(function($){
$.jPlayer.adapters.flash = function(jPlayer){
var _ready = false,
_available = _checkForFlash(10.1),
_initialized = false,
_active = false,
_formats = {
mp3: true,
m4a: true,
fla: true,
rtmpa: true,
m4v: true,
flv: true,
rtmpv: true
},
_movieId = jPlayer.options.idPrefix + "_flash_" + jPlayer.count,
_jq = null,
_swfPath = jPlayer.options.swfPath + (jPlayer.options.swfPath.toLowerCase().slice(-4) !== ".swf" ? (jPlayer.options.swfPath && jPlayer.options.swfPath.slice(-1) !== "/" ? "/" : "") + "Jplayer.swf" : "");
jPlayer.version.flash = "n/a";
function _checkForFlash(version) {
var flashOk = false;
if(_getFlashPluginVersion() >= version) {
flashOk = true;
}
return flashOk;
}
function _getFlashStatus(status) {
jPlayer.status.seekPercent = status.seekPercent;
jPlayer.status.currentPercentRelative = status.currentPercentRelative;
jPlayer.status.currentPercentAbsolute = status.currentPercentAbsolute;
jPlayer.status.currentTime = status.currentTime;
jPlayer.status.duration = status.duration;
jPlayer.status.videoWidth = status.videoWidth;
jPlayer.status.videoHeight = status.videoHeight;
// The Flash does not generate this information in this release
jPlayer.status.readyState = 4; // status.readyState;
jPlayer.status.networkState = 0; // status.networkState;
jPlayer.status.playbackRate = 1; // status.playbackRate;
jPlayer.status.ended = false; // status.ended;
jPlayer._updateInterface();
}
function _getFlashPluginVersion() {
// _getFlashPluginVersion() code influenced by:
// - FlashReplace 1.01: http://code.google.com/p/flashreplace/
// - SWFObject 2.2: http://code.google.com/p/swfobject/
var version = 0,
flash;
if(window.ActiveXObject) {
try {
flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
if (flash) { // flash will return null when ActiveX is disabled
var v = flash.GetVariable("$version");
if(v) {
v = v.split(" ")[1].split(",");
version = parseInt(v[0], 10) + "." + parseInt(v[1], 10);
}
}
} catch(e) {}
}
else if(navigator.plugins && navigator.mimeTypes.length > 0) {
flash = navigator.plugins["Shockwave Flash"];
if(flash) {
version = navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/, "$1");
}
}
return version * 1; // Converts to a number
}
function _getMovie() {
return document[_movieId];
}
function _flashError(error) {
var errorType;
if(!jPlayer.internal.ready) {
errorType = "FLASH";
} else {
errorType = "FLASH_DISABLED";
}
this._error( {
type: $.jPlayer.error[errorType],
context: _swfPath,
message: $.jPlayer.errorMsg[errorType] + error.message,
hint: $.jPlayer.errorHint[errorType]
});
// Allow the audio player to recover if display:none and then shown again, or with position:fixed on Firefox.
// This really only affects audio in a media player, as an audio player could easily move the jPlayer element away from such issues.
_jq.css({'width':'1px', 'height':'1px'});
}
return {
_checkWaitForPlay: function(){
if(jPlayer.status.waitForPlay) {
jPlayer.status.waitForPlay = false;
if(jPlayer.css.jq.videoPlay.length) {
jPlayer.css.jq.videoPlay.hide();
}
if(jPlayer.status.video) {
jPlayer.internal.poster.jq.hide();
_jq.css({'width': jPlayer.status.width, 'height': jPlayer.status.height});
}
}
},
_trigger: function(eventType, status){
if(eventType == $.jPlayer.event.ready) {
if(!_ready) {
_ready = true;
_jq.css({'width':'0px', 'height':'0px'}); // Once Flash generates the ready event, minimise to zero as it is not affected by wmode anymore.
jPlayer.version.flash = status.version;
if(jPlayer.version.needFlash !== jPlayer.version.flash) {
jPlayer._error( {
type: $.jPlayer.error.VERSION,
context: jPlayer.version.flash,
message: $.jPlayer.errorMsg.VERSION + jPlayer.version.flash,
hint: $.jPlayer.errorHint.VERSION
});
}
jPlayer._trigger(eventType);
} else {
// This condition occurs if the Flash is hidden and then shown again.
// Firefox also reloads the Flash if the CSS position changes. position:fixed is used for full screen.
// Only do this if the Flash is the solution being used at the moment. Affects Media players where both solution may be being used.
if(_active) {
// Send the current status to the Flash now that it is ready (available) again.
if(jPlayer.status.srcSet) {
// Need to read original status before issuing the setMedia command.
var currentTime = jPlayer.status.currentTime,
paused = jPlayer.status.paused;
jPlayer.setMedia(jPlayer.status.media);
if(currentTime > 0) {
if(paused) {
jPlayer.pause(currentTime);
} else {
jPlayer.play(currentTime);
}
}
}
jPlayer._trigger($.jPlayer.event.flashreset);
}
}
return;
}
if(!_active) {
return;
}
switch(eventType) {
case $.jPlayer.event.progress:
_getFlashStatus(status);
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.timeupdate:
_getFlashStatus(status);
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.play:
jPlayer._seeked();
jPlayer._updateButtons(true);
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.pause:
jPlayer._updateButtons(false);
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.ended:
jPlayer._updateButtons(false);
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.click:
jPlayer._trigger(eventType); // This could be dealt with by the default
break;
case $.jPlayer.event.error:
jPlayer.status.waitForLoad = true; // Allows the load operation to try again.
jPlayer.status.waitForPlay = true; // Reset since a play was captured.
if(jPlayer.status.video) {
_jq.css({'width':'0px', 'height':'0px'});
}
if(jPlayer._validString(jPlayer.status.media.poster)) {
jPlayer.internal.poster.jq.show();
}
if(jPlayer.css.jq.videoPlay.length && jPlayer.status.video) {
jPlayer.css.jq.videoPlay.show();
}
if(jPlayer.status.video) { // Set up for another try. Execute before error event.
jPlayer.adapter.setVideo(jPlayer.status.media);
} else {
jPlayer.adapter.setAudio(jPlayer.status.media);
}
jPlayer._updateButtons(false);
jPlayer._error( {
type: $.jPlayer.error.URL,
context:status.src,
message: $.jPlayer.errorMsg.URL,
hint: $.jPlayer.errorHint.URL
});
break;
case $.jPlayer.event.seeking:
jPlayer._seeking();
jPlayer._trigger(eventType);
break;
case $.jPlayer.event.seeked:
jPlayer._seeked();
jPlayer._trigger(eventType);
break;
default:
jPlayer._trigger(eventType);
}
},
canPlay: function(format) {
return _available && _formats[format];
},
clearMedia: function() {
try {
_getMovie().fl_clearMedia();
} catch(err) { _flashError(err); }
},
init: function() {
// prevent double execution
if(_initialized){
return;
}
_initialized = true;
var htmlObj,
flashVars = 'jQuery=' + encodeURI(jPlayer.options.noConflict) + '&id=' + encodeURI(jPlayer.internal.self.id) + '&vol=' + jPlayer.options.volume + '&muted=' + jPlayer.options.muted;
_ready = false;
// Code influenced by SWFObject 2.2: http://code.google.com/p/swfobject/
// Non IE browsers have an initial Flash size of 1 by 1 otherwise the wmode affected the Flash ready event.
if($.jPlayer.browser.msie && (Number($.jPlayer.browser.version) < 9 || $.jPlayer.browser.documentMode < 9)) {
var objStr = '';
var paramStr = [
'',
'',
'',
'',
''
];
htmlObj = document.createElement(objStr);
for(var i=0; i < paramStr.length; i++) {
htmlObj.appendChild(document.createElement(paramStr[i]));
}
} else {
var createParam = function(el, n, v) {
var p = document.createElement("param");
p.setAttribute("name", n);
p.setAttribute("value", v);
el.appendChild(p);
};
htmlObj = document.createElement("object");
htmlObj.setAttribute("id", _movieId);
htmlObj.setAttribute("name", _movieId);
htmlObj.setAttribute("data", _swfPath);
htmlObj.setAttribute("type", "application/x-shockwave-flash");
htmlObj.setAttribute("width", "1"); // Non-zero
htmlObj.setAttribute("height", "1"); // Non-zero
htmlObj.setAttribute("tabindex", "-1");
createParam(htmlObj, "flashvars", flashVars);
createParam(htmlObj, "allowscriptaccess", "always");
createParam(htmlObj, "bgcolor", jPlayer.options.backgroundColor);
createParam(htmlObj, "wmode", jPlayer.options.wmode);
}
jPlayer.element.append(htmlObj);
jPlayer.internal.flash.jq = $(htmlObj);
},
isActive: function() {
return _active
},
isInitialized: function(){
return _initialized
},
isReady: function() {
return _ready;
},
load: function() {
try {
_getMovie().fl_load();
} catch(err) { _flashError(err); }
jPlayer.status.waitForLoad = false;
},
mute: function(m) {
try {
_getMovie().fl_mute(m);
} catch(err) { _flashError(err); }
},
pause: function(time) {
try {
_getMovie().fl_pause(time);
} catch(err) { _flashError(err); }
if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button.
jPlayer.status.waitForLoad = false;
this._checkWaitForPlay();
}
},
play: function(time) {
try {
_getMovie().fl_play(time);
} catch(err) { _flashError(err); }
jPlayer.status.waitForLoad = false;
this._checkWaitForPlay();
},
playHead: function(p) {
try {
_getMovie().fl_play_head(p);
} catch(err) { _flashError(err); }
if(!jPlayer.status.waitForLoad) {
this._checkWaitForPlay();
}
},
resetMedia: function() {
jPlayer.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Must do via CSS as setting attr() to zero causes a jQuery error in IE.
jPlayer.adapter.pause(NaN); // flash_pause
_active = false;
},
setAudio: function(media) {
var self = this;
try {
// Always finds a format due to checks in setMedia()
$.each(jPlayer.formats, function(priority, format) {
if(self.canPlay(format) && media[format]) {
switch (format) {
case "m4a" :
case "fla" :
_getMovie().fl_setAudio_m4a(media[format]);
break;
case "mp3" :
_getMovie().fl_setAudio_mp3(media[format]);
break;
case "rtmpa":
_getMovie().fl_setAudio_rtmp(media[format]);
break;
}
jPlayer.status.src = media[format];
jPlayer.status.format[format] = true;
jPlayer.status.formatType = format;
_active = 'audio';
return false;
}
return true;
});
if(jPlayer.options.preload === 'auto') {
this.load();
jPlayer.status.waitForLoad = false;
}
} catch(err) { _flashError(err); }
},
setSize: function(width, height) {
_jq.css({'width': width, 'height': height});
},
setVideo: function(media) {
var self = this;
try {
// Always finds a format due to checks in setMedia()
$.each(jPlayer.formats, function(priority, format) {
if(self.canPlay(format) && media[format]) {
switch (format) {
case "m4v" :
case "flv" :
_getMovie().fl_setVideo_m4v(media[format]);
break;
case "rtmpv":
_getMovie().fl_setVideo_rtmp(media[format]);
break;
}
jPlayer.status.src = media[format];
jPlayer.status.format[format] = true;
jPlayer.status.formatType = format;
_active = 'video';
return false;
}
});
if(jPlayer.options.preload === 'auto') {
this.load();
jPlayer.status.waitForLoad = false;
}
} catch(err) { _flashError(err); }
},
volume: function(v) {
try {
_getMovie().fl_volume(v);
} catch(err) { _flashError(err); }
}
};
}
})(jQuery);