function mistembed(streamname) { // return the current flash version function flash_version() { var version = 0; try { // check in the mimeTypes version = navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin.description.replace(/([^0-9\.])/g, '').split('.')[0]; }catch(e){} try { // for our special friend IE version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable("$version").replace(/([^0-9\,])/g, '').split(',')[0]; }catch(e){} return parseInt(version, 10); }; function html5_video_type(type) { var support = false; try { var v = document.createElement('video'); if( v && v.canPlayType(type) != "" ) { support = true; } }catch(e){} return support; } // what does the browser support - used in hasSupport() supports = { flashversion: flash_version(), hls: html5_video_type('application/vnd.apple.mpegURL'), ism: html5_video_type('application/vnd.ms-ss') }; // return true if a type is supported function hasSupport(type) { switch(type) { case 'f4v': return supports.flashversion >= 11; break; case 'rtmp': return supports.flashversion >= 10; break; case 'flv': return supports.flashversion >= 7; break; case 'hls': return supports.hls; break; case 'ism': return supports.ism; break; default: return false; } }; // build HTML for certain kinds of types function buildPlayer(src, container, videowidth, videoheight, vtype) { // used to recalculate the width/height var ratio; // get the container's width/height var containerwidth = parseInt(container.scrollWidth, 10); var containerheight = parseInt(container.scrollHeight, 10); if(videowidth > containerwidth && containerwidth > 0) { ratio = videowidth / containerwidth; videowidth /= ratio; videoheight /= ratio; } if(videoheight > containerheight && containerheight > 0) { ratio = videoheight / containerheight; videowidth /= ratio; videoheight /= ratio; } // if the video type is 'live', lappend = vtype == 'live' ? "&streamType=live" : ""; switch(src.type) { case 'f4v': case 'rtmp': case 'flv': container.innerHTML = ''; break; case 'hls': case 'ism': container.innerHTML = ''; break; case 'fallback': container.innerHTML = 'No support for any player found'; break; } }; var video = mistvideo[streamname], container = document.createElement('div'), scripts = document.getElementsByTagName('script'), me = scripts[scripts.length - 1]; if (video.width == 0) { video.width = 250; } if (video.height == 0) { video.height = 250; } // create the container me.parentNode.insertBefore(container, me); // set the class to 'mistvideo' container.setAttribute('class', 'mistvideo'); // remove script tag me.parentNode.removeChild(me); if(video.error) { // there was an error; display it container.innerHTML = ['Error: ', video.error, ''].join(''); }else if(video.source.length < 1) { // no stream sources container.innerHTML = 'Error: no streams found'; }else{ // no error, and sources found. Check the video types and output the best // available video player. var i, video, vtype = video.type ? video.type : 'unknown'; foundPlayer = false, len = video.source.length; for(i = 0; i < len; i++) { if( hasSupport( video.source[i].type ) ) { // we support this kind of video, so build it. buildPlayer(video.source[i], container.parentNode, video.width, video.height, vtype); // we've build a player, so we're done here foundPlayer = true; break; // break for() loop } } if(!foundPlayer) { // of all the streams given, none was supported (eg. no flash and HTML5 video). Display error buildPlayer({type: 'fallback'}, container.parentNode, video.width, video.height); } } }