summaryrefslogtreecommitdiff
path: root/chimere/static/jme/packages/mm.full.js
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/static/jme/packages/mm.full.js')
-rw-r--r--chimere/static/jme/packages/mm.full.js2732
1 files changed, 2732 insertions, 0 deletions
diff --git a/chimere/static/jme/packages/mm.full.js b/chimere/static/jme/packages/mm.full.js
new file mode 100644
index 0000000..3571c20
--- /dev/null
+++ b/chimere/static/jme/packages/mm.full.js
@@ -0,0 +1,2732 @@
+/**!
+ * Part of the jMediaelement-Project v1.3.5 | http://github.com/aFarkas/jMediaelement
+ * @author Alexander Farkas
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+
+(function($){
+ $.multimediaSupport = {};
+ var m = $.multimediaSupport,
+ vID = new Date().getTime(),
+ doc = document,
+ tVid = $('<video />')[0],
+ //this bad assumption isn't really true, but our workaround-implementation doesn't really hurt
+ supportMediaPreload = !( 'webkitPreservesPitch' in tVid && parseFloat($.browser.version, 10) < 535 && (navigator.userAgent.indexOf('Chrome') !== -1 || navigator.userAgent.indexOf('Mac') === -1) )
+ ;
+ // support test + document.createElement trick
+ $.support.video = !!(tVid.canPlayType);
+ $.support.autoBuffer = !!('autobuffer' in tVid);
+ $.support.audio = !!($('<audio />')[0].canPlayType);
+
+ tVid = null;
+
+ $('<source />');
+ $('<track />');
+
+ $.support.mediaElements = ($.support.video && $.support.audio);
+ $.support.dynamicHTML5 = !!($('<video><div></div></video>')[0].innerHTML);
+ $.support.mediaLoop = ('loop' in $('<video />')[0]);
+ $.browser.deprecatedPoster = !supportMediaPreload;
+
+ // HTML5 shiv document.createElement does not work with dynamic inserted elements
+ // thanks to jdbartlett for this simple script
+ // see also http://jdbartlett.github.com/innershiv/
+ $.fixHTML5 = (function(){
+ var d, b;
+ return ($.support.dynamicHTML5) ?
+ function(h){return h;} :
+ function(h) {
+ if (!d) {
+ b = document.body;
+ d = document.createElement('div');
+ d.style.display = 'none';
+ }
+ var e = d.cloneNode(false);
+ b.appendChild(e);
+ e.innerHTML = h;
+ b.removeChild(e);
+ return e.childNodes;
+ }
+ ;
+ })();
+
+
+
+ var cssShow = { left: "0px", position: "absolute", visibility: "hidden", display:"block" },
+ dimStyles = ['float']
+ ;
+
+ $.each(['Top', 'Left', 'Right', 'Bottom'], function(i, name){
+ dimStyles.push('margin'+ name);
+ dimStyles.push('padding'+ name);
+ dimStyles.push('border'+ name +'Width');
+ setTimeout(function(){
+ m._transferStyles.push('border'+ name +'Color');
+ m._transferStyles.push('border'+ name +'Style');
+ }, 1);
+ });
+ $.fn.getDimensions = function(){
+ var ret = {width: 0, height: 0};
+ if(this[0]){
+ var elem = this,
+ elmS = this[0].style
+ ;
+ // assume that inline style is correct
+ // enables %, em etc. feature with inline-style (i.e.: 100%)
+ ret.height = elmS.height || this.height();
+ ret.width = elmS.width || this.width();
+ $.each(dimStyles, function(i, name){
+ // assume that inline style is correct
+ ret[name] = elmS[name] || elem.css(name);
+ });
+ }
+ return ret;
+ };
+
+
+
+ var oldAttr = $.attr,
+ attrElems = /video|audio|source/i,
+ srcNames = {
+ src: 1,
+ poster: 1
+ },
+ booleanNames = {
+ loop: 1,
+ autoplay: 1,
+ controls: 1
+ },
+ mixedNames = {
+ srces: 1,
+ getConfig: 1,
+ preload: 1
+ },
+ preloadVals = {
+ auto: 1,
+ metadata: 1,
+ none: 1
+ }
+ ;
+
+ var fixPreload = {
+ change: function(elem, setPreload, force){
+ if( !$.support.mediaElements ){return;}
+ var _preload = elem.getAttribute('preload') || 'metadata';
+ if( force || setPreload !== _preload ){
+ if( !supportMediaPreload ){
+ if( setPreload === 'none' || (_preload === 'none' && (setPreload === 'auto' || !elem.getAttribute('poster')) ) ){
+ $(elem).unbind('play', fixPreload.changePlayMode);
+ if(setPreload === 'none'){
+ $(elem).bind('play', fixPreload.changePlayMode);
+ }
+ $.attr(elem, 'srces', $.attr(elem, 'srces'), setPreload);
+ }
+ } else if( $.support.autoBuffer ){
+ elem.autobuffer = !!(setPreload === 'auto');
+ }
+ }
+ },
+ changeAutoplay: function(elem, autoplay){
+ if( $.support.mediaElements && !supportMediaPreload && $.attr(elem, 'preload') === 'none' && autoplay !== $.attr(elem, 'autoplay')){
+ var srces = $.attr(elem, 'srces');
+ $.attr(elem, 'srces', srces, 'auto');
+ if( srces.length && autoplay ){
+ setTimeout(function(){
+ if(elem.play && $(elem).getMediaAPI() === 'nativ' ){
+ elem.play();
+ }
+ }, 9);
+ }
+ }
+ },
+ changePlayMode: function(){
+ fixPreload.changeAutoplay(this, true);
+ },
+ addSrces: function(elem, srces, preload){
+ if( supportMediaPreload || !$.support.mediaElements ){
+ return false;
+ }
+
+ preload = preload || $.attr(elem, 'preload');
+ $(elem).unbind('play', fixPreload.changePlayMode);
+ if( preload === 'auto' || $.attr(elem, 'autoplay') ){return $.data(elem, 'jme-srces', false);}
+ $(elem).bind('play', fixPreload.changePlayMode);
+ $.data(elem, 'jme-srces', srces);
+ return true;
+ }
+ };
+ $.attr = function(elem, name, value, preloadPass){
+
+ if( !(elem.nodeName && attrElems.test(elem.nodeName) && (mixedNames[name] || booleanNames[name] || srcNames[name])) ){
+ return oldAttr(elem, name, value, preloadPass);
+ }
+
+ var set = (value !== undefined), elemName, api, ret;
+
+ if(!set){
+ if(booleanNames[name]){
+ return ( typeof elem[name] === 'boolean' ) ? elem[name] : !!((elem.attributes[name] || {}).specified);
+ }
+ if(srcNames[name]){
+ return $.support.video && elem[name] || m.makeAbsURI(elem.getAttribute(name));
+ }
+ switch(name) {
+ case 'srces':
+ ret = $.data(elem, 'jme-srces');
+ if(ret){break;}
+
+ ret = $.attr(elem, 'src');
+ if( ret ){
+ ret = [{
+ src: ret,
+ type: elem.getAttribute('type'),
+ media: elem.getAttribute('media')
+ }]
+ ;
+ } else {
+ ret = [];
+ $('source', elem).each(function(i){
+ ret.push({
+ src: $.attr(this, 'src'),
+ type: this.getAttribute('type'),
+ media: this.getAttribute('media')
+ });
+ });
+ // safari without quicktime ignores source-tags, initially
+ if(!ret.length){
+ $('a.source', elem).each(function(){
+ ret.push({
+ src: this.href,
+ type: this.getAttribute('type'),
+ media: this.getAttribute('data-media')
+ });
+ });
+ }
+ }
+ break;
+ case 'getConfig':
+ ret = {};
+ $.each(['autoplay', 'loop', 'controls', 'poster', 'preload'], function(i, name){
+ ret[name] = $.attr(elem, name);
+ });
+ break;
+ case 'preload':
+ ret = elem.preload || elem.getAttribute('preload');
+ if(ret === ''){
+ ret = 'auto';
+ }
+ if(!preloadVals[ret]){
+ ret = 'metadata';
+ }
+ break;
+ }
+ return ret;
+ } else {
+ if(booleanNames[name]){
+ value = !!(value);
+ elem[name] = value;
+ if(name === 'autoplay'){
+ fixPreload.changeAutoplay(elem, value);
+ }
+ if(value){
+ elem[name] = value;
+ elem.setAttribute(name, name);
+ } else {
+ elem[name] = value;
+ elem.removeAttribute(name);
+ }
+ } else if(srcNames[name]){
+ elem.setAttribute(name, value);
+ } else if (name === 'srces') {
+ $('source, a.source', elem).remove();
+ elem.removeAttribute('src');
+ value = $.isArray(value) ? value : [value];
+ if(fixPreload.addSrces(elem, value, preloadPass)){return;}
+ $.each(value, function(i, src){
+
+ ret = doc.createElement('source');
+ if(typeof src === 'string'){
+ src = {src: src};
+ }
+ ret.setAttribute('src', src.src);
+ if(src.type){
+ ret.setAttribute('type', src.type);
+ }
+ if(src.media){
+ ret.setAttribute('media', src.media);
+ }
+ elem.appendChild(ret);
+ });
+ } else if(name === 'getConfig'){
+ //works, but you shouldn´t use as a setter
+ $.each(value, function(n, v){
+ $.attr(elem, n, v);
+ });
+ } else if(name === 'preload'){
+ if(value === ''){
+ value = 'auto';
+ } else if(!preloadVals[value]){
+ value = 'metadata';
+ }
+ fixPreload.change(elem, value, preloadPass);
+ elem.setAttribute(name, value);
+ }
+ }
+ };
+
+ function sourceError(){
+ $.event.special.mediaerror.handler.apply($(this).closest('video, audio')[0], arguments);
+ }
+
+ function bindSource(e){
+ if(!$.support.mediaElements){return;}
+
+ var apis = $.data(this, 'mediaElemSupport');
+ if(!apis || !apis.apis){return;}
+ //reset error
+ if(e && e.type){
+ $.data(this, 'calledMediaError', false);
+ }
+ apis = apis.apis;
+
+ //webkit is really stupid with the error event, so fallback to canPlaytype
+ var elem = this,
+ srces = $.attr(this, 'srces')
+ ;
+
+ if( elem.error || (srces.length && !apis.nativ.canPlaySrces(srces)) ){
+ $.event.special.mediaerror.handler.call(this, $.Event('mediaerror'));
+ //stop trying to play
+ try {
+ elem.pause();
+ } catch(er){}
+ }
+
+ //bind error
+ $('source', this)
+ .unbind('error', sourceError)
+ .filter(':last')
+ .bind('error', sourceError)
+ ;
+ }
+
+ $.event.special.mediaerror = {
+ setup: function(){
+ //ff always triggers an error on video/audio | w3c/webkit/opera triggers error event on source, if available
+ var media = $(this)
+ .bind('error', $.event.special.mediaerror.handler)
+ //older webkit do not support emptied
+ .bind('native_mediareset', bindSource)
+ ;
+ //bindSource can trigger mediaerror, but event is always bound after setup
+ setTimeout(function(){
+ media.each(bindSource);
+ }, 0);
+ },
+ teardown: function(){
+ $(this)
+ .unbind('error', $.event.special.mediaerror.handler)
+ .find('source')
+ .unbind('error', sourceError)
+ ;
+ },
+ handler: function(e){
+ if($.data(this, 'calledMediaError')){return;}
+ e = $.extend({}, e || {}, {type: 'mediaerror'});
+ $.data(this, 'calledMediaError', true);
+ return $.event.handle.apply(this, arguments);
+ }
+ };
+
+ m.getExt = function(src){
+ var pos = src.indexOf('?'),
+ ext = ''
+ ;
+ src = (pos > 0) ? src.substring(0, pos) : src;
+ pos = src.lastIndexOf('.') + 1;
+ ext = src.substr(pos);
+ return (ext && ext.toLowerCase) ? ext.toLowerCase() : ext;
+ };
+
+
+ var getExt = m.getExt;
+ var mimeTypes = {
+ audio: {
+ //ogm shouldn´t be used!
+ 'audio/ogg': ['ogg','oga', 'ogm'],
+ 'audio/mpeg': ['mp2','mp3','mpga','mpega'],
+ 'audio/mp4': ['mp4','mpg4', 'm4r'],
+ 'audio/wav': ['wav'],
+ 'audio/x-m4a': ['m4a'],
+ 'audio/x-m4p': ['m4p'],
+ 'audio/3gpp': ['3gp','3gpp'],
+ 'audio/webm': ['webm']
+ },
+ 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']
+ }
+ }
+ ;
+
+
+ $.extend(m, {
+ jsPath: (function(){
+ var scripts = $('script'),
+ path = scripts[scripts.length - 1].src.split('?')[0]
+ ;
+ return path.slice(0, path.lastIndexOf("/") + 1);
+ })(),
+ extendWithData: (function(){
+ var allowedVals ={
+ string: 1,
+ number: 1,
+ 'boolean': 1
+ };
+ return function(elem, target, obj){
+ if(!obj){
+ obj = target;
+ }
+ $.each(obj, $.isArray(obj) ?
+ function(i, name){
+ m.getData(elem, name, target);
+ } :
+ function(name, val){
+ if(allowedVals[typeof val]){
+ m.getData(elem, name, target);
+ }
+ }
+ );
+ return target;
+ };
+ })(),
+ getData: (function(){
+ var getVal = function(elem, name){
+ var val = elem.getAttribute('data-'+ name);
+ if(!val && val !== ''){
+ return undefined;
+ }
+
+ return (val * 1 == val) ?
+ parseFloat(val, 10) :
+ (val === 'false') ?
+ false :
+ (val === 'true') ?
+ true :
+ val
+ ;
+ };
+ return function(elem, arr, ret){
+ var name = arr;
+ ret = ret || {};
+ if(typeof arr === 'string'){
+ arr = [name];
+ }
+
+ $.each(arr, $.isArray(arr) ?
+ function(i, name){
+ var val = getVal(elem, name);
+ if(val !== undefined){
+ ret[name] = val;
+ }
+ } :
+ function(name){
+ var val = getVal(elem, name);
+ if(val !== undefined){
+ ret[name] = val;
+ }
+ }
+ );
+ return ret;
+ };
+ })(),
+ registerMimetype: function(elemName, mimeObj){
+ if(arguments.length === 1){
+ $.each(mimeTypes, function(name){
+ m.registerMimetype(name, elemName);
+ });
+ return;
+ }
+ $.each(mimeObj, function(mime, exts){
+ if(mimeTypes[elemName][mime]){
+ mimeTypes[elemName][mime] = [];
+ }
+ mimeTypes[elemName][mime] = mimeTypes[elemName][mime].concat(exts);
+ });
+
+ },
+ _showMimeTypes: function(){
+ if(window.console){
+ console.log(mimeTypes);
+ }
+ },
+ add: function(name, elemName, api){
+ if(!this.apis[elemName][name]){
+ this.apis[elemName][name] = m.beget(this.fn);
+ if(name !== 'nativ' && $.inArray(name, $.fn.jmeEmbed.defaults.apiOrder) === -1){
+ $.fn.jmeEmbed.defaults.apiOrder.push(name);
+ }
+ }
+ $.extend(true, this.apis[elemName][name], api);
+ },
+ fn: {
+ _init: $.noop,
+ canPlayType: function(type){
+ var elem = this.apiElem,
+ ret
+ ;
+ if(elem && elem.canPlayType){
+ ret = elem.canPlayType(type);
+ return (ret === 'no') ? '' : ret;
+ }
+ var parts = m.extractContainerCodecsFormType(type),
+ that = this
+ ;
+ ret = 'probably';
+ if(!parts[1]){
+ return (this.canPlayContainer && $.inArray(parts[0], this.canPlayContainer) !== -1) ? 'maybe' : '';
+ }
+ $.each(parts[1], function(i, part){
+ if(!that.canPlayCodecs || $.inArray(part, that.canPlayCodecs) === -1){
+ ret = '';
+ return false;
+ }
+ });
+ return ret;
+ },
+ canPlaySrc: function(src){
+ var that = this;
+ if(typeof src !== 'string'){
+ if(src.type){
+ return this.canPlayType(src.type);
+ }
+ src = src.src;
+ }
+
+ var ext = getExt(src), ret = '';
+ $.each(mimeTypes[this.nodeName], function(mime, exts){
+ var index = $.inArray(ext, exts);
+ if(index !== -1){
+ ret = that.canPlayType(mime);
+ return false;
+ }
+ });
+ return ret;
+ },
+ canPlaySrces: function(srces){
+ srces = srces || $.attr(this.element, 'srces');
+ if(!$.isArray(srces)){
+ srces = [srces];
+ }
+ var that = this,
+ canplay = false,
+ src = ''
+ ;
+ $.each(srces, function(i, curSrc){
+ canplay = that.canPlaySrc(curSrc);
+ if(canplay){
+ src = curSrc;
+ return false;
+ }
+ });
+ return src;
+ },
+ _setActive: $.noop,
+ _setInactive: $.noop,
+ _trigger: function(e){$(this.element).triggerHandler(e, e);}
+ },
+ apis: {
+ audio: {},
+ video: {}
+ },
+ extractContainerCodecsFormType: function(type){
+ var types = type.split(/\s*;\s*/g);
+ if(types[1] && types[1].indexOf('codecs') !== -1){
+ types[1] = types[1].replace(/["|']$/, '').replace(/^\s*codecs=('|")/, '').split(/\s*,\s*/g);
+ }
+ return types;
+ },
+ makeAbsURI: (function(){
+ return function(src){
+ if(src && typeof src === 'string'){
+ src = $('<a href="'+ src +'"></a>')[0].href;
+ }
+ return src;
+ };
+ })(),
+ // simple, but powerfull
+ beget: function(sup){
+ var F = function(){};
+ F.prototype = sup;
+ return new F();
+ },
+ _create: function(elemName, supType, element, opts){
+ var data = $.data(element, 'mediaElemSupport') || $.data(element, 'mediaElemSupport', {apis: {}, nodeName: elemName});
+ if(!data.apis[supType]){
+ data.apis[supType] = m.beget( m.apis[elemName][supType]);
+ data.apis[supType].element = element;
+ data.apis[supType].nodeName = elemName;
+ data.apis[supType].name = supType;
+ data.apis[supType].data = {};
+ data.apis[supType].embedOpts = opts;
+ }
+ return data;
+ },
+ _transferStyles: [
+ 'backgroundColor', 'backgroundPosition', 'backgroundImage', 'backgroundRepeat', 'background-attachment'
+ ],
+ _setAPIActive: function(element, supType){
+ var data = $.data(element, 'mediaElemSupport'),
+ oldActive = data.name
+ ;
+ if(oldActive === supType){return true;}
+
+ var hideElem = data.apis[oldActive].apiElem,
+ showElem = data.apis[supType] && data.apis[supType].apiElem,
+ apiReady = false
+ ;
+
+ if(showElem && showElem.nodeName){
+ if(data.nodeName !== 'audio' || $.attr(element, 'controls')){
+ if(supType === 'nativ'){
+ data.apis[supType].visualElem.css({display: ''});
+ } else {
+ data.apis[supType].visualElem
+ .css( $.extend({visibility: ''}, data.apis[oldActive].visualElem.getDimensions()) )
+ ;
+ }
+ }
+ data.apis[supType]._setActive(oldActive);
+ apiReady = true;
+
+ data.apis[supType]._trigger({type: 'apiActivated', api: supType});
+ if( data.apis[oldActive] ){
+ if( data.apis[oldActive]._volumelevelState !== undefined ){
+ $(element).volumelevel(data.apis[oldActive]._volumelevelState);
+ }
+ if( data.apis[oldActive]._muteState !== undefined ){
+ $(element).muted(data.apis[oldActive]._muteState);
+ }
+ if(data.apis[oldActive].visualElem){
+ $.each(m._transferStyles, function(i, name){
+ data.apis[supType].visualElem.css(name, data.apis[oldActive].visualElem.css(name));
+ });
+ }
+ }
+
+ }
+ data.apis[supType].isAPIActive = true;
+ if(hideElem && hideElem.nodeName){
+ if(oldActive === 'nativ'){
+ hideElem.style.display = 'none';
+ } else {
+ data.apis[oldActive].visualElem
+ .css({
+ height: 0,
+ width: 0,
+ visibility: 'hidden'
+ })
+ ;
+ }
+ data.apis[oldActive]._setInactive(supType);
+ data.apis[oldActive].isAPIActive = false;
+ data.apis[supType]._trigger({type: 'apiDeActivated', api: oldActive});
+ }
+
+ data.name = supType;
+
+ return apiReady;
+ },
+ getSuitedPlayers: function(elem, apiOrder){
+ var apis = $.data(elem, 'mediaElemSupport');
+ if(!apis || !apis.apis){return;}
+ apis = apis.apis;
+ var srces = $.attr(elem, 'srces'),
+ supported = false,
+ getSupported = function(name, api){
+ if( (typeof api.isTechAvailable === 'boolean' && !api.isTechAvailable) || ( $.isFunction(api.isTechAvailable) && !api.isTechAvailable() ) ){
+ return;
+ }
+ var src = api.canPlaySrces(srces);
+
+ if(src){
+ supported = {
+ src: src.src || src,
+ name: name
+ };
+ }
+ return supported;
+ }
+ ;
+ if(!srces.length){return 'noSource';}
+ if(apiOrder){
+ $.each(apiOrder, function(i, name){
+ return !(getSupported(name, apis[name]));
+ });
+ } else {
+ $.each(apis, function(name, api){
+ return !(getSupported(name, api));
+ });
+ }
+ return supported;
+ },
+ _embedApi: function(elem, supported, apiData){
+ var config = $.attr(elem, 'getConfig'),
+ jElm = $(elem),
+ dims = {},
+ id = elem.id,
+ fn = function(apiElem){
+ apiData.apis[supported.name].apiElem = apiElem;
+ $(apiElem).addClass(apiData.nodeName);
+ if(!config.controls){
+ $(apiElem).attr({
+ tabindex: '-1',
+ role: 'presentation'
+ });
+ }
+ apiData.apis[supported.name]._init();
+ apiData.apis[supported.name]._trigger({type: 'apiActivated', api: supported.name});
+ },
+ label = jElm.attr('aria-labelledby')
+ ;
+
+ if(!id){
+ vID++;
+ id = apiData.nodeName +'-'+vID;
+ elem.id = id;
+ }
+ apiData.apis[supported.name].visualElem = $('<div class="media-element-box mm-'+ apiData.nodeName +'-box" style="position: relative;" />').insertBefore(elem);
+
+ if(label){
+ apiData.apis[supported.name].visualElem.attr({
+ role: 'group',
+ 'aria-labelledby': label
+ });
+ }
+
+ if(apiData.nodeName === 'audio' && !config.controls){
+ apiData.apis[supported.name].visualElem
+ .css({
+ height: 0,
+ width: 0
+ })
+ ;
+ } else {
+ apiData.apis[supported.name].visualElem
+ .css( jElm.getDimensions() )
+ ;
+ $.each(m._transferStyles, function(i, name){
+ apiData.apis[supported.name].visualElem.css(name, jElm.css(name));
+ });
+ }
+ apiData.apis[supported.name]._embed(supported.src, apiData.name +'-'+ id, config, fn);
+ },
+ getPluginVersion: function(name, plugDesc){
+ var plugin = plugDesc || (navigator.plugins && navigator.plugins[name]),
+ version = [-1, 0],
+ desc
+ ;
+ if(plugin){
+ desc = (plugin.description || '').replace(/,/g, '.').match(/(\d+)/g) || ['0'];
+ if(desc && desc[0]){
+ version[0] = desc[0];
+ if(desc[1]){
+ version[0] += '.'+desc[1];
+ }
+ version[0] = parseFloat(version[0], 10);
+ if(desc[2]){
+ version[1] = parseInt(desc[2], 10);
+ }
+ }
+ }
+ return version;
+ },
+ embedObject: function(elem, id, attrs, params, activeXAttrs, pluginName){
+ elem.style.overflow = 'hidden';
+ elem = $('<div />').prependTo(elem)[0];
+ var obj;
+
+ if(navigator.plugins && navigator.plugins.length){
+ obj = doc.createElement('object');
+ $.each(attrs, function(name, val){
+ obj.setAttribute(name, val);
+ });
+
+ $.each(params, function(name, val){
+ var param = doc.createElement('param');
+ param.setAttribute('name', name);
+ param.setAttribute('value', val);
+ obj.appendChild(param);
+ });
+ obj.setAttribute('id', id);
+ obj.setAttribute('name', id);
+ if(params.wmode === 'transparent'){
+ obj.style.minHeight = '1px';
+ obj.style.minWidth = '1px';
+ }
+ elem.parentNode.replaceChild(obj, elem);
+ } else if(window.ActiveXObject){
+ obj = '<object style="width: 100%; height: 100%; width="100%" height="100%"';
+ $.each($.extend({}, attrs, activeXAttrs), function(name, val){
+ obj += ' '+ name +'="'+ val +'"';
+ });
+ obj += ' name="'+ id +'"';
+ obj += ' id="'+ id +'"';
+ obj += '>';
+ $.each(params, function(name, val){
+ obj += ' <param name="'+ name +'" value="'+ val +'" />';
+ });
+ obj += '</object>';
+ elem.outerHTML = obj;
+ obj = doc.getElementById(id);
+ }
+ if(obj){
+ obj.setAttribute('width', '100%');
+ obj.setAttribute('height', '100%');
+ }
+ $(window).unload(function(){
+ jQuery.cleanData( [ obj ] );
+ obj = null;
+ });
+// vlc in ie is a little stupid here
+ setTimeout(function(){
+ if( !obj || !obj.style ){return;}
+ obj.style.width = '100%';
+ obj.style.height = '100%';
+ }, 0);
+ return obj;
+ }
+ });
+
+ m.add('nativ', 'video', {});
+ m.add('nativ', 'audio', {});
+
+ function findInitFallback(elem, opts){
+ var elemName = elem.nodeName.toLowerCase();
+
+ //getSupportedSrc and Player
+ var supported = m.getSuitedPlayers(elem, opts.apiOrder),
+ apiData = $.data(elem, 'mediaElemSupport')
+ ;
+
+ // important total fail error event
+ if(!supported){
+ apiData.apis.nativ._trigger({type: 'totalerror'});
+ try {
+ elem.pause();
+ } catch(e){}
+ return;
+ }
+ if(supported === 'noSource'){
+ apiData.noSource = true;
+ return;
+ }
+ //_setAPIActive returns false if player isn´t embeded
+ if(!m._setAPIActive(elem, supported.name)){
+ m._embedApi(elem, supported, apiData, elemName);
+ } else if(apiData.apis[supported.name]._mmload){
+ apiData.apis[supported.name]._mmload(supported.src, $.attr(elem, 'poster'));
+ }
+ }
+
+ var showFallback = function(){
+ var fallback = $(this).hide().children(':not(source, track)').clone().insertAfter(this);
+ $(this).one('mediareset', function(){
+ $(this).show();
+ fallback.remove();
+ });
+ };
+
+
+
+ $.fn.jmeEmbed = function(opts){
+ opts = $.extend(true, {}, $.fn.jmeEmbed.defaults, opts);
+ if(opts.showFallback && $.support.mediaElements){
+ this.bind('totalerror', showFallback);
+ }
+
+ return this.each(function(){
+ var elemName = this.nodeName.toLowerCase(),
+ supported = false,
+ elem = this
+ ;
+
+ if(elemName !== 'video' && elemName !== 'audio' || ($.support.flash9 && $.nodeName(elem.parentNode, 'object'))){return;}
+
+ //remove swf fallback
+ $('object, embed', this)
+ .each(function(){
+ $('> *:not(param, embed, object)', this).appendTo(elem);
+ })
+ .remove()
+ ;
+
+ $(this).trigger('jmeBeforeEmbed', {
+ options: opts,
+ nodeName: elemName
+ })
+ ;
+ if(opts.removeControls){
+ $.attr(this, 'controls', false);
+ }
+
+ var apiData = m._create(elemName, 'nativ', this, opts);
+ apiData.name = 'nativ';
+ apiData.apis.nativ.apiElem = this;
+ apiData.apis.nativ.visualElem = $(this);
+ apiData.apis.nativ.isAPIActive = true;
+ $.each(m.apis[elemName], function(name){
+ if(name !== 'nativ'){
+ m._create(elemName, name, elem, opts);
+ }
+ });
+
+ $(this)
+ .bind('mediaerror', function(e){
+ if(apiData.name === 'nativ'){
+ findInitFallback(this, opts);
+ }
+ })
+ ;
+
+ if($.support.flash9 && opts.activateFlash && opts.flashPlayer){
+ supported = m.getSuitedPlayers(elem, [opts.flashPlayer]);
+ if( supported == 'noSource' ){
+ supported = {name: opts.flashPlayer};
+ }
+ apiData.apis.nativ.isAPIReady = true;
+ if(supported.name == opts.flashPlayer && !m._setAPIActive(this, opts.flashPlayer)){
+ m._embedApi(this, supported, apiData, elemName);
+ } else {
+ supported = false;
+ }
+ }
+ if( !supported ){
+ if(opts.debug || !$.support.mediaElements){
+ findInitFallback(this, opts);
+ apiData.apis.nativ.isAPIReady = true;
+ } else {
+ apiData.apis.nativ._init();
+ }
+ }
+ $.attr(this, 'preload', $.attr(this, 'preload'), true);
+
+ $(this)
+ .trigger('jmeEmbed', {
+ options: opts,
+ nodeName: elemName,
+ data: apiData
+ })
+ ;
+ });
+ };
+
+ $.fn.jmeEmbed.defaults = {
+ debug: false,
+ removeControls: false,
+ showFallback: false,
+ apiOrder: [],
+ activateFlash: false,
+ flashPlayer: ''
+ };
+
+ // deprecated
+ $.fn.mediaElementEmbed = $.fn.jmeEmbed;
+
+ if($.cleanData && window.ActiveXObject){
+ var _cleanData = $.cleanData;
+ $.cleanData = function(elems){
+ _cleanData(elems);
+ for(var i = 0, len = elems.length; i < len; i++){
+ if(elems[i].nodeName === 'OBJECT'){
+ try {
+ for (var j in elems[i]) {
+ if (typeof elems[i][j] === "function") {
+ elems[i][j] = null;
+ }
+ }
+ } catch(e){}
+ }
+ }
+ };
+ }
+
+})(jQuery);/**!
+ * Part of the jMediaelement-Project | http://github.com/aFarkas/jMediaelement
+ * @author Alexander Farkas
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+(function($){
+ var video = document.createElement('video'),
+ $m = $.multimediaSupport,
+ noAPIEvents = {
+ apiActivated: 1,
+ apiDeActivated: 1,
+ mediareset: 1,
+ native_mediareset: 1,
+ //these are api-events, but shouldn´t throw mmAPIReady
+ totalerror: 1,
+ jmeflashRefresh: 1,
+ flashblocker: 1
+ },
+ nuBubbleEvents = {
+ native_mediareset: 1,
+ apiDeActivated: 1,
+ native_mediareset: 1,
+ apiActivated: 1,
+ timechange: 1,
+ progresschange: 1,
+ mmAPIReady: 1,
+ jmeflashRefresh: 1
+ },
+ fsMethods = {}
+ ;
+
+ if('enterFullScreen' in video && video.supportsFullscreen){
+ $.support.videoFullscreen = true;
+ fsMethods.enter = 'enterFullScreen';
+ fsMethods.exit = 'exitFullScreen';
+ } else {
+ $.each(['webkit', 'moz', 'o', 'ms'], function(i, name){
+ if(name+'EnterFullScreen' in video && name+'SupportsFullscreen' in video){
+ $.support.videoFullscreen = true;
+ fsMethods.enter = name+'EnterFullScreen';
+ fsMethods.exit = name+'ExitFullScreen';
+ return false;
+ }
+ });
+ }
+
+ video = null;
+
+ $.extend($m, {
+ capturingEvents: function(names){
+ if(!document.addEventListener){return;}
+ if(typeof names == 'string'){
+ names = [names];
+ }
+ $.each(names, function(i, name){
+ var handler = function( e ) {
+ e = $.event.fix( e );
+ return $.event.handle.call( this, e );
+ };
+ $.event.special[name] = $.event.special[name] || {};
+ $.extend($.event.special[name], {
+ setup: function() {
+ this.addEventListener(name, handler, true);
+ },
+ teardown: function() {
+ this.removeEventListener(name, handler, true);
+ }
+ });
+ });
+ },
+ formatTime: function(sec){
+ return $.map(
+ [
+ parseInt(sec/60, 10),
+ parseInt(sec%60, 10)
+ ],
+ function(num){
+ return (isNaN(num)) ? '--' : (num < 10) ? ('0'+num) : num;
+ })
+ .join(':')
+ ;
+ }
+ });
+
+ //mediaevents/most html5 events do not bubble normally, except in ff, we make them bubble, because we love this feature
+ $m.capturingEvents('play pause playing waiting ended'.split(' '));
+ //ToDo add jmeReady/mmAPIReady
+ $.event.special.loadedmeta = {
+ add: function( details ) {
+ var api = $(this).getJMEAPI();
+ if(api && api.loadedmeta){
+ var evt = $.extend({}, api.loadedmeta);
+ details.handler.call(this, evt, evt);
+ }
+ }
+ };
+
+ //extend fn
+ $.extend($m.fn, {
+ _trigger: function(e){
+ var evt = (e.type) ? e : {type: e},
+ type = evt.type
+ ;
+
+ switch(type){
+ case 'mmAPIReady':
+ if(this.isAPIReady){
+ return;
+ }
+ this.isAPIReady = true;
+ break;
+ case 'loadedmeta':
+ this.loadedmeta = evt;
+ break;
+ case 'totalerror':
+ this.totalerror = true;
+ break;
+ case 'mute':
+ this._muteState = e.isMuted;
+ break;
+ case 'volumelevelchange':
+ this._volumelevelState = e.volumelevel;
+ break;
+ case 'mediareset':
+ this.loadedmeta = false;
+ this.totalerror = false;
+ this._bufferLoaded = false;
+ break;
+ }
+
+ if(!this.isAPIActive || (this.totalerror && !noAPIEvents[type]) || this._stoppedEvents[type]){return;}
+ if(!this.isAPIReady && !noAPIEvents[type]){
+ this._trigger('mmAPIReady');
+ }
+
+ if(e.type === 'progresschange'){
+ this._bufferLoaded = e.relLoaded;
+ }
+
+ e.target = this.element;
+ e = $.Event(e);
+ e.preventDefault();
+
+ evt.mediaAPI = this.name;
+
+ if($.fn.on){
+ $.event.trigger( e, evt, this.element, !!(nuBubbleEvents[type]) );
+ } else {
+ if(nuBubbleEvents[type]){
+ e.stopPropagation();
+ }
+ $.event.trigger( e, evt, this.element );
+ }
+ },
+ _stoppedEvents: {},
+ _stopEvent: function(name, autoAllow){
+ this._stoppedEvents[name] = true;
+ if(autoAllow){
+ var that = this;
+ setTimeout(function(){
+ that._allowEvent(name);
+ }, 9);
+ }
+ },
+ _allowEvent: function(name){
+ this._stoppedEvents[name] = false;
+ },
+ supportsFullScreen: function(){
+ return this._videoFullscreen || false;
+ },
+ enterFullscreen: $.noop,
+ exitFullscreen: $.noop,
+ isAPIReady: false,
+ isJMEReady: function(){
+ return this.isAPIReady;
+ },
+ relCurrentTime: function(rel){
+ var dur = this.getDuration() || Number.MIN_VALUE;
+ if(rel && isFinite(rel)){
+ this.currentTime(dur * rel / 100);
+ }
+ return this.currentTime() / dur * 100;
+ },
+ getMediaAPI: function(){
+ return this.name;
+ },
+ togglePlay: function(){
+ this[(this.isPlaying()) ? 'pause' : 'play']();
+ },
+ toggleMuted: function(){
+ this.muted(!(this.muted()));
+ },
+ getJMEVisual: function(){
+ return this.visualElem;
+ },
+ jmeReady: function(fn, n){
+ var e = {type: 'mmAPIReady'};
+ if( this.isJMEReady() && (this.name !== 'nativ' || $.support.mediaElements) ){
+ fn.call(this.element, e, e);
+ } else {
+ n = n || 'jmediaelement';
+ var that = this,
+ fn2 = function(){
+ $(that.element)
+ .unbind('mmAPIReady.'+n, fn2)
+ .unbind('jmeflashRefresh.'+n, fn2)
+ ;
+ fn.call(that.element, e, e);
+ };
+ $(this.element)
+ .bind('mmAPIReady.'+n, fn2)
+ .bind('jmeflashRefresh.'+n, fn2)
+ ;
+ }
+ },
+ unAPIReady: function(name){
+ $(this.element).unbind('mmAPIReady.'+name);
+ },
+ _adjustPluginLoop: function(pluginLoop){
+ var htmlLoop = $.attr(this.element, 'loop'),
+ api = this
+ ;
+ if(htmlLoop !== pluginLoop){
+ setTimeout(function(){
+ api[ (htmlLoop) ? 'play' : 'pause' ]();
+ }, 0);
+ }
+ },
+ _format: $m.formatTime,
+ getFormattedDuration: function(){
+ return this._format(this.getDuration());
+ },
+ getFormattedTime: function(){
+ return this._format(this.currentTime());
+ },
+ loadSrc: function(srces, poster, mediaName, extras){
+ if(srces){
+ $.attr(this.element, 'srces', srces);
+ srces = $.isArray(srces) ? srces : [srces];
+ } else {
+ srces = $.attr(this.element, 'srces');
+ }
+
+ if(poster !== undefined){
+ if(poster){
+ $.attr(this.element, 'poster', poster);
+ } else {
+ $(this.element).removeAttr('poster');
+ }
+ } else {
+ poster = $.attr(this.element, 'poster');
+ }
+ var data = $.data(this.element, 'mediaElemSupport');
+ if( typeof mediaName == 'string' ){
+ if( data.mediaName ){
+ data.mediaName.text(mediaName);
+ }
+ }
+
+ data.noSource = !!(srces.length);
+
+ this._isResetting = true;
+
+ var canPlaySrc = this.canPlaySrces(srces);
+ this._trigger('mediareset');
+ if(canPlaySrc){
+ canPlaySrc = canPlaySrc.src || canPlaySrc;
+ this._mmload(canPlaySrc, poster, extras);
+ } else {
+ $m._setAPIActive(this.element, 'nativ');
+ this._trigger('native_mediareset');
+ $(this.element).data('mediaElemSupport').apis.nativ._mmload();
+ }
+ this._isResetting = false;
+ },
+ isPlaying: function(){
+ return (this._isResetting) ? false : this._isPlaying();
+ },
+ _makenum: function(num){
+ var ret = false;
+ if(num == num * 1){
+ ret = parseFloat(num, 10);
+ }
+ return ret;
+ }
+ });
+
+ // firefox and old webkits (safari 4/chrome 4) are using an extended event, but safari uses load instead of progress
+ // newer webkits are compilant to the current w3c specification (progress is a simple event + buffered is a timerange-object)
+ // opera 10.5 hasn´t implemented the timerange-object yet <- no support
+ var fixProgressEvent = function(api){
+ var getConcerningRange = function(){
+ var time = api.element.currentTime || 0,
+ buffered = api.element.buffered,
+ bufLen = buffered.length,
+ ret = {}
+ ;
+
+ for(var i = 0; i < bufLen; i++){
+ ret.start = buffered.start(i);
+ ret.end = buffered.end(i);
+ if(ret.start <= time && ret.end >= time){
+ break;
+ }
+ }
+ return ret;
+ },
+
+ calculateProgress = function(e){
+ var evt = {type: 'progresschange'},
+ dur, bufRange
+ ;
+
+ //current implementation -> chrome 5/safari 5
+ if(this.buffered && this.buffered.length){
+
+ dur = this.duration;
+ if(dur){
+ bufRange = getConcerningRange();
+ evt.relStart = bufRange.start / dur * 100;
+ evt.relLoaded = bufRange.end / dur * 100;
+ }
+ api._trigger(evt);
+ //ff + safari4 implementation
+ } else if(e.originalEvent && 'lengthComputable' in e.originalEvent && e.originalEvent.loaded){
+ if(e.originalEvent.lengthComputable && e.originalEvent.total){
+ evt.relStart = 0;
+ evt.relLoaded = e.originalEvent.loaded / e.originalEvent.total * 100;
+ }
+ api._trigger(evt);
+ }
+ //opera fallback
+ if( !evt.relLoaded && this.readyState === 4 ){
+ evt.relStart = 0;
+ evt.relLoaded = 100;
+ api._trigger(evt);
+ }
+ return evt.relLoaded;
+ },
+ progressInterval = function(){
+ if( calculateProgress.call(api.element, { type: 'ipadprogress' }) >= 100 || api.element.readyState === 1 ){
+ clearInterval(timer);
+ }
+ },
+ timer
+ ;
+ $(api.element).bind('progress load', calculateProgress);
+
+ //iPad has no progress event
+ if ('buffered' in api.element) {
+ $(api.element).bind('play waiting loadstart', function(){
+ clearInterval(timer);
+ if (api.isAPIActive) {
+ timer = setInterval(progressInterval, 333);
+ progressInterval();
+ }
+ });
+ }
+ };
+
+ //add API for native MM-Support
+ var nativ = {
+ isTechAvailable: $.support.mediaElements,
+ _init: function(){
+ var that = this,
+ curMuted = this.apiElem.muted,
+ //bug: firefox loadingerror
+ loadingTimer = false,
+ triggerLoadingErr = function(e){
+ clearInterval(loadingTimer);
+ if ( !that.element.error && that.element.mozLoadFrom && that.isAPIActive && !that.element.readyState && that.element.networkState === 2 && $.support.flash9 ) {
+ if(e === true){
+ //this will abort and start the error handling
+ that.element.load();
+ } else {
+ loadingTimer = setTimeout(function(){
+ triggerLoadingErr(true);
+ }, ( e === 'initial' ) ? 20000 : 9000);
+ }
+ }
+ }
+ ;
+
+ //addEvents
+ fixProgressEvent(this);
+
+ $(this.element)
+ .bind({
+ volumechange: function(){
+ if(curMuted !== that.apiElem.muted){
+ curMuted = that.apiElem.muted;
+ that._trigger.call(that, {type: 'mute', isMuted: curMuted});
+ } else {
+ that._trigger.call(that, {type: 'volumelevelchange', volumelevel: that.apiElem.volume * 100});
+ }
+ },
+ ended: function(){
+ if(that.isAPIActive && this.ended && !this.paused && !$.attr(this, 'loop') ){
+ that._stopEvent('pause', true);
+ this.pause();
+ }
+ },
+ timeupdate: function(){
+ var e = {
+ type: 'timechange',
+ time: this.currentTime
+ };
+ if(this.duration){
+ e.duration = this.duration;
+ e.timeProgress = e.time / e.duration * 100;
+ }
+
+ that._trigger(e);
+ },
+ //Opera sometimes forgets to dispatch loadedmetadata
+ progress: function(){
+ if(!that.loadedmeta && this.duration){
+ that._trigger({
+ type: 'loadedmeta',
+ duration: this.duration
+ });
+ }
+ },
+ loadedmetadata: function(){
+ that._trigger({
+ type: 'loadedmeta',
+ duration: this.duration
+ });
+ }
+ })
+ .bind('play playing', function(e){
+ if( !that.isAPIActive && e.originalEvent && !that.element.paused && !that.element.ended ){
+ try{
+ that.element.pause();
+ } catch(e){}
+ }
+ })
+ .bind('mediareset', triggerLoadingErr)
+ .bind('ended play pause waiting playing', function(e){
+ if( (!that.isAPIActive && e.originalEvent && (e.originalEvent.mediaAPI === "nativ" || !e.originalEvent.mediaAPI)) || that._stoppedEvents[e.type]){
+ e.stopImmediatePropagation();
+ }
+ })
+ ;
+
+ triggerLoadingErr( 'initial' );
+
+ if( !$.support.mediaLoop ){
+ $(this.element).bind('ended', function(){
+ if( that.isAPIActive && $.attr(this, 'loop') ){
+ var elem = this;
+ setTimeout(function(){
+ ( $.attr(elem, 'loop') && elem.play() );
+ }, 0);
+ }
+ });
+ }
+ //workaround for loadedmeta and particularly mmAPIReady event
+ if( this.element.error ){return;}
+ //jmeEmbed is called very late (after onload)
+ if ( this.element.readyState > 0 ) {
+ this._trigger({
+ type: 'loadedmeta',
+ duration: this.element.duration
+ });
+ // if element isn't busy || opera can freeze and mozilla doesn't react on method load
+ // bug: iPad & iPhone initially report networkState === 2 although they are idling
+ } else if ( this.element.networkState !== 2 || 'webkitPreservesPitch' in this.element ) {
+ this._trigger('mmAPIReady');
+ }
+ },
+ play: function(){
+ this.element.play();
+ },
+ pause: function(){
+ this._allowEvent('pause');
+ this.element.pause();
+ },
+ muted: function(bool){
+ if(typeof bool !== 'boolean'){
+ return this.element.muted;
+ }
+ this.element.muted = bool;
+ },
+ volume: function(vol){
+ if(!isFinite(vol)){
+ return this.element.volume * 100;
+ }
+ this.element.volume = vol / 100;
+ },
+ currentTime: function(sec){
+ if(!isFinite(sec)){
+ return this.element.currentTime;
+ }
+ try {
+ this.element.currentTime = sec;
+ } catch(e){}
+ },
+ _mmload: function(){
+ if(this.element.load){
+ this.element.load();
+ } else {
+ $(this.element).triggerHandler('error');
+ }
+ },
+ _isPlaying: function(){
+ //readyState should be above 1, but IE9 has a bug here above 1 means isPlaying means now isPlaying or will be playing
+ return (!this.element.paused && this.element.readyState > 1 && !this.element.error && !this.element.ended);
+ },
+ getDuration: function(){
+ return this.element.duration;
+ },
+ getCurrentSrc: function(){
+ return this.element.currentSrc;
+ }
+ };
+
+
+
+ $m.add('nativ', 'video', $.extend({
+ _videoFullscreen: $.support.videoFullscreen,
+ enterFullScreen: function(){
+ if(!this._videoFullscreen){return false;}
+ try {
+ this.element[fsMethods.enter]();
+ } catch(e){
+ return false;
+ }
+ return true;
+ },
+ exitFullScreen: function(){
+ if(!this._videoFullscreen){return false;}
+ try {
+ this.element[fsMethods.exit]();
+ } catch(e){
+ return false;
+ }
+ return true;
+ }
+ }, nativ));
+
+
+ $m.add('nativ', 'audio', nativ);
+
+
+ //public-methods
+ $.fn.getJMEAPI = function(full){
+ if(!this[0]){return;}
+ var api = $.data(this[0], 'mediaElemSupport');
+ return ( full || !api || !api.name || !api.apis ) ? api : api.apis[api.name];
+ };
+
+ var noAPIMethods = {
+ jmeReady: 1,
+ getJMEVisual: 1,
+ jmeReady: 1,
+ isJMEReady: 1,
+ getMediaAPI: 1,
+ supportsFullScreen: 1
+ }
+ ;
+ $m.registerAPI = function(names){
+ if(typeof names === 'string'){
+ names = [names];
+ }
+ $.each(names, function(i, name){
+ var fn = $m.apis.video.nativ[name];
+ if(fn && !$.fn[name] && $.isFunction(fn) && name.indexOf('_') !== 0){
+ $.fn[name] = function(){
+ var args = arguments,
+ ret
+ ;
+ this.each(function(){
+ var api = $(this).getJMEAPI();
+ if(!api){return;}
+ if( noAPIMethods[name] || (name == 'loadSrc' && $.data(this, 'mediaElemSupport').noSource) || (api.isJMEReady() && !api.totalerror && (api.name !== 'nativ' || $.support.mediaElements) ) ){
+ ret = api[name].apply(api, args);
+ return !(ret !== undefined);
+ } else {
+ api.unAPIReady(name+'queue');
+ api.jmeReady.call(api, function(){
+ api[name].apply(api, args);
+ }, name+'queue');
+ }
+ });
+ return (ret === undefined) ? this : ret;
+ };
+ }
+ });
+ };
+
+ var fnNames = [];
+ $.each($m.apis.video.nativ, function(name, fn){
+ fnNames.push(name);
+ });
+
+ $m.registerAPI(fnNames);
+
+ // deprecated
+ $.fn.onAPIReady = $.fn.jmeReady;
+ $.fn.getMMAPI = $.fn.getJMEAPI;
+
+ //plugin mechanism
+ $m.fn._extend = function(exts, noAPI){
+ var names = [];
+ $.each(exts, function(name, fn){
+ $m.fn[name] = fn;
+ names.push(name);
+ if(noAPI){
+ noAPIMethods[name] = true;
+ }
+ });
+ $m.registerAPI(names);
+ };
+
+})(jQuery);/**!
+ * Part of the jMediaelement-Project | http://github.com/aFarkas/jMediaelement
+ * @author Alexander Farkas
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+
+(function($){
+ if(!$.event.special.ariaclick){
+ (function(){
+ var preventclick = false,
+ handleAriaClick = function(e){
+ if(!preventclick && (!e.keyCode || e.keyCode === 13 || ( e.keyCode === 32 && $.attr(e.target, 'role') === 'button' ) )){
+ preventclick = true;
+ setTimeout(function(){
+ preventclick = false;
+ }, 1);
+ return $.event.special.ariaclick.handler.apply(this, arguments);
+ } else if(preventclick && e.type == 'click'){
+ e.preventDefault();
+ return false;
+ }
+ return undefined;
+ }
+ ;
+ $.event.special.ariaclick = {
+ setup: function(){
+ $(this).bind('click keydown', handleAriaClick);
+ return true;
+ },
+ teardown: function(){
+ $(this).unbind('click keydown', handleAriaClick);
+ return true;
+ },
+ handler: function(e){
+ e.type = 'ariaclick';
+ return $.event.handle.apply(this, arguments);
+ }
+ };
+ })();
+
+ }
+
+ var controls = {},
+ $m = $.multimediaSupport
+ ;
+
+ function getElems(elem, o){
+ var jElm = $(elem),
+ ret = {},
+ mmID = jElm.attr('data-controls')
+ ;
+
+ ret.mm = (mmID) ? $('#'+ mmID) : $('video, audio', jElm).filter(':first');
+ ret.api = ret.mm.getJMEAPI(true) || ret.mm.jmeEmbed(o.embed).getJMEAPI(true);
+ if(!ret.api){return ret;}
+ if(jElm.is(o.controlSel)){
+ ret.controls = jElm;
+ }
+
+ if(!ret.controls || ret.controls.hasClass(o.classPrefix+'media-controls')) {
+ if( jElm[0] && !ret.api.controlWrapper && $.contains( jElm[0], ret.mm[0] ) ){
+ ret.api.controlWrapper = jElm;
+ }
+ ret.controls = (ret.controls) ? $(o.controlSel, jElm).add(ret.controls) : $(o.controlSel, jElm);
+ }
+ return ret;
+ }
+
+
+ function addWrapperBindings(wrapper, mm, api, o){
+ if(wrapper.data('jmePlayer')){return;}
+ $m.addStateClasses(wrapper, mm, o.classPrefix);
+ wrapper.data('jmePlayer', {mediaelement: mm, api: api});
+ if( $.fn.videoOverlay ){
+ wrapper
+ .videoOverlay({
+ video: mm,
+ startCSS: {
+ width: 'auto',
+ height: 'auto',
+ zIndex: 99998,
+ padding: 0,
+ margin: 0,
+ borderWidth: 0
+ },
+ position: {
+ bottom: 0,
+ left: 0,
+ right: 0,
+ top: 0,
+ width: 0,
+ height: 0
+ }
+ })
+ ;
+ }
+ if (!$.ui || !$.ui.keyCode) {return;}
+ wrapper
+ .bind('keydown', function(e){
+ if( e.jmeHandledEvent ){return;}
+ e.jmeHandledEvent = true;
+ if( {40: 1,37: 1,39: 1,38: 1}[e.keyCode] ){
+ //user is interacting with the slider don´t do anything
+ if($(e.target).is('.ui-slider-handle')){return;}
+ var dif = 5;
+ switch(e.keyCode) {
+ case $.ui.keyCode.UP:
+ if(e.ctrlKey){
+ dif += 5;
+ }
+ mm.volume( Math.min(100, mm.volume() + dif ) );
+ break;
+ case $.ui.keyCode.DOWN:
+ if(e.ctrlKey){
+ dif += 5;
+ }
+ mm.volume( Math.max(0, mm.volume() - dif ) );
+ break;
+ case $.ui.keyCode.LEFT:
+ if(e.ctrlKey){
+ dif += 55;
+ }
+ mm.currentTime( Math.max(0, mm.currentTime() - dif ) );
+ break;
+ case $.ui.keyCode.RIGHT:
+ if(e.ctrlKey){
+ dif += 55;
+ }
+ mm.currentTime( Math.min( mm.getDuration(), mm.currentTime() + dif ) );
+ break;
+ }
+ e.preventDefault();
+ } else if( e.keyCode === $.ui.keyCode.SPACE && ( !$.nodeName(e.target, 'button') && $.attr(e.target, 'role') !== 'button' || wrapper.hasClass('wraps-fullscreen')) ){
+ mm.togglePlay();
+ e.preventDefault();
+ }
+ })
+ ;
+ }
+
+ $.fn.jmeControl = function(opts){
+ opts = $.extend(true, {}, $.fn.jmeControl.defaults, opts);
+ opts.controlSel = [];
+ $.each(controls, function(name){
+ if(name !== 'media-controls'){
+ opts.controlSel.push('.'+ opts.classPrefix + name);
+ }
+ });
+ opts.controlSel.push('.'+ opts.classPrefix + 'media-controls');
+ opts.controlSel = opts.controlSel.join(', ');
+
+ function registerControl(){
+ var elems = getElems(this, opts);
+ if( !elems.api ){return;}
+ elems.api.controls = elems.api.controls || [];
+ if(!elems.api){return;}
+ elems.controls.each(function(){
+ var jElm = $(this);
+
+ if($.inArray(this, elems.api.controls) !== -1){return;}
+ elems.api.controls.push(this);
+ $.each(controls, function(name, ui){
+ if( jElm.hasClass(opts.classPrefix+name) ){
+ var o = $.extend(true, {}, opts);
+ o[ui.optionsName] = $m.extendWithData(jElm[0], o[ui.optionsName], opts[ui.optionsName]);
+ ui(jElm, elems.mm, elems.api, o);
+ return false;
+ }
+ });
+ });
+ if( elems.api.controlWrapper && elems.api.controlWrapper[0] ){
+ addWrapperBindings(elems.api.controlWrapper, elems.mm, elems.api, opts);
+ }
+ }
+
+ return this.each(registerControl);
+ };
+
+ $.fn.jmeControl.defaults = {
+ //common
+ embed: {removeControls: true},
+ classPrefix: '',
+ addThemeRoller: true
+ };
+
+ $.support.waiaria = (!$.browser.msie || $.browser.version > 7);
+
+ $.fn.jmeControl.getBtn = (function(){
+ var split = /\s*\/\s*|\s*\|\s*|\s*\,\s*/g;
+ return function(control){
+ var elems = {
+ icon: $('.ui-icon', control),
+ text: $('.button-text', control),
+ title: control
+ };
+
+ if (!control.is(':button') && !control.attr('role')) {
+ if ($.support.waiaria) {
+ control.removeAttr('href');
+ }
+ control.attr({
+ role: 'button',
+ tabindex: 0
+ });
+ }
+
+ if (!elems.icon[0] && !elems.text[0] && !$('*', control)[0]) {
+ elems.icon = control;
+ elems.text = control;
+ }
+
+ elems.names = elems.text.text().split(split);
+ elems.titleText = (control.attr('title') || '').split(split);
+
+ if (elems.names.length !== 2) {
+ elems.text = $([]);
+ }
+ if (elems.titleText.length !== 2) {
+ elems.title = $([]);
+ }
+ return elems;
+ };
+ })();
+
+ $m.camelCase = (function(){
+ var rdashAlpha = /-([a-z])/ig,
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ }
+ ;
+ return function(name){
+ return name.replace(rdashAlpha, fcamelCase);
+ };
+ })();
+ $.fn.jmeControl.addControl = function(name, fn, ops, optsName){
+ ops = ops || {};
+ optsName = optsName || $m.camelCase(name);
+ $.fn.jmeControl.defaults[optsName] = ops;
+ fn.optionsName = optsName;
+ controls[name] = fn;
+
+ };
+
+ $.fn.jmeControl.addControls = function(controls){
+ $.each(controls, function(i, control){
+ $.fn.jmeControl.addControl(control.name, control.fn, control.options, control.optionName);
+ });
+ };
+
+ $.fn.registerMMControl = $.fn.jmeControl;
+
+
+ //implement controls
+ var toggleModells = {
+ 'play-pause': {stateMethod: 'isPlaying', actionMethod: 'togglePlay', evts: 'play playing pause ended loadedmeta mediareset', trueClass: 'ui-icon-pause', falseClass: 'ui-icon-play'},
+ 'mute-unmute': {stateMethod: 'muted', actionMethod: 'toggleMuted', evts: 'mute loadedmeta', trueClass: 'ui-icon-volume-off', falseClass: 'ui-icon-volume-on'}
+ }
+ ;
+
+ $.each(toggleModells, function(name, opts){
+ $.fn.jmeControl.addControl(name, function(control, mm, api, o){
+ var elems = $.fn.jmeControl.getBtn(control);
+ if(o.addThemeRoller){
+ control.addClass('ui-state-default ui-corner-all');
+ }
+ function changeState(e){
+ var state = (name == 'play-pause' && e && e.type == 'playing') ? true : mm[opts.stateMethod]();
+
+ if(state){
+ elems.text.text(elems.names[1]);
+ elems.title.attr('title', elems.titleText[1]);
+ elems.icon.addClass(opts.trueClass).removeClass(opts.falseClass);
+ } else {
+ elems.text.text(elems.names[0]);
+ elems.title.attr('title', elems.titleText[0]);
+ elems.icon.addClass(opts.falseClass).removeClass(opts.trueClass);
+ }
+ }
+
+ changeState();
+
+ mm
+ .bind(opts.evts, changeState)
+ .jmeReady(changeState)
+ ;
+ control.bind('ariaclick', function(e){
+ mm[opts.actionMethod]();
+ e.preventDefault();
+ });
+ });
+ });
+
+
+
+ $.each(['current-time', 'remaining-time'], function(i, name){
+ $.fn.jmeControl.addControl(name, function(control, mm, api, o){
+ var timeChange = ( name == 'remaining-time' ) ?
+ function(e, evt){
+ control.html( api.apis[api.name]._format( duration - evt.time ));
+ } :
+ function(e, evt){
+ control.html(api.apis[api.name]._format(evt.time));
+ },
+ duration = Number.MIN_VALUE
+ ;
+
+ if(o.addThemeRoller){
+ control.addClass('ui-widget-content ui-corner-all');
+ }
+ control.html('00:00').attr('role', 'timer');
+
+ if( name == 'remaining-time' ){
+ mm.bind('loadedmeta', function(e, evt){
+ duration = evt.duration || Number.MIN_VALUE;
+ timeChange(false, {time: 0});
+ });
+ }
+ mm
+ .bind('timechange', timeChange)
+ .bind('mediareset', function(){
+ control.html('00:00');
+ })
+ ;
+ });
+ });
+
+ $.fn.jmeControl.addControls([
+ {
+ name: 'duration',
+ fn: function(control, mm, api, o){
+ if(o.addThemeRoller){
+ control.addClass('ui-widget-content ui-corner-all');
+ }
+ control.html('00:00');
+ mm
+ .bind('loadedmeta', function(e, evt){
+ control.html(api.apis[api.name]._format(evt.duration));
+ })
+ .bind('mediareset', function(){
+ control.html('00:00');
+ })
+ ;
+
+ }
+ },
+ {
+ name: 'media-controls',
+ options: {
+ dynamicTimeslider: false,
+ timeSliderAdjust: 0,
+ excludeSel: false,
+ fullWindowOverlay: false
+ },
+ fn: function(control, mm, api, o){
+ if(o.addThemeRoller){
+ control.addClass('ui-widget ui-widget-header ui-corner-all');
+ }
+ control.attr('role', 'toolbar');
+ function calcSlider(){
+ var space = control.width() + o.mediaControls.timeSliderAdjust,
+ occupied = timeSlider.outerWidth(true) - timeSlider.innerWidth()
+ ;
+
+ $('> *', control).each(function(){
+ if(timeSlider[0] !== this && this.offsetWidth && $.curCSS(this, 'position') !== 'absolute' && ( !o.excludeSel || !$(this).is(o.excludeSel) ) ){
+ occupied += $(this).outerWidth(true);
+ }
+ });
+ timeSlider.css('width', space - occupied);
+ }
+
+ if(o.mediaControls.dynamicTimeslider){
+ var timeSlider = $('.'+ o.classPrefix +'timeline-slider', control),
+ calcTimer = setTimeout(calcSlider, 0)
+ ;
+
+ mm.jmeReady(function(){
+ clearInterval(calcTimer);
+ setTimeout(calcSlider, 0);
+ });
+ $(window).bind('resize', calcSlider);
+ mm.bind('resize emchange', calcSlider);
+ }
+ if(o.mediaControls.fullWindowOverlay && $.fn.videoOverlay ){
+ control.videoOverlay({
+ fullscreenClass: o.classPrefix +'controls-fullscreenvideo',
+ video: mm,
+ startCSS: {
+ width: 'auto'
+ },
+ position: {
+ bottom: 0,
+ left: 0,
+ right: 0
+ }
+ });
+ }
+ }
+ },
+ {
+ name: 'media-label',
+ fn: (function(){
+ var labelID = 0;
+ return function(control, mm, data, o){
+ if (!data.controlWrapper || data.controlWrapper.attr('role')) {
+ return;
+ }
+ var id = control.attr('id'), mediaName = $('.' + o.classPrefix + 'media-name', control);
+ if (!id) {
+ labelID++;
+ id = o.classPrefix + 'media-label-' + labelID;
+ control.attr('id', id);
+ }
+ data.mediaName = (mediaName[0]) ? mediaName : control;
+ data.controlWrapper.attr({
+ role: 'group',
+ 'aria-labelledby': id
+ });
+ };
+ })()
+ },
+ {
+ name: 'fallback',
+ fn: function(control, mm, api, o){
+ if( o.embed.showFallback || !$.support.mediaElements ){return;}
+ var fallback = control.clone(true),
+ showFallback = function(){
+ mm.after(fallback).hide();
+ $(this).one('mediareset', function(){
+ mm.show();
+ fallback.detach();
+ });
+ }
+ ;
+ mm.bind('totalerror', showFallback);
+ }
+ },
+ {
+ name: 'media-state',
+ options: {
+ click: 'togglePlay'
+ },
+ fn: function(control, mm, api, o){
+ $m.addStateClasses(control, mm, o.classPrefix);
+ if( o.mediaState.click && mm[o.mediaState.click] ){
+ control.click(function(){
+ mm[o.mediaState.click]();
+ });
+ }
+
+ }
+ }
+ ]);
+
+ $m.addStateClasses = function(control, mm, prefix){
+ prefix = prefix || '';
+ var stateClasses = prefix+'playing '+ prefix +'totalerror '+ prefix +'waiting '+ prefix +'idle '+ prefix +'flashblocker',
+ removeStateClasses = function(){
+ control.removeClass(stateClasses);
+ }
+ ;
+ mm.jmeReady(function(){
+ var playing = mm.isPlaying();
+ if(typeof playing !== 'boolean'){return;}
+ control.addClass(prefix+ (playing) ? 'idle' : 'playing');
+ });
+
+ control.addClass(prefix + mm.getMediaAPI());
+ mm
+ .bind({
+ apiActivated: function(e, d){
+ control.addClass(prefix + d.api);
+ },
+ apiDeActivated: function(e, d){
+ control.removeClass(prefix + d.api);
+ }
+ })
+ .bind('playing totalerror waiting flashblocker', function(e){
+ removeStateClasses();
+ control.addClass(prefix + e.type);
+ })
+ .bind('play', function(){
+ control.removeClass(prefix + 'idle');
+ })
+ .bind('pause ended mediareset', function(e){
+ removeStateClasses();
+ control.addClass(prefix +'idle');
+ })
+ .bind('canplay', function(e){
+ control.removeClass(prefix +'waiting');
+ })
+ ;
+ };
+
+ (function(){
+ var sliderMethod = ($.fn.a11ySlider) ? 'a11ySlider' : 'slider';
+ var sliderOpts = {range: false, animate: false};
+
+ $(function(){
+ sliderMethod = ($.fn.a11ySlider) ? 'a11ySlider' : 'slider';
+ });
+
+ $.fn.jmeControl.addControls([
+ {
+ name: 'timeline-slider',
+ optionName: 'timeSlider',
+ options: sliderOpts,
+ fn: function(control, mm, api, o){
+ var stopSlide = false,
+ changeTimeState = function(e, ui){
+ var time = parseInt( ui.timeProgress, 10 );
+ if(ui.timeProgress !== undefined && !stopSlide ){
+ control[sliderMethod]('value', ui.timeProgress);
+ }
+ },
+ changeDisabledState = function(){
+ if(api.apis[api.name].loadedmeta && api.apis[api.name].loadedmeta.duration){
+ control[sliderMethod]('option', 'step', 100 / Math.max( 100, control[0].offsetWidth ) );
+ control[sliderMethod]('option', 'disabled', false);
+ } else {
+ control[sliderMethod]('option', 'disabled', true);
+ }
+ }
+ ;
+
+ control[sliderMethod](o.timeSlider)[sliderMethod]('option', 'disabled', true);
+ $(window).bind('resize', changeDisabledState);
+ $(document).bind('emchange', changeDisabledState);
+ mm
+ .bind('loadedmeta resize', changeDisabledState)
+ .bind('timechange', changeTimeState)
+ .bind('mediareset', function(){
+ control[sliderMethod]('value', 0);
+ changeDisabledState();
+ })
+ .bind('ended', function(){
+ control[sliderMethod]('value', 100);
+ })
+ ;
+ control
+ .bind('slidestart', function(e, ui){
+ if (e.originalEvent) {
+ stopSlide = true;
+ }
+ })
+ .bind('slidestop', function(e, ui){
+ stopSlide = false;
+ })
+ .bind('slide', function(e, ui){
+ if(e.originalEvent && api.apis[api.name].isAPIReady){
+ api.apis[api.name].relCurrentTime(ui.value);
+ }
+ })
+ ;
+ }
+ },
+ {
+ name: 'volume-slider',
+ options: $.extend( {mutestate: false}, sliderOpts ),
+ fn: function(control, mm, api, o){
+ var stopSlide = false;
+
+ control[sliderMethod](o.volumeSlider)[sliderMethod]('option', 'disabled', true);
+
+ function changeVolumeUI(e, data){
+ if (stopSlide) {return;}
+ if(e.type == 'volumelevelchange') {
+ control[sliderMethod]('value', data.volumelevel);
+ } else {
+ control[sliderMethod]('value', ( mm.muted() ) ? 0 : mm.volume() );
+ }
+
+ }
+
+ control
+ .bind('slidestart', function(e){
+ if (e.originalEvent) {
+ stopSlide = true;
+ }
+ })
+ .bind('slidestop', function(){
+ stopSlide = false;
+ })
+ .bind('slide', function(e, ui){
+ if(e.originalEvent && api.apis[api.name].isAPIReady){
+ api.apis[api.name].volume(ui.value);
+ if( o.volumeSlider.mutestate && api.apis[api.name].muted() ){
+ api.apis[api.name].muted(false);
+ }
+ }
+ })
+ ;
+
+ mm
+ .bind('volumelevelchange loadedmeta', changeVolumeUI)
+ .jmeReady(function(){
+ control[sliderMethod]('option', 'disabled', false);
+ changeVolumeUI({type: 'ready'});
+ })
+ ;
+ //todo!!!
+ if(o.volumeSlider.mutestate){
+ mm.bind('mute', changeVolumeUI);
+ }
+ }
+ },
+ {
+ name: 'progressbar',
+ fn: function(control, mm, api, o){
+ control.progressbar(o.progressbar).progressbar('option', 'disabled', true);
+
+ function changeProgressUI(e, ui){
+ if ('relLoaded' in ui) {
+ control.progressbar('option', 'disabled', false).progressbar('value', ui.relLoaded);
+ } else {
+ control.progressbar('option', 'disabled', true);
+ }
+ }
+
+ function resetProgress(e, ui){
+ control.progressbar('option', 'disabled', true).progressbar('value', 0);
+ }
+
+ mm
+ .bind('progresschange', changeProgressUI)
+ .bind('mediareset', resetProgress)
+ ;
+
+ }
+ }
+ ]);
+ })();
+})(jQuery);/**!
+ * Part of the jMediaelement-Project | http://github.com/aFarkas/jMediaelement
+ * @author Alexander Farkas
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+
+(function($){
+
+ var swfAttr = {type: 'application/x-shockwave-flash'},
+ aXAttrs = {classid: 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'},
+ m = $.multimediaSupport
+ ;
+
+ $.extend($.fn.jmeEmbed.defaults,
+ {
+ flashPlayer: 'jwPlayer',
+ jwPlayer: {
+ path: m.jsPath + 'player.swf',
+ hideIcons: 'auto',
+ vars: {},
+ attrs: {},
+ plugins: {},
+ params: {
+ allowscriptaccess: 'always',
+ allowfullscreen: 'true'
+ }
+ }
+ }
+ )
+ ;
+
+ $(function(){
+ var path = ($('script.jwPlayer')[0] || {}).src;
+ if(path){
+ $.fn.jmeEmbed.defaults.jwPlayer.path = path;
+ }
+ });
+
+ var regs = {
+ A: /&amp;/g,
+ a: /&/g,
+ e: /\=/g,
+ q: /\?/g
+ },
+ providerMatch = {
+ audio: 'sound',
+ video: 'video'
+ },
+ replaceVar = function(val){
+ return (val.replace) ? val.replace(regs.A, '%26').replace(regs.a, '%26').replace(regs.e, '%3D').replace(regs.q, '%3F') : val;
+ }
+ ;
+
+
+
+ (function(){
+ $.support.flash9 = false;
+ $.support.flashVersion = 0;
+ var swf = m.getPluginVersion('Shockwave Flash'),
+ supportsMovieStar = function(obj, _retest){
+ $.support.flash9 = false;
+ try {
+ //opera needs typeof check do not use 'GetVariable' in obj
+ if (obj && typeof obj.GetVariable !== 'undefined') {
+ var version = obj.GetVariable("$version");
+ obj = m.getPluginVersion('', {
+ description: version
+ });
+ $.support.flashVersion = obj[0];
+ $.support.flash9 = !!(obj[0] > 9 || (obj[0] === 9 && obj[1] >= 115));
+ }
+ } catch (e) {}
+
+ }
+ ;
+ if(swf && swf[0]){
+ $.support.flashVersion = swf[0];
+ }
+ if(swf[0] > 9 || (swf[0] === 9 && swf[1] >= 115)){
+ //temp result
+
+ $.support.flash9 = true;
+ $(function(){
+ swf = $('<object />', swfAttr).appendTo('body');
+ supportsMovieStar(swf[0]);
+ swf.remove();
+ });
+ } else if(window.ActiveXObject){
+ try {
+ swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
+ supportsMovieStar(swf);
+ swf = null;
+ } catch(e){}
+ }
+ })();
+
+ var jwMM = {
+ isTechAvailable: function(){
+ return $.support.flash9;
+ },
+ _extendJWLoad: function(src, obj, elem){
+ if(!src){return;}
+
+ elem = elem || this.element;
+ var changeVars = this.embedOpts.jwPlayer.changeVars;
+ m.extendWithData(elem, obj, ['type', 'provider', 'stretching', 'bufferlength', 'streamer']);
+ obj.file = (elem.getAttribute('data-jwprefixsrc') || '') + obj.file;
+ // if we can't autodetect provider by file-extension,
+ // we add a provider
+ var ext = m.getExt(src),
+ name = (ext == 'm4r') ? 'video' : this.nodeName
+ ;
+ if(ext == 'm4r' || !this.canPlaySrc(src)){
+ if(!obj.provider){
+ obj.provider = providerMatch[name];
+ }
+ if(!obj.type){
+ obj.type = providerMatch[name];
+ }
+ }
+ if(changeVars){
+ changeVars(src, obj, elem, this);
+ }
+ return obj;
+ },
+ _embed: function(src, id, cfg, fn){
+ var opts = this.embedOpts.jwPlayer,
+ vars = $.extend({}, opts.vars, {file: src, id: id}),
+ attrs = $.extend({name: id}, opts.attrs, swfAttr, !(window.ActiveXObject) ? {data: opts.path} : {}),
+ params = $.extend({movie: opts.path}, opts.params),
+ plugins = [],
+ that = this
+ ;
+
+ this._extendJWLoad(src, vars);
+
+ if(cfg.poster){
+ vars.image = cfg.poster;
+ }
+
+ vars.autostart = ''+ cfg.autoplay;
+ vars.repeat = (cfg.loop) ? 'single' : 'false';
+ vars.controlbar = (cfg.controls) ? 'bottom' : 'none';
+
+ if( !cfg.controls && this.nodeName !== 'audio' && params.wmode === undefined ){
+ params.wmode = 'transparent';
+ }
+
+ if( (!cfg.controls && opts.hideIcons && params.wmode === 'transparent') || opts.hideIcons === true ){
+ vars.icons = 'false';
+ vars.showicons = 'false';
+ }
+
+ if( params.wmode === 'transparent' && !vars.screencolor && !attrs.bgcolor ){
+ vars.screencolor = 'ffffffff';
+ attrs.bgcolor = '#000000';
+ }
+
+ params.flashvars = [];
+ $.each(vars, function(name, val){
+ params.flashvars.push(replaceVar(name)+'='+replaceVar(val));
+ });
+
+ $.each(opts.plugins, function(name, src){
+ plugins.push(src);
+ });
+ if(plugins.length){
+ params.flashvars.push( 'plugins='+ ( plugins.join(',') ) );
+ }
+ params.flashvars = params.flashvars.join('&');
+ fn(m.embedObject( this.visualElem[0], id, attrs, params, aXAttrs, 'Shockwave Flash' ));
+ setTimeout(function(){
+ var swf = $('object', that.visualElem)[0];
+ if( !swf || (swf.style.display === 'none' && $('> *', that.visualElem).length > 1 ) ){
+ $('div[bgactive]', that.visualElem).css({width: '100%', height: '100%'});
+ that._trigger('flashblocker');
+ }
+ }, 9);
+ },
+ canPlaySrc: function(media){
+ var ret = m.fn.canPlaySrc.apply(this, arguments),
+ index = -1,
+ src = media.src || media
+ ;
+
+ if( !ret && typeof src === 'string' ){
+ index = src.indexOf('youtube.com/');
+ if(index < 15 && index > 6){
+ ret = 'maybe';
+ }
+ }
+
+ return ret;
+ },
+ canPlayCodecs: ['avc1.42E01E', 'mp4a.40.2', 'avc1.58A01E', 'avc1.4D401E', 'avc1.64001E', 'VP6', 'mp3', 'AAC'],
+ canPlayContainer: ['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', 'jwplayer/jwplayer']
+ }
+ ;
+
+ m.add('jwPlayer', 'video', jwMM);
+ m.add('jwPlayer', 'audio', jwMM);
+
+})(jQuery);
+/**!
+ * Part of the jMediaelement-Project | http://github.com/aFarkas/jMediaelement
+ * @author Alexander Farkas
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+
+(function($){
+ var doc = document,
+ $m = $.multimediaSupport,
+ rep = /^jwPlayer-/
+ ;
+
+ function getAPI(id){
+ if(!id){return;}
+ id = id.replace(rep, '');
+ return $.data(doc.getElementById(id), 'mediaElemSupport').apis.jwPlayer;
+ }
+
+ window.jwEvents = {
+ View: {
+ PLAY: function(obj){
+ var api = obj.state && getAPI(obj.id);
+ if(!api){return;}
+ api._trigger('play');
+ api._$isPlaystate = true;
+ }
+ },
+ Model: {
+ BUFFER: function(obj){
+ var api = getAPI(obj.id);
+ if(!api){return;}
+
+ if( api._$timeProgress && obj.percentage + api._$startBuffer + 1 < api._$timeProgress ){
+ api._$startBuffer = api._$timeProgress;
+ }
+ var evt = {
+ type: 'progresschange',
+ relLoaded: obj.percentage + api._$startBuffer,
+ relStart: 0
+ };
+ api._$buffered = evt.relLoaded;
+ api._trigger(evt);
+ },
+ STATE: function(obj){
+ var state = privJwEvents.Model.STATE(obj);
+ if(state === 'playing'){
+ var api = getAPI(obj.id);
+ if(!api){return;}
+ api._trigger('playing');
+ api._$isPlaystate = true;
+ }
+ },
+ META: function(obj){
+ if(obj.type === 'metadata'){
+ var api = getAPI(obj.id);
+ if(!api){return;}
+ api._trigger({
+ type: 'loadedmeta',
+ duration: obj.duration
+ });
+ }
+
+ },
+ TIME: function(obj){
+ var api = getAPI(obj.id),
+ e = {
+ type: 'timechange',
+ time: obj.position
+ }
+ ;
+ if(!api){return;}
+
+ //workaround: meta isn´t triggered on audio | ToDo: Is this needed with jwplayer 5.1.x?
+ if(!api.loadedmeta){
+ api._trigger({
+ type: 'loadedmeta',
+ duration: obj.duration
+ });
+ }
+
+ api._$currentPos = obj.position;
+ if(obj.duration){
+ e.duration = obj.duration;
+ e.timeProgress = obj.position / obj.duration * 100;
+ api._$timeProgress = e.timeProgress;
+ }
+ api._trigger(e);
+ },
+ STATE: function(obj){
+ if(obj.newstate === 'IDLE'){
+ return false;
+ }
+ var api = getAPI(obj.id),
+ type
+ ;
+ if(!api){return false;}
+ switch(obj.newstate) {
+ case 'PLAYING':
+ type = 'playing';
+ break;
+ case 'PAUSED':
+ api._$isPlaystate = false;
+ type = 'pause';
+ break;
+ case 'COMPLETED':
+ api._$isPlaystate = false;
+ type = 'ended';
+ api._adjustPluginLoop( (api.apiElem.getConfig().repeat == 'single') );
+ break;
+ case 'BUFFERING':
+ type = 'waiting';
+ break;
+ }
+
+ if(type){
+ api._trigger(type);
+ }
+ return type;
+ }
+ },
+ Controller: {
+ VOLUME: function(obj){
+ var api = getAPI(obj.id);
+ if(!api || api._$lastMuteState !== api.muted() ){return;}
+ api._trigger({type: 'volumelevelchange', volumelevel: obj.percentage});
+ },
+ MUTE: function(obj){
+ var api = getAPI(obj.id);
+ if(!api){return;}
+ api._$lastMuteState = obj.state;
+ api._trigger({type: 'mute', isMuted: obj.state});
+ }
+ }
+ };
+
+ window.playerReady = function (obj) {
+
+ var api = getAPI(obj.id);
+ if(!api){return;}
+ //https://bugzilla.mozilla.org/show_bug.cgi?id=90268 every html5video shim has this problem fix it!!!
+ if(api.isAPIReady){
+ if(!api.apiElem.sendEvent){
+ api._$reInit();
+ return;
+ } else {
+ setTimeout(function(){
+ if( api._lastLoad ){
+ api._mmload(api._lastLoad.file, api._lastLoad.image);
+ }
+ if(api._$isPlaystate && !(api.apiElem.getConfig() || {}).autostart){
+ api.play();
+ }
+ }, 8);
+ }
+ setTimeout(function(){
+ api._trigger('jmeflashRefresh');
+ }, 8);
+ } else if(!api.apiElem.sendEvent){
+ api._$reInit();
+ return;
+ }
+
+ //add events
+ $.each(jwEvents, function(mvcName, evts){
+ $.each(evts, function(evtName){
+ api.apiElem['add'+ mvcName +'Listener'](evtName, 'jwEvents.'+ mvcName +'.'+ evtName);
+ });
+ });
+
+ //preload workaround
+ setTimeout(function(){
+ api._$lastMuteState = api.muted();
+ var cfg = $.attr(api.element, 'getConfig');
+ api._trigger('mmAPIReady');
+ if(!cfg.autoplay && !api._$isPlaystate && (api.apiElem.getConfig() || {}).state === 'IDLE'){
+ if( api.nodeName === 'audio' && cfg.preload === 'auto' ){
+ api.apiElem.sendEvent('PLAY', 'true');
+ api.apiElem.sendEvent('PLAY', 'false');
+ } else if( api.nodeName === 'video' && cfg.preload !== 'none' && !cfg.poster ){
+ api.apiElem.sendEvent('PLAY', 'true');
+ api.apiElem.sendEvent('PLAY', 'false');
+ api.currentTime(0);
+ }
+ }
+ }, 9);
+ };
+
+ var jwAPI = {
+ _init: function(){
+ this._$resetStates();
+ },
+ _$resetStates: function(){
+ this._$buffered = 0;
+ this._$startBuffer = 0;
+ this._$timeProgress = 0;
+ this._$currentPos = 0;
+ },
+ _$reInitCount: 0,
+ _$reInitTimer: false,
+ _$reInit: function(){
+ var that = this;
+ if(this._$reInitCount < 5){
+ this.visualElem[0].style.overflow = 'visible';
+ setTimeout(function(){
+ that.visualElem[0].style.overflow = 'hidden';
+ }, 0);
+ }
+ this._$reInitCount++;
+ this._$resetStates();
+ if(!this._$reInitTimer){
+ this._$reInitTimer = true;
+ setTimeout(function(){
+ that._$reInitCount = 0;
+ that._$reInitTimer = false;
+ }, 20000);
+ }
+ },
+ play: function(){
+ this.apiElem.sendEvent('PLAY', 'true');
+ this._$isPlaystate = true;
+ this._trigger('play');
+ },
+ pause: function(){
+ this.apiElem.sendEvent('PLAY', 'false');
+ },
+ _isPlaying: function(){
+ var cfg = this.apiElem.getConfig();
+ return (cfg) ? (cfg.state === 'PLAYING' ) : undefined;
+ },
+ _mmload: function(src, poster, jwExtras){
+ var playing = this._isPlaying();
+ this._lastLoad = {file: src};
+ if(poster){
+ this._lastLoad.image = poster;
+ }
+ this._$resetStates();
+ this._extendJWLoad(src, this._lastLoad);
+ if(typeof jwExtras == 'object'){
+ $.extend(this._lastLoad, jwExtras);
+ }
+ if(!this.apiElem.sendEvent){return;}
+ this.apiElem.sendEvent('LOAD', this._lastLoad);
+ if( this.isAPIActive && ($.attr(this.element, 'autoplay') || playing) ){
+ this.apiElem.sendEvent('PLAY', 'true');
+ } else {
+ this.apiElem.sendEvent('PLAY', 'false');
+ }
+ },
+ muted: function(state){
+ if(typeof state !== 'boolean'){
+ var cfg = this.apiElem.getConfig();
+ return (cfg || {}).mute;
+ }
+ this.apiElem.sendEvent('mute', ''+state);
+ },
+ currentTime: function(t){
+ if(!isFinite(t)){
+ return this._$currentPos || 0;
+ }
+ this._$currentPos = t;
+ var playing = this._isPlaying();
+ this.apiElem.sendEvent('SEEK', t);
+ if(!playing){
+ this.pause();
+ }
+ this._trigger({type: 'timechange', time: t});
+ },
+ getDuration: function(){
+ var t = this.apiElem.getPlaylist()[0].duration || 0;
+ return t < 0 ? 0 : t;
+ },
+ volume: function(v){
+ if(!isFinite(v)){
+ return parseInt(this.apiElem.getConfig().volume, 10);
+ }
+ var wasMuted = this.muted();
+ this.apiElem.sendEvent('VOLUME', ''+v);
+ if(wasMuted){
+ this.apiElem.sendEvent('mute', 'true');
+ }
+ },
+ getCurrentSrc: function(){
+ return (this.apiElem.getConfig() || {}).file || '';
+ }
+ };
+
+ // ff flash refreshbug https://bugzilla.mozilla.org/show_bug.cgi?id=90268
+ // opera also has some problems here
+ $.extend(jwAPI, {
+ isJMEReady: function(){
+ var ret = false;
+ if(this.isAPIReady && this.apiElem.sendEvent && this.apiElem.getConfig){
+ // seems stupid, but helps :-)
+ ( $.browser.mozilla && this.apiElem.getConfig() );
+ ret = true;
+ }
+ return ret;
+ }
+ });
+
+
+ $m.add('jwPlayer', 'video', $.extend({}, jwAPI, {
+ exitFullScreen: function(){
+ if(this.apiElem.jmeExitFullScreen){
+ try {
+ this.apiElem.jmeExitFullScreen();
+ return true;
+ } catch(e){}
+ }
+ return false;
+ }
+ }));
+
+ $m.add('jwPlayer', 'audio', jwAPI);
+
+})(jQuery);