');
+
+ data.api = false;
+ data.actionQueue = [];
+ box = data.shadowElem;
+ resetSwfProps(data);
+ data.currentSrc = canPlaySrc.srcProp;
+
+ } else {
+ $(document.getElementById('wrapper-'+ elemId )).remove();
+ box = $('
')
+ .css({
+ position: 'relative',
+ overflow: 'hidden'
+ })
+ ;
+ data = webshims.data(elem, 'mediaelement', webshims.objectCreate(playerStateObj, {
+ actionQueue: {
+ value: []
+ },
+ shadowElem: {
+ value: box
+ },
+ _elemNodeName: {
+ value: elemNodeName
+ },
+ _elem: {
+ value: elem
+ },
+ currentSrc: {
+ value: canPlaySrc.srcProp
+ },
+ swfCreated: {
+ value: true
+ },
+ id: {
+ value: elemId.replace(/-/g, '')
+ },
+ buffered: {
+ value: {
+ start: function(index){
+ if(index >= data.buffered.length){
+ webshims.error('buffered index size error');
+ return;
+ }
+ return 0;
+ },
+ end: function(index){
+ if(index >= data.buffered.length){
+ webshims.error('buffered index size error');
+ return;
+ }
+ return ( (data.duration - data._bufferedStart) * data._bufferedEnd) + data._bufferedStart;
+ },
+ length: 0
+ }
+ }
+ }));
+
+
+
+ box.insertBefore(elem);
+
+ if(hasNative){
+ $.extend(data, {volume: $.prop(elem, 'volume'), muted: $.prop(elem, 'muted'), paused: $.prop(elem, 'paused')});
+ }
+
+ webshims.addShadowDom(elem, box);
+ if(!webshims.data(elem, 'mediaelement')){
+ webshims.data(elem, 'mediaelement', data);
+ }
+ addMediaToStopEvents(elem);
+
+ mediaelement.setActive(elem, 'third', data);
+
+ setElementDimension(data, hasControls);
+
+ $(elem)
+ .on({
+ 'updatemediaelementdimensions loadedmetadata emptied': setDimension,
+ 'remove': function(e){
+ if(!e.originalEvent && mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem == elem){
+ delete mediaelement.jarisEvent[data.id];
+ clearTimeout(localConnectionTimer);
+ clearTimeout(data.flashBlock);
+ }
+ }
+ })
+ .onWSOff('updateshadowdom', setDimension)
+ ;
+ }
+
+ if(mediaelement.jarisEvent[data.id] && mediaelement.jarisEvent[data.id].elem != elem){
+ webshims.error('something went wrong');
+ return;
+ } else if(!mediaelement.jarisEvent[data.id]){
+
+ mediaelement.jarisEvent[data.id] = function(jaris){
+
+ if(jaris.type == 'ready'){
+ var onReady = function(){
+ if(data.api){
+ if(!data.paused){
+ data.api.api_play();
+ }
+ if(bufferSrc(elem)){
+ data.api.api_preload();
+ }
+ onEvent.ready(jaris, data);
+ }
+ };
+ if(data.api){
+ onReady();
+ } else {
+ setTimeout(onReady, 9);
+ }
+ } else {
+ data.currentTime = jaris.position;
+
+ if(data.api){
+ if(!data._calledMeta && isNaN(jaris.duration) && data.duration != jaris.duration && isNaN(data.duration)){
+ onEvent.onDataInitialized(jaris, data);
+ }
+
+ if(!data._ppFlag && jaris.type != 'onPlayPause'){
+ onEvent.onPlayPause(jaris, data);
+ }
+
+ if(onEvent[jaris.type]){
+ onEvent[jaris.type](jaris, data);
+ }
+ }
+ data.duration = jaris.duration;
+ }
+ };
+ mediaelement.jarisEvent[data.id].elem = elem;
+ }
+
+ $.extend(vars,
+ {
+ id: elemId,
+ evtId: data.id,
+ controls: ''+hasControls,
+ autostart: 'false',
+ nodename: elemNodeName
+ },
+ elemVars
+ );
+
+ if(isRtmp){
+ vars.streamtype = 'rtmp';
+ } else if(canPlaySrc.type == 'audio/mpeg' || canPlaySrc.type == 'audio/mp3'){
+ vars.type = 'audio';
+ vars.streamtype = 'file';
+ } else if(canPlaySrc.type == 'video/youtube'){
+ vars.streamtype = 'youtube';
+ }
+ options.changeSWF(vars, elem, canPlaySrc, data, 'embed');
+ clearTimeout(data.flashBlock);
+
+ swfmini.embedSWF(playerSwfPath, elemId, "100%", "100%", "9.0.115", false, vars, params, attrs, function(swfData){
+ if(swfData.success){
+ var fBlocker = function(){
+ if((!swfData.ref.parentNode && box[0].parentNode) || swfData.ref.style.display == "none"){
+ box.addClass('flashblocker-assumed');
+ $(elem).trigger('flashblocker');
+ webshims.warn("flashblocker assumed");
+ }
+ $(swfData.ref).css({'minHeight': '2px', 'minWidth': '2px', display: 'block'});
+ };
+ data.api = swfData.ref;
+
+ if(!hasControls){
+ $(swfData.ref).attr('tabindex', '-1').css('outline', 'none');
+ }
+
+ data.flashBlock = setTimeout(fBlocker, 99);
+
+ if(!localConnectionTimer){
+ clearTimeout(localConnectionTimer);
+ localConnectionTimer = setTimeout(function(){
+ fBlocker();
+ var flash = $(swfData.ref);
+ if(flash[0].offsetWidth > 1 && flash[0].offsetHeight > 1 && location.protocol.indexOf('file:') === 0){
+ webshims.error("Add your local development-directory to the local-trusted security sandbox: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html");
+ } else if(flash[0].offsetWidth < 2 || flash[0].offsetHeight < 2) {
+ webshims.warn("JS-SWF connection can't be established on hidden or unconnected flash objects");
+ }
+ flash = null;
+ }, 8000);
+ }
+ }
+ });
+
+ trigger(data._elem, 'loadstart');
+ };
+
+
+ var queueSwfMethod = function(elem, fn, args, data){
+ data = data || getSwfDataFromElem(elem);
+
+ if(data){
+ if(data.api && data.api[fn]){
+ data.api[fn].apply(data.api, args || []);
+ } else {
+ //todo add to queue
+ data.actionQueue.push({fn: fn, args: args});
+
+ if(data.actionQueue.length > 10){
+ setTimeout(function(){
+ if(data.actionQueue.length > 5){
+ data.actionQueue.shift();
+ }
+ }, 99);
+ }
+ }
+ return data;
+ }
+ return false;
+ };
+
+ ['audio', 'video'].forEach(function(nodeName){
+ var descs = {};
+ var mediaSup;
+ var createGetProp = function(key){
+ if(nodeName == 'audio' && (key == 'videoHeight' || key == 'videoWidth')){return;}
+
+ descs[key] = {
+ get: function(){
+ var data = getSwfDataFromElem(this);
+ if(data){
+ return data[key];
+ } else if(hasNative && mediaSup[key].prop._supget) {
+ return mediaSup[key].prop._supget.apply(this);
+ } else {
+ return playerStateObj[key];
+ }
+ },
+ writeable: false
+ };
+ };
+ var createGetSetProp = function(key, setFn){
+ createGetProp(key);
+ delete descs[key].writeable;
+ descs[key].set = setFn;
+ };
+
+ createGetSetProp('seeking');
+
+ createGetSetProp('volume', function(v){
+ var data = getSwfDataFromElem(this);
+ if(data){
+ v *= 1;
+ if(!isNaN(v)){
+
+ if(v < 0 || v > 1){
+ webshims.error('volume greater or less than allowed '+ (v / 100));
+ }
+
+ queueSwfMethod(this, 'api_volume', [v], data);
+
+
+ if(data.volume != v){
+ data.volume = v;
+ trigger(data._elem, 'volumechange');
+ }
+ data = null;
+ }
+ } else if(mediaSup.volume.prop._supset) {
+ return mediaSup.volume.prop._supset.apply(this, arguments);
+ }
+ });
+
+ createGetSetProp('muted', function(m){
+ var data = getSwfDataFromElem(this);
+ if(data){
+ m = !!m;
+ queueSwfMethod(this, 'api_muted', [m], data);
+ if(data.muted != m){
+ data.muted = m;
+ trigger(data._elem, 'volumechange');
+ }
+ data = null;
+ } else if(mediaSup.muted.prop._supset) {
+ return mediaSup.muted.prop._supset.apply(this, arguments);
+ }
+ });
+
+
+ createGetSetProp('currentTime', function(t){
+ var data = getSwfDataFromElem(this);
+ if(data){
+ t *= 1;
+ if (!isNaN(t)) {
+ queueSwfMethod(this, 'api_seek', [t], data);
+ }
+
+ } else if(mediaSup.currentTime.prop._supset) {
+ return mediaSup.currentTime.prop._supset.apply(this, arguments);
+ }
+ });
+
+ ['play', 'pause'].forEach(function(fn){
+ descs[fn] = {
+ value: function(){
+ var data = getSwfDataFromElem(this);
+
+ if(data){
+ if(data.stopPlayPause){
+ clearTimeout(data.stopPlayPause);
+ }
+ queueSwfMethod(this, fn == 'play' ? 'api_play' : 'api_pause', [], data);
+
+ data._ppFlag = true;
+ if(data.paused != (fn != 'play')){
+ data.paused = fn != 'play';
+ trigger(data._elem, fn);
+ }
+ } else if(mediaSup[fn].prop._supvalue) {
+ return mediaSup[fn].prop._supvalue.apply(this, arguments);
+ }
+ }
+ };
+ });
+
+ getPropKeys.forEach(createGetProp);
+
+ webshims.onNodeNamesPropertyModify(nodeName, 'controls', function(val, boolProp){
+ var data = getSwfDataFromElem(this);
+
+ $(this)[boolProp ? 'addClass' : 'removeClass']('webshims-controls');
+
+ if(data){
+ if(nodeName == 'audio'){
+ setElementDimension(data, boolProp);
+ }
+ queueSwfMethod(this, 'api_controls', [boolProp], data);
+ }
+ });
+
+
+ webshims.onNodeNamesPropertyModify(nodeName, 'preload', function(val){
+ var data, baseData, elem;
+
+
+ if(bufferSrc(this)){
+ data = getSwfDataFromElem(this);
+ if(data){
+ queueSwfMethod(this, 'api_preload', [], data);
+ } else if(needsLoadPreload && this.paused && !this.error && !$.data(this, 'mediaerror') && !this.readyState && !this.networkState && !this.autoplay && $(this).is(':not(.nonnative-api-active)')){
+ elem = this;
+ baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
+ clearTimeout(baseData.loadTimer);
+ baseData.loadTimer = setTimeout(function(){
+ $(elem).mediaLoad();
+ }, 9);
+ }
+ }
+ });
+
+ mediaSup = webshims.defineNodeNameProperties(nodeName, descs, 'prop');
+
+ if(!support.mediaDefaultMuted){
+ webshims.defineNodeNameProperties(nodeName, {
+ defaultMuted: {
+ get: function(){
+ return $.attr(this, 'muted') != null;
+ },
+ set: function(val){
+ if(val){
+ $.attr(this, 'muted', '');
+ } else {
+ $(this).removeAttr('muted');
+ }
+ }
+ }
+ }, 'prop');
+ }
+ });
+
+
+ if(hasFlash && $.cleanData){
+ var oldClean = $.cleanData;
+ var objElem = document.createElement('object');
+ var noRemove = {
+ SetVariable: 1,
+ GetVariable: 1,
+ SetReturnValue: 1,
+ GetReturnValue: 1
+ };
+ var flashNames = {
+ object: 1,
+ OBJECT: 1
+ };
+
+ $.cleanData = function(elems){
+ var i, len, prop;
+ var ret = oldClean.apply(this, arguments);
+ if(elems && (len = elems.length) && loadedSwf){
+
+ for(i = 0; i < len; i++){
+ if(flashNames[elems[i].nodeName] && 'api_destroy' in elems[i]){
+ loadedSwf--;
+ try {
+ elems[i].api_destroy();
+ if(elems[i].readyState == 4){
+ for (prop in elems[i]) {
+ if (!noRemove[prop] && !objElem[prop] && typeof elems[i][prop] == "function") {
+ elems[i][prop] = null;
+ }
+ }
+ }
+ } catch(er){console.log(er);}
+ }
+ }
+
+ }
+ return ret;
+ };
+ }
+
+ if(!hasNative){
+
+ ['poster', 'src'].forEach(function(prop){
+ webshims.defineNodeNamesProperty(prop == 'src' ? ['audio', 'video', 'source'] : ['video'], prop, {
+ //attr: {},
+ reflect: true,
+ propType: 'src'
+ });
+ });
+
+ webshims.defineNodeNamesProperty(['audio', 'video'], 'preload', {
+ reflect: true,
+ propType: 'enumarated',
+ defaultValue: '',
+ limitedTo: ['', 'auto', 'metadata', 'none']
+ });
+
+ webshims.reflectProperties('source', ['type', 'media']);
+
+
+ ['autoplay', 'controls'].forEach(function(name){
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], name);
+ });
+
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
+ HAVE_CURRENT_DATA: {
+ value: 2
+ },
+ HAVE_ENOUGH_DATA: {
+ value: 4
+ },
+ HAVE_FUTURE_DATA: {
+ value: 3
+ },
+ HAVE_METADATA: {
+ value: 1
+ },
+ HAVE_NOTHING: {
+ value: 0
+ },
+ NETWORK_EMPTY: {
+ value: 0
+ },
+ NETWORK_IDLE: {
+ value: 1
+ },
+ NETWORK_LOADING: {
+ value: 2
+ },
+ NETWORK_NO_SOURCE: {
+ value: 3
+ }
+
+ }, 'prop');
+
+
+ if(hasFlash){
+ webshims.ready('WINDOWLOAD', function(){
+ setTimeout(function(){
+ if(!loadedSwf){
+ document.createElement('img').src = playerSwfPath;
+ }
+ }, 9);
+ });
+ }
+ } else if(!('media' in document.createElement('source'))){
+ webshims.reflectProperties('source', ['media']);
+ }
+
+ if(hasNative && hasFlash && !options.preferFlash){
+ var switchErrors = {
+ 3: 1,
+ 4: 1
+ };
+ var switchOptions = function(e){
+ var media, error, parent;
+ if(
+ ($(e.target).is('audio, video') || ((parent = e.target.parentNode) && $('source', parent).last()[0] == e.target)) &&
+ (media = $(e.target).closest('audio, video')) && !media.is('.nonnative-api-active')
+ ){
+ error = media.prop('error');
+ setTimeout(function(){
+ if(!media.is('.nonnative-api-active')){
+ if(error && switchErrors[error.code]){
+ options.preferFlash = true;
+ document.removeEventListener('error', switchOptions, true);
+ $('audio, video').each(function(){
+ webshims.mediaelement.selectSource(this);
+ });
+ webshims.error("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.currentSrc+" Mediaerror: "+ media.prop('error')+ ' error.code: '+ error.code);
+ }
+ webshims.warn('There was a mediaelement error. Run the following line in your console to get more info: webshim.mediaelement.loadDebugger();')
+ }
+ });
+
+
+ }
+ };
+
+ document.addEventListener('error', switchOptions, true);
+ setTimeout(function(){
+ $('audio, video').each(function(){
+ var error = $.prop(this, 'error');
+ if(error && switchErrors[error]){
+ switchOptions({target: this});
+ }
+ });
+ });
+ }
+
+});
+;webshims.register('track', function($, webshims, window, document, undefined){
+ "use strict";
+ var mediaelement = webshims.mediaelement;
+ var id = new Date().getTime();
+ //descriptions are not really shown, but they are inserted into the dom
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
+ var dummyTrack = $('
');
+ var support = webshims.support;
+ var supportTrackMod = support.ES5 && support.objectAccessor;
+ var createEventTarget = function(obj){
+ var eventList = {};
+ obj.addEventListener = function(name, fn){
+ if(eventList[name]){
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
+ }
+ eventList[name] = fn;
+
+ };
+ obj.removeEventListener = function(name, fn){
+ if(eventList[name] && eventList[name] != fn){
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
+ }
+ if(eventList[name]){
+ delete eventList[name];
+ }
+ };
+ return obj;
+ };
+
+ var cueListProto = {
+ getCueById: function(id){
+ var cue = null;
+ for(var i = 0, len = this.length; i < len; i++){
+ if(this[i].id === id){
+ cue = this[i];
+ break;
+ }
+ }
+ return cue;
+ }
+ };
+ var numericModes = {
+ 0: 'disabled',
+ 1: 'hidden',
+ 2: 'showing'
+ };
+
+ var textTrackProto = {
+ shimActiveCues: null,
+ _shimActiveCues: null,
+ activeCues: null,
+ cues: null,
+ kind: 'subtitles',
+ label: '',
+ language: '',
+ id: '',
+ mode: 'disabled',
+ oncuechange: null,
+ toString: function() {
+ return "[object TextTrack]";
+ },
+ addCue: function(cue){
+ if(!this.cues){
+ this.cues = mediaelement.createCueList();
+ } else {
+ var lastCue = this.cues[this.cues.length-1];
+ if(lastCue && lastCue.startTime > cue.startTime){
+ webshims.error("cue startTime higher than previous cue's startTime");
+ }
+ }
+ if(cue.track && cue.track.removeCue){
+ cue.track.removeCue(cue);
+ }
+ cue.track = this;
+ this.cues.push(cue);
+ },
+ //ToDo: make it more dynamic
+ removeCue: function(cue){
+ var cues = this.cues || [];
+ var i = 0;
+ var len = cues.length;
+ if(cue.track != this){
+ webshims.error("cue not part of track");
+ return;
+ }
+ for(; i < len; i++){
+ if(cues[i] === cue){
+ cues.splice(i, 1);
+ cue.track = null;
+ break;
+ }
+ }
+ if(cue.track){
+ webshims.error("cue not part of track");
+ return;
+ }
+ }/*,
+ DISABLED: 'disabled',
+ OFF: 'disabled',
+ HIDDEN: 'hidden',
+ SHOWING: 'showing',
+ ERROR: 3,
+ LOADED: 2,
+ LOADING: 1,
+ NONE: 0*/
+ };
+ var copyProps = ['kind', 'label', 'srclang'];
+ var copyName = {srclang: 'language'};
+
+ var updateMediaTrackList = function(baseData, trackList){
+ var removed = [];
+ var added = [];
+ var newTracks = [];
+ var i, len;
+ if(!baseData){
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
+ }
+
+ if(!trackList){
+ baseData.blockTrackListUpdate = true;
+ trackList = $.prop(this, 'textTracks');
+ baseData.blockTrackListUpdate = false;
+ }
+
+ clearTimeout(baseData.updateTrackListTimer);
+
+ $('track', this).each(function(){
+ var track = $.prop(this, 'track');
+ newTracks.push(track);
+ if(trackList.indexOf(track) == -1){
+ added.push(track);
+ }
+ });
+
+ if(baseData.scriptedTextTracks){
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
+ newTracks.push(baseData.scriptedTextTracks[i]);
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
+ added.push(baseData.scriptedTextTracks[i]);
+ }
+ }
+ }
+
+ for(i = 0, len = trackList.length; i < len; i++){
+ if(newTracks.indexOf(trackList[i]) == -1){
+ removed.push(trackList[i]);
+ }
+ }
+
+ if(removed.length || added.length){
+ trackList.splice(0);
+
+ for(i = 0, len = newTracks.length; i < len; i++){
+ trackList.push(newTracks[i]);
+ }
+ for(i = 0, len = removed.length; i < len; i++){
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
+ }
+ for(i = 0, len = added.length; i < len; i++){
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
+ }
+ if(baseData.scriptedTextTracks || removed.length){
+ $(this).triggerHandler('updatetrackdisplay');
+ }
+ }
+ };
+
+ var refreshTrack = function(track, trackData){
+ if(!trackData){
+ trackData = webshims.data(track, 'trackData');
+ }
+
+ if(trackData && !trackData.isTriggering){
+ trackData.isTriggering = true;
+ setTimeout(function(){
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
+ trackData.isTriggering = false;
+ }, 1);
+ }
+ };
+ var isDefaultTrack = (function(){
+ var defaultKinds = {
+ subtitles: {
+ subtitles: 1,
+ captions: 1
+ },
+ descriptions: {descriptions: 1},
+ chapters: {chapters: 1}
+ };
+ defaultKinds.captions = defaultKinds.subtitles;
+
+ return function(track){
+ var kind, firstDefaultTrack;
+ var isDefault = $.prop(track, 'default');
+ if(isDefault && (kind = $.prop(track, 'kind')) != 'metadata'){
+ firstDefaultTrack = $(track)
+ .parent()
+ .find('track[default]')
+ .filter(function(){
+ return !!(defaultKinds[kind][$.prop(this, 'kind')]);
+ })[0]
+ ;
+ if(firstDefaultTrack != track){
+ isDefault = false;
+ webshims.error('more than one default track of a specific kind detected. Fall back to default = false');
+ }
+ }
+ return isDefault;
+ };
+ })();
+ var emptyDiv = $('
')[0];
+
+ function VTTCue(startTime, endTime, text){
+ if(arguments.length != 3){
+ webshims.error("wrong arguments.length for VTTCue.constructor");
+ }
+
+ this.startTime = startTime;
+ this.endTime = endTime;
+ this.text = text;
+ this.onenter = null;
+ this.onexit = null;
+ this.pauseOnExit = false;
+ this.track = null;
+ this.id = null;
+ this.getCueAsHTML = (function(){
+ var lastText = "";
+ var parsedText = "";
+ var fragment;
+
+ return function(){
+ var i, len;
+ if(!fragment){
+ fragment = document.createDocumentFragment();
+ }
+ if(lastText != this.text){
+ lastText = this.text;
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
+ emptyDiv.innerHTML = parsedText;
+
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
+ }
+ }
+ return fragment.cloneNode(true);
+ };
+
+ })();
+ }
+
+ window.VTTCue = VTTCue;
+ window.TextTrackCue = function(){
+ webshims.error("Use VTTCue constructor instead of abstract TextTrackCue constructor.");
+ VTTCue.apply(this, arguments);
+ };
+
+ window.TextTrackCue.prototype = VTTCue.prototype;
+
+ mediaelement.createCueList = function(){
+ return $.extend([], cueListProto);
+ };
+
+ mediaelement.parseCueTextToHTML = (function(){
+ var tagSplits = /(<\/?[^>]+>)/ig;
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
+ var regEnd = /\<\s*\//;
+ var addToTemplate = function(localName, attribute, tag, html){
+ var ret;
+ if(regEnd.test(html)){
+ ret = ''+ localName +'>';
+ } else {
+ tag.splice(0, 1);
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '"')) +'">';
+ }
+ return ret;
+ };
+ var replacer = function(html){
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
+ if(tag[0]){
+ tag[0] = tag[0].toLowerCase();
+ if(allowedTags.test(tag[0])){
+ if(tag[0] == 'c'){
+ html = addToTemplate('span', 'class', tag, html);
+ } else if(tag[0] == 'v'){
+ html = addToTemplate('q', 'title', tag, html);
+ }
+ } else {
+ html = "";
+ }
+ }
+ return html;
+ };
+
+ return function(cueText){
+ return cueText.replace(tagSplits, replacer);
+ };
+ })();
+ var mapTtmlToVtt = function(i){
+ var content = i+'';
+ var begin = this.getAttribute('begin') || '';
+ var end = this.getAttribute('end') || '';
+ var text = $.trim($.text(this));
+ if(!/\./.test(begin)){
+ begin += '.000';
+ }
+ if(!/\./.test(end)){
+ end += '.000';
+ }
+ content += '\n';
+ content += begin +' --> '+end+'\n';
+ content += text;
+ return content;
+ };
+ var ttmlTextToVTT = function(ttml){
+ ttml = $.parseXML(ttml) || [];
+ return $(ttml).find('[begin][end]').map(mapTtmlToVtt).get().join('\n\n') || '';
+ };
+ var loadingTracks = 0;
+
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
+ var loadEvents = 'play playing loadedmetadata loadstart';
+ var obj = trackData.track;
+ var load = function(){
+ var error, ajax, createAjax;
+ var isDisabled = obj.mode == 'disabled';
+ var videoState = !!($.prop(mediaelem, 'readyState') > 0 || $.prop(mediaelem, 'networkState') == 2 || !$.prop(mediaelem, 'paused'));
+ var src = (!isDisabled || videoState) && ($.attr(track, 'src') && $.prop(track, 'src'));
+
+ if(src){
+ $(mediaelem).off(loadEvents, load).off('updatetrackdisplay', load);
+
+ if(!trackData.readyState){
+ error = function(){
+ loadingTracks--;
+ trackData.readyState = 3;
+ obj.cues = null;
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
+ $(track).triggerHandler('error');
+ };
+ trackData.readyState = 1;
+ try {
+ obj.cues = mediaelement.createCueList();
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
+ loadingTracks++;
+ createAjax = function(){
+ ajax = $.ajax({
+ dataType: 'text',
+ url: src,
+ success: function(text){
+ loadingTracks--;
+ var contentType = ajax.getResponseHeader('content-type') || '';
+
+ if(!contentType.indexOf('application/xml')){
+ text = ttmlTextToVTT(text);
+ } else if(contentType.indexOf('text/vtt')){
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
+ }
+ mediaelement.parseCaptions(text, obj, function(cues){
+ if(cues && 'length' in cues){
+ trackData.readyState = 2;
+ $(track).triggerHandler('load');
+ $(mediaelem).triggerHandler('updatetrackdisplay');
+ } else {
+ error();
+ }
+ });
+ },
+ error: error
+ });
+ };
+ if($.ajax && $.ajaxSettings.xhr){
+ if(isDisabled){
+ setTimeout(createAjax, loadingTracks * 2);
+ } else {
+ createAjax();
+ }
+ } else {
+ webshims.ready('jajax', createAjax);
+ webshims.loader.loadList(['jajax']);
+ }
+ } catch(er){
+ error();
+ webshims.error(er);
+ }
+ }
+ }
+ };
+ trackData.readyState = 0;
+ obj.shimActiveCues = null;
+ obj._shimActiveCues = null;
+ obj.activeCues = null;
+ obj.cues = null;
+
+ $(mediaelem).on(loadEvents, load);
+
+ if(_default){
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
+ load();
+ } else {
+ $(mediaelem).on('updatetrackdisplay', load);
+ }
+ };
+
+ mediaelement.createTextTrack = function(mediaelem, track){
+ var obj, trackData;
+ if(track.nodeName){
+ trackData = webshims.data(track, 'trackData');
+
+ if(trackData){
+ refreshTrack(track, trackData);
+ obj = trackData.track;
+ }
+ }
+
+ if(!obj){
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
+
+ if(!supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ var prop = $.prop(track, copyProp);
+ if(prop){
+ obj[copyName[copyProp] || copyProp] = prop;
+ }
+ });
+ }
+
+
+ if(track.nodeName){
+ if(supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
+ get: function(){
+ return $.prop(track, copyProp);
+ }
+ });
+ });
+ }
+ obj.id = $(track).prop('id');
+ trackData = webshims.data(track, 'trackData', {track: obj});
+ mediaelement.loadTextTrack(mediaelem, track, trackData, isDefaultTrack(track));
+ } else {
+ if(supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
+ value: track[copyProp],
+ writeable: false
+ });
+ });
+ }
+ obj.cues = mediaelement.createCueList();
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
+ obj.mode = 'hidden';
+ obj.readyState = 2;
+ }
+ if(obj.kind == 'subtitles' && !obj.language){
+ webshims.error('you must provide a language for track in subtitles state');
+ }
+ obj.__wsmode = obj.mode;
+ }
+
+ return obj;
+ };
+
+
+/*
+taken from:
+Captionator 0.5.1 [CaptionCrunch]
+Christopher Giffard, 2011
+Share and enjoy
+
+https://github.com/cgiffard/Captionator
+
+modified for webshims
+*/
+ mediaelement.parseCaptionChunk = (function(){
+ // Set up timestamp parsers
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
+ var SRTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s*(.*)/;
+
+ return function(subtitleElement,objectCount){
+
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id;
+ var timestampMatch, tmpCue;
+
+ // WebVTT Special Cue Logic
+ if (WebVTTDEFAULTSCueParser.exec(subtitleElement) || WebVTTCOMMENTCueParser.exec(subtitleElement) || WebVTTSTYLECueParser.exec(subtitleElement)) {
+ return null;
+ }
+
+ subtitleParts = subtitleElement.split(/\n/g);
+
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
+ subtitleParts.shift();
+ }
+
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
+ }
+
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
+ var timestamp = subtitleParts[subtitlePartIndex];
+
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp)) || (timestampMatch = SRTTimestampParser.exec(timestamp))) {
+
+ // WebVTT
+
+ timeData = timestampMatch.slice(1);
+
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
+ parseInt((timeData[2]||0),10) + // Seconds
+ parseFloat("0." + (timeData[3]||0)); // MS
+
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
+ parseInt((timeData[6]||0),10) + // Seconds
+ parseFloat("0." + (timeData[7]||0)); // MS
+/*
+ if (timeData[8]) {
+ cueSettings = timeData[8];
+ }
+*/
+ }
+
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
+ break;
+ }
+
+ if (!timeIn && !timeOut) {
+ // We didn't extract any time information. Assume the cue is invalid!
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
+ return null;
+ }
+/*
+ // Consolidate cue settings, convert defaults to object
+ var compositeCueSettings =
+ cueDefaults
+ .reduce(function(previous,current,index,array){
+ previous[current.split(":")[0]] = current.split(":")[1];
+ return previous;
+ },{});
+
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
+ compositeCueSettings =
+ cueSettings
+ .split(/\s+/g)
+ .filter(function(set) { return set && !!set.length; })
+ // Convert array to a key/val object
+ .reduce(function(previous,current,index,array){
+ previous[current.split(":")[0]] = current.split(":")[1];
+ return previous;
+ },compositeCueSettings);
+
+ // Turn back into string like the VTTCue constructor expects
+ cueSettings = "";
+ for (var key in compositeCueSettings) {
+ if (compositeCueSettings.hasOwnProperty(key)) {
+ cueSettings += !!cueSettings.length ? " " : "";
+ cueSettings += key + ":" + compositeCueSettings[key];
+ }
+ }
+*/
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
+ html = subtitleParts.join("\n");
+ tmpCue = new VTTCue(timeIn, timeOut, html);
+ if(id){
+ tmpCue.id = id;
+ }
+ return tmpCue;
+ };
+ })();
+
+ mediaelement.parseCaptions = function(captionData, track, complete) {
+
+ var cue, lazyProcess, regWevVTT, startDate, isWEBVTT;
+
+ mediaelement.createCueList();
+ if (captionData) {
+
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
+
+ lazyProcess = function(i, len){
+
+ for(; i < len; i++){
+ cue = captionData[i];
+ if(regWevVTT.test(cue)){
+ isWEBVTT = true;
+ } else if(cue.replace(/\s*/ig,"").length){
+ cue = mediaelement.parseCaptionChunk(cue, i);
+ if(cue){
+ track.addCue(cue);
+ }
+ }
+ if(startDate < (new Date().getTime()) - 30){
+ i++;
+ setTimeout(function(){
+ startDate = new Date().getTime();
+ lazyProcess(i, len);
+ }, 90);
+
+ break;
+ }
+ }
+ if(i >= len){
+ if(!isWEBVTT){
+ webshims.error('please use WebVTT format. This is the standard');
+ }
+ complete(track.cues);
+ }
+ };
+
+ captionData = captionData.replace(/\r\n/g,"\n");
+
+ setTimeout(function(){
+ captionData = captionData.replace(/\r/g,"\n");
+ setTimeout(function(){
+ startDate = new Date().getTime();
+ captionData = captionData.split(/\n\n+/g);
+ lazyProcess(0, captionData.length);
+ }, 9);
+ }, 9);
+
+ } else {
+ webshims.error("Required parameter captionData not supplied.");
+ }
+ };
+
+
+ mediaelement.createTrackList = function(mediaelem, baseData){
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
+ if(!baseData.textTracks){
+ baseData.textTracks = [];
+ webshims.defineProperties(baseData.textTracks, {
+ onaddtrack: {value: null},
+ onremovetrack: {value: null},
+ onchange: {value: null},
+ getTrackById: {
+ value: function(id){
+ var track = null;
+ for(var i = 0; i < baseData.textTracks.length; i++){
+ if(id == baseData.textTracks[i].id){
+ track = baseData.textTracks[i];
+ break;
+ }
+ }
+ return track;
+ }
+ }
+ });
+ createEventTarget(baseData.textTracks);
+ $(mediaelem).on('updatetrackdisplay', function(){
+ var track;
+ for(var i = 0; i < baseData.textTracks.length; i++){
+ track = baseData.textTracks[i];
+ if(track.__wsmode != track.mode){
+ track.__wsmode = track.mode;
+ $([ baseData.textTracks ]).triggerHandler('change');
+ }
+ }
+ });
+
+ }
+ return baseData.textTracks;
+ };
+
+ if(!support.track){
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
+
+ webshims.defineNodeNameProperties('track', {
+ src: {
+ //attr: {},
+ reflect: true,
+ propType: 'src'
+ }
+ });
+ }
+
+ webshims.defineNodeNameProperties('track', {
+ kind: {
+ attr: support.track ? {
+ set: function(value){
+ var trackData = webshims.data(this, 'trackData');
+ this.setAttribute('data-kind', value);
+ if(trackData){
+ trackData.attrKind = value;
+ }
+ },
+ get: function(){
+ var trackData = webshims.data(this, 'trackData');
+ if(trackData && ('attrKind' in trackData)){
+ return trackData.attrKind;
+ }
+ return this.getAttribute('kind');
+ }
+ } : {},
+ reflect: true,
+ propType: 'enumarated',
+ defaultValue: 'subtitles',
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
+ }
+ });
+
+ $.each(copyProps, function(i, copyProp){
+ var name = copyName[copyProp] || copyProp;
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
+ var trackData = webshims.data(this, 'trackData');
+ var track = this;
+ if(trackData){
+ if(copyProp == 'kind'){
+ refreshTrack(this, trackData);
+ }
+ if(!supportTrackMod){
+ trackData.track[name] = $.prop(this, copyProp);
+ }
+ }
+ });
+ });
+
+
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
+ if(val){
+ var data = webshims.data(this, 'trackData');
+ var media;
+ if(data){
+ media = $(this).closest('video, audio');
+ if(media[0]){
+ mediaelement.loadTextTrack(media, this, data);
+ }
+ }
+ }
+
+ });
+
+ //
+ webshims.defineNodeNamesProperties(['track'], {
+ ERROR: {
+ value: 3
+ },
+ LOADED: {
+ value: 2
+ },
+ LOADING: {
+ value: 1
+ },
+ NONE: {
+ value: 0
+ },
+ readyState: {
+ get: function(){
+ return (webshims.data(this, 'trackData') || {readyState: 0}).readyState;
+ },
+ writeable: false
+ },
+ track: {
+ get: function(){
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
+ },
+ writeable: false
+ }
+ }, 'prop');
+
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
+ textTracks: {
+ get: function(){
+ var media = this;
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
+ var tracks = mediaelement.createTrackList(media, baseData);
+ if(!baseData.blockTrackListUpdate){
+ updateMediaTrackList.call(media, baseData, tracks);
+ }
+ return tracks;
+ },
+ writeable: false
+ },
+ addTextTrack: {
+ value: function(kind, label, lang){
+ var textTrack = mediaelement.createTextTrack(this, {
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
+ label: label || '',
+ srclang: lang || ''
+ });
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
+ if (!baseData.scriptedTextTracks) {
+ baseData.scriptedTextTracks = [];
+ }
+ baseData.scriptedTextTracks.push(textTrack);
+ updateMediaTrackList.call(this);
+ return textTrack;
+ }
+ }
+ }, 'prop');
+
+ //wsmediareload
+ var thUpdateList = function(e){
+ if($(e.target).is('audio, video')){
+ var baseData = webshims.data(e.target, 'mediaelementBase');
+ if(baseData){
+ clearTimeout(baseData.updateTrackListTimer);
+ baseData.updateTrackListTimer = setTimeout(function(){
+ updateMediaTrackList.call(e.target, baseData);
+ }, 0);
+ }
+ }
+ };
+
+ var getNativeReadyState = function(trackElem, textTrack){
+ return textTrack.readyState || trackElem.readyState;
+ };
+ var stopOriginalEvent = function(e){
+ if(e.originalEvent){
+ e.stopImmediatePropagation();
+ }
+ };
+ var hideNativeTracks = function(){
+ if(webshims.implement(this, 'track')){
+ var kind;
+ var origTrack = this.track;
+ if(origTrack){
+
+ if (!webshims.bugs.track && (origTrack.mode || getNativeReadyState(this, origTrack))) {
+ $.prop(this, 'track').mode = numericModes[origTrack.mode] || origTrack.mode;
+ }
+ //disable track from showing + remove UI
+ kind = $.prop(this, 'kind');
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
+ this.kind = 'metadata';
+
+ $(this).attr({kind: kind});
+
+ }
+ $(this).on('load error', stopOriginalEvent);
+ }
+ };
+
+ webshims.addReady(function(context, insertedElement){
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
+ $('video, audio', context)
+ .add(insertedMedia)
+ .each(function(){
+ updateMediaTrackList.call(this);
+ })
+ .on('emptied updatetracklist wsmediareload', thUpdateList)
+ .each(function(){
+ if(support.track){
+ var shimedTextTracks = $.prop(this, 'textTracks');
+ var origTextTracks = this.textTracks;
+
+ if(shimedTextTracks.length != origTextTracks.length){
+ webshims.warn("textTracks couldn't be copied");
+ }
+
+ $('track', this).each(hideNativeTracks);
+ }
+ })
+ ;
+
+ insertedMedia.each(function(){
+ var media = this;
+ var baseData = webshims.data(media, 'mediaelementBase');
+ if(baseData){
+ clearTimeout(baseData.updateTrackListTimer);
+ baseData.updateTrackListTimer = setTimeout(function(){
+ updateMediaTrackList.call(media, baseData);
+ }, 9);
+ }
+ });
+ });
+
+ if(support.texttrackapi){
+ $('video, audio').trigger('trackapichange');
+ }
+});
diff --git a/public/webshims/shims/combos/22.js b/public/webshims/shims/combos/22.js
new file mode 100644
index 00000000..ea2ec46b
--- /dev/null
+++ b/public/webshims/shims/combos/22.js
@@ -0,0 +1,1027 @@
+webshims.register('details', function($, webshims, window, doc, undefined, options){
+ var isInterActiveSummary = function(summary){
+ var details = $(summary).parent('details');
+ if(details[0] && details.children(':first').get(0) === summary){
+ return details;
+ }
+ };
+
+ var bindDetailsSummary = function(summary, details){
+ summary = $(summary);
+ details = $(details);
+ var oldSummary = $.data(details[0], 'summaryElement');
+ $.data(summary[0], 'detailsElement', details);
+ if(!oldSummary || summary[0] !== oldSummary[0]){
+ if(oldSummary){
+ if(oldSummary.hasClass('fallback-summary')){
+ oldSummary.remove();
+ } else {
+ oldSummary
+ .off('.summaryPolyfill')
+ .removeData('detailsElement')
+ .removeAttr('role')
+ .removeAttr('tabindex')
+ .removeAttr('aria-expanded')
+ .removeClass('summary-button')
+ .find('span.details-open-indicator')
+ .remove()
+ ;
+ }
+ }
+ $.data(details[0], 'summaryElement', summary);
+ details.prop('open', details.prop('open'));
+ }
+ };
+ var getSummary = function(details){
+ var summary = $.data(details, 'summaryElement');
+ if(!summary){
+ summary = $(details).children('summary:first-child');
+ if(!summary[0]){
+ $(details).prependPolyfill('
'+ options.text +'');
+ summary = $.data(details, 'summaryElement');
+ } else {
+ bindDetailsSummary(summary, details);
+ }
+ }
+ return summary;
+ };
+
+// var isOriginalPrevented = function(e){
+// var src = e.originalEvent;
+// if(!src){return e.isDefaultPrevented();}
+//
+// return src.defaultPrevented || src.returnValue === false ||
+// src.getPreventDefault && src.getPreventDefault();
+// };
+
+ webshims.createElement('summary', function(){
+ var details = isInterActiveSummary(this);
+ if(!details || $.data(this, 'detailsElement')){return;}
+ var timer;
+ var stopNativeClickTest;
+ var tabindex = $.attr(this, 'tabIndex') || '0';
+ bindDetailsSummary(this, details);
+ $(this)
+ .on({
+ 'focus.summaryPolyfill': function(){
+ $(this).addClass('summary-has-focus');
+ },
+ 'blur.summaryPolyfill': function(){
+ $(this).removeClass('summary-has-focus');
+ },
+ 'mouseenter.summaryPolyfill': function(){
+ $(this).addClass('summary-has-hover');
+ },
+ 'mouseleave.summaryPolyfill': function(){
+ $(this).removeClass('summary-has-hover');
+ },
+ 'click.summaryPolyfill': function(e){
+ var details = isInterActiveSummary(this);
+ if(details){
+ if(!stopNativeClickTest && e.originalEvent){
+ stopNativeClickTest = true;
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ $(this).trigger('click');
+ stopNativeClickTest = false;
+ return false;
+ } else {
+ clearTimeout(timer);
+
+ timer = setTimeout(function(){
+ if(!e.isDefaultPrevented()){
+ details.prop('open', !details.prop('open'));
+ }
+ }, 0);
+ }
+ }
+ },
+ 'keydown.summaryPolyfill': function(e){
+ if( (e.keyCode == 13 || e.keyCode == 32) && !e.isDefaultPrevented()){
+ stopNativeClickTest = true;
+ e.preventDefault();
+ $(this).trigger('click');
+ stopNativeClickTest = false;
+ }
+ }
+ })
+ .attr({tabindex: tabindex, role: 'button'})
+ .prepend('
')
+ ;
+ webshims.moveToFirstEvent(this, 'click');
+ });
+
+ var initDetails;
+ webshims.defineNodeNamesBooleanProperty('details', 'open', function(val){
+ var summary = $($.data(this, 'summaryElement'));
+ if(!summary){return;}
+ var action = (val) ? 'removeClass' : 'addClass';
+ var details = $(this);
+ if (!initDetails && options.animate){
+ details.stop().css({width: '', height: ''});
+ var start = {
+ width: details.width(),
+ height: details.height()
+ };
+ }
+ summary.attr('aria-expanded', ''+val);
+ details[action]('closed-details-summary').children().not(summary[0])[action]('closed-details-child');
+ if(!initDetails && options.animate){
+ var end = {
+ width: details.width(),
+ height: details.height()
+ };
+ details.css(start).animate(end, {
+ complete: function(){
+ $(this).css({width: '', height: ''});
+ }
+ });
+ }
+
+ });
+ webshims.createElement('details', function(){
+ initDetails = true;
+ var summary = getSummary(this);
+ $.prop(this, 'open', $.prop(this, 'open'));
+ initDetails = false;
+ });
+});
+;webshims.register('track', function($, webshims, window, document, undefined){
+ "use strict";
+ var mediaelement = webshims.mediaelement;
+ var id = new Date().getTime();
+ //descriptions are not really shown, but they are inserted into the dom
+ var showTracks = {subtitles: 1, captions: 1, descriptions: 1};
+ var dummyTrack = $('
');
+ var support = webshims.support;
+ var supportTrackMod = support.ES5 && support.objectAccessor;
+ var createEventTarget = function(obj){
+ var eventList = {};
+ obj.addEventListener = function(name, fn){
+ if(eventList[name]){
+ webshims.error('always use $.on to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
+ }
+ eventList[name] = fn;
+
+ };
+ obj.removeEventListener = function(name, fn){
+ if(eventList[name] && eventList[name] != fn){
+ webshims.error('always use $.on/$.off to the shimed event: '+ name +' already bound fn was: '+ eventList[name] +' your fn was: '+ fn);
+ }
+ if(eventList[name]){
+ delete eventList[name];
+ }
+ };
+ return obj;
+ };
+
+ var cueListProto = {
+ getCueById: function(id){
+ var cue = null;
+ for(var i = 0, len = this.length; i < len; i++){
+ if(this[i].id === id){
+ cue = this[i];
+ break;
+ }
+ }
+ return cue;
+ }
+ };
+ var numericModes = {
+ 0: 'disabled',
+ 1: 'hidden',
+ 2: 'showing'
+ };
+
+ var textTrackProto = {
+ shimActiveCues: null,
+ _shimActiveCues: null,
+ activeCues: null,
+ cues: null,
+ kind: 'subtitles',
+ label: '',
+ language: '',
+ id: '',
+ mode: 'disabled',
+ oncuechange: null,
+ toString: function() {
+ return "[object TextTrack]";
+ },
+ addCue: function(cue){
+ if(!this.cues){
+ this.cues = mediaelement.createCueList();
+ } else {
+ var lastCue = this.cues[this.cues.length-1];
+ if(lastCue && lastCue.startTime > cue.startTime){
+ webshims.error("cue startTime higher than previous cue's startTime");
+ }
+ }
+ if(cue.track && cue.track.removeCue){
+ cue.track.removeCue(cue);
+ }
+ cue.track = this;
+ this.cues.push(cue);
+ },
+ //ToDo: make it more dynamic
+ removeCue: function(cue){
+ var cues = this.cues || [];
+ var i = 0;
+ var len = cues.length;
+ if(cue.track != this){
+ webshims.error("cue not part of track");
+ return;
+ }
+ for(; i < len; i++){
+ if(cues[i] === cue){
+ cues.splice(i, 1);
+ cue.track = null;
+ break;
+ }
+ }
+ if(cue.track){
+ webshims.error("cue not part of track");
+ return;
+ }
+ }/*,
+ DISABLED: 'disabled',
+ OFF: 'disabled',
+ HIDDEN: 'hidden',
+ SHOWING: 'showing',
+ ERROR: 3,
+ LOADED: 2,
+ LOADING: 1,
+ NONE: 0*/
+ };
+ var copyProps = ['kind', 'label', 'srclang'];
+ var copyName = {srclang: 'language'};
+
+ var updateMediaTrackList = function(baseData, trackList){
+ var removed = [];
+ var added = [];
+ var newTracks = [];
+ var i, len;
+ if(!baseData){
+ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
+ }
+
+ if(!trackList){
+ baseData.blockTrackListUpdate = true;
+ trackList = $.prop(this, 'textTracks');
+ baseData.blockTrackListUpdate = false;
+ }
+
+ clearTimeout(baseData.updateTrackListTimer);
+
+ $('track', this).each(function(){
+ var track = $.prop(this, 'track');
+ newTracks.push(track);
+ if(trackList.indexOf(track) == -1){
+ added.push(track);
+ }
+ });
+
+ if(baseData.scriptedTextTracks){
+ for(i = 0, len = baseData.scriptedTextTracks.length; i < len; i++){
+ newTracks.push(baseData.scriptedTextTracks[i]);
+ if(trackList.indexOf(baseData.scriptedTextTracks[i]) == -1){
+ added.push(baseData.scriptedTextTracks[i]);
+ }
+ }
+ }
+
+ for(i = 0, len = trackList.length; i < len; i++){
+ if(newTracks.indexOf(trackList[i]) == -1){
+ removed.push(trackList[i]);
+ }
+ }
+
+ if(removed.length || added.length){
+ trackList.splice(0);
+
+ for(i = 0, len = newTracks.length; i < len; i++){
+ trackList.push(newTracks[i]);
+ }
+ for(i = 0, len = removed.length; i < len; i++){
+ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]}));
+ }
+ for(i = 0, len = added.length; i < len; i++){
+ $([trackList]).triggerHandler($.Event({type: 'addtrack', track: added[i]}));
+ }
+ if(baseData.scriptedTextTracks || removed.length){
+ $(this).triggerHandler('updatetrackdisplay');
+ }
+ }
+ };
+
+ var refreshTrack = function(track, trackData){
+ if(!trackData){
+ trackData = webshims.data(track, 'trackData');
+ }
+
+ if(trackData && !trackData.isTriggering){
+ trackData.isTriggering = true;
+ setTimeout(function(){
+ $(track).closest('audio, video').triggerHandler('updatetrackdisplay');
+ trackData.isTriggering = false;
+ }, 1);
+ }
+ };
+ var isDefaultTrack = (function(){
+ var defaultKinds = {
+ subtitles: {
+ subtitles: 1,
+ captions: 1
+ },
+ descriptions: {descriptions: 1},
+ chapters: {chapters: 1}
+ };
+ defaultKinds.captions = defaultKinds.subtitles;
+
+ return function(track){
+ var kind, firstDefaultTrack;
+ var isDefault = $.prop(track, 'default');
+ if(isDefault && (kind = $.prop(track, 'kind')) != 'metadata'){
+ firstDefaultTrack = $(track)
+ .parent()
+ .find('track[default]')
+ .filter(function(){
+ return !!(defaultKinds[kind][$.prop(this, 'kind')]);
+ })[0]
+ ;
+ if(firstDefaultTrack != track){
+ isDefault = false;
+ webshims.error('more than one default track of a specific kind detected. Fall back to default = false');
+ }
+ }
+ return isDefault;
+ };
+ })();
+ var emptyDiv = $('
')[0];
+
+ function VTTCue(startTime, endTime, text){
+ if(arguments.length != 3){
+ webshims.error("wrong arguments.length for VTTCue.constructor");
+ }
+
+ this.startTime = startTime;
+ this.endTime = endTime;
+ this.text = text;
+ this.onenter = null;
+ this.onexit = null;
+ this.pauseOnExit = false;
+ this.track = null;
+ this.id = null;
+ this.getCueAsHTML = (function(){
+ var lastText = "";
+ var parsedText = "";
+ var fragment;
+
+ return function(){
+ var i, len;
+ if(!fragment){
+ fragment = document.createDocumentFragment();
+ }
+ if(lastText != this.text){
+ lastText = this.text;
+ parsedText = mediaelement.parseCueTextToHTML(lastText);
+ emptyDiv.innerHTML = parsedText;
+
+ for(i = 0, len = emptyDiv.childNodes.length; i < len; i++){
+ fragment.appendChild(emptyDiv.childNodes[i].cloneNode(true));
+ }
+ }
+ return fragment.cloneNode(true);
+ };
+
+ })();
+ }
+
+ window.VTTCue = VTTCue;
+ window.TextTrackCue = function(){
+ webshims.error("Use VTTCue constructor instead of abstract TextTrackCue constructor.");
+ VTTCue.apply(this, arguments);
+ };
+
+ window.TextTrackCue.prototype = VTTCue.prototype;
+
+ mediaelement.createCueList = function(){
+ return $.extend([], cueListProto);
+ };
+
+ mediaelement.parseCueTextToHTML = (function(){
+ var tagSplits = /(<\/?[^>]+>)/ig;
+ var allowedTags = /^(?:c|v|ruby|rt|b|i|u)/;
+ var regEnd = /\<\s*\//;
+ var addToTemplate = function(localName, attribute, tag, html){
+ var ret;
+ if(regEnd.test(html)){
+ ret = ''+ localName +'>';
+ } else {
+ tag.splice(0, 1);
+ ret = '<'+ localName +' '+ attribute +'="'+ (tag.join(' ').replace(/\"/g, '"')) +'">';
+ }
+ return ret;
+ };
+ var replacer = function(html){
+ var tag = html.replace(/[<\/>]+/ig,"").split(/[\s\.]+/);
+ if(tag[0]){
+ tag[0] = tag[0].toLowerCase();
+ if(allowedTags.test(tag[0])){
+ if(tag[0] == 'c'){
+ html = addToTemplate('span', 'class', tag, html);
+ } else if(tag[0] == 'v'){
+ html = addToTemplate('q', 'title', tag, html);
+ }
+ } else {
+ html = "";
+ }
+ }
+ return html;
+ };
+
+ return function(cueText){
+ return cueText.replace(tagSplits, replacer);
+ };
+ })();
+ var mapTtmlToVtt = function(i){
+ var content = i+'';
+ var begin = this.getAttribute('begin') || '';
+ var end = this.getAttribute('end') || '';
+ var text = $.trim($.text(this));
+ if(!/\./.test(begin)){
+ begin += '.000';
+ }
+ if(!/\./.test(end)){
+ end += '.000';
+ }
+ content += '\n';
+ content += begin +' --> '+end+'\n';
+ content += text;
+ return content;
+ };
+ var ttmlTextToVTT = function(ttml){
+ ttml = $.parseXML(ttml) || [];
+ return $(ttml).find('[begin][end]').map(mapTtmlToVtt).get().join('\n\n') || '';
+ };
+ var loadingTracks = 0;
+
+ mediaelement.loadTextTrack = function(mediaelem, track, trackData, _default){
+ var loadEvents = 'play playing loadedmetadata loadstart';
+ var obj = trackData.track;
+ var load = function(){
+ var error, ajax, createAjax;
+ var isDisabled = obj.mode == 'disabled';
+ var videoState = !!($.prop(mediaelem, 'readyState') > 0 || $.prop(mediaelem, 'networkState') == 2 || !$.prop(mediaelem, 'paused'));
+ var src = (!isDisabled || videoState) && ($.attr(track, 'src') && $.prop(track, 'src'));
+
+ if(src){
+ $(mediaelem).off(loadEvents, load).off('updatetrackdisplay', load);
+
+ if(!trackData.readyState){
+ error = function(){
+ loadingTracks--;
+ trackData.readyState = 3;
+ obj.cues = null;
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = null;
+ $(track).triggerHandler('error');
+ };
+ trackData.readyState = 1;
+ try {
+ obj.cues = mediaelement.createCueList();
+ obj.activeCues = obj.shimActiveCues = obj._shimActiveCues = mediaelement.createCueList();
+ loadingTracks++;
+ createAjax = function(){
+ ajax = $.ajax({
+ dataType: 'text',
+ url: src,
+ success: function(text){
+ loadingTracks--;
+ var contentType = ajax.getResponseHeader('content-type') || '';
+
+ if(!contentType.indexOf('application/xml')){
+ text = ttmlTextToVTT(text);
+ } else if(contentType.indexOf('text/vtt')){
+ webshims.error('set the mime-type of your WebVTT files to text/vtt. see: http://dev.w3.org/html5/webvtt/#text/vtt');
+ }
+ mediaelement.parseCaptions(text, obj, function(cues){
+ if(cues && 'length' in cues){
+ trackData.readyState = 2;
+ $(track).triggerHandler('load');
+ $(mediaelem).triggerHandler('updatetrackdisplay');
+ } else {
+ error();
+ }
+ });
+ },
+ error: error
+ });
+ };
+ if($.ajax && $.ajaxSettings.xhr){
+ if(isDisabled){
+ setTimeout(createAjax, loadingTracks * 2);
+ } else {
+ createAjax();
+ }
+ } else {
+ webshims.ready('jajax', createAjax);
+ webshims.loader.loadList(['jajax']);
+ }
+ } catch(er){
+ error();
+ webshims.error(er);
+ }
+ }
+ }
+ };
+ trackData.readyState = 0;
+ obj.shimActiveCues = null;
+ obj._shimActiveCues = null;
+ obj.activeCues = null;
+ obj.cues = null;
+
+ $(mediaelem).on(loadEvents, load);
+
+ if(_default){
+ obj.mode = showTracks[obj.kind] ? 'showing' : 'hidden';
+ load();
+ } else {
+ $(mediaelem).on('updatetrackdisplay', load);
+ }
+ };
+
+ mediaelement.createTextTrack = function(mediaelem, track){
+ var obj, trackData;
+ if(track.nodeName){
+ trackData = webshims.data(track, 'trackData');
+
+ if(trackData){
+ refreshTrack(track, trackData);
+ obj = trackData.track;
+ }
+ }
+
+ if(!obj){
+ obj = createEventTarget(webshims.objectCreate(textTrackProto));
+
+ if(!supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ var prop = $.prop(track, copyProp);
+ if(prop){
+ obj[copyName[copyProp] || copyProp] = prop;
+ }
+ });
+ }
+
+
+ if(track.nodeName){
+ if(supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
+ get: function(){
+ return $.prop(track, copyProp);
+ }
+ });
+ });
+ }
+ obj.id = $(track).prop('id');
+ trackData = webshims.data(track, 'trackData', {track: obj});
+ mediaelement.loadTextTrack(mediaelem, track, trackData, isDefaultTrack(track));
+ } else {
+ if(supportTrackMod){
+ copyProps.forEach(function(copyProp){
+ webshims.defineProperty(obj, copyName[copyProp] || copyProp, {
+ value: track[copyProp],
+ writeable: false
+ });
+ });
+ }
+ obj.cues = mediaelement.createCueList();
+ obj.activeCues = obj._shimActiveCues = obj.shimActiveCues = mediaelement.createCueList();
+ obj.mode = 'hidden';
+ obj.readyState = 2;
+ }
+ if(obj.kind == 'subtitles' && !obj.language){
+ webshims.error('you must provide a language for track in subtitles state');
+ }
+ obj.__wsmode = obj.mode;
+ }
+
+ return obj;
+ };
+
+
+/*
+taken from:
+Captionator 0.5.1 [CaptionCrunch]
+Christopher Giffard, 2011
+Share and enjoy
+
+https://github.com/cgiffard/Captionator
+
+modified for webshims
+*/
+ mediaelement.parseCaptionChunk = (function(){
+ // Set up timestamp parsers
+ var WebVTTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})\.(\d+)\s*(.*)/;
+ var WebVTTDEFAULTSCueParser = /^(DEFAULTS|DEFAULT)\s+\-\-\>\s+(.*)/g;
+ var WebVTTSTYLECueParser = /^(STYLE|STYLES)\s+\-\-\>\s*\n([\s\S]*)/g;
+ var WebVTTCOMMENTCueParser = /^(COMMENT|COMMENTS)\s+\-\-\>\s+(.*)/g;
+ var SRTTimestampParser = /^(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s+\-\-\>\s+(\d{2})?:?(\d{2}):(\d{2})[\.\,](\d+)\s*(.*)/;
+
+ return function(subtitleElement,objectCount){
+
+ var subtitleParts, timeIn, timeOut, html, timeData, subtitlePartIndex, id;
+ var timestampMatch, tmpCue;
+
+ // WebVTT Special Cue Logic
+ if (WebVTTDEFAULTSCueParser.exec(subtitleElement) || WebVTTCOMMENTCueParser.exec(subtitleElement) || WebVTTSTYLECueParser.exec(subtitleElement)) {
+ return null;
+ }
+
+ subtitleParts = subtitleElement.split(/\n/g);
+
+ // Trim off any blank lines (logically, should only be max. one, but loop to be sure)
+ while (!subtitleParts[0].replace(/\s+/ig,"").length && subtitleParts.length > 0) {
+ subtitleParts.shift();
+ }
+
+ if (subtitleParts[0].match(/^\s*[a-z0-9-\_]+\s*$/ig)) {
+ // The identifier becomes the cue ID (when *we* load the cues from file. Programatically created cues can have an ID of whatever.)
+ id = String(subtitleParts.shift().replace(/\s*/ig,""));
+ }
+
+ for (subtitlePartIndex = 0; subtitlePartIndex < subtitleParts.length; subtitlePartIndex ++) {
+ var timestamp = subtitleParts[subtitlePartIndex];
+
+ if ((timestampMatch = WebVTTTimestampParser.exec(timestamp)) || (timestampMatch = SRTTimestampParser.exec(timestamp))) {
+
+ // WebVTT
+
+ timeData = timestampMatch.slice(1);
+
+ timeIn = parseInt((timeData[0]||0) * 60 * 60,10) + // Hours
+ parseInt((timeData[1]||0) * 60,10) + // Minutes
+ parseInt((timeData[2]||0),10) + // Seconds
+ parseFloat("0." + (timeData[3]||0)); // MS
+
+ timeOut = parseInt((timeData[4]||0) * 60 * 60,10) + // Hours
+ parseInt((timeData[5]||0) * 60,10) + // Minutes
+ parseInt((timeData[6]||0),10) + // Seconds
+ parseFloat("0." + (timeData[7]||0)); // MS
+/*
+ if (timeData[8]) {
+ cueSettings = timeData[8];
+ }
+*/
+ }
+
+ // We've got the timestamp - return all the other unmatched lines as the raw subtitle data
+ subtitleParts = subtitleParts.slice(0,subtitlePartIndex).concat(subtitleParts.slice(subtitlePartIndex+1));
+ break;
+ }
+
+ if (!timeIn && !timeOut) {
+ // We didn't extract any time information. Assume the cue is invalid!
+ webshims.warn("couldn't extract time information: "+[timeIn, timeOut, subtitleParts.join("\n"), id].join(' ; '));
+ return null;
+ }
+/*
+ // Consolidate cue settings, convert defaults to object
+ var compositeCueSettings =
+ cueDefaults
+ .reduce(function(previous,current,index,array){
+ previous[current.split(":")[0]] = current.split(":")[1];
+ return previous;
+ },{});
+
+ // Loop through cue settings, replace defaults with cue specific settings if they exist
+ compositeCueSettings =
+ cueSettings
+ .split(/\s+/g)
+ .filter(function(set) { return set && !!set.length; })
+ // Convert array to a key/val object
+ .reduce(function(previous,current,index,array){
+ previous[current.split(":")[0]] = current.split(":")[1];
+ return previous;
+ },compositeCueSettings);
+
+ // Turn back into string like the VTTCue constructor expects
+ cueSettings = "";
+ for (var key in compositeCueSettings) {
+ if (compositeCueSettings.hasOwnProperty(key)) {
+ cueSettings += !!cueSettings.length ? " " : "";
+ cueSettings += key + ":" + compositeCueSettings[key];
+ }
+ }
+*/
+ // The remaining lines are the subtitle payload itself (after removing an ID if present, and the time);
+ html = subtitleParts.join("\n");
+ tmpCue = new VTTCue(timeIn, timeOut, html);
+ if(id){
+ tmpCue.id = id;
+ }
+ return tmpCue;
+ };
+ })();
+
+ mediaelement.parseCaptions = function(captionData, track, complete) {
+
+ var cue, lazyProcess, regWevVTT, startDate, isWEBVTT;
+
+ mediaelement.createCueList();
+ if (captionData) {
+
+ regWevVTT = /^WEBVTT(\s*FILE)?/ig;
+
+ lazyProcess = function(i, len){
+
+ for(; i < len; i++){
+ cue = captionData[i];
+ if(regWevVTT.test(cue)){
+ isWEBVTT = true;
+ } else if(cue.replace(/\s*/ig,"").length){
+ cue = mediaelement.parseCaptionChunk(cue, i);
+ if(cue){
+ track.addCue(cue);
+ }
+ }
+ if(startDate < (new Date().getTime()) - 30){
+ i++;
+ setTimeout(function(){
+ startDate = new Date().getTime();
+ lazyProcess(i, len);
+ }, 90);
+
+ break;
+ }
+ }
+ if(i >= len){
+ if(!isWEBVTT){
+ webshims.error('please use WebVTT format. This is the standard');
+ }
+ complete(track.cues);
+ }
+ };
+
+ captionData = captionData.replace(/\r\n/g,"\n");
+
+ setTimeout(function(){
+ captionData = captionData.replace(/\r/g,"\n");
+ setTimeout(function(){
+ startDate = new Date().getTime();
+ captionData = captionData.split(/\n\n+/g);
+ lazyProcess(0, captionData.length);
+ }, 9);
+ }, 9);
+
+ } else {
+ webshims.error("Required parameter captionData not supplied.");
+ }
+ };
+
+
+ mediaelement.createTrackList = function(mediaelem, baseData){
+ baseData = baseData || webshims.data(mediaelem, 'mediaelementBase') || webshims.data(mediaelem, 'mediaelementBase', {});
+ if(!baseData.textTracks){
+ baseData.textTracks = [];
+ webshims.defineProperties(baseData.textTracks, {
+ onaddtrack: {value: null},
+ onremovetrack: {value: null},
+ onchange: {value: null},
+ getTrackById: {
+ value: function(id){
+ var track = null;
+ for(var i = 0; i < baseData.textTracks.length; i++){
+ if(id == baseData.textTracks[i].id){
+ track = baseData.textTracks[i];
+ break;
+ }
+ }
+ return track;
+ }
+ }
+ });
+ createEventTarget(baseData.textTracks);
+ $(mediaelem).on('updatetrackdisplay', function(){
+ var track;
+ for(var i = 0; i < baseData.textTracks.length; i++){
+ track = baseData.textTracks[i];
+ if(track.__wsmode != track.mode){
+ track.__wsmode = track.mode;
+ $([ baseData.textTracks ]).triggerHandler('change');
+ }
+ }
+ });
+
+ }
+ return baseData.textTracks;
+ };
+
+ if(!support.track){
+ webshims.defineNodeNamesBooleanProperty(['track'], 'default');
+ webshims.reflectProperties(['track'], ['srclang', 'label']);
+
+ webshims.defineNodeNameProperties('track', {
+ src: {
+ //attr: {},
+ reflect: true,
+ propType: 'src'
+ }
+ });
+ }
+
+ webshims.defineNodeNameProperties('track', {
+ kind: {
+ attr: support.track ? {
+ set: function(value){
+ var trackData = webshims.data(this, 'trackData');
+ this.setAttribute('data-kind', value);
+ if(trackData){
+ trackData.attrKind = value;
+ }
+ },
+ get: function(){
+ var trackData = webshims.data(this, 'trackData');
+ if(trackData && ('attrKind' in trackData)){
+ return trackData.attrKind;
+ }
+ return this.getAttribute('kind');
+ }
+ } : {},
+ reflect: true,
+ propType: 'enumarated',
+ defaultValue: 'subtitles',
+ limitedTo: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata']
+ }
+ });
+
+ $.each(copyProps, function(i, copyProp){
+ var name = copyName[copyProp] || copyProp;
+ webshims.onNodeNamesPropertyModify('track', copyProp, function(){
+ var trackData = webshims.data(this, 'trackData');
+ var track = this;
+ if(trackData){
+ if(copyProp == 'kind'){
+ refreshTrack(this, trackData);
+ }
+ if(!supportTrackMod){
+ trackData.track[name] = $.prop(this, copyProp);
+ }
+ }
+ });
+ });
+
+
+ webshims.onNodeNamesPropertyModify('track', 'src', function(val){
+ if(val){
+ var data = webshims.data(this, 'trackData');
+ var media;
+ if(data){
+ media = $(this).closest('video, audio');
+ if(media[0]){
+ mediaelement.loadTextTrack(media, this, data);
+ }
+ }
+ }
+
+ });
+
+ //
+ webshims.defineNodeNamesProperties(['track'], {
+ ERROR: {
+ value: 3
+ },
+ LOADED: {
+ value: 2
+ },
+ LOADING: {
+ value: 1
+ },
+ NONE: {
+ value: 0
+ },
+ readyState: {
+ get: function(){
+ return (webshims.data(this, 'trackData') || {readyState: 0}).readyState;
+ },
+ writeable: false
+ },
+ track: {
+ get: function(){
+ return mediaelement.createTextTrack($(this).closest('audio, video')[0], this);
+ },
+ writeable: false
+ }
+ }, 'prop');
+
+ webshims.defineNodeNamesProperties(['audio', 'video'], {
+ textTracks: {
+ get: function(){
+ var media = this;
+ var baseData = webshims.data(media, 'mediaelementBase') || webshims.data(media, 'mediaelementBase', {});
+ var tracks = mediaelement.createTrackList(media, baseData);
+ if(!baseData.blockTrackListUpdate){
+ updateMediaTrackList.call(media, baseData, tracks);
+ }
+ return tracks;
+ },
+ writeable: false
+ },
+ addTextTrack: {
+ value: function(kind, label, lang){
+ var textTrack = mediaelement.createTextTrack(this, {
+ kind: dummyTrack.prop('kind', kind || '').prop('kind'),
+ label: label || '',
+ srclang: lang || ''
+ });
+ var baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {});
+ if (!baseData.scriptedTextTracks) {
+ baseData.scriptedTextTracks = [];
+ }
+ baseData.scriptedTextTracks.push(textTrack);
+ updateMediaTrackList.call(this);
+ return textTrack;
+ }
+ }
+ }, 'prop');
+
+ //wsmediareload
+ var thUpdateList = function(e){
+ if($(e.target).is('audio, video')){
+ var baseData = webshims.data(e.target, 'mediaelementBase');
+ if(baseData){
+ clearTimeout(baseData.updateTrackListTimer);
+ baseData.updateTrackListTimer = setTimeout(function(){
+ updateMediaTrackList.call(e.target, baseData);
+ }, 0);
+ }
+ }
+ };
+
+ var getNativeReadyState = function(trackElem, textTrack){
+ return textTrack.readyState || trackElem.readyState;
+ };
+ var stopOriginalEvent = function(e){
+ if(e.originalEvent){
+ e.stopImmediatePropagation();
+ }
+ };
+ var hideNativeTracks = function(){
+ if(webshims.implement(this, 'track')){
+ var kind;
+ var origTrack = this.track;
+ if(origTrack){
+
+ if (!webshims.bugs.track && (origTrack.mode || getNativeReadyState(this, origTrack))) {
+ $.prop(this, 'track').mode = numericModes[origTrack.mode] || origTrack.mode;
+ }
+ //disable track from showing + remove UI
+ kind = $.prop(this, 'kind');
+ origTrack.mode = (typeof origTrack.mode == 'string') ? 'disabled' : 0;
+ this.kind = 'metadata';
+
+ $(this).attr({kind: kind});
+
+ }
+ $(this).on('load error', stopOriginalEvent);
+ }
+ };
+
+ webshims.addReady(function(context, insertedElement){
+ var insertedMedia = insertedElement.filter('video, audio, track').closest('audio, video');
+ $('video, audio', context)
+ .add(insertedMedia)
+ .each(function(){
+ updateMediaTrackList.call(this);
+ })
+ .on('emptied updatetracklist wsmediareload', thUpdateList)
+ .each(function(){
+ if(support.track){
+ var shimedTextTracks = $.prop(this, 'textTracks');
+ var origTextTracks = this.textTracks;
+
+ if(shimedTextTracks.length != origTextTracks.length){
+ webshims.warn("textTracks couldn't be copied");
+ }
+
+ $('track', this).each(hideNativeTracks);
+ }
+ })
+ ;
+
+ insertedMedia.each(function(){
+ var media = this;
+ var baseData = webshims.data(media, 'mediaelementBase');
+ if(baseData){
+ clearTimeout(baseData.updateTrackListTimer);
+ baseData.updateTrackListTimer = setTimeout(function(){
+ updateMediaTrackList.call(media, baseData);
+ }, 9);
+ }
+ });
+ });
+
+ if(support.texttrackapi){
+ $('video, audio').trigger('trackapichange');
+ }
+});
diff --git a/public/webshims/shims/combos/23.js b/public/webshims/shims/combos/23.js
new file mode 100644
index 00000000..3992851a
--- /dev/null
+++ b/public/webshims/shims/combos/23.js
@@ -0,0 +1,759 @@
+/*! SWFMini - a SWFObject 2.2 cut down version for webshims
+ *
+ * based on SWFObject v2.2
+ is released under the MIT License
+*/
+
+var swfmini = function() {
+ var wasRemoved = function(){webshims.error('This method was removed from swfmini');};
+ var UNDEF = "undefined",
+ OBJECT = "object",
+ webshims = window.webshims,
+ SHOCKWAVE_FLASH = "Shockwave Flash",
+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+ FLASH_MIME_TYPE = "application/x-shockwave-flash",
+
+ win = window,
+ doc = document,
+ nav = navigator,
+
+ plugin = false,
+ domLoadFnArr = [main],
+
+ isDomLoaded = false,
+ autoHideShow = true,
+
+ /* Centralized function for browser feature detection
+ - User agent string detection is only used when no good alternative is possible
+ - Is executed directly for optimal performance
+ */
+ ua = function() {
+ var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+ u = nav.userAgent.toLowerCase(),
+ p = nav.platform.toLowerCase(),
+ windows = p ? /win/.test(p) : /win/.test(u),
+ mac = p ? /mac/.test(p) : /mac/.test(u),
+ webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+ ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+ playerVersion = [0,0,0],
+ d = null;
+ if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+ d = nav.plugins[SHOCKWAVE_FLASH].description;
+ if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+ plugin = true;
+ ie = false; // cascaded feature detection for Internet Explorer
+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+ playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+ playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+ playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+ }
+ }
+ else if (typeof win.ActiveXObject != UNDEF) {
+ try {
+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+ if (a) { // a will return null when ActiveX is disabled
+ d = a.GetVariable("$version");
+ if (d) {
+ ie = true; // cascaded feature detection for Internet Explorer
+ d = d.split(" ")[1].split(",");
+ playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ }
+ catch(e) {}
+ }
+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+ }();
+
+
+ function callDomLoadFunctions() {
+ if (isDomLoaded) { return; }
+ isDomLoaded = true;
+ var dl = domLoadFnArr.length;
+ for (var i = 0; i < dl; i++) {
+ domLoadFnArr[i]();
+ }
+ }
+
+ function addDomLoadEvent(fn) {
+ if (isDomLoaded) {
+ fn();
+ }
+ else {
+ domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+ }
+ }
+
+
+ /* Main function
+ - Will preferably execute onDomLoad, otherwise onload (as a fallback)
+ */
+ function main() {
+ if (plugin) {
+ testPlayerVersion();
+ }
+ }
+
+ /* Detect the Flash Player version for non-Internet Explorer browsers
+ - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+ a. Both release and build numbers can be detected
+ b. Avoid wrong descriptions by corrupt installers provided by Adobe
+ c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+ - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+ */
+ function testPlayerVersion() {
+ var b = doc.getElementsByTagName("body")[0];
+ var o = createElement(OBJECT);
+ o.setAttribute("type", FLASH_MIME_TYPE);
+ var t = b.appendChild(o);
+ if (t) {
+ var counter = 0;
+ (function(){
+ if (typeof t.GetVariable != UNDEF) {
+ var d = t.GetVariable("$version");
+ if (d) {
+ d = d.split(" ")[1].split(",");
+ ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+ }
+ }
+ else if (counter < 10) {
+ counter++;
+ setTimeout(arguments.callee, 10);
+ return;
+ }
+ b.removeChild(o);
+ t = null;
+ })();
+ }
+ }
+
+
+ function createElement(el) {
+ return doc.createElement(el);
+ }
+
+
+ /* Flash Player and SWF content version matching
+ */
+ function hasPlayerVersion(rv) {
+ var pv = ua.pv, v = rv.split(".");
+ v[0] = parseInt(v[0], 10);
+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+ v[2] = parseInt(v[2], 10) || 0;
+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+ }
+
+
+
+
+
+ webshims.ready('DOM', callDomLoadFunctions);
+
+ webshims.loader.addModule('swfmini-embed', {d: ['swfmini']});
+ var loadEmbed = hasPlayerVersion('9.0.0') ?
+ function(){
+ webshims.loader.loadList(['swfmini-embed']);
+ return true;
+ } :
+ webshims.$.noop
+ ;
+
+ if(!webshims.support.mediaelement){
+ loadEmbed();
+ } else {
+ webshims.ready('WINDOWLOAD', loadEmbed);
+ }
+
+ return {
+ /* Public API
+ - Reference: http://code.google.com/p/swfobject/wiki/documentation
+ */
+ registerObject: wasRemoved,
+
+ getObjectById: wasRemoved,
+
+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+ var args = arguments;
+ if(loadEmbed()){
+ webshims.ready('swfmini-embed', function(){
+ swfmini.embedSWF.apply(swfmini, args);
+ });
+ } else if(callbackFn) {
+ callbackFn({success:false, id:replaceElemIdStr});
+ }
+ },
+
+ switchOffAutoHideShow: function() {
+ autoHideShow = false;
+ },
+
+ ua: ua,
+
+ getFlashPlayerVersion: function() {
+ return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+ },
+
+ hasFlashPlayerVersion: hasPlayerVersion,
+
+ createSWF: function(attObj, parObj, replaceElemIdStr) {
+ if (ua.w3) {
+ return createSWF(attObj, parObj, replaceElemIdStr);
+ }
+ else {
+ return undefined;
+ }
+ },
+
+ showExpressInstall: wasRemoved,
+
+ removeSWF: wasRemoved,
+
+ createCSS: wasRemoved,
+
+ addDomLoadEvent: addDomLoadEvent,
+
+ addLoadEvent: wasRemoved,
+
+
+ // For internal usage only
+ expressInstallCallback: wasRemoved
+ };
+}();
+
+webshims.isReady('swfmini', true);
+;(function(webshims){
+ "use strict";
+ var support = webshims.support;
+ var hasNative = support.mediaelement;
+ var supportsLoop = false;
+ var bugs = webshims.bugs;
+ var swfType = 'mediaelement-jaris';
+ var loadSwf = function(){
+ webshims.ready(swfType, function(){
+ if(!webshims.mediaelement.createSWF){
+ webshims.mediaelement.loadSwf = true;
+ webshims.reTest([swfType], hasNative);
+ }
+ });
+ };
+
+ var wsCfg = webshims.cfg;
+ var options = wsCfg.mediaelement;
+ var isIE = navigator.userAgent.indexOf('MSIE') != -1;
+ if(!options){
+ webshims.error("mediaelement wasn't implemented but loaded");
+ return;
+ }
+
+ if(hasNative){
+ var videoElem = document.createElement('video');
+ support.videoBuffered = ('buffered' in videoElem);
+ support.mediaDefaultMuted = ('defaultMuted' in videoElem);
+ supportsLoop = ('loop' in videoElem);
+ support.mediaLoop = supportsLoop;
+
+ webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']);
+
+ if( !support.videoBuffered || !supportsLoop || (!support.mediaDefaultMuted && isIE && 'ActiveXObject' in window) ){
+ webshims.addPolyfill('mediaelement-native-fix', {
+ d: ['dom-support']
+ });
+ webshims.loader.loadList(['mediaelement-native-fix']);
+ }
+ }
+
+ if(support.track && !bugs.track){
+ (function(){
+ if(!bugs.track){
+
+ if(window.VTTCue && !window.TextTrackCue){
+ window.TextTrackCue = window.VTTCue;
+ } else if(!window.VTTCue){
+ window.VTTCue = window.TextTrackCue;
+ }
+
+ try {
+ new VTTCue(2, 3, '');
+ } catch(e){
+ bugs.track = true;
+ }
+ }
+ })();
+ }
+
+webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){
+ var hasSwf = swfmini.hasFlashPlayerVersion('10.0.3');
+ var mediaelement = webshims.mediaelement;
+
+ mediaelement.parseRtmp = function(data){
+ var src = data.src.split('://');
+ var paths = src[1].split('/');
+ var i, len, found;
+ data.server = src[0]+'://'+paths[0]+'/';
+ data.streamId = [];
+ for(i = 1, len = paths.length; i < len; i++){
+ if(!found && paths[i].indexOf(':') !== -1){
+ paths[i] = paths[i].split(':')[1];
+ found = true;
+ }
+ if(!found){
+ data.server += paths[i]+'/';
+ } else {
+ data.streamId.push(paths[i]);
+ }
+ }
+ if(!data.streamId.length){
+ webshims.error('Could not parse rtmp url');
+ }
+ data.streamId = data.streamId.join('/');
+ };
+
+ var getSrcObj = function(elem, nodeName){
+ elem = $(elem);
+ var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')};
+ var tmp;
+
+ if(!src.src){return src;}
+
+ tmp = elem.attr('data-server');
+ if(tmp != null){
+ src.server = tmp;
+ }
+
+ tmp = elem.attr('type') || elem.attr('data-type');
+ if(tmp){
+ src.type = tmp;
+ src.container = $.trim(tmp.split(';')[0]);
+ } else {
+ if(!nodeName){
+ nodeName = elem[0].nodeName.toLowerCase();
+ if(nodeName == 'source'){
+ nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase();
+ }
+ }
+ if(src.server){
+ src.type = nodeName+'/rtmp';
+ src.container = nodeName+'/rtmp';
+ } else {
+
+ tmp = mediaelement.getTypeForSrc( src.src, nodeName, src );
+
+ if(tmp){
+ src.type = tmp;
+ src.container = tmp;
+ }
+ }
+ }
+
+ tmp = elem.attr('media');
+ if(tmp){
+ src.media = tmp;
+ }
+ if(src.type == 'audio/rtmp' || src.type == 'video/rtmp'){
+ if(src.server){
+ src.streamId = src.src;
+ } else {
+ mediaelement.parseRtmp(src);
+ }
+ }
+ return src;
+ };
+
+
+
+ var hasYt = !hasSwf && ('postMessage' in window) && hasNative;
+
+ var loadTrackUi = function(){
+ if(loadTrackUi.loaded){return;}
+ loadTrackUi.loaded = true;
+ if(!options.noAutoTrack){
+ webshims.ready('WINDOWLOAD', function(){
+ loadThird();
+ webshims.loader.loadList(['track-ui']);
+ });
+ }
+ };
+
+ var loadYt = (function(){
+ var loaded;
+ return function(){
+ if(loaded || !hasYt){return;}
+ loaded = true;
+ webshims.loader.loadScript("https://www.youtube.com/player_api");
+ $(function(){
+ webshims._polyfill(["mediaelement-yt"]);
+ });
+ };
+ })();
+ var loadThird = function(){
+ if(hasSwf){
+ loadSwf();
+ } else {
+ loadYt();
+ }
+ };
+
+ webshims.addPolyfill('mediaelement-yt', {
+ test: !hasYt,
+ d: ['dom-support']
+ });
+
+
+
+ mediaelement.mimeTypes = {
+ audio: {
+ //ogm shouldn´t be used!
+ 'audio/ogg': ['ogg','oga', 'ogm'],
+ 'audio/ogg;codecs="opus"': 'opus',
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
+ 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'],
+ 'audio/wav': ['wav'],
+ 'audio/3gpp': ['3gp','3gpp'],
+ 'audio/webm': ['webm'],
+ 'audio/fla': ['flv', 'f4a', 'fla'],
+ 'application/x-mpegURL': ['m3u8', 'm3u']
+ },
+ video: {
+ //ogm shouldn´t be used!
+ 'video/ogg': ['ogg','ogv', 'ogm'],
+ 'video/mpeg': ['mpg','mpeg','mpe'],
+ 'video/mp4': ['mp4','mpg4', 'm4v'],
+ 'video/quicktime': ['mov','qt'],
+ 'video/x-msvideo': ['avi'],
+ 'video/x-ms-asf': ['asf', 'asx'],
+ 'video/flv': ['flv', 'f4v'],
+ 'video/3gpp': ['3gp','3gpp'],
+ 'video/webm': ['webm'],
+ 'application/x-mpegURL': ['m3u8', 'm3u'],
+ 'video/MP2T': ['ts']
+ }
+ }
+ ;
+
+ mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video);
+
+ mediaelement.getTypeForSrc = function(src, nodeName){
+ if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){
+ return 'video/youtube';
+ }
+ if(src.indexOf('rtmp') === 0){
+ return nodeName+'/rtmp';
+ }
+ src = src.split('?')[0].split('#')[0].split('.');
+ src = src[src.length - 1];
+ var mt;
+
+ $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){
+ if(exts.indexOf(src) !== -1){
+ mt = mimeType;
+ return false;
+ }
+ });
+ return mt;
+ };
+
+
+ mediaelement.srces = function(mediaElem, srces){
+ mediaElem = $(mediaElem);
+ if(!srces){
+ srces = [];
+ var nodeName = mediaElem[0].nodeName.toLowerCase();
+ var src = getSrcObj(mediaElem, nodeName);
+
+ if(!src.src){
+ $('source', mediaElem).each(function(){
+ src = getSrcObj(this, nodeName);
+ if(src.src){srces.push(src);}
+ });
+ } else {
+ srces.push(src);
+ }
+ return srces;
+ } else {
+ webshims.error('setting sources was removed.');
+ }
+ };
+
+ mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp'];
+
+ mediaelement.canThirdPlaySrces = function(mediaElem, srces){
+ var ret = '';
+ if(hasSwf || hasYt){
+ mediaElem = $(mediaElem);
+ srces = srces || mediaelement.srces(mediaElem);
+ $.each(srces, function(i, src){
+ if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){
+ ret = src;
+ return false;
+ }
+ });
+
+ }
+
+ return ret;
+ };
+
+ var nativeCanPlayType = {};
+ mediaelement.canNativePlaySrces = function(mediaElem, srces){
+ var ret = '';
+ if(hasNative){
+ mediaElem = $(mediaElem);
+ var nodeName = (mediaElem[0].nodeName || '').toLowerCase();
+ var nativeCanPlay = (nativeCanPlayType[nodeName] || {prop: {_supvalue: false}}).prop._supvalue || mediaElem[0].canPlayType;
+ if(!nativeCanPlay){return ret;}
+ srces = srces || mediaelement.srces(mediaElem);
+
+ $.each(srces, function(i, src){
+ if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){
+ ret = src;
+ return false;
+ }
+ });
+ }
+ return ret;
+ };
+ var emptyType = (/^\s*application\/octet\-stream\s*$/i);
+ var getRemoveEmptyType = function(){
+ var ret = emptyType.test($.attr(this, 'type') || '');
+ if(ret){
+ $(this).removeAttr('type');
+ }
+ return ret;
+ };
+ mediaelement.setError = function(elem, message){
+ if($('source', elem).filter(getRemoveEmptyType).length){
+ webshims.error('"application/octet-stream" is a useless mimetype for audio/video. Please change this attribute.');
+ try {
+ $(elem).mediaLoad();
+ } catch(er){}
+ } else {
+ if(!message){
+ message = "can't play sources";
+ }
+ $(elem).pause().data('mediaerror', message);
+ webshims.error('mediaelementError: '+ message +'. Run the following line in your console to get more info: webshim.mediaelement.loadDebugger();');
+ setTimeout(function(){
+ if($(elem).data('mediaerror')){
+ $(elem).addClass('media-error').trigger('mediaerror');
+ }
+ }, 1);
+ }
+
+
+ };
+
+ var handleThird = (function(){
+ var requested;
+ var readyType = hasSwf ? swfType : 'mediaelement-yt';
+ return function( mediaElem, ret, data ){
+ //readd to ready
+
+ webshims.ready(readyType, function(){
+ if(mediaelement.createSWF && $(mediaElem).parent()[0]){
+ mediaelement.createSWF( mediaElem, ret, data );
+ } else if(!requested) {
+ requested = true;
+ loadThird();
+
+ handleThird( mediaElem, ret, data );
+ }
+ });
+ if(!requested && hasYt && !mediaelement.createSWF){
+ loadYt();
+ }
+ };
+ })();
+
+ var activate = {
+ native: function(elem, src, data){
+ if(data && data.isActive == 'third') {
+ mediaelement.setActive(elem, 'html5', data);
+ }
+ },
+ third: handleThird
+ };
+
+ var stepSources = function(elem, data, srces){
+ var i, src;
+ var testOrder = [{test: 'canNativePlaySrces', activate: 'native'}, {test: 'canThirdPlaySrces', activate: 'third'}];
+ if(options.preferFlash || (data && data.isActive == 'third') ){
+ testOrder.reverse();
+ }
+ for(i = 0; i < 2; i++){
+ src = mediaelement[testOrder[i].test](elem, srces);
+ if(src){
+ activate[testOrder[i].activate](elem, src, data);
+ break;
+ }
+ }
+
+ if(!src){
+ mediaelement.setError(elem, false);
+ if(data && data.isActive == 'third') {
+ mediaelement.setActive(elem, 'html5', data);
+ }
+ }
+ };
+ var stopParent = /^(?:embed|object|datalist|picture)$/i;
+ var selectSource = function(elem, data){
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
+ var _srces = mediaelement.srces(elem);
+ var parent = elem.parentNode;
+
+ clearTimeout(baseData.loadTimer);
+ $(elem).removeClass('media-error');
+ $.data(elem, 'mediaerror', false);
+
+ if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;}
+ data = data || webshims.data(elem, 'mediaelement');
+ if(mediaelement.sortMedia){
+ _srces.sort(mediaelement.sortMedia);
+ }
+ stepSources(elem, data, _srces);
+
+ };
+ mediaelement.selectSource = selectSource;
+
+
+ $(document).on('ended', function(e){
+ var data = webshims.data(e.target, 'mediaelement');
+ if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;}
+ setTimeout(function(){
+ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;}
+ $(e.target).prop('currentTime', 0).play();
+ });
+
+ });
+
+ var handleMedia = false;
+
+ var initMediaElements = function(){
+ var testFixMedia = function(){
+
+ if(webshims.implement(this, 'mediaelement')){
+ selectSource(this);
+ if(!support.mediaDefaultMuted && $.attr(this, 'muted') != null){
+ $.prop(this, 'muted', true);
+ }
+
+ }
+ };
+
+ webshims.ready('dom-support', function(){
+ handleMedia = true;
+
+ if(!supportsLoop){
+ webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop');
+ }
+
+ ['audio', 'video'].forEach(function(nodeName){
+ var supLoad;
+ supLoad = webshims.defineNodeNameProperty(nodeName, 'load', {
+ prop: {
+ value: function(){
+ var data = webshims.data(this, 'mediaelement');
+
+ selectSource(this, data);
+ if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){
+ supLoad.prop._supvalue.apply(this, arguments);
+ }
+ if(!loadTrackUi.loaded && this.querySelector('track')){
+ loadTrackUi();
+ }
+ $(this).triggerHandler('wsmediareload');
+ }
+ }
+ });
+
+ nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', {
+ prop: {
+ value: function(type){
+ var ret = '';
+ if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){
+ ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type);
+ if(ret == 'no'){
+ ret = '';
+ }
+ }
+ if(!ret && hasSwf){
+ type = $.trim((type || '').split(';')[0]);
+ if(mediaelement.swfMimeTypes.indexOf(type) != -1){
+ ret = 'maybe';
+ }
+ }
+ if(!ret && hasYt && type == 'video/youtube'){
+ ret = 'maybe';
+ }
+ return ret;
+ }
+ }
+ });
+ });
+
+
+ webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], {
+ set: function(){
+ var elem = this;
+ var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {});
+ clearTimeout(baseData.loadTimer);
+ baseData.loadTimer = setTimeout(function(){
+ selectSource(elem);
+ elem = null;
+ }, 9);
+ }
+ });
+
+
+ webshims.addReady(function(context, insertedElement){
+ var media = $('video, audio', context)
+ .add(insertedElement.filter('video, audio'))
+ .each(testFixMedia)
+ ;
+ if(!loadTrackUi.loaded && $('track', media).length){
+ loadTrackUi();
+ }
+ media = null;
+ });
+ });
+
+ if(hasNative && !handleMedia){
+ webshims.addReady(function(context, insertedElement){
+ if(!handleMedia){
+ $('video, audio', context)
+ .add(insertedElement.filter('video, audio'))
+ .each(function(){
+ if(!mediaelement.canNativePlaySrces(this)){
+ loadThird();
+ handleMedia = true;
+ return false;
+ }
+ })
+ ;
+ }
+ });
+ }
+ };
+
+ mediaelement.loadDebugger = function(){
+ webshims.ready('dom-support', function(){
+ webshims.loader.loadScript('mediaelement-debug');
+ });
+ };
+
+ if(({noCombo: 1, media: 1})[webshims.cfg.debug]){
+ $(document).on('mediaerror', function(e){
+ mediaelement.loadDebugger();
+ });
+ }
+ //set native implementation ready, before swf api is retested
+ if(hasNative){
+ webshims.isReady('mediaelement-core', true);
+ initMediaElements();
+ webshims.ready('WINDOWLOAD mediaelement', loadThird);
+ } else {
+ webshims.ready(swfType, initMediaElements);
+ }
+ webshims.ready('track', loadTrackUi);
+});
+
+})(webshims);
diff --git a/public/webshims/shims/combos/25.js b/public/webshims/shims/combos/25.js
new file mode 100644
index 00000000..1ea35b04
--- /dev/null
+++ b/public/webshims/shims/combos/25.js
@@ -0,0 +1,2927 @@
+
+//this might was already extended by ES5 shim feature
+(function($){
+ "use strict";
+ var webshims = window.webshims;
+ if(webshims.defineProperties){return;}
+ var defineProperty = 'defineProperty';
+ var has = Object.prototype.hasOwnProperty;
+ var descProps = ['configurable', 'enumerable', 'writable'];
+ var extendUndefined = function(prop){
+ for(var i = 0; i < 3; i++){
+ if(prop[descProps[i]] === undefined && (descProps[i] !== 'writable' || prop.value !== undefined)){
+ prop[descProps[i]] = true;
+ }
+ }
+ };
+
+ var extendProps = function(props){
+ if(props){
+ for(var i in props){
+ if(has.call(props, i)){
+ extendUndefined(props[i]);
+ }
+ }
+ }
+ };
+
+ if(Object.create){
+ webshims.objectCreate = function(proto, props, opts){
+ extendProps(props);
+ var o = Object.create(proto, props);
+ if(opts){
+ o.options = $.extend(true, {}, o.options || {}, opts);
+ opts = o.options;
+ }
+ if(o._create && $.isFunction(o._create)){
+ o._create(opts);
+ }
+ return o;
+ };
+ }
+
+ if(Object[defineProperty]){
+ webshims[defineProperty] = function(obj, prop, desc){
+ extendUndefined(desc);
+ return Object[defineProperty](obj, prop, desc);
+ };
+ }
+ if(Object.defineProperties){
+ webshims.defineProperties = function(obj, props){
+ extendProps(props);
+ return Object.defineProperties(obj, props);
+ };
+ }
+ webshims.getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+ webshims.getPrototypeOf = Object.getPrototypeOf;
+})(window.webshims.$);
+//DOM-Extension helper
+webshims.register('dom-extend', function($, webshims, window, document, undefined){
+ "use strict";
+ var supportHrefNormalized = !('hrefNormalized' in $.support) || $.support.hrefNormalized;
+ var supportGetSetAttribute = !('getSetAttribute' in $.support) || $.support.getSetAttribute;
+ var has = Object.prototype.hasOwnProperty;
+ webshims.assumeARIA = true;
+
+ if($('').attr('type') == 'text' || $('').attr('novalidate') === "" || ('required' in $('')[0].attributes)){
+ webshims.error("IE browser modes are busted in IE10+. Please test your HTML/CSS/JS with a real IE version or at least IETester or similiar tools");
+ }
+
+ if('debug' in webshims){
+ webshims.error('Use webshims.setOptions("debug", true||false||"noCombo"); to debug flag');
+ }
+
+ if (!webshims.cfg.no$Switch) {
+ var switch$ = function(){
+ if (window.jQuery && (!window.$ || window.jQuery == window.$) && !window.jQuery.webshims) {
+ webshims.error("jQuery was included more than once. Make sure to include it only once or try the $.noConflict(extreme) feature! Webshims and other Plugins might not work properly. Or set webshims.cfg.no$Switch to 'true'.");
+ if (window.$) {
+ window.$ = webshims.$;
+ }
+ window.jQuery = webshims.$;
+ }
+ };
+ switch$();
+ setTimeout(switch$, 90);
+ webshims.ready('DOM', switch$);
+ $(switch$);
+ webshims.ready('WINDOWLOAD', switch$);
+
+ }
+
+ //shortcus
+ var modules = webshims.modules;
+ var listReg = /\s*,\s*/;
+
+ //proxying attribute
+ var olds = {};
+ var havePolyfill = {};
+ var hasPolyfillMethod = {};
+ var extendedProps = {};
+ var extendQ = {};
+ var modifyProps = {};
+
+ var oldVal = $.fn.val;
+ var singleVal = function(elem, name, val, pass, _argless){
+ return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val);
+ };
+
+ //jquery mobile and jquery ui
+ if(!$.widget){
+ (function(){
+ var _cleanData = $.cleanData;
+ $.cleanData = function( elems ) {
+ if(!$.widget){
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ try {
+ $( elem ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
+ }
+ }
+ _cleanData( elems );
+ };
+ })();
+ }
+
+
+ $.fn.val = function(val){
+ var elem = this[0];
+ if(arguments.length && val == null){
+ val = '';
+ }
+ if(!arguments.length){
+ if(!elem || elem.nodeType !== 1){return oldVal.call(this);}
+ return $.prop(elem, 'value', val, 'val', true);
+ }
+ if($.isArray(val)){
+ return oldVal.apply(this, arguments);
+ }
+ var isFunction = $.isFunction(val);
+ return this.each(function(i){
+ elem = this;
+ if(elem.nodeType === 1){
+ if(isFunction){
+ var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true));
+ if(genVal == null){
+ genVal = '';
+ }
+ $.prop(elem, 'value', genVal, 'val') ;
+ } else {
+ $.prop(elem, 'value', val, 'val');
+ }
+ }
+ });
+ };
+ $.fn.onTrigger = function(evt, fn){
+ return this.on(evt, fn).each(fn);
+ };
+
+ $.fn.onWSOff = function(evt, fn, trigger, evtDel){
+ if(!evtDel){
+ evtDel = document;
+ }
+ $(evtDel)[trigger ? 'onTrigger' : 'on'](evt, fn);
+ this.on('remove', function(e){
+ if(!e.originalEvent){
+ $(evtDel).off(evt, fn);
+ }
+ });
+ return this;
+ };
+ var idCount = 0;
+ var dataID = '_webshims'+ (Math.round(Math.random() * 1000));
+ var elementData = function(elem, key, val){
+ elem = elem.jquery ? elem[0] : elem;
+ if(!elem){return val || {};}
+ var data = $.data(elem, dataID);
+ if(val !== undefined){
+ if(!data){
+ data = $.data(elem, dataID, {});
+ }
+ if(key){
+ data[key] = val;
+ }
+ }
+
+ return key ? data && data[key] : data;
+ };
+
+
+ [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){
+ $.fn[data.name] = function(){
+ var elems = [];
+ this.each(function(){
+ var shadowData = elementData(this, 'shadowData');
+ var elem = shadowData && shadowData[data.prop] || this;
+ if($.inArray(elem, elems) == -1){
+ elems.push(elem);
+ }
+ });
+ return this.pushStack(elems);
+ };
+ });
+
+ function clone(elem, dataAndEvents, uniqueIds){
+ var cloned = $.clone( elem, dataAndEvents, false );
+ $(cloned.querySelectorAll('.'+webshims.shadowClass)).detach();
+ if(uniqueIds){
+ idCount++;
+ $(cloned.querySelectorAll('[id]')).prop('id', function(i, id){
+ return id +idCount;
+ });
+ } else {
+ $(cloned.querySelectorAll('audio[id^="ID-"], video[id^="ID-"], label[id^="ID-"]')).removeAttr('id');
+ }
+ return cloned;
+ }
+
+ $.fn.clonePolyfill = function(dataAndEvents, uniqueIds){
+ dataAndEvents = dataAndEvents || false;
+ return this
+ .map(function() {
+ var cloned = clone( this, dataAndEvents, uniqueIds );
+ setTimeout(function(){
+ if($.contains(document.body, cloned)){
+ $(cloned).updatePolyfill();
+ }
+ });
+ return cloned;
+ })
+ ;
+ };
+
+ //add support for $('video').trigger('play') in case extendNative is set to false
+ if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){
+ (function(oldTrigger){
+ $.event.trigger = function(event, data, elem, onlyHandlers){
+
+ if(!hasPolyfillMethod[event] || onlyHandlers || !elem || elem.nodeType !== 1){
+ return oldTrigger.apply(this, arguments);
+ }
+ var ret, isOrig, origName;
+ var origFn = elem[event];
+ var polyfilledFn = $.prop(elem, event);
+ var changeFn = polyfilledFn && origFn != polyfilledFn;
+ if(changeFn){
+ origName = '__ws'+event;
+ isOrig = (event in elem) && has.call(elem, event);
+ elem[event] = polyfilledFn;
+ elem[origName] = origFn;
+ }
+
+ ret = oldTrigger.apply(this, arguments);
+ if (changeFn) {
+ if(isOrig){
+ elem[event] = origFn;
+ } else {
+ delete elem[event];
+ }
+ delete elem[origName];
+ }
+
+ return ret;
+ };
+ })($.event.trigger);
+ }
+
+ ['removeAttr', 'prop', 'attr'].forEach(function(type){
+ olds[type] = $[type];
+ $[type] = function(elem, name, value, pass, _argless){
+ var isVal = (pass == 'val');
+ var oldMethod = !isVal ? olds[type] : singleVal;
+ if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){
+ return oldMethod(elem, name, value, pass, _argless);
+ }
+
+ var nodeName = (elem.nodeName || '').toLowerCase();
+ var desc = extendedProps[nodeName];
+ var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type;
+ var propMethod;
+ var oldValMethod;
+ var ret;
+
+
+ if(!desc){
+ desc = extendedProps['*'];
+ }
+ if(desc){
+ desc = desc[name];
+ }
+
+ if(desc){
+ propMethod = desc[curType];
+ }
+
+ if(propMethod){
+ if(name == 'value'){
+ oldValMethod = propMethod.isVal;
+ propMethod.isVal = isVal;
+ }
+ if(curType === 'removeAttr'){
+ return propMethod.value.call(elem);
+ } else if(value === undefined){
+ return (propMethod.get) ?
+ propMethod.get.call(elem) :
+ propMethod.value
+ ;
+ } else if(propMethod.set) {
+ if(type == 'attr' && value === true){
+ value = name;
+ }
+
+ ret = propMethod.set.call(elem, value);
+ }
+ if(name == 'value'){
+ propMethod.isVal = oldValMethod;
+ }
+ } else {
+ ret = oldMethod(elem, name, value, pass, _argless);
+ }
+ if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){
+
+ var boolValue;
+ if(curType == 'removeAttr'){
+ boolValue = false;
+ } else if(curType == 'prop'){
+ boolValue = !!(value);
+ } else {
+ boolValue = true;
+ }
+
+ modifyProps[nodeName][name].forEach(function(fn){
+ if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){
+ fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type);
+ }
+ });
+ }
+ return ret;
+ };
+
+ extendQ[type] = function(nodeName, prop, desc){
+
+ if(!extendedProps[nodeName]){
+ extendedProps[nodeName] = {};
+ }
+ if(!extendedProps[nodeName][prop]){
+ extendedProps[nodeName][prop] = {};
+ }
+ var oldDesc = extendedProps[nodeName][prop][type];
+ var getSup = function(propType, descriptor, oDesc){
+ var origProp;
+ if(descriptor && descriptor[propType]){
+ return descriptor[propType];
+ }
+ if(oDesc && oDesc[propType]){
+ return oDesc[propType];
+ }
+ if(type == 'prop' && prop == 'value'){
+ return function(value){
+ var elem = this;
+ return (desc.isVal) ?
+ singleVal(elem, prop, value, false, (arguments.length === 0)) :
+ olds[type](elem, prop, value)
+ ;
+ };
+ }
+ if(type == 'prop' && propType == 'value' && desc.value.apply){
+ origProp = '__ws'+prop;
+ hasPolyfillMethod[prop] = true;
+ return function(value){
+ var sup = this[origProp] || olds[type](this, prop);
+ if(sup && sup.apply){
+ sup = sup.apply(this, arguments);
+ }
+ return sup;
+ };
+ }
+ return function(value){
+ return olds[type](this, prop, value);
+ };
+ };
+ extendedProps[nodeName][prop][type] = desc;
+ if(desc.value === undefined){
+ if(!desc.set){
+ desc.set = desc.writeable ?
+ getSup('set', desc, oldDesc) :
+ (webshims.cfg.useStrict && prop == 'prop') ?
+ function(){throw(prop +' is readonly on '+ nodeName);} :
+ function(){webshims.info(prop +' is readonly on '+ nodeName);}
+ ;
+ }
+ if(!desc.get){
+ desc.get = getSup('get', desc, oldDesc);
+ }
+
+ }
+
+ ['value', 'get', 'set'].forEach(function(descProp){
+ if(desc[descProp]){
+ desc['_sup'+descProp] = getSup(descProp, oldDesc);
+ }
+ });
+ };
+
+ });
+
+ var extendNativeValue = (function(){
+ var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar'));
+
+ //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc
+ var isExtendNativeSave = webshims.support.advancedObjectProperties && webshims.support.objectAccessor;
+ return function(nodeName, prop, desc){
+ var elem , elemProto;
+ if( isExtendNativeSave && (elem = document.createElement(nodeName)) && (elemProto = webshims.getPrototypeOf(elem)) && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){
+ var sup = elem[prop];
+ desc._supvalue = function(){
+ if(sup && sup.apply){
+ return sup.apply(this, arguments);
+ }
+ return sup;
+ };
+ elemProto[prop] = desc.value;
+ } else {
+ desc._supvalue = function(){
+ var data = elementData(this, 'propValue');
+ if(data && data[prop] && data[prop].apply){
+ return data[prop].apply(this, arguments);
+ }
+ return data && data[prop];
+ };
+ initProp.extendValue(nodeName, prop, desc.value);
+ }
+ desc.value._supvalue = desc._supvalue;
+ };
+ })();
+
+ var initProp = (function(){
+
+ var initProps = {};
+
+ webshims.addReady(function(context, contextElem){
+ var nodeNameCache = {};
+ var getElementsByName = function(name){
+ if(!nodeNameCache[name]){
+ nodeNameCache[name] = $(context.getElementsByTagName(name));
+ if(contextElem[0] && $.nodeName(contextElem[0], name)){
+ nodeNameCache[name] = nodeNameCache[name].add(contextElem);
+ }
+ }
+ };
+
+
+ $.each(initProps, function(name, fns){
+ getElementsByName(name);
+ if(!fns || !fns.forEach){
+ webshims.warn('Error: with '+ name +'-property. methods: '+ fns);
+ return;
+ }
+ fns.forEach(function(fn){
+ nodeNameCache[name].each(fn);
+ });
+ });
+ nodeNameCache = null;
+ });
+
+ var tempCache;
+ var emptyQ = $([]);
+ var createNodeNameInit = function(nodeName, fn){
+ if(!initProps[nodeName]){
+ initProps[nodeName] = [fn];
+ } else {
+ initProps[nodeName].push(fn);
+ }
+ if($.isDOMReady){
+ (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn);
+ }
+ };
+
+ var elementExtends = {};
+ return {
+ createTmpCache: function(nodeName){
+ if($.isDOMReady){
+ tempCache = tempCache || $( document.getElementsByTagName(nodeName) );
+ }
+ return tempCache || emptyQ;
+ },
+ flushTmpCache: function(){
+ tempCache = null;
+ },
+ content: function(nodeName, prop){
+ createNodeNameInit(nodeName, function(){
+ var val = $.attr(this, prop);
+ if(val != null){
+ $.attr(this, prop, val);
+ }
+ });
+ },
+ createElement: function(nodeName, fn){
+ createNodeNameInit(nodeName, fn);
+ },
+ extendValue: function(nodeName, prop, value){
+ createNodeNameInit(nodeName, function(){
+ $(this).each(function(){
+ var data = elementData(this, 'propValue', {});
+ data[prop] = this[prop];
+ this[prop] = value;
+ });
+ });
+ }
+ };
+ })();
+
+ var createPropDefault = function(descs, removeType){
+ if(descs.defaultValue === undefined){
+ descs.defaultValue = '';
+ }
+ if(!descs.removeAttr){
+ descs.removeAttr = {
+ value: function(){
+ descs[removeType || 'prop'].set.call(this, descs.defaultValue);
+ descs.removeAttr._supvalue.call(this);
+ }
+ };
+ }
+ if(!descs.attr){
+ descs.attr = {};
+ }
+ };
+
+ $.extend(webshims, {
+ getID: (function(){
+ var ID = new Date().getTime();
+ return function(elem){
+ elem = $(elem);
+ var id = elem.prop('id');
+ if(!id){
+ ID++;
+ id = 'ID-'+ ID;
+ elem.eq(0).prop('id', id);
+ }
+ return id;
+ };
+ })(),
+ shadowClass: 'wsshadow-'+(Date.now()),
+ implement: function(elem, type){
+ var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {});
+ if(data[type]){
+ webshims.warn(type +' already implemented for element #'+elem.id);
+ return false;
+ }
+ data[type] = true;
+ return true;
+ },
+ extendUNDEFProp: function(obj, props){
+ $.each(props, function(name, prop){
+ if( !(name in obj) ){
+ obj[name] = prop;
+ }
+ });
+ },
+ getOptions: (function(){
+ var normalName = /\-([a-z])/g;
+ var regs = {};
+ var nameRegs = {};
+ var regFn = function(f, upper){
+ return upper.toLowerCase();
+ };
+ var nameFn = function(f, dashed){
+ return dashed.toUpperCase();
+ };
+ return function(elem, name, bases, stringAllowed){
+ if(nameRegs[name]){
+ name = nameRegs[name];
+ } else {
+ nameRegs[name] = name.replace(normalName, nameFn);
+ name = nameRegs[name];
+ }
+ var data = elementData(elem, 'cfg'+name);
+ var dataName;
+ var cfg = {};
+
+ if(data){
+ return data;
+ }
+ data = $(elem).data();
+ if(data && typeof data[name] == 'string'){
+ if(stringAllowed){
+ return elementData(elem, 'cfg'+name, data[name]);
+ }
+ webshims.error('data-'+ name +' attribute has to be a valid JSON, was: '+ data[name]);
+ }
+ if(!bases){
+ bases = [true, {}];
+ } else if(!Array.isArray(bases)){
+ bases = [true, {}, bases];
+ } else {
+ bases.unshift(true, {});
+ }
+
+ if(data && typeof data[name] == 'object'){
+ bases.push(data[name]);
+ }
+
+ if(!regs[name]){
+ regs[name] = new RegExp('^'+ name +'([A-Z])');
+ }
+
+ for(dataName in data){
+ if(regs[name].test(dataName)){
+ cfg[dataName.replace(regs[name], regFn)] = data[dataName];
+ }
+ }
+ bases.push(cfg);
+ return elementData(elem, 'cfg'+name, $.extend.apply($, bases));
+ };
+ })(),
+ //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect
+ createPropDefault: createPropDefault,
+ data: elementData,
+ moveToFirstEvent: function(elem, eventType, bindType){
+ var events = ($._data(elem, 'events') || {})[eventType];
+ var fn;
+
+ if(events && events.length > 1){
+ fn = events.pop();
+ if(!bindType){
+ bindType = 'bind';
+ }
+ if(bindType == 'bind' && events.delegateCount){
+ events.splice( events.delegateCount, 0, fn);
+ } else {
+ events.unshift( fn );
+ }
+
+
+ }
+ elem = null;
+ },
+ addShadowDom: (function(){
+ var resizeTimer;
+ var lastHeight;
+ var lastWidth;
+ var $window = $(window);
+ var docObserve = {
+ init: false,
+ runs: 0,
+ test: function(){
+ var height = docObserve.getHeight();
+ var width = docObserve.getWidth();
+
+ if(height != docObserve.height || width != docObserve.width){
+ docObserve.height = height;
+ docObserve.width = width;
+ docObserve.handler({type: 'docresize'});
+ docObserve.runs++;
+ if(docObserve.runs < 9){
+ setTimeout(docObserve.test, 90);
+ }
+ } else {
+ docObserve.runs = 0;
+ }
+ },
+ handler: (function(){
+ var trigger = function(){
+ $(document).triggerHandler('updateshadowdom');
+ };
+ return function(e){
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(function(){
+ if(e.type == 'resize'){
+ var width = $window.width();
+ var height = $window.width();
+
+ if(height == lastHeight && width == lastWidth){
+ return;
+ }
+ lastHeight = height;
+ lastWidth = width;
+
+ docObserve.height = docObserve.getHeight();
+ docObserve.width = docObserve.getWidth();
+ }
+
+ if(window.requestAnimationFrame){
+ requestAnimationFrame(trigger);
+ } else {
+ setTimeout(trigger, 0);
+ }
+
+ }, (e.type == 'resize' && !window.requestAnimationFrame) ? 50 : 9);
+ };
+ })(),
+ _create: function(){
+ $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){
+ var body = document.body;
+ var doc = document.documentElement;
+ docObserve[type] = function (){
+ return Math.max(
+ body[ "scroll" + name ], doc[ "scroll" + name ],
+ body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ };
+ });
+ },
+ start: function(){
+ if(!this.init && document.body){
+ this.init = true;
+ this._create();
+ this.height = docObserve.getHeight();
+ this.width = docObserve.getWidth();
+ setInterval(this.test, 999);
+ $(this.test);
+ if($.support.boxSizing == null){
+ $(function(){
+ if($.support.boxSizing){
+ docObserve.handler({type: 'boxsizing'});
+ }
+ });
+ }
+ webshims.ready('WINDOWLOAD', this.test);
+ $(document).on('updatelayout.webshim pageinit popupafteropen panelbeforeopen tabsactivate collapsibleexpand shown.bs.modal shown.bs.collapse slid.bs.carousel playerdimensionchange', this.handler);
+ $(window).on('resize', this.handler);
+ }
+ }
+ };
+
+
+ webshims.docObserve = function(){
+ webshims.ready('DOM', function(){
+ docObserve.start();
+
+ });
+ };
+ return function(nativeElem, shadowElem, opts){
+ if(nativeElem && shadowElem){
+ opts = opts || {};
+ if(nativeElem.jquery){
+ nativeElem = nativeElem[0];
+ }
+ if(shadowElem.jquery){
+ shadowElem = shadowElem[0];
+ }
+ var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {});
+ var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {});
+ var shadowFocusElementData = {};
+ if(!opts.shadowFocusElement){
+ opts.shadowFocusElement = shadowElem;
+ } else if(opts.shadowFocusElement){
+ if(opts.shadowFocusElement.jquery){
+ opts.shadowFocusElement = opts.shadowFocusElement[0];
+ }
+ shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData);
+ }
+
+ $(nativeElem).on('remove', function(e){
+ if (!e.originalEvent) {
+ setTimeout(function(){
+ $(shadowElem).remove();
+ }, 4);
+ }
+ });
+
+ nativeData.hasShadow = shadowElem;
+ shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem;
+ shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = {
+ nativeElement: nativeElem,
+ shadowElement: shadowElem,
+ shadowFocusElement: opts.shadowFocusElement
+ };
+ if(opts.shadowChilds){
+ opts.shadowChilds.each(function(){
+ elementData(this, 'shadowData', shadowData.shadowData);
+ });
+ }
+
+ if(opts.data){
+ shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data;
+ }
+ opts = null;
+ }
+ webshims.docObserve();
+ };
+ })(),
+ propTypes: {
+ standard: function(descs, name){
+ createPropDefault(descs);
+ if(descs.prop){return;}
+ descs.prop = {
+ set: function(val){
+ descs.attr.set.call(this, ''+val);
+ },
+ get: function(){
+ return descs.attr.get.call(this) || descs.defaultValue;
+ }
+ };
+
+ },
+ "boolean": function(descs, name){
+
+ createPropDefault(descs);
+ if(descs.prop){return;}
+ descs.prop = {
+ set: function(val){
+ if(val){
+ descs.attr.set.call(this, "");
+ } else {
+ descs.removeAttr.value.call(this);
+ }
+ },
+ get: function(){
+ return descs.attr.get.call(this) != null;
+ }
+ };
+ },
+ "src": (function(){
+ var anchor = document.createElement('a');
+ anchor.style.display = "none";
+ return function(descs, name){
+
+ createPropDefault(descs);
+ if(descs.prop){return;}
+ descs.prop = {
+ set: function(val){
+ descs.attr.set.call(this, val);
+ },
+ get: function(){
+ var href = this.getAttribute(name);
+ var ret;
+ if(href == null){return '';}
+
+ anchor.setAttribute('href', href+'' );
+
+ if(!supportHrefNormalized){
+ try {
+ $(anchor).insertAfter(this);
+ ret = anchor.getAttribute('href', 4);
+ } catch(er){
+ ret = anchor.getAttribute('href', 4);
+ }
+ $(anchor).detach();
+ }
+ return ret || anchor.href;
+ }
+ };
+ };
+ })(),
+ enumarated: function(descs, name){
+
+ createPropDefault(descs);
+ if(descs.prop){return;}
+ descs.prop = {
+ set: function(val){
+ descs.attr.set.call(this, val);
+ },
+ get: function(){
+ var val = (descs.attr.get.call(this) || '').toLowerCase();
+ if(!val || descs.limitedTo.indexOf(val) == -1){
+ val = descs.defaultValue;
+ }
+ return val;
+ }
+ };
+ }
+
+// ,unsignedLong: $.noop
+// ,"doubble": $.noop
+// ,"long": $.noop
+// ,tokenlist: $.noop
+// ,settableTokenlist: $.noop
+ },
+ reflectProperties: function(nodeNames, props){
+ if(typeof props == 'string'){
+ props = props.split(listReg);
+ }
+ props.forEach(function(prop){
+ webshims.defineNodeNamesProperty(nodeNames, prop, {
+ prop: {
+ set: function(val){
+ $.attr(this, prop, val);
+ },
+ get: function(){
+ return $.attr(this, prop) || '';
+ }
+ }
+ });
+ });
+ },
+ defineNodeNameProperty: function(nodeName, prop, descs){
+ havePolyfill[prop] = true;
+
+ if(descs.reflect){
+ if(descs.propType && !webshims.propTypes[descs.propType]){
+ webshims.error('could not finde propType '+ descs.propType);
+ } else {
+ webshims.propTypes[descs.propType || 'standard'](descs, prop);
+ }
+
+ }
+
+ ['prop', 'attr', 'removeAttr'].forEach(function(type){
+ var desc = descs[type];
+ if(desc){
+ if(type === 'prop'){
+ desc = $.extend({writeable: true}, desc);
+ } else {
+ desc = $.extend({}, desc, {writeable: true});
+ }
+
+ extendQ[type](nodeName, prop, desc);
+ if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){
+ extendNativeValue(nodeName, prop, desc);
+ }
+ descs[type] = desc;
+ }
+ });
+ if(descs.initAttr){
+ initProp.content(nodeName, prop);
+ }
+ return descs;
+ },
+
+ defineNodeNameProperties: function(name, descs, propType, _noTmpCache){
+ var olddesc;
+ for(var prop in descs){
+ if(!_noTmpCache && descs[prop].initAttr){
+ initProp.createTmpCache(name);
+ }
+ if(propType){
+ if(descs[prop][propType]){
+ //webshims.log('override: '+ name +'['+prop +'] for '+ propType);
+ } else {
+ descs[prop][propType] = {};
+ ['value', 'set', 'get'].forEach(function(copyProp){
+ if(copyProp in descs[prop]){
+ descs[prop][propType][copyProp] = descs[prop][copyProp];
+ delete descs[prop][copyProp];
+ }
+ });
+ }
+ }
+ descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]);
+ }
+ if(!_noTmpCache){
+ initProp.flushTmpCache();
+ }
+ return descs;
+ },
+
+ createElement: function(nodeName, create, descs){
+ var ret;
+ if($.isFunction(create)){
+ create = {
+ after: create
+ };
+ }
+ initProp.createTmpCache(nodeName);
+ if(create.before){
+ initProp.createElement(nodeName, create.before);
+ }
+ if(descs){
+ ret = webshims.defineNodeNameProperties(nodeName, descs, false, true);
+ }
+ if(create.after){
+ initProp.createElement(nodeName, create.after);
+ }
+ initProp.flushTmpCache();
+ return ret;
+ },
+ onNodeNamesPropertyModify: function(nodeNames, props, desc, only){
+ if(typeof nodeNames == 'string'){
+ nodeNames = nodeNames.split(listReg);
+ }
+ if($.isFunction(desc)){
+ desc = {set: desc};
+ }
+
+ nodeNames.forEach(function(name){
+ if(!modifyProps[name]){
+ modifyProps[name] = {};
+ }
+ if(typeof props == 'string'){
+ props = props.split(listReg);
+ }
+ if(desc.initAttr){
+ initProp.createTmpCache(name);
+ }
+ props.forEach(function(prop){
+ if(!modifyProps[name][prop]){
+ modifyProps[name][prop] = [];
+ havePolyfill[prop] = true;
+ }
+ if(desc.set){
+ if(only){
+ desc.set.only = only;
+ }
+ modifyProps[name][prop].push(desc.set);
+ }
+
+ if(desc.initAttr){
+ initProp.content(name, prop);
+ }
+ });
+ initProp.flushTmpCache();
+
+ });
+ },
+ defineNodeNamesBooleanProperty: function(elementNames, prop, descs){
+ if(!descs){
+ descs = {};
+ }
+ if($.isFunction(descs)){
+ descs.set = descs;
+ }
+ webshims.defineNodeNamesProperty(elementNames, prop, {
+ attr: {
+ set: function(val){
+ if(descs.useContentAttribute){
+ webshims.contentAttr(this, prop, val);
+ } else {
+ this.setAttribute(prop, val);
+ }
+ if(descs.set){
+ descs.set.call(this, true);
+ }
+ },
+ get: function(){
+ var ret = (descs.useContentAttribute) ? webshims.contentAttr(this, prop) : this.getAttribute(prop);
+ return (ret == null) ? undefined : prop;
+ }
+ },
+ removeAttr: {
+ value: function(){
+ this.removeAttribute(prop);
+ if(descs.set){
+ descs.set.call(this, false);
+ }
+ }
+ },
+ reflect: true,
+ propType: 'boolean',
+ initAttr: descs.initAttr || false
+ });
+ },
+ contentAttr: function(elem, name, val){
+ if(!elem.nodeName){return;}
+ var attr;
+ if(val === undefined){
+ attr = (elem.attributes[name] || {});
+ val = attr.specified ? attr.value : null;
+ return (val == null) ? undefined : val;
+ }
+
+ if(typeof val == 'boolean'){
+ if(!val){
+ elem.removeAttribute(name);
+ } else {
+ elem.setAttribute(name, name);
+ }
+ } else {
+ elem.setAttribute(name, val);
+ }
+ },
+
+ activeLang: (function(){
+ var curLang = [];
+ var langDatas = [];
+ var loading = {};
+ var load = function(src, obj, loadingLang){
+ obj._isLoading = true;
+ if(loading[src]){
+ loading[src].push(obj);
+ } else {
+ loading[src] = [obj];
+ webshims.loader.loadScript(src, function(){
+ if(loadingLang == curLang.join()){
+ $.each(loading[src], function(i, obj){
+ select(obj);
+ });
+ }
+ delete loading[src];
+ });
+ }
+ };
+
+ var select = function(obj){
+ var oldLang = obj.__active;
+ var selectLang = function(i, lang){
+ obj._isLoading = false;
+ if(obj[lang] || obj.availableLangs.indexOf(lang) != -1){
+ if(obj[lang]){
+ obj.__active = obj[lang];
+ obj.__activeName = lang;
+ } else {
+ load(obj.langSrc+lang, obj, curLang.join());
+ }
+ return false;
+ }
+ };
+ $.each(curLang, selectLang);
+ if(!obj.__active){
+ obj.__active = obj[''];
+ obj.__activeName = '';
+ }
+ if(oldLang != obj.__active){
+ $(obj).trigger('change');
+ }
+ };
+ return function(lang){
+ var shortLang;
+ if(typeof lang == 'string'){
+ if(curLang[0] != lang){
+ curLang = [lang];
+ shortLang = curLang[0].split('-')[0];
+ if(shortLang && shortLang != lang){
+ curLang.push(shortLang);
+ }
+ langDatas.forEach(select);
+ }
+ } else if(typeof lang == 'object'){
+ if(!lang.__active){
+ langDatas.push(lang);
+ select(lang);
+ }
+ return lang.__active;
+ }
+ return curLang[0];
+ };
+ })()
+ });
+
+ $.each({
+ defineNodeNamesProperty: 'defineNodeNameProperty',
+ defineNodeNamesProperties: 'defineNodeNameProperties',
+ createElements: 'createElement'
+ }, function(name, baseMethod){
+ webshims[name] = function(names, a, b, c){
+ if(typeof names == 'string'){
+ names = names.split(listReg);
+ }
+ var retDesc = {};
+ names.forEach(function(nodeName){
+ retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c);
+ });
+ return retDesc;
+ };
+ });
+
+ webshims.isReady('webshimLocalization', true);
+
+//html5a11y + hidden attribute
+(function(){
+ if(('content' in document.createElement('template'))){return;}
+
+ $(function(){
+ var main = $('main').attr({role: 'main'});
+ if(main.length > 1){
+ webshims.error('only one main element allowed in document');
+ } else if(main.is('article *, section *')) {
+ webshims.error('main not allowed inside of article/section elements');
+ }
+ });
+
+ if(('hidden' in document.createElement('a'))){
+ return;
+ }
+
+ webshims.defineNodeNamesBooleanProperty(['*'], 'hidden');
+
+ var elemMappings = {
+ article: "article",
+ aside: "complementary",
+ section: "region",
+ nav: "navigation",
+ address: "contentinfo"
+ };
+ var addRole = function(elem, role){
+ var hasRole = elem.getAttribute('role');
+ if (!hasRole) {
+ elem.setAttribute('role', role);
+ }
+ };
+
+
+ $.webshims.addReady(function(context, contextElem){
+ $.each(elemMappings, function(name, role){
+ var elems = $(name, context).add(contextElem.filter(name));
+ for (var i = 0, len = elems.length; i < len; i++) {
+ addRole(elems[i], role);
+ }
+ });
+ if (context === document) {
+ var header = document.getElementsByTagName('header')[0];
+ var footers = document.getElementsByTagName('footer');
+ var footerLen = footers.length;
+
+ if (header && !$(header).closest('section, article')[0]) {
+ addRole(header, 'banner');
+ }
+ if (!footerLen) {
+ return;
+ }
+ var footer = footers[footerLen - 1];
+ if (!$(footer).closest('section, article')[0]) {
+ addRole(footer, 'contentinfo');
+ }
+ }
+ });
+
+})();
+});
+;webshim.register('filereader', function($, webshim, window, document, undefined, featureOptions){
+ "use strict";
+ var mOxie, moxie, hasXDomain;
+ var FormData = $.noop;
+ var sel = 'input[type="file"].ws-filereader';
+ var loadMoxie = function (){
+ webshim.loader.loadList(['moxie']);
+ };
+ var _createFilePicker = function(){
+ var $input, picker, $parent, onReset;
+ var input = this;
+
+ if(webshim.implement(input, 'filepicker')){
+
+ input = this;
+ $input = $(this);
+ $parent = $input.parent();
+ onReset = function(){
+ if(!input.value){
+ $input.prop('value', '');
+ }
+ };
+
+ $input.attr('tabindex', '-1').on('mousedown.filereaderwaiting click.filereaderwaiting', false);
+ $parent.addClass('ws-loading');
+ picker = new mOxie.FileInput({
+ browse_button: this,
+ accept: $.prop(this, 'accept'),
+ multiple: $.prop(this, 'multiple')
+ });
+
+ $input.jProp('form').on('reset', function(){
+ setTimeout(onReset);
+ });
+ picker.onready = function(){
+ $input.off('.fileraderwaiting');
+ $parent.removeClass('ws-waiting');
+ };
+
+ picker.onchange = function(e){
+ webshim.data(input, 'fileList', e.target.files);
+ $input.trigger('change');
+ };
+ picker.onmouseenter = function(){
+ $input.trigger('mouseover');
+ $parent.addClass('ws-mouseenter');
+ };
+ picker.onmouseleave = function(){
+ $input.trigger('mouseout');
+ $parent.removeClass('ws-mouseenter');
+ };
+ picker.onmousedown = function(){
+ $input.trigger('mousedown');
+ $parent.addClass('ws-active');
+ };
+ picker.onmouseup = function(){
+ $input.trigger('mouseup');
+ $parent.removeClass('ws-active');
+ };
+
+ webshim.data(input, 'filePicker', picker);
+
+ webshim.ready('WINDOWLOAD', function(){
+ var lastWidth;
+ $input.onWSOff('updateshadowdom', function(){
+ var curWitdth = input.offsetWidth;
+ if(curWitdth && lastWidth != curWitdth){
+ lastWidth = curWitdth;
+ picker.refresh();
+ }
+ });
+ });
+
+ webshim.addShadowDom();
+
+ picker.init();
+ if(input.disabled){
+ picker.disable(true);
+ }
+ }
+ };
+ var getFileNames = function(file){
+ return file.name;
+ };
+ var createFilePicker = function(){
+ var elem = this;
+ loadMoxie();
+ $(elem)
+ .on('mousedown.filereaderwaiting click.filereaderwaiting', false)
+ .parent()
+ .addClass('ws-loading')
+ ;
+ webshim.ready('moxie', function(){
+ createFilePicker.call(elem);
+ });
+ };
+ var noxhr = /^(?:script|jsonp)$/i;
+ var notReadyYet = function(){
+ loadMoxie();
+ webshim.error('filereader/formdata not ready yet. please wait for moxie to load `webshim.ready("moxie", callbackFn);`` or wait for the first change event on input[type="file"].ws-filereader.')
+ };
+ var inputValueDesc = webshim.defineNodeNameProperty('input', 'value', {
+ prop: {
+ get: function(){
+ var fileList = webshim.data(this, 'fileList');
+
+ if(fileList && fileList.map){
+ return fileList.map(getFileNames).join(', ');
+ }
+
+ return inputValueDesc.prop._supget.call(this);
+ }
+ }
+ }
+ );
+ var shimMoxiePath = webshim.cfg.basePath+'moxie/';
+ var crossXMLMessage = 'You nedd a crossdomain.xml to get all "filereader" / "XHR2" / "CORS" features to work. Or host moxie.swf/moxie.xap on your server an configure filereader options: "swfpath"/"xappath"';
+ var testMoxie = function(options){
+ return (options.wsType == 'moxie' || (options.data && options.data instanceof mOxie.FormData) || (options.crossDomain && $.support.cors !== false && hasXDomain != 'no' && !noxhr.test(options.dataType || '')));
+ };
+ var createMoxieTransport = function (options){
+
+ if(testMoxie(options)){
+ var ajax;
+ webshim.info('moxie transfer used for $.ajax');
+ if(hasXDomain == 'no'){
+ webshim.error(crossXMLMessage);
+ }
+ return {
+ send: function( headers, completeCallback ) {
+
+ var proressEvent = function(obj, name){
+ if(options[name]){
+ var called = false;
+ ajax.addEventListener('load', function(e){
+ if(!called){
+ options[name]({type: 'progress', lengthComputable: true, total: 1, loaded: 1});
+ } else if(called.lengthComputable && called.total > called.loaded){
+ options[name]({type: 'progress', lengthComputable: true, total: called.total, loaded: called.total});
+ }
+ });
+ obj.addEventListener('progress', function(e){
+ called = e;
+ options[name](e);
+ });
+ }
+ };
+ ajax = new moxie.xhr.XMLHttpRequest();
+
+ ajax.open(options.type, options.url, options.async, options.username, options.password);
+
+ proressEvent(ajax.upload, featureOptions.uploadprogress);
+ proressEvent(ajax.upload, featureOptions.progress);
+
+ ajax.addEventListener('load', function(e){
+ var responses = {
+ text: ajax.responseText,
+ xml: ajax.responseXML
+ };
+ completeCallback(ajax.status, ajax.statusText, responses, ajax.getAllResponseHeaders());
+ });
+
+ if(options.xhrFields && options.xhrFields.withCredentials){
+ ajax.withCredentials = true;
+ }
+
+ if(options.timeout){
+ ajax.timeout = options.timeout;
+ }
+
+ $.each(headers, function(name, value){
+ ajax.setRequestHeader(name, value);
+ });
+
+
+ ajax.send(options.data);
+
+ },
+ abort: function() {
+ if(ajax){
+ ajax.abort();
+ }
+ }
+ };
+ }
+ };
+ var transports = {
+ //based on script: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
+ xdomain: (function(){
+ var httpRegEx = /^https?:\/\//i;
+ var getOrPostRegEx = /^get|post$/i;
+ var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i');
+ return function(options, userOptions, jqXHR) {
+
+ // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
+ if (!options.crossDomain || options.username || (options.xhrFields && options.xhrFields.withCredentials) || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url) || (options.data && options.data