var Wistiamara = {
/* Version 3.0, 15 Oct 2013 */
_version: "3.0",
_url: null,
_style_block: null,
_refresh_ms: 20,
_default_language: 'en',
_players: [],
_nomodrewrite: false,
_apiversion: 2,
NOLANGCODE: '--',
VIDEOTYPE: 1,
PLAYLISTTYPE: 2,
init: function ( serviceURL, options ) {
if (! options) { options = {}; };
var o = {
nomodrewrite: false,
apiversion: 2
};
for( var p in options ) { o[p] = options[p] };
Wistiamara._url = serviceURL;
Wistiamara._nomodrewrite = o.nomodrewrite;
Wistiamara._apiversion = o.apiversion;
if (Wistiamara._url.indexOf('/', Wistiamara._url.length - 1) === -1) {
Wistiamara._url = Wistiamara._url + '/';
}
},
_trackEvent: function( action, label, value ) {
if (ga) {
switch(arguments.length) {
case 1: ga('send', 'event', 'wistiamara', action ); return;
case 2: ga('send', 'event', 'wistiamara', action, label); return;
case 3: ga('send', 'event', 'wistiamara', action, label, value); return;
default: throw new Error('illegal argument count')
}
}
},
insertPlaylist: function( id, urlprefix, options, email ) {
if (! Wistiamara._url ) { throw "Wistiamara must be initialized with the URL of its server side portion."; };
if (! options) { options = {}; };
var o = {
volumeControl: true,
videoWidth: 640,
videoHeight: 360,
autoPlay: false,
controlsVisibleOnLoad: false
};
for( var p in options ) { o[p] = options[p] };
document.write( '
' );
var wpl = Wistia.playlist( id, {
version: "v1",
theme: "tab",
videoOptions: {
volumeControl: o.volumeControl,
autoPlay: o.autoPlay,
videoWidth: o.videoWidth,
videoHeight: o.videoHeight,
trackEmail: email
},
media_0_0: {
autoPlay: o.autoPlay,
controlsVisibleOnLoad: o.controlsVisibleOnLoad
}
});
Wistiamara.bindPlaylist( wpl, urlprefix );
},
bindPlaylist: function( pl, urlprefix ) {
if (! Wistiamara._url ) { throw "Wistiamara must be initialized with the URL of its server side portion."; };
switch (Wistiamara._apiversion) {
case 1:
if ( urlprefix.indexOf('http://') === 0 ) { urlprefix = urlprefix.substr(7); }
else if ( urlprefix.indexOf('https://') === 0 ) { urlprefix = urlprefix.substr(8); }
break;
case 2: // Use as-is
break;
default:
alert('Unknown Wistiamara API version.');
return null;
}
if (! pl.wistiamara ) {
pl.wistiamara = {
'data':{},
'urlprefix':urlprefix,
'lang':false,
'interval':false,
'showing':{ 'time':null, 'title':null, 'b':null, 'e':null },
'type': Wistiamara.PLAYLISTTYPE,
};
}
Wistiamara._create_elements( pl );
pl.bind( 'beforeembed', function( si, vi ){ Wistiamara._onBeforeEmbed(pl, si, vi); } );
pl.bind( 'afterembed', function( si, vi ){ Wistiamara._onAfterEmbed(pl, si, vi); } );
pl.bind( 'play', function( ){ Wistiamara._onPlay( pl ); } );
pl.bind( 'pause', function( ){ Wistiamara._onPause( pl ); } );
pl.bind( 'end', function( ){ Wistiamara._onEnd( pl ); } );
pl.bind( 'timechange', function( ){ Wistiamara._onTimeChange( pl ); } );
pl.wistiamara.select.onchange = function() { Wistiamara._onLanguageSelectChanged( pl ); };
Wistiamara._players.push( pl );
},
insertVideo: function( id, urlprefix, options, email ) {
if (! Wistiamara._url ) { throw "Wistiamara must be initialized with the URL of its server side portion."; };
if (! options) { options = {}; };
var o = {
volumeControl: true,
videoWidth: 640,
videoHeight: 360,
autoPlay: false,
controlsVisibleOnLoad: false
};
for( var p in options ) { o[p] = options[p] };
document.write( '
' );
wv = Wistia.embed(id, {
version: "v1",
videoWidth: o.videoWidth,
videoHeight: o.videoHeight,
fullscreenButton: false,
container: "wistia_" + id,
trackEmail: email
});
Wistiamara.bindVideo( wv, urlprefix, o );
},
bindVideo: function( vid, urlprefix, options ) {
if (! Wistiamara._url ) { throw "Wistiamara must be initialized with the URL of its server side portion."; };
if (! options) { options = {}; };
var o = {
videoWidth: 640,
videoHeight: 360,
};
for( var p in options ) { o[p] = options[p] };
switch (Wistiamara._apiversion) {
case 1:
if ( urlprefix.indexOf('http://') === 0 ) { urlprefix = urlprefix.substr(7); }
else if ( urlprefix.indexOf('https://') === 0 ) { urlprefix = urlprefix.substr(8); }
break;
case 2: // Use as-is
break;
default:
alert('Unknown Wistiamara API version.');
return null;
}
if (! vid.wistiamara ) {
vid.wistiamara = {
'data':{},
'urlprefix':urlprefix,
'lang':false,
'interval':false,
'showing':{ 'time':null, 'title':null, 'b':null, 'e':null },
'type': Wistiamara.VIDEOTYPE,
};
}
Wistiamara._create_elements( vid );
vid.ready( function() {
Wistiamara._onBeforeEmbed(vid, 0, 0);
Wistiamara._onAfterEmbed(vid, 0, 0);
vid.container.style.height = '' + o.videoHeight + 'px';
vid.container.style.width = '' + o.videoWidth + 'px';
} );
vid.bind( 'play', function( ){ Wistiamara._onPlay( vid ); } );
vid.bind( 'pause', function( ){ Wistiamara._onPause( vid ); } );
vid.bind( 'end', function( ){ Wistiamara._onEnd( vid ); } );
vid.bind( 'timechange', function( ){ Wistiamara._onTimeChange( vid ); } );
vid.wistiamara.select.onchange = function() { Wistiamara._onLanguageSelectChanged( vid ); };
Wistiamara._players.push( vid );
},
_onBeforeEmbed: function( player, si, vi ) {
var hid;
if (player.wistiamara.type == Wistiamara.PLAYLISTTYPE) {
hid = player.data[si].medias[vi].embed_config.media.hashedId;
} else if (player.wistiamara.type == Wistiamara.VIDEOTYPE) {
hid = player.data.media.hashedId;
}
player.wistiamara.subtitle_panel.innerHTML = '';
player.wistiamara.showing.time = null;
if ( ! player.wistiamara.data[hid] ) {
player.wistiamara.subtitle_panel.style.display = "none";
player.wistiamara.loading_panel.style.display = "block";
player.wistiamara.data[hid] = Wistiamara.getAmaraData( player.wistiamara.urlprefix, hid );
}
},
_onAfterEmbed: function( player, si, vi ) {
var hid;
if (player.wistiamara.type == Wistiamara.PLAYLISTTYPE) {
hid = player.data[si].medias[vi].embed_config.media.hashedId;
} else if (player.wistiamara.type == Wistiamara.VIDEOTYPE) {
hid = player.data.media.hashedId;
}
player.wistiamara.loading_panel.style.display = "none";
player.wistiamara.subtitle_panel.style.display = "none";
// Make sure the current language exists, and is compatible with the new video.
if ((! player.wistiamara.lang ) || (! player.wistiamara.data[hid].languages[ player.wistiamara.lang ] )) {
player.wistiamara.lang = Wistiamara.NOLANGCODE;
}
if (player.wistiamara.select.firstChild) { player.wistiamara.select.removeChild(player.wistiamara.select.firstChild); };
player.wistiamara.select.appendChild( player.wistiamara.data[hid].optgroup );
player.wistiamara.select.value = player.wistiamara.lang;
},
_onPlay: function( player ) {
Wistiamara._playSubs( player );
},
_onPause: function( player ) {
Wistiamara._pauseSubs( player );
},
_onEnd: function( player ) {
// nothing yet
},
_onTimeChange: function( player ) {
Wistiamara.showCurrentSubtitle(player);
},
_playSubs: function( player ) {
if ( player.wistiamara.interval === false ) { // If this is not false, the subs are already playing.
player.wistiamara.interval = window.setInterval( function(){ Wistiamara.showCurrentSubtitle(player); }, Wistiamara._refresh_ms );
};
},
_pauseSubs: function( player ) {
if ( player.wistiamara.interval !== false ) {
window.clearInterval( player.wistiamara.interval );
player.wistiamara.interval = false;
}
},
_stopSubs: function( player ) {
if ( player.wistiamara.interval !== false ) {
window.clearInterval( player.wistiamara.interval );
player.wistiamara.interval = false;
}
player.wistiamara.subtitle_panel.innerHTML = ''; // Difference between 'pause' and 'stop': stop clears the display.
player.wistiamara.showing.time = null; // and cache
},
_onLanguageSelectChanged: function( player ) {
var newlang = player.wistiamara.select.value;
if ( newlang === player.wistiamara.lang ) { return; }
var resultlang = Wistiamara.trySwitchLanguage( player, newlang );
if ( newlang != resultlang ) { player.wistiamara.select.value = resultlang; };
},
trySwitchLanguage: function( player, code ) {
var hid = null;
if (player.wistiamara.type == Wistiamara.PLAYLISTTYPE) {
hid = player.currentVideo().hashedId();
} else if (player.wistiamara.type == Wistiamara.VIDEOTYPE) {
hid = player.data.media.hashedId;
}
if ( (player.wistiamara.data[hid].languages[code]) || ( code == Wistiamara.NOLANGCODE ) ) {
player.wistiamara.lang = code;
player.wistiamara.showing.time = null;
if ( code == Wistiamara.NOLANGCODE ) {
Wistiamara._trackEvent('disable subtitles');
} else {
Wistiamara._trackEvent('enable subtitles', code);
}
Wistiamara.showCurrentSubtitle( player );
return code;
} else {
return player.wistiamara.lang;
}
},
getAmaraData: function( prefix, hid ) {
var r, url;
switch (Wistiamara._apiversion) {
case 1:
url = Wistiamara._url + (Wistiamara._nomodrewrite ? 'wistiamara.php?PATH_INFO=' : '') + "subtitles/" + prefix + encodeURIComponent( hid );
break;
case 2:
url = Wistiamara._url + (Wistiamara._nomodrewrite ? 'wistiamara.php?PATH_INFO=' : '') + "subtitles/" + (Wistiamara._nomodrewrite ? '&' : '?') + 'api_version=2&url=' + encodeURIComponent( prefix + hid );
break;
default:
alert('Unknown Wistiamara API version.');
return null;
}
Wistiamara.rawAJAX(
url, "GET", true,
function(xrq) {
if (xrq.readyState == 4) {
if ( xrq.status == 200 ) {
r = xrq.responseText;
} else {
throw "Could not retrieve subtitles."
}
}
}
);
r = JSON.parse(r);
if (! r['languages']) { r.languages = [];}
r.lookup = {};
r.optgroup = document.createElement('OPTGROUP');
var opt;
for( var code in r.languages ){
if (! r.subtitles[code]) {
delete r.languages[code];
}
}
opt = document.createElement('OPTION');
opt.value = Wistiamara.NOLANGCODE;
if (r.language_count < 1) {
opt.text = "( No Subtitles Available )";
} else {
opt.text = "( Subtitles Off )";
}
r.optgroup.appendChild(opt);
for( var code in r.languages ){
var titles = r.subtitles[code];
var t, bm, em;
var currmintitles = [];
var currmin = 0;
var minutetrees = [];
for( var i=0; i= currmin) ) { currmintitles.push(i); }
if ( bm > currmin ) {
// End of current minute
for (var m=currmin; m= player.wistiamara.showing.b ) && ( ms <= player.wistiamara.showing.e )) { return player.wistiamara.showing.title; }
}
var min = (ms / 60000) << 0; // Left shift 0: fast truncate-to-int
var tree = data.lookup[player.wistiamara.lang][min];
if (! tree) { return null; }
var i = Wistiamara._seektimetree( tree, ms );
if (i === null) { return null; }
var t = data.subtitles[player.wistiamara.lang][i];
player.wistiamara.showing.time = ms;
var h = player.wistiamara.showing.title = t.html;
player.wistiamara.showing.b = t.begin;
player.wistiamara.showing.e = t.end;
return h;
},
_seektimetree: function( node, ms ) {
if (! node) { return null; }
if ( ms < node.b ) { return Wistiamara._seektimetree( node.l, ms ); }
if ( ms > node.e ) { return Wistiamara._seektimetree( node.r, ms ); }
return node.i;
},
_maketimetree: function( src, set ) {
if (set.length < 1) { return null; }
var pivot = set.length >> 1;
var lset = (pivot>0) ? set.slice(0, pivot) : [];
var rset = (pivot<(set.length-1)) ? set.slice(pivot+1) : [];
var i = set[pivot];
var c = 1;
var l = Wistiamara._maketimetree(src, lset);
var r = Wistiamara._maketimetree(src, rset);
if (l) { c+= l.c; }
if (r) { c+= r.c; }
return { i:i, c:c, b:src[i].begin, e:src[i].end, l:l, r:r };
},
rawAJAX: function (url, method, sync, responseHandler, data, headers) {
sync = !!sync;
data = data || {};
headers = headers || {};
methods = { 'GET':true, 'POST':true };
method = method || 'GET'; method = method.toUpperCase();
if (! methods[method] ) { method = 'GET'; };
if(! url) { throw "Cannot use an AJAX request without an URL."; }
if (data instanceof Object) {
var a = [];
for(var p in data) { a.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p])); }
data = a.join("&");
}
var xrq = false;
if (window.XMLHttpRequest) {
xrq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xrq = new ActiveXObject("Microsoft.XMLHTTP");
}
if (! xrq) { throw "Could not create XMLHttpRequest"; };
if(method == "GET") {
if ( data ) { url = url + "?" + data; };
data = null;
}
xrq.open(method, url, (!sync));
if(method == "POST")
{
xrq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
for(var h in headers) { xrq.setRequestHeader(h, headers[h]); }
xrq.onreadystatechange = function () {
responseHandler(xrq);
};
xrq.send(data);
},
_create_elements: function( player ) {
// Create the blank loading_panel before checking for the style blocks, so we can use it for feature detection.
var loading_panel = document.createElement('DIV');
if ( !Wistiamara._style_block ) {
Wistiamara._style_block = document.createElement('STYLE');
Wistiamara._style_block.setAttribute( 'type', 'text/css' );
if ( (loading_panel.style.boxShadow !== '') && (loading_panel.style.filter === '') ) { // Older IE: No box-shadow, but has filter
Wistiamara._style_block.innerHTML = Wistiamara._css + "\n\n" + Wistiamara._css_old_ie;
} else {
Wistiamara._style_block.innerHTML = Wistiamara._css;
}
document.getElementsByTagName('HEAD')[0].appendChild( Wistiamara._style_block );
}
loading_panel.className = 'wistiamara_loader';
var img = document.createElement('IMG');
img.setAttribute('src', Wistiamara._loader_image);
img.style.display = 'block';
img.style.margin = '15px auto 30px';
loading_panel.appendChild( img );
loading_panel.appendChild( document.createTextNode('LOADING SUBTITLES') );
var subtitle_panel = document.createElement('DIV');
subtitle_panel.className = 'wistiamara_subtitle';
var select = document.createElement('SELECT');
select.className = 'wistiamara_select';
player.container.style.position = 'relative';
player.container.appendChild( loading_panel );
player.container.appendChild( subtitle_panel );
player.container.appendChild( select );
player.wistiamara.loading_panel = loading_panel;
player.wistiamara.subtitle_panel = subtitle_panel;
player.wistiamara.select = select;
player.container.style.height = '' + (player.container.offsetHeight + player.wistiamara.select.offsetHeight + 3) + 'px';
},
_css: ".wistiamara_loader { \n\
width: 30%; \n\
height: 30%; \n\
background: #FFF; \n\
color: #000; \n\
text-align: center; \n\
font-size: 130%; \n\
padding: 5%; \n\
box-shadow: 3px 3px 5px #000; \n\
border-radius: 6px; \n\
z-index: 100000; \n\
display: none; \n\
position: absolute; \n\
left: 25%; \n\
top: 25%; \n\
} \n\
.wistiamara_select { \n\
width: 30%; \n\
min-width:160px; \n\
display:block; \n\
margin: 3px 0 0; \n\
clear: both \n\
} \n\
\n\
.wistiamara_select option { \n\
padding-left: 2px; \n\
} \n\
\n\
.wistiamara_subtitle { \n\
z-index: 9900; \n\
width: 66%; \n\
font: 16px bold Helvetica,Arial,sans-serif; \n\
display: block; \n\
position: absolute; \n\
bottom: 10%; \n\
background: #333; \n\
background: rgba(0,0,0,0.8); \n\
padding: 5px; \n\
border-radius: 0.5em; \n\
left: 17%; \n\
text-align: center; \n\
color: #FFF; \n\
display: none; \n\
} \n\
",
_css_old_ie: ".wistiamara_subtitle { \n\
filter: progid:DXImageTransform.Microsoft.Chroma(color='black') \n\
progid:DXImageTransform.Microsoft.Alpha(opacity=100) \n\
progid:DXImageTransform.Microsoft.dropshadow(color=#000000,offX=1,offY=1) \n\
progid:DXImageTransform.Microsoft.dropshadow(color=#000000,offX=-1,offY=1) \n\
progid:DXImageTransform.Microsoft.dropshadow(color=#000000,offX=1,offY=-1) \n\
progid:DXImageTransform.Microsoft.dropshadow(color=#000000,offX=-1,offY=-1); \n\
} \n\
",
_loader_image: "data:image/gif;base64,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"
};