home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
developer.apple.com
/
developer.apple.com.tar
/
developer.apple.com
/
global
/
scripts
/
ac_media.js
next >
Wrap
Text File
|
2010-06-09
|
150KB
|
4,413 lines
// = Apple Gracefully Degrading Media Playback =
//
// This script provides functionality for both creating video players
// that will use modern technology if possible, but fall back on QuickTime.
//
// Part of the functionality included herein is also video controls similar
// to those in Show Leopard's QuickTime X Player.
//
/*jsl:ignoreall*/
var existingVideo = false,
existingVideoSrc = false,
playExistingVideo = false,
ac_media_language = false;
var MediaLanguage = {
translationDictionary: {
"en": "en.json",
"en-US": "en-US.json",
"en-CA": "en-CA.json",
"en-KR": "en-KR.json",
"es": "es.json",
"es-LA": "es-LA.json",
"es-MX": "es-MX.json",
"fr": "fr.json",
"fr-CA": "fr-CA.json",
"ja": "ja.json",
"ja-JP": "ja-JP.json",
"pt": "pt.json",
"pt-BR": "pt-BR.json",
"zh": "zh.json",
"zh-CN": "zh-CN.json",
"zh-HK": "zh-HK.json",
"zh-TW": "zh-TW.json"
},
getLangFromAttr: function(attr) {
if(!attr) {
return 'en-US';
}
switch (attr.toLowerCase()) {
case 'en-us':
return 'en-US';
case 'en-ca':
return 'en-CA';
case 'en-kr':
return 'en-KR';
case 'ja-jp':
return 'ja-JP';
case 'pt':
case 'pt-br':
return 'pt-BR';
case 'es-419':
case 'es-la':
return 'es-LA';
case 'es-mx':
return 'es-MX';
case 'fr-ca':
return 'fr-CA';
case 'ja-jp':
return 'ja-JP';
case 'zh-cn':
return 'zh-CN';
case 'zh-hk':
return 'zh-HK';
case 'zh-tw':
return 'zh-TW';
default:
return attr;
}
},
getTranslations: function() {
var html = document.getElementsByTagName('html').item(0),
langAttr = html.getAttribute('lang'),
lang = this.getLangFromAttr(langAttr),
langFile = this.langDictionary(lang);
new Ajax.Request('/global/scripts/ac_media_languages/'+langFile, {
method:'get',
requestHeaders: {Accept: 'application/json'},
onSuccess: function(transport){
ac_media_language = new Function("return "+transport.responseText)();
//func.call(((self) ? self : window),json);
}.bind(this),
evalJS: false
});
},
langDictionary: function(locale) {
var language = locale.toLowerCase().split('-')[0],
localeInfo = this.translationDictionary[locale] || false;
if (!localeInfo) {
localeInfo = this.translationDictionary[language];
}
if (!localeInfo) {
localeInfo = this.translationDictionary['en'];
}
return localeInfo;
}
};
MediaLanguage.getTranslations();
var Media = {
VERSION: '3.5',
MIN_QUICKTIME_VERSION: '7.4',
CAPTIONS_NS: 'http://www.w3.org/2006/04/ttaf1',
create: function(container, src, options) {
var element, innerface, controls, controller,
shouldBuildMediaSpecVideo = true,
shouldBuildMediaSpecQuickTime = true,
shouldBuildMediaSpecSBVDP = true,
ipad = AC.Detector.isiPad();
// Do some browser-specific setup
switch(true) {
case Media.Detection.Firefox():
Element.addClassName(container, 'mozilla');
break;
case Media.Detection.Opera():
Element.addClassName(container, 'opera');
break;
case Media.Detection.IE():
Media._createEventSource();
break;
default:
break;
}
if (options.target === 'quicktimeplayer') {
options.spec = 'qt';
}
if (options.spec) {
switch(options.spec) {
case 'qt':
shouldBuildMediaSpecVideo = false;
shouldBuildMediaSpecSBVDP = false;
break;
case 'video': case 'audio':
shouldBuildMediaSpecQuickTime = false;
shouldBuildMediaSpecSBVDP = false;
break;
case 'sbvdp':
shouldBuildMediaSpecVideo = false;
shouldBuildMediaSpecQuickTime = false;
break;
default:
break;
}
}
var iPhoneOSVersion = (Media.Detection.Mobile()) ? Media.Detection.iPhoneOSVersion() : null;
if (iPhoneOSVersion && iPhoneOSVersion[0] < 3) {
shouldBuildMediaSpecVideo = false;
shouldBuildMediaSpecQuickTime = true;
}
switch(true) {
case (ipad || (shouldBuildMediaSpecVideo && Media._isHTML5VideoAvailable() && !Media.Detection.Firefox() && !Media.Detection.Mobile() && !Media.Detection.Chrome() && !Media.Detection.Opera() && !!(Media.Detection.Safari() && Media.Detection.SnowLeopard()))):
// Create <video> player
if(options.audio == true && typeof Media.Spec.Audio !== undefined) {
return build(Media.Spec.Audio);
}
return build(Media.Spec.Video);
break;
case (shouldBuildMediaSpecQuickTime && Media._isQuickTimeAvailable(Media.MIN_QUICKTIME_VERSION)):
case Media.Detection.Mobile():
// Create QuickTime player
return build(Media.Spec.QuickTime);
break;
case (shouldBuildMediaSpecSBVDP && Media._isSBVDPAvailable(Media.MIN_SBVDP_VERSION)):
// Create SBVDP player
return build(Media.Spec.SBVDP);
break;
case Media._shouldShowDownloadPrompt():
default:
// At this point we've determined there will be no video,
// so show a download prompt if we need to, then return false;
Media.createDownloadPrompt(container, src, options);
break;
}
function build(Spec) {
// First, create a new controller...
controller = Media.Controller(container);
// ...then a video player (with a corresponding video interface)...
element = Spec.create(container, src, options);
innerface = Media.VideoInterface(element, controller);
//Got to fake autolay for iPad:
if(ipad && (options.autoplay === true || options.autostart === true)) {
//element.forcePlay();
// alert("ipad = "+ipad+", options.autoplay = "+options.autoplay+", options.autostart = "+options.autostart);
// var link = document.createElement("a"),
// forcePlay = function(event) {
// event.preventDefault();
// element.play();
// },
// triggerEvent;
// link.addEventListener("click",forcePlay,false);
// document.body.appendChild(link);
// triggerEvent = document.createEvent("MouseEvents");
// if (triggerEvent.initMouseEvent) {
// triggerEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
// link.dispatchEvent(triggerEvent);
// }
// document.body.removeChild(link);
//
}
// Now, customize the interface with events and/or polling, and custom methods.
var eventsToRegister = Spec.eventsToRegister;
for (var event in eventsToRegister) {
var name = eventsToRegister[event].name || eventsToRegister[event],
fn = eventsToRegister[event].callback;
innerface.registerEvent(event, name, fn);
}
if (Spec.pollForChanges) {
innerface.pollForChanges(Spec.pollForChanges);
}
if (Spec.interfaceMethods) {
innerface.override(Spec.interfaceMethods);
}
innerface.setup();
// Finally, attach the video interface to the controller
controller.setVideo(innerface);
controller.setVideoSrc(src);
//controller.configureSettingsControls(src);
controller.container = container;
controller.movieLoadingPanelClass = 'movie-loading-panel';
if (typeof options.width != 'undefined' && typeof options.height != 'undefined') {
if (typeof controller.currentWidth == 'undefined' && typeof controller.currentHeight == 'undefined') {
controller.currentWidth = options.width;
controller.currentHeight = options.height;
}
controller.movieLoadingPanelClass = 'movie-loading-panel_' + options.width + 'x' + options.height;
}
Element.addClassName(container, controller.movieLoadingPanelClass);
return controller;
}
return false;
},
createDownloadPrompt: function (container, src, options)
{
Element2.Methods.removeAllChildNodes(container);
var downloadNotice = document.createElement('a'),
downloadNoticeTitle = document.createElement('span'),
downloadNoticeText = document.createElement('span'),
downloadNoticeButton = document.createElement('span'),
downloadNoticeUrl = options.downloadUrl || ac_media_language.downloadquicktimeurl || 'http://www.apple.com/quicktime/download/';
Element.addClassName(downloadNotice, 'quicktime-download');
if (typeof options.width !== 'undefined' && typeof options.height !== 'undefined') {
Element.addClassName(downloadNotice, 'size' + options.width + 'x' + options.height);
}
downloadNotice.setAttribute('href', downloadNoticeUrl);
Element.addClassName(downloadNoticeTitle, 'quicktime-download-title');
Element.addClassName(downloadNoticeText, 'quicktime-download-text');
Element.addClassName(downloadNoticeButton, 'quicktime-download-button');
downloadNoticeTitle.innerHTML = options.downloadTitle || ac_media_language.downloadquicktimetitle || 'Get QuickTime.';
downloadNoticeText.innerHTML = options.downloadText || ac_media_language.downloadquicktimetext || 'Download QuickTime to view this video.<br />QuickTime is free for Mac + PC.';
downloadNoticeButton.innerHTML = options.downloadButton || ac_media_language.downloadquicktimebutton || 'Download';
downloadNotice.appendChild(downloadNoticeTitle);
downloadNotice.appendChild(downloadNoticeText);
downloadNotice.appendChild(downloadNoticeButton);
container.appendChild(downloadNotice);
if ('fire' in Element) {
Element.fire(document.body,
"QuickTime:noCompatibleQTAvailable",
{controller: this, minVersion: Media.MIN_QUICKTIME_VERSION});
}
return downloadNotice;
},
_isHTML5VideoAvailable: function ()
{
return Media.Detection.HTML5();
},
_isQuickTimeAvailable: function ()
{
return Media.Detection.QuickTime(Media.MIN_QUICKTIME_VERSION);
},
_isSBVDPAvailable: function ()
{
return Media.Detection.SBVDP(Media.MIN_SBVDP_VERSION);
},
_shouldShowDownloadPrompt: function ()
{
return !Media.Detection.Mobile();
},
_createEventSource: function()
{
var source_id = "qt_event_source",
behavior,
head;
// Don't recreate it if we already have one by this id
if (document.getElementById(source_id)) {
return;
}
behavior = document.createElement('object');
behavior.id = source_id;
behavior.setAttribute('clsid', 'CB927D12-4FF7-4a9e-A169-56E4B8A75598');
head = document.getElementsByTagName('head')[0];
head.appendChild(behavior);
}
};
Media.Detection = {
HTML5: function () {
if (!('HTMLMediaElement' in window)){
return false;
}
var video = document.createElement('video');
return (video.canPlayType && video.canPlayType('video/mp4')!=='');
},
QuickTime: function(version) {
return AC.Detector.isValidQTAvailable(version);
},
SBVDP: function(version) {
return AC.Detector.isSBVDPAvailable(version);
},
Mobile: function () {
return (AC.Detector.isiPad()) ? true : AC.Detector.isMobile();
},
iPhoneOSVersion: function() {
return AC.Detector.iPhoneOSVersion();
},
iPad: function () {
return AC.Detector.isiPad();
},
Safari: function () {
return AC.Detector.isSafari2();
},
IE: function () {
return AC.Detector.isIEStrict();
},
Firefox: function () {
return AC.Detector.isFirefox();
},
Opera: function () {
return AC.Detector.isOpera();
},
Chrome: function () {
return AC.Detector.isChrome();
},
SnowLeopard: function () {
return AC.Detector.isSnowLeopard();
},
SnowLeopard1062: function () {
var agent = AC.Detector.getAgent(),
match = agent.match(/mac\sos\sx\D*([\.\w]*)/i),
version = false;
if (match && match[1]) {
version = match[1];
}
return (AC.Detector.isWebKit() && (version === '10_6_2' || version === '10_6_1' || version === '10_6'));
},
CSSTransitions: function () {
try {
var temp = document.createElement('div').style;
temp.setProperty('-webkit-transition', 'inherit', null);
temp.setProperty('-moz-transition', 'inherit', null);
temp.setProperty('-o-transition', 'inherit', null);
temp.setProperty('transition', 'inherit', null);
return (temp.getPropertyValue('-webkit-transition') == 'inherit' ||
temp.getPropertyValue('-moz-transition') == 'inherit' ||
temp.getPropertyValue('-o-transition') == 'inherit' ||
temp.getPropertyValue('transition') == 'inherit');
} catch(e) {
return false;
}
},
CSSBorderRadius: function () {
try {
var temp = document.createElement('div').style;
temp.setProperty('-webkit-border-radius', 'inherit', null);
temp.setProperty('-moz-border-radius', 'inherit', null);
temp.setProperty('-o-border-radius', 'inherit', null);
temp.setProperty('border-radius', 'inherit', null);
return (temp.getPropertyValue('-webkit-border-radius').match('inherit') ||
temp.getPropertyValue('-moz-border-radius').match('inherit') ||
temp.getPropertyValue('-o-border-radius').match('inherit') ||
temp.getPropertyValue('border-radius').match('inherit'));
} catch(e) {
return false;
}
}
};
// == Media.Spec ==
//
// Media.Spec is a list of the types of media that we can support, with
// specs on how to create and interact with each.
//
// The create function is in charge of generating DOM elements, and appending
// them to the container.
Media.Spec = {
Video: {
create: function (container, src, options) {
var tagName = ( options && options.audio ) ? 'audio' : 'video',
video,
videoSrc = (src.indexOf('?') > 0) ? src.substring(0, src.lastIndexOf('?')): src,
qtSource,
dotLastIndex = videoSrc.lastIndexOf("."),
pathExtension = ( dotLastIndex > 0 ) ? videoSrc.substring(dotLastIndex+1,src.length) : null,
type = 'video/mp4';
if(pathExtension) {
pathExtension = pathExtension.split("#")[0];
type = tagName+'/'+pathExtension;
}
//Not re-using the video for iPad takes care of rdar://problem/8065412, tha forces a reload of the movie
if (!AC.Detector.isiPad() && existingVideo != false) {
//if (existingVideo != false) {
if (existingVideoSrc == videoSrc) {
//console.log('using existing video');
video = existingVideo;
container.appendChild(video);
playExistingVideo = true;
return video;
} else {
existingVideoSrc = false;
}
}
video = document.createElement(tagName);
qtSource = document.createElement('source');
video.playerType = tagName;
if ((video.playerType === "video" && (video.canPlayType('video/mp4') || video.canPlayType('application/x-mpegURL'))) || (video.playerType === "audio" && ( ((AC.Detector.isWebKit() || AC.Detector.isMobile() || AC.Detector.isiPad()) && pathExtension === "mov") || video.canPlayType(type)) )) {
if(video.playerType === "video") {
type = 'video/mp4';
}
var id = options.id || (container.id ? container.id+'_video' : ''),
fileExtension = (src.indexOf('?') > 0) ? src.substring(src.lastIndexOf('.'),src.lastIndexOf('?')) : src.substring(src.lastIndexOf('.'),src.length);
video.setAttribute('id', id);
Element.addClassName(video, video.playerType);
if(video.playerType === "video") {
qtSource.setAttribute('src', videoSrc);
switch(fileExtension) {
case '.m3u8':
video.setAttribute('src', src);
break;
default:
qtSource.setAttribute('type', type);
video.appendChild(qtSource);
break;
}
}
else {
video.setAttribute('src', src);
}
this._configure(video, videoSrc, options);
Event.observe(window, 'unload', function () {
try {
video.stop();
} catch(e) {}
video.style.display = 'none';
video = null;
});
container.appendChild(video);
existingVideoSrc = videoSrc;
existingVideo = video;
} else {
// We need to create our fallback in case the browser supports <video>, but not our codec.
// So... do that now
video = this._createFallback(container, src, options);
}
//alert(video.outerHTML);
return video;
},
eventsToRegister: {
load: 'load',
loadedmetadata: 'loadedmetadata',
timeupdate: 'timeupdate',
durationchange: 'durationchange',
progress: 'progress',
playing: 'playing',
play: 'play',
pause: 'pause',
ended: 'ended'
// fullscreen removal
// webkitendfullscreen: 'webkitendfullscreen'
},
_captions: null,
// fullscreen removal
// _fullscreen: false,
interfaceMethods: {
readystate: function () {
return this.readyState;
},
autoplay: function() {
return this.autoplay;
},
duration: function () {
return this.duration;
},
time: function () {
if (!this.webkitClosedCaptionsVisible && this._captionsEnabled === true) {
// update the closedcaptions display if we're playing
if (typeof Media.Spec.Video._captions !== 'undefined') {
var closedcaptions = Media.Spec.Video._captions.getElementsByTagName('p');
if (closedcaptions.length > 0) {
var caption = '';
function convertTime(oldTime) {
var newTime = 0.0;
if (oldTime) {
var timeArr = oldTime.split(':');
switch (timeArr.length) {
case 3:
for (var i=0; i < 3; i++)
newTime = newTime * 60 + parseFloat(timeArr[i].replace(',', '.'));
break;
case 4:
for (var i=0; i < 3; i++)
newTime = newTime * 60 + parseFloat(timeArr[i].replace(',', '.'));
// @@ ignore frames
break;
default:
break;
}
}
return newTime;
}
for (var index = 0, closedcaption; closedcaption = closedcaptions[index]; index++) {
var begin = convertTime(closedcaption.getAttribute('begin')),
end = convertTime(closedcaption.getAttribute('end'));
if (this.currentTime < begin) {
break;
}
if (this.currentTime >= begin && this.currentTime < end) {
caption = closedcaption;
}
}
if (typeof caption != 'undefined' && caption != this.currentCaption) {
this.currentCaption = caption;
var children = caption.childNodes,
length = (typeof children != 'undefined') ? children.length : 0,
captionString = '';
for (var i = 0; i < length; i++) {
var child = children.item(i);
if (child.nodeType == 3) {
captionString += '<span>'+child.nodeValue+'</span>';
}
}
if (captionString === '') {
this.trackTextSpan.style.display = 'none';
} else {
this.trackTextSpan.style.display = 'inline-block';
this.trackTextSpan.innerHTML = captionString;
}
}
}
}
}
return this.currentTime;
},
setTime: function(value) {
this.currentTime = value;
},
volume: function () {
return this.volume;
},
setVolume: function(value) {
this.volume = value;
},
muted: function () {
return this.muted;
},
setMuted: function(value) {
this.muted = value;
},
rate: function () {
return this.playbackRate;
},
setRate: function (value) {
this.playbackRate = value;
},
defaultRate: function () {
return this.defaultPlaybackRate;
},
src: function () {
return this.src;
},
setSrc: function (src) {
// console.log('in video spec setting src');
this.src = src;
},
status: function () {
return this.status;
},
percentLoaded: function () {
var percentLoaded = 0;
try {
percentLoaded = this.buffered.end(0) / this.duration;
} catch(e) {}
return percentLoaded;
},
pause: function () {
this.pause();
},
play: function () {
this.play();
},
paused: function () {
return this.paused;
},
ended: function () {
return this.ended;
},
timeScale: function () {
return 2997;
},
movieType: function () {
return 'Video';
},
// fullscreen removal
// supportsFullscreen: function() {
// return !!this.webkitSupportsFullscreen;
// },
getContainer: function () {
return this.parentNode;
},
setTrackTextSpan: function(span) {
this.trackTextSpan = span;
},
setCaptionsAvailable: function(func, url) {
if ((typeof Media.Spec.Video._captions != 'undefined' && Media.Spec.Video._captions != null) || typeof this.webkitClosedCaptionsVisible != 'undefined') {
func();
return;
}
var videoText;
if (url.match(/\w+:\/\//i)) {
url = url.replace(/\w+:\/\/[^\/]+/i,"");
}
// for debugging uncomment the line below
//url = '/global/scripts/sbvdp/caption_export.xml';
//console.log('captions url: '+url);
new Ajax.checkURL(url, func);
videoText = document.createElement('text');
videoText.setAttribute('type', 'application/ttaf+xml');
videoText.setAttribute('src', url);
this.appendChild(videoText);
new Ajax.Request(url, {
method:'get',
requestHeaders: {Accept: 'application/ttaf+xml'},
onSuccess: function(httpResponse) {
var captionsDocument = httpResponse.responseXMLValue().documentElement;
if (AC.Detector.isIEStrict()) {
captionsDocument = captionsDocument.ownerDocument;
}
var language = captionsDocument.getAttribute('xml:lang');
videoText.setAttribute('lang', language);
Media.Spec.Video._captions = captionsDocument.getElementsByTagNameNS(Media.CAPTIONS_NS, 'body').item(0);
Media.Spec.Video._captions.currentIndex = 0;
//console.log('got captionsxml');
}.bind(this),
onFailure: function() {},
onException: function() {},
onCreate: function(httpResponse) {
httpResponse.request.overrideMimeType('application/ttaf+xml');
}
});
},
enableCaptions: function() {
var enableCaptionsTextDisplay = this._videoClosedCaptionsEnabled;
try{
if (this._videoClosedCaptionsEnabled === true) {
this.webkitClosedCaptionsVisible = true;
}
} catch(e) {}
this._captionsEnabled = true;
},
disableCaptions: function() {
try {
if (this._videoClosedCaptionsEnabled === true) {
this.webkitClosedCaptionsVisible = false;
}
} catch (e) {}
if ('' != this.currentCaption) {
this.currentCaption = this.trackTextSpan.innerHTML = '';
}
this._captionsEnabled = false;
},
_videoClosedCaptionsEnabled: false,
videoClosedCaptionsEnabled: function() {
this._videoClosedCaptionsEnabled = (typeof this.webkitClosedCaptionsVisible != 'undefined') ? true : false;
return this._videoClosedCaptionsEnabled;
} //,
// enableCaptionsTextDisplay: function() {
// return (typeof this.webkitClosedCaptionsVisible != 'undefined') ? true : false;
//
// // if (typeof this.webkitClosedCaptionsVisible != 'undefined') {
// // return true;
// // } else {
// // return false;
// // }
// },
// fullscreen removal
// enableFullscreen: function() {
// try {
// if (this._captionsEnabled === true) {
// this.webkitClosedCaptionsVisible = true;
// }
// this.webkitEnterFullScreen();
// } catch(e) {}
// },
// disableFullscreen: function() {
// try {
// if (this._captionsEnabled === true) {
// this.webkitClosedCaptionsVisible = false;
// }
// this.webkitExitFullScreen();
// } catch(e) {}
// }
},
_configure: function (video, src, options)
{
if (!options) {
return;
}
var property,
attributeName;
for (property in options) {
if (options.hasOwnProperty(property)) {
if(typeof options[property] == undefined) {
continue;
}
attributeName = property.toLowerCase();
switch(attributeName) {
case 'type':
case 'src':
case 'data':
case 'classid':
case 'name':
case 'id':
case 'postdomevents':
case 'saveembedtags':
case 'factory':
case 'aggressiveCleanup':
case 'innerId':
case 'cache':
case 'aggressivecleanup':
case 'showlogo':
//do nothing as these shouldn't be overridden or set
break;
case('class'):
Element.addClassName(video, options[property]);
break;
case('controller'):
if (options[property] || (Media.Detection.iPad() && video.tagName === "VIDEO") ) {
video.setAttribute("controls", "controls");
}
break;
case('autoplay'):
case('autostart'):
if (options[property]) {
video.setAttribute("autoplay", "autoplay");
}
break;
case('posterframe'):
if (options[property]) {
video.setAttribute("poster", options[property]);
}
break;
default:
if(typeof options[property] !== "undefined") {
video.setAttribute(attributeName, options[property]);
}
break;
}
}
}
},
_createFallback: function (container, src, options)
{
if (Media._isQuickTimeAvailable()) {
return Media.Spec.QuickTime.create(container, src, options);
}
if (Media._isSBVDPAvailable()) {
return Media.Spec.SBVDP.create(container, src, options);
}
if (Media._shouldShowDownloadPrompt()) {
return Media.createDownloadPrompt(container, src, options);
}
return false;
}
},
QuickTime: {
create: function(container, src, options) {
var outerObject = this._createObject(src, options),
innerObject = null,
id = options.id || (container.id ? container.id+'_video' : '');
outerObject.setAttribute('id', id);
if (!Media.Detection.IE() && !Media.Detection.Mobile()) {
// Note:
// Creating an inner object in IE results in a "# items remaining"
// status which makes the page appear as if it never finishes loading.
// So, we won't create one for IE.
if (options.target === 'quicktimeplayer') {
innerObject = this._innerObject = this._createInnerObject(src, options);
} else {
innerObject = this._embed = this._createEmbed(src, options);
}
outerObject.appendChild(innerObject);
} else {
outerObject.style.behavior = "url(#qt_event_source)";
if (options.aggressiveCleanup !== false){
//knowing it's IE at this point, make sure we clear the movie when the page closes
//we also set our reference to null for good measure
Event.observe(window, 'unload', function () {
try {
outerObject.Stop();
} catch(e) {}
outerObject.style.display = 'none';
outerObject = null;
});
}
}
this._configure(innerObject, outerObject, options);
// Needs to be last so IE sees all the parameters appended to
// the object prior to loading the activex control
outerObject.setAttribute('classid', 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B');
// We're adding that in order to be able to specialize the CSS for movie-loading for the Quicktime plugin only.
Element.addClassName(outerObject, (outerObject.playerType = 'quicktime'));
//console.log(outerObject.innerHTML);
container.appendChild(outerObject);
return innerObject || outerObject;
},
pollForChanges: [
'load',
'timeupdate',
'durationchange',
'progress',
'playing',
'play',
'pause',
'ended'
],
_captions: null,
interfaceMethods: {
setup: function () {
},
duration: function () {
var duration = 0;
try {
duration = this.GetDuration() / this.GetTimeScale();
} catch(e) {}
return duration || 0;
},
time: function () {
var time = 0;
try {
time = this.GetTime() / this.GetTimeScale();
} catch(e) {}
return time || 0;
},
setTime: function(value) {
try {
this.SetTime(value * this.GetTimeScale());
} catch(e) {}
},
volume: function () {
return this.GetVolume() / 255;
},
setVolume: function(value) {
this.SetVolume(value * 255);
},
muted: function () {
return this.GetMute();
},
setMuted: function(value) {
this.SetMute(value);
},
rate: function () {
var rate;
try {
rate = this.GetRate();
} catch(e) {}
return rate || 1;
},
setRate: function (value) {
this.SetRate(value);
},
status: function () {
this.GetPluginStatus();
},
percentLoaded: function () {
var percent = 0;
try {
percent = this.GetMaxBytesLoaded()/this.GetMovieSize();
} catch(e) {}
return percent;
},
pause: function () {
try {
this.Stop();
} catch(e) {}
},
play: function () {
try {
this.Play();
} catch(e) {}
},
paused: function () {
try {
return this.GetRate()===0;
} catch(e) {}
},
ended: function () {
return this.ended;
},
src: function () {
var src;
try {
src = this.GetURL();
} catch(e) {}
return src || '';
},
setSrc: function (src) {
this.SetURL(src);
this.SetControllerVisible(false);
if (typeof this._embed != 'undefined') {
this._embed.SetControllerVisible(false);
}
},
timeScale: function () {
return this.GetTimeScale();
},
movieType: function () {
return 'QuickTime';
},
// fullscreen removal
// supportsFullscreen: function() {
// return false;
// },
getContainer: function() {
return this._container;
},
setTrackTextSpan: function(span) {
},
setCaptionsAvailable: function(func, url) {
try {
// Try to find the closed caption trackCount
// (tragically the index starts at 1, not 0)
var trackCount = this.GetTrackCount(),
i;
for (i = 1; i <= trackCount; i++) {
if ('Closed Caption' === this.GetTrackType(i)) {
Media.Spec.QuickTime._captions = i;
if (typeof func != 'undefined') {
func();
}
}
}
} catch(e) {}
},
enableCaptions: function() {
try {
if (Media.Spec.QuickTime._captions === 'undefined') {
this.setCaptionsAvailable();
}
this.SetTrackEnabled(Media.Spec.QuickTime._captions, true);
this._captionsEnabled = true;
} catch(e) {}
},
disableCaptions: function() {
try {
this.SetTrackEnabled(Media.Spec.QuickTime._captions, false);
this._captionsEnabled = false;
} catch(e) {}
},
videoClosedCaptionsEnabled: function() {
return false;
}
},
_configure: function(innerObject, outerObject, options)
{
if (!options) {
return;
}
var property = null,
attributeName = null;
for (property in options) {
if (options.hasOwnProperty(property)) {
if(typeof options[property] == undefined) {
continue;
}
attributeName = property.toLowerCase();
switch(attributeName) {
case('type'):
case('src'):
case('data'):
case('classid'):
case('name'):
case('id'):
case('postdomevents'):
case('saveembedtags'):
case('factory'):
case('aggressiveCleanup'):
//do nothing as these shouldn't be overridden or set
break;
case('class'):
Element.addClassName(outerObject, options[property]);
break;
case('innerId'):
if (innerObject) {
innerObject.setAttribute('id', options[property]);
}
break;
case('autoplay'):
this._addParameter(outerObject, 'autostart', options[property]);
this._addParameter(innerObject, 'autostart', options[property]);
break;
case('width'):
case('height'):
outerObject.setAttribute(attributeName, options[property]);
if (innerObject) {
innerObject.setAttribute(attributeName, options[property]);
}
break;
default:
this._addParameter(outerObject, attributeName, options[property]);
this._addParameter(innerObject, attributeName, options[property]);
break;
}
}
}
},
/**
* Adds an object param tag to the specified parent
* Note that the attributes are added in this seemingly odd order
* so they show up in the logical order in the dom
*/
_addParameter: function(parent, name, value)
{
if (!parent) {
return;
}
var param = document.createElement('param');
param.setAttribute('value', value);
param.setAttribute('name', name);
parent.appendChild(param);
param = null;
},
/**
* Adds an object embed tag to the specified parent
* only used for displaying controller over the movie
*/
_createEmbed: function(url, options) {
var embed = document.createElement('embed');
embed.setAttribute('src', url);
embed.setAttribute('type', 'video/quicktime');
if (!Media.Detection.Firefox() && !Media.Detection.Opera())
embed.setAttribute('wmode', 'transparent');
embed.setAttribute('postdomevents', true);
embed.setAttribute('controller', false);
embed.setAttribute('showlogo', false);
embed.setAttribute('scale', 'tofit');
if (options) {
if (!isNaN(parseInt(options.width, 10))) {
embed.setAttribute('width', options.width);
}
if (!isNaN(parseInt(options.height, 10))) {
embed.setAttribute('height', options.height);
}
if (typeof options.target != 'undefined') {
embed.setAttribute('target', options.target);
}
}
return embed;
},
/**
* Adds an inner object tag to the specified parent
* only used for targeting QuickTime player
*/
_createInnerObject: function(url, options) {
var object = document.createElement('object');
object.setAttribute('type', 'video/quicktime');
object.setAttribute('id', options.id+'Inner');
object.setAttribute('name', options.id);
object.setAttribute('width', '1');
object.setAttribute('height', '1');
object.setAttribute('data', url);
this._addParameter(object, 'target', options.target);
this._addParameter(object, 'postdomevents', 'true');
return object;
},
/**
* Creates the IE friendly outer object
* NOTE Safari and Opera both seem to be able to use this one as well
*/
_createObject: function(url, options)
{
var object = document.createElement('object'),
activexVersion = '7,3,0,0';
if (Media.Detection.Mobile() && options.posterFrame) {
this._addParameter(object, 'src', options.posterFrame);
this._addParameter(object, 'href', url);
this._addParameter(object, 'target', 'myself');
} else {
this._addParameter(object, 'src', url);
if (!Media.Detection.Firefox() && !Media.Detection.Opera()) {
this._addParameter(object, 'wmode', 'transparent');
}
}
object.setAttribute('id', name);
if (!Media.Detection.Mobile()) {
this._addParameter(object, 'showlogo', false);
this._addParameter(object, 'scale', 'tofit');
this._addParameter(object, 'saveembedtags', true);
this._addParameter(object, 'postdomevents', true);
}
if (null !== options && (typeof options.codebase !== 'undefined') && '' !== options.codebase) {
activexVersion = options.codeBase;
}
object.setAttribute('codebase', 'http://www.apple.com/qtactivex/qtplugin.cab#version=' + activexVersion);
return object;
}
}
};
/*
if(AC.Detector.isiPad()) {
HTMLMediaElement.prototype.forcePlay = function() {
//alert("ipad = forcePlay");
var self = this,
link = document.createElement("a"),
forcePlay = function(event) {
event.preventDefault();
self.play();
},
triggerEvent;
link.addEventListener("click",forcePlay,false);
document.body.appendChild(link);
triggerEvent = document.createEvent("MouseEvents");
if (triggerEvent.initMouseEvent) {
triggerEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(triggerEvent);
}
document.body.removeChild(link);
};
HTMLMediaElement.prototype.forcePause = function() {
var self = this,
link = document.createElement("a"),
forcePause = function(event) {
event.preventDefault();
self.pause();
},
triggerEvent;
link.addEventListener("click",forcePause,false);
document.body.appendChild(link);
triggerEvent = document.createEvent("MouseEvents");
if (triggerEvent.initMouseEvent) {
triggerEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(triggerEvent);
}
document.body.removeChild(link);
};
}
*/
// == Media.VideoInterface ==
//
// Media.VideoInterface does the work of talking with the media element.
// It takes cues from Media.Spec to operate on the video element itself.
Media.VideoInterface = function(videoElement, delegateObject) {
var video = videoElement,
delegate = delegateObject,
pollTimeout,
videoTitle,
videoUrl,
videoDescription,
videoPosterFrame;
return {
videoTitle: function() {
return videoTitle;
},
setVideoTitle: function(newTitle) {
videoTitle = newTitle;
},
videoUrl: function() {
return videoUrl;
},
setVideoUrl: function(newUrl) {
videoUrl = newUrl;
},
videoDescription: function() {
return videoDescription;
},
setVideoDescription: function(newDescription) {
videoDescription = newDescription;
},
videoPosterFrame: function() {
return videoPosterFrame;
},
setVideoPosterFrame: function(newPosterFrame) {
videoPosterFrame = newPosterFrame;
},
object: function () {
return video;
},
setObject: function (newVideo) {
video = newVideo;
},
setDelegate: function (newDelegate) {
delegate = newDelegate;
},
setup: function() {},
/**
* Override default values (and optionally add new ones), subscribing the
* standard media interface to a customized one.
*/
override: function (functions) {
var member;
function wrap(name, fn) {
return function() {
return fn.apply(video, arguments);
};
}
for (member in functions) {
this[member] = wrap(member, functions[member]);
}
return this;
},
registerEvent: function (functionName, eventName, auxFunction) {
if (!auxFunction && typeof(eventName)=='function') {
auxFunction = eventName;
eventName = null;
}
var e = eventName || functionName;
Event.observe(video, e, function (event) {
if (auxFunction) {
auxFunction.apply(this);
}
this.messageDelegate(functionName);
}.bind(this));
},
pollForChanges: function (functions) {
if (pollTimeout) {
window.clearInterval(pollTimeout);
}
if (functions) {
pollTimeout = window.setInterval(function(){
for(var i = 0, func; func = functions[i]; i++) {
this.messageDelegate(func);
}
}.bind(this), 480);
}
},
messageDelegate: function(eventName) {
if (!delegate) {
return;
}
eventName = eventName.charAt(0).toUpperCase()+eventName.substring(1);
var callback = 'videoReceived'+eventName+'Event';
if (callback in delegate) {
delegate[callback](this);
}
}
};
};
Media.Controller = function (containerElement) {
var container = containerElement,
delegate,
video,
videoSrc,
controlPanel,
timeout,
sizeTimeout,
duration,
seeking = false,
wasPlayingBeforeSeek,
hasBegunPlaying = false,
hasEndedPlaying = false,
playing = false,
playAcknowledged = true,
pauseAcknowledged = true,
isPlayAdvanced = false,
currentlyChangingSize = false,
sizeAnimation = false,
controlPanelConfigurationsSet = false;
function containerMouseMove(e) {
if (!controlPanel || currentlyChangingSize || !hasBegunPlaying) {
return;
}
controlPanel.show();
window.clearTimeout(timeout);
var controls = controlPanel.element;
mouseElement = e.target || e.srcElement;
if (mouseElement == controls) {
timeout = window.setTimeout(function(){
if (controlPanel && typeof controlPanel != 'undefined') {
controlPanel.hide();
}
}, 2500);
}
}
function containerMouseOut(e) {
if (!controlPanel || !hasBegunPlaying) {
return;
}
window.clearTimeout(timeout);
timeout = window.setTimeout(function(){
if (controlPanel) {
controlPanel.hide();
}
},50);
}
function containerMouseOver(e) {
if (!controlPanel || !hasBegunPlaying) {
return;
}
window.clearTimeout(timeout);
timeout = window.setTimeout(function(){
if (controlPanel) {
controlPanel.hide();
}
},50);
}
function containerMouseOver(e) {
if (!controlPanel || currentlyChangingSize || !hasBegunPlaying) {
return;
}
window.clearTimeout(timeout);
controlPanel.show();
}
function menuMouseOver(e) {
if (!controlPanel) {
return;
}
window.clearTimeout(timeout);
controlPanel.show();
}
return {
_send: function (msg, params) {
if (delegate && msg in delegate) {
params = [this].concat(params);
return delegate[msg].apply(delegate, params);
}
},
_fireEvent: function (event, data) {
Media.Controller.fireEvent(event, data);
},
reset: function () {
seeking = false;
hasBegunPlaying = false;
hasEndedPlaying = false;
playing = false;
},
setDelegate: function (newDelegate) {
delegate = newDelegate;
},
setVideo: function (vid) {
hasBegunPlaying = false;
hasEndedPlaying = false;
video = vid;
duration = video.duration() || 0;
if (controlPanel && controlPanel.videoObjectHasChanged) {
controlPanel.videoObjectHasChanged(video);
}
return this;
},
setVideoSrc: function(src) {
videoSrc = src;
},
video: function() {
return video;
},
setControlPanel: function (cp) {
// Give the language file a moment to load first
setTimeout(function() {
controlPanel = (video.tagName === "VIDEO" && Media.Detection.iPad()) ? false : cp;
if (controlPanel) {
if (existingVideo != false && playExistingVideo === true) {
video.play();
}
controlPanel.delegate = this;
Event.observe(containerElement, 'mousemove', containerMouseMove);
Event.observe(containerElement, 'mouseout', containerMouseOut);
Event.observe(containerElement, 'mouseover', containerMouseOver);
if(controlPanel.settingsMenu) {
Event.observe(controlPanel.settingsMenu, 'mouseover', menuMouseOver);
}
video.setTrackTextSpan(controlPanel.trackText);
if (!controlPanel.settingsControlsAreSet && (video.tagName === "VIDEO")) {
this.configureSettingsControls(videoSrc);
controlPanel.settingsControlsAreSet = true;
}
if(controlPanel.element) {
controlPanel.element.parentNode.parentNode.style.width = this.currentWidth + 'px';
controlPanel.element.parentNode.parentNode.style.height = this.currentHeight + 'px';
}
if(video.object().tagName.toLowerCase() === "video") {
this.setSizeAnimation(true);
}
this.setVideoSizeForWidthAndHeight(this.currentWidth, this.currentHeight);
controlPanel.setFocus();
} else {
Event.stopObserving(containerElement, 'mousemove', containerMouseMove);
Event.stopObserving(containerElement, 'mouseout', containerMouseOut);
Event.stopObserving(containerElement, 'mouseover', containerMouseOver);
}
return this;
}.bind(this), 1);
},
beginSeeking: function () {
if (seeking) {
return;
}
seeking = true;
wasPlayingBeforeSeek = !video.paused() && this.rate()==1;
this.pause();
var time = video.time();
this._send('didStartJogging', time);
this._fireEvent("QuickTime:didStartJogging", {controller: this, time: time});
},
endSeeking: function () {
var time = video.time(),
duration = video.duration();
seeking = false;
this._send('didStopJogging', time);
this._fireEvent("QuickTime:didStopJogging", {controller: this, time: time});
if (wasPlayingBeforeSeek) {
if (time != duration) {
this.play();
} else {
// ending the movie if user scrubs past the end of the movie
// also, have to set hasEndedPlaying to false, since it hasn't ended yet
hasEndedPlaying = false;
this.videoReceivedEndedEvent(this);
}
}
},
// fullscreen removal
// supportsFullscreen: function() {
// //console.log('going to see if fullscreen is supported');
// return video.supportsFullscreen();
// },
time: function () {
return video.time() || this._lastTime || 0;
},
setTime: function(newTime) {
video.setTime(newTime);
this.videoReceivedTimeupdateEvent();
},
duration: function () {
if ( !duration ) {
duration = video.duration();
}
return duration;
},
volume: function() {
return video.volume();
},
setVolume: function(level) {
video.setMuted(false);
video.setVolume(level);
if (typeof controlPanel != 'undefined' && controlPanel != null) {
controlPanel.volumeControlSetting = level;
}
},
setMuted: function(mute) {
video.setMuted(mute);
if (typeof controlPanel != 'undefined' && controlPanel != null) {
controlPanel.volumeControlSetting = 0;
}
},
toggleMute: function () {
var isMuted = video.muted();
if ( isMuted ) {
this.setMuted(false);
} else {
this.setMuted(true);
}
return !isMuted;
},
playPause: function () {
var isPaused = video.paused(),
rate = this.rate();
if (isPaused && rate === 1) {
this.play();
} else if (rate !== 1) {
this.setRate(1);
} else {
this.pause();
}
return video.paused();
},
playing: function() {
return playing;
},
play: function () {
video.play();
playing = true;
playAcknowledged = false;
},
playing: function () {
return playing;
},
pause: function () {
video.pause();
playing = false;
pauseAcknowledged = false;
},
stop: function () {
video.pause();
playing = false;
pauseAcknowledged = false;
hasEndedPlaying = true;
},
setRate: function (newRate) {
video.setRate(newRate);
if (newRate !== 1 || newRate !== 0) {
isPlayAdvanced = true;
} else {
isPlayAdvanced = false;
}
},
rate: function () {
return video.rate();
},
src: function () {
return video.src();
},
setSrc: function (src) {
// console.log('before setting src: '+src);
video.setSrc(src);
this._currentSrc = src;
},
setSizeAnimation: function(bool) {
sizeAnimation = bool;
},
_currentSrc: false,
setVideoSizeForSrc: function(src) {
var path = this.moviePath(),
filename = src.substring(src.lastIndexOf('/')+1, src.length);
srcToSet = path + filename,
newWidth = filename.substring(filename.lastIndexOf('_')+1, filename.lastIndexOf('x')),
newHeight = filename.substring(filename.lastIndexOf('x')+1, filename.lastIndexOf('.'));
if (sizeAnimation === false || (video.percentLoaded() < 1 || (video.percentLoaded() >= 1 && (this._currentSrc != false && videoSrc != this._currentSrc)))) {
if (sizeAnimation === true) {
this.setSizeAnimation(false);
}
// console.log('set new src');
this.setSrc(srcToSet);
}
this.setVideoSizeForWidthAndHeight(newWidth, newHeight);
},
setVideoSizeForWidthAndHeight: function(width, height) {
var videoObject = video.object() || video.object().parentNode;
if (typeof controlPanel != 'undefined' && typeof videoObject != 'undefined') {
//var videoObject = video.object();
function setControlPanelType() {
if (typeof controlPanel != 'undefined') {
controlPanel.setControllerType();
// if (typeof controlPanel != 'undefined' && (controlPanel.controllerType === 'slim' || controlPanel.controllerType === 'short-slim')) {
// if (controlPanel.controllerType === 'short-slim' && width > 450) {
// Element.removeClassName(controlPanel.container, 'short-slim');
// controlPanel.controllerType = 'slim';
// }
// if (controlPanel.controllerType === 'slim' && width <= 450) {
// Element.addClassName(controlPanel.container, 'short-slim');
// controlPanel.controllerType = 'short-slim';
// }
controlPanel.setTrackContainerWidth();
}
}
if (AC.Detector.isIEStrict()) {
var top = parseInt(height / 2);
videoObject.style.marginTop = '-' + top + 'px';
controlPanel.element.style.marginTop = '-' + top + 'px';
// if (AC.Detector.getAgent().match(/msie 8/i)) {
// var left = parseInt(width/2);
// videoObject.style.marginLeft = '-' + left + 'px';
// controlPanel.element.style.marginLeft = '-' + left + 'px';
// }
}
if (video.percentLoaded() < 1 || sizeAnimation === false || Media.Detection.Chrome()) {
// console.log('changing height/width');
videoObject.width = width;
videoObject.height = height;
if (video.movieType() != 'Video' && typeof videoObject.parentNode != null) {
videoObject.parentNode.width = width;
videoObject.parentNode.height = height;
}
controlPanel.container.style.width = width + 'px';
controlPanel.container.style.height = height + 'px';
if(controlPanel.element) {
controlPanel.element.style.width = width + 'px';
controlPanel.element.style.height = height + 'px';
}
if (AC.Detector.isIEStrict()) {
var top = parseInt(height / 2);
videoObject.style.marginTop = '-' + top + 'px';
controlPanel.element.style.marginTop = '-' + top + 'px';
if (AC.Detector.getAgent().match(/msie 8/i)) {
var left = parseInt(width/2, 10);
//videoObject.style.left = '50%';
videoObject.parentNode.style.left = '50%';
controlPanel.element.style.left = '0';
videoObject.style.marginLeft = '-' + left + 'px';
controlPanel.element.style.marginLeft = '-' + left + 'px';
// videoObject.parentNode.style.left = '50%';
// videoObject.style.left = '0';
// controlPanel.element.style.left = '0';
// videoObject.style.marginLeft = '-' + left + 'px';
// controlPanel.element.style.marginLeft = '-' + left + 'px';
}
}
} else {
// add transition
if (Media.Detection.CSSTransitions() === true && video.movieType() !== 'QuickTime') {
videoObject.style.width = width + 'px';
videoObject.style.height = height + 'px';
controlPanel.container.style.width = width + 'px';
controlPanel.container.style.height = height + 'px';
controlPanel.element.style.width = width + 'px';
controlPanel.element.style.height = height + 'px';
} else {
var morphEffects = [];
if (controlPanel.controllerType === 'slim' || controlPanel.controllerType === 'short-slim') {
controlPanel._hiding = true;
controlPanel._showing = false;
controlPanel.fadeElement.style.opacity = '0';
controlPanel.fadeElement.style.visibility = 'hidden';
if(controlPanel.settingsMenu) {
Element.removeClassName(controlPanel.settingsMenu, controlPanel.settingsMenu.baseClassName+'-hovered');
}
currentlyChangingSize = true;
}
controlPanel.resetSettingsMenus();
morphEffects.push(new Effect.Morph(videoObject, {sync:true, style:{width:width+'px', height:height+'px'}}));
if (video.movieType != 'Video' && typeof videoObject.parentNode != null) {
morphEffects.push(new Effect.Morph(videoObject.parentNode, {sync:true, style:{width:width+'px', height:height+'px'}}));
}
morphEffects.push(new Effect.Morph(controlPanel.container, {sync:true, style:{width:width+'px', height:height+'px'}}));
morphEffects.push(new Effect.Morph(controlPanel.element, {sync:true, style:{width:width+'px', height:height+'px'}}));
var redraw = document.createElement('div');
Element.addClassName(redraw, 'ACMediaRedraw');
var agent = AC.Detector.getAgent();
var forceIERedraw = function() {
//if (!agent.match(/msie 8/i)) {
// having to do a redraw on these elements to force IE6 not to show a black screen
videoObject.style.outline = "1px solid transparent"; // adding an outline on the movie so the movie isn't black
document.body.appendChild(redraw); // adding an element above the movie to remove black on and around movie
controlPanel.mouseoverSettingsControl(controlPanel.sizesControl); // adding settings menu to remove black on edges of screen
// removing all added CSS and elements
videoObject.style.outline = 'none';
document.body.removeChild(redraw);
controlPanel.hide();
controlPanel.resetSettingsMenus();
//}
}
new Effect.Parallel(morphEffects, {
duration:0.4,
beforeStart: function() {
if (AC.Detector.isIEStrict()) {
var top = parseInt(videoObject.offsetHeight/2);
videoObject.parentNode.style.top = '50%';
videoObject.style.top = '0';
controlPanel.element.style.top = '0';
videoObject.style.marginTop = '-' + top + 'px';
controlPanel.element.style.marginTop = '-' + top + 'px';
// if (agent.match(/msie 8/i)) {
// var left = parseInt(videoObject.offsetWidth/2);
// videoObject.parentNode.style.left = '50%';
// videoObject.style.left = '0';
// controlPanel.element.style.left = '0';
// videoObject.style.marginLeft = '-' + left + 'px';
// controlPanel.element.style.marginLeft = '-' + left + 'px';
// }
// force a redraw
forceIERedraw();
}
},
afterUpdate: function() {
currentlyChangingSize = true;
if (AC.Detector.isIEStrict()) {
var top = parseInt(videoObject.offsetHeight/2);
videoObject.parentNode.style.top = '50%';
videoObject.style.top = '0';
controlPanel.element.style.top = '0';
videoObject.style.marginTop = '-' + top + 'px';
controlPanel.element.style.marginTop = '-' + top + 'px';
// if (agent.match(/msie 8/i)) {
// var left = parseInt(videoObject.offsetWidth/2);
// videoObject.parentNode.style.left = '50%';
// videoObject.style.left = '0';
// controlPanel.element.style.left = '0';
// videoObject.style.marginLeft = '-' + left + 'px';
// controlPanel.element.style.marginLeft = '-' + left + 'px';
// }
forceIERedraw();
}
},
afterFinish: function() {
if (AC.Detector.isIEStrict()) {
var top = parseInt(height/2);
//video.object().parentNode.parentNode.style.marginTop = '-' + top + 'px';
videoObject.parentNode.style.top = '50%';
videoObject.style.top = '0';
controlPanel.element.style.top = '0';
videoObject.style.marginTop = '-' + top + 'px';
controlPanel.element.style.marginTop = '-' + top + 'px';
// if (agent.match(/msie 8/i)) {
// var left = parseInt(width/2);
// videoObject.parentNode.style.left = '50%';
// videoObject.style.left = '0';
// controlPanel.element.style.left = '0';
// videoObject.style.marginLeft = '-' + left + 'px';
// controlPanel.element.style.marginLeft = '-' + left + 'px';
// }
// force a redraw
controlPanel.mouseoutSettingsControl(controlPanel.sizesControl);
controlPanel.hide();
}
setControlPanelType();
window.clearTimeout(sizeTimeout);
sizeTimeout = window.setTimeout(function(){
if (controlPanel.controllerType === 'slim' || controlPanel.controllerType === 'short-slim') {
controlPanel.fadeElement.style.visibility = 'visible';
controlPanel.fadeElement.style.opacity = '1';
controlPanel._hiding = false;
controlPanel._showing = false;
}
currentlyChangingSize = false;
},50);
}
});
}
}
setControlPanelType();
}
this.currentWidth = width;
this.currentHeight = height;
},
timeScale: function () {
return video.timeScale();
},
movieType: function() {
return video.movieType();
},
moviePath: function() {
var url,
path = '';
if (typeof videoSrc != 'undefined' && videoSrc.length > 0) {
url = videoSrc.substring(0, videoSrc.lastIndexOf('_')) + '.html';
} else {
return;
}
if (url.match(/\w+:\/\//i)) {
// comment out the if section if not debugging
if ((window.location.href.match(/\w+:\/\/ic/i) || window.location.href.match(/\w+:\/\/www-dev/i)) && url.indexOf('/105') < 0) {
url = url.replace(/\w+:\/\/[^\/]+/i,"/105");
} else {
url = url.replace(/\w+:\/\/[^\/]+/i,"");
}
}
path = url.substring(0, (url.lastIndexOf('/')+1));
return path;
},
setCaptionsAvailable: function(url) {
var func = this.enableCaptionsControl.bind(this);
video.setCaptionsAvailable(func, url);
},
enableCaptionsControl: function() {
if (controlPanel && typeof controlPanel.enableCaptionsControl !== 'undefined') {
controlPanel.enableCaptionsControl();
return true;
}
return false;
},
enableCaptions: function() {
video.enableCaptions();
this._fireEvent("QuickTime:didSetClosedCaptions", {controller: this, enabled: true});
},
disableCaptions: function() {
video.disableCaptions();
this._fireEvent("QuickTime:didSetClosedCaptions", {controller: this, enabled: false});
},
enableCaptionsTextDisplay: function() {
return video.videoClosedCaptionsEnabled();
},
resetCaptions: function() {
video.disableCaptions();
},
setSizesAvailable: function(list) {
this.sizesMenuOptions = list;
for (var i=0, option; option=this.sizesMenuOptions[i]; i++) {
this.sizesMenuOptions['size_'+option.type] = option;
}
this.enableSizesControl();
},
enableSizesControl: function() {
if (controlPanel && typeof controlPanel.enableSizesControl !== 'undefined') {
if (this.sizesMenuOptions.length > 1) {
controlPanel.buildSizesMenu(this.sizesMenuOptions);
controlPanel.setSizesAvailable();
controlPanel.enableSizesControl();
return true;
}
}
return false;
},
setDownloadAvailable: function(list) {
this.downloadMenuOptions = list;
for (var i=0, option; option=this.downloadMenuOptions[i]; i++) {
this.downloadMenuOptions['download_'+option.type] = option;
}
this.enableDownloadControl();
},
enableDownloadControl: function() {
if (controlPanel && typeof controlPanel.enableDownloadControl !== 'undefined') {
if (this.downloadMenuOptions.length > 0) {
controlPanel.buildDownloadMenu(this.downloadMenuOptions);
controlPanel.setDownloadAvailable();
controlPanel.enableDownloadControl();
return true;
}
}
return false;
},
setShareAvailable: function(movie) {
if (controlPanel && typeof controlPanel.enableShareControl !== 'undefined' && ac_media_language.sharemenu) {
var head = document.getElementsByTagName('head').item(0),
sharemenu = ac_media_language.sharemenu, self = this;
for (var i=0, sharemenuitem; sharemenuitem=sharemenu[i]; i++) {
var localScript = document.createElement('script'), shareMenuSetup;
localScript.setAttribute('type', 'text/javascript');
localScript.pluginName = sharemenuitem.id;
shareMenuSetup = function() {
//1) Get the class of the plugin that just loaded
//2) Create an instance
//3) Register it to controlPanel.registerPluginForMenu(newPlugin);
if (typeof window.event != 'undefined') {
var target = window.event.srcElement;
if (!window.event || ((target = window.event.srcElement) && (target.isLoaded || ( (typeof target.isLoaded === "undefined") && ((target.readyState == 'complete') || (target.readyState == 'loaded'))) ) )) {
if (target && !target.isLoaded) {
target.onreadystatechange = null;
target.isLoaded = true;
}
Event._domReady();
}
}
}
if (localScript.addEventListener) {
localScript.addEventListener("load",shareMenuSetup,false);
} else {
if (typeof localScript.onreadystatechange === "function") {
localScript.onreadystatechange = function () {
if (this.readyState == 'complete') {
shareMenuSetup();
}
}
} else {
localScript.onreadystatechange = shareMenuSetup;
}
}
localScript.setAttribute('src', sharemenuitem.plugin);
head.appendChild(localScript);
sharemenu[i].localScript = localScript;
}
}
},
// fullscreen removal
// setFullscreenAvailable: function() {
// //console.log('setting fullscreen available');
// this.enableFullscreenControl();
// },
// fullscreen removal
// enableFullscreenControl: function() {
// if (controlPanel && typeof controlPanel.enableFullscreenControl !== 'undefined') {
// controlPanel.enableFullscreenControl();
// return true;
// }
// return false;
// },
// fullscreen removal
// enableFullscreen: function() {
// video.enableFullscreen();
// this._fireEvent("QuickTime:didSetClosedFullscreen", {controller: this, enabled: true});
// },
// fullscreen removal
// disableFullscreen: function() {
// video.disableFullscreen();
// this._fireEvent("QuickTime:didSetClosedFullscreen", {controller: this, enabled: false});
// },
configureSettingsControls: function(videoSrc) {
if (existingVideo != false && controlPanelConfigurationsSet === true) return;
var url,
langAttr = document.body.parentNode.getAttribute('lang'),
language = MediaLanguage.getLangFromAttr(langAttr),
//language = document.getElementsByTagName('html').item(0).getAttribute('lang'),
path = this.moviePath();
if (typeof videoSrc != 'undefined' && videoSrc.length > 0) {
url = videoSrc.substring(0, videoSrc.lastIndexOf('_')) + '.json';
// url = videoSrc.substring(0, videoSrc.lastIndexOf('_')) + '.html';
} else {
return;
}
if (url.match(/\w+:\/\//i)) {
// comment out the if section if not debugging
if ((window.location.href.match(/\w+:\/\/ic/i) || window.location.href.match(/\w+:\/\/www-dev/i)) && url.indexOf('/105') < 0) {
url = url.replace(/\w+:\/\/[^\/]+/i,"/105");
} else {
url = url.replace(/\w+:\/\/[^\/]+/i,"");
}
}
//path = url.substring(0, (url.lastIndexOf('/')+1));
// for debugging uncomment the lines below
// if (location.href.match('test-without-share')){
// url = '/tests/quicktime/snow_leopard_controls/configure-test-without-share.html';
// } else {
// url = '/tests/quicktime/snow_leopard_controls/configure-test.html';
// }
// new Ajax.checkURL(url, function() {
// this.checkedForConfigXML = true;
// }.bind(this));
// url = '/105'+url;
// if (url.match(/\/105\/105/i)) {
// url = url.replace(/\/105\/105/, "/105");
// }
// JSON request for configuration file
new Ajax.Request(url, {
method:'get',
requestHeaders: {Accept: 'application/json'},
onSuccess: function(transport) {
this.configSettings = new Function("return "+transport.responseText)();
this.setSettingsControlsAvailableForLanguageAndPath(language, path);
}.bind(this),
onFailure: function() {
if (typeof controlPanel != 'undefined') {
controlPanel.setTrackContainerWidth();
}
}.bind(this),
onException: function() {},
evalJS: false
});
},
setSettingsControlsAvailableForLanguageAndPath: function(language, path) {
var captionsWithPath = this.configSettings.metadata.captions,
sizesList = this.configSettings.metadata.sizes,
downloadList = this.configSettings.metadata.downloads,
shareToggle = this.configSettings.metadata.share || true,
movieLanguage = this.configSettings.metadata.lang,
movieTitle = this.configSettings.metadata.title,
movieDescription = this.configSettings.metadata.description,
movieUrl = this.configSettings.src,
moviePosterframe = this.configSettings.posterframe || 'http://images.apple.com/global/elements/overlay/overlay_movie_endstate_640x400_20081014.jpg';
if (typeof movieTitle != 'undefined') {
video.setVideoTitle(movieTitle);
}
if (typeof movieUrl != 'undefined') {
video.setVideoUrl(movieUrl);
}
if (typeof movieDescription != 'undefined') {
video.setVideoDescription(movieDescription);
}
if (typeof moviePosterframe != 'undefined') {
video.setVideoPosterFrame(moviePosterframe);
}
if (typeof captionsWithPath != 'undefined') {
var captionsFile = captionsWithPath.substring(captionsWithPath.lastIndexOf('/'), captionsWithPath.length),
captionsUrl = path + ((captionsFile[0] === '/') ? captionsFile.substring(1, captionsFile.length) : captionsFile);
controlPanel.captionsUrl = captionsUrl;
this.setCaptionsAvailable(controlPanel.captionsUrl);
}
if (typeof sizesList != 'undefined') {
this.setSizesAvailable(sizesList);
}
if (typeof downloadsList != 'undefined') {
this.setDownloadAvailable(downloadList);
}
if (shareToggle) {
this.setShareAvailable();
}
// if (this.supportsFullscreen() === true) {
// //console.log('in setting... before setfullscreenavailable');
// this.setFullscreenAvailable();
// }
if (typeof captionsUrl == 'undefined' && typeof sizesList == 'undefined' && typeof downloadsList == 'undefined' && !shareToggle && this.supprtsFullscreen() === false && typeof controlPanel != 'undefined') {
controlPanel.setTrackContainerWidth();
}
controlPanelConfigurationsSet = true;
},
videoReceivedPlayingEvent: function (evt) {
if (!hasBegunPlaying && (this.movieType() == 'Video' || (this.time() > 0 && this.duration != 0))) {
if (controlPanel && typeof controlPanel.mediaDidBecomePlayable !== 'undefined') {
controlPanel.mediaDidBecomePlayable();
}
if (controlPanel && typeof controlPanel.enableBasicControls !== 'undefined') {
// give the settings config file a moment to load
controlPanel.enableBasicControls();
controlPanel.setSettingsControls();
if (typeof controlPanel.captionsUrl != 'undefined' && !controlPanel.captionsControl.isEnabled) {
this.setCaptionsAvailable(controlPanel.captionsUrl);
}
switch(true) {
case (typeof controlPanel.captionsControlSetting != 'undefined' && controlPanel.captionsControlSetting === true):
video.enableCaptions();
break;
default:
break;
}
}
// if (Media.Detection.SnowLeopard1062() && this.movieType() == 'Video') {
// var state = video.readystate(),
// autoplay = video.autoplay();
// console.log('videoReceivedPlayingEvent - state: '+state);
// console.log('videoReceivedPlayingEvent - autoplay: '+autoplay);
// }
playing = true;
Element.removeClassName(this.container, this.movieLoadingPanelClass);
hasBegunPlaying = true;
this._send('didBecomePlayable');
this._fireEvent("QuickTime:canplaythrough", {controller: this});
this._send('didBegin');
this._fireEvent("QuickTime:begin", {controller: this});
timeout = window.setTimeout(function(){
if (controlPanel && typeof controlPanel != 'undefined') {
controlPanel.hide();
}
}, 500);
}
},
videoReceivedLoadEvent: function (evt) {
if (controlPanel) {
var percentLoaded = video.percentLoaded();
controlPanel.updatePercentLoaded(percentLoaded);
// if (Media.Detection.SnowLeopard1062() && this.movieType() == 'Video') {
// var state = video.readystate(),
// autoplay = video.autoplay();
// // console.log('videoReceivedLoadEvent - state: '+state);
// // console.log('videoReceivedLoadEvent - autoplay: '+autoplay);
// }
if (percentLoaded <= 1 && typeof controlPanel.captionsUrl != 'undefined' && !controlPanel.captionsControl.isEnabled) {
this.setCaptionsAvailable(controlPanel.captionsUrl);
}
// if (percentLoaded >= 1 && Media.Detection.SnowLeopard1062()) {
// controlPanel.removeClickToPlay();
// }
}
},
// fullscreen removal
// videoReceivedLoadedmetadataEvent: function (evt) {
// if (controlPanel) {
// if (this.supportsFullscreen() === true) {
// //console.log('in onfailure before setfullscreenavailable');
// this.setFullscreenAvailable();
// }
// }
// },
videoReceivedEndedEvent: function (evt) {
var time = video.time();
duration = video.duration();
if (hasEndedPlaying) {
return;
}
if (hasBegunPlaying && ((time >= duration && duration != 0) || (video.movieType() == "SBVDP" && duration != 0 && time >= (duration - 0.5)))) {
hasEndedPlaying = true;
this.videoReceivedTimeupdateEvent(this);
if (controlPanel) {
controlPanel.resetSettingsMenus();
if (AC.Detector.isIEStrict()) {
// clean up video sizing for IE
var videoObject = video.object();
videoObject.parentNode.style.width = '';
videoObject.parentNode.style.height = '';
videoObject.parentNode.style.top = '';
videoObject.style.top = '';
controlPanel.element.style.top = '';
videoObject.style.marginTop = '';
controlPanel.element.style.marginTop = '';
if (AC.Detector.getAgent().match(/msie 8/i)) {
videoObject.parentNode.style.left = '';
videoObject.style.left = '';
controlPanel.element.style.left = '';
videoObject.style.marginLeft = '';
controlPanel.element.style.marginLeft = '';
}
}
}
if (!seeking) {
this._send('onMovieFinished');
this._send('didEnd');
this._fireEvent("QuickTime:end", {controller: this});
}
}
},
videoReceivedPlayEvent: function (evt) {
this._currentPlayState = 'playing';
if (playAcknowledged) {
return;
}
playAcknowledged = true;
this._send('didStart');
this._fireEvent("QuickTime:start", {controller: this});
},
videoReceivedPauseEvent: function (evt) {
this._currentPlayState = 'paused';
if (pauseAcknowledged) {
return;
}
pauseAcknowledged = true;
this._send('didStop');
this._fireEvent("QuickTime:stop", {controller: this});
},
videoReceivedTimeupdateEvent: function (evt) {
var time = video.time() || 0;
//console.log("time = "+time);
if (controlPanel) {
controlPanel.updateTime(time);
}
if (this._lastTime != time) {
this._fireEvent("QuickTime:didPlayProgress", {
controller: this,
currentTime: time,
duration: this.duration()
});
}
this._lastTime = time;
},
videoReceivedProgressEvent: function (evt) {
if (controlPanel) {
controlPanel.updatePercentLoaded(video.percentLoaded());
}
// console.log('videoReceivedProgressEvent - state: '+video.readystate()+' - '+video.percentLoaded());
switch(true) {
case (!hasBegunPlaying && Media.Detection.SnowLeopard() && this.movieType() == 'Video' && video.autoplay() === true && video.readystate() >= 3 && video.percentLoaded() > 0.4):
// console.log('should start playing');
this.play();
//this.videoReceivedPlayingEvent();
break;
default:
break;
}
},
videoReceivedDurationchangeEvent: function (evt) {
if (controlPanel) {
controlPanel.updateRemainingTime(this.duration() - this.time());
}
}
// fullscreen removal
// videoReceivedWebkitendfullscreenEvent: function (evt) {
// if (controlPanel) {
// if (typeof this._currentPlayState != 'undefined' && this._currentPlayState === 'playing') {
// controlPanel.play();
// } else if (typeof this._currentPlayState != 'undefined' && this._currentPlayState === 'paused') {
// controlPanel.pause();
// }
//
// var currentVolume = this.volume();
// controlPanel.volumeScrubber.setValue(currentVolume);
// this.setVolume(currentVolume);
//
// }
//
// }
};
};
Media.Controller.fireEvent = function (event, data) {
var body = $(document.body);
if ('fire' in body) {
body.fire(event, data);
}
};
Media.ControlsWidget = function (containerElement, delegateObject, options) {
this.settingsControlsAreSet = false;
this.container = containerElement;
this.delegate = delegateObject;
this.options = options;
//Adds itself as an observer of the plugin loaded notification.
//process any plugin that are already loaded.
// and call this.registerPluginClass() //The instance level method.
Event.observe(document.body, 'PluginClass:Added', this.registerPluginClass.bind(this));
for (var i=0, pluginType; pluginType=Media.ControlsWidget.pluginTypes[i]; i++) {
for (var j=0, pluginClass; pluginClass=pluginType[j]; j++) {
this.registerPluginClass(pluginClass);
}
}
if (!Media.Detection.iPad()) {
this._createTemplate();
this._setupControls();
}
};
Media.ControlsWidget.registerPluginClass = function(aPluginClass) {
//Structure plugins by pluginType: pluginType -> [plugin1, plugin2, plugin3]
//Send an event to tell that a new plugin class is available
//Instances need to register for that event, and when they get it, they add the menu for themselves.
var pluginName = aPluginClass.prototype.name(),
pluginType = aPluginClass.prototype.pluginType(),
pluginTypeArray;
this.pluginTypes(pluginType);
this.pluginClassesForType
if (!(pluginTypeArray = Media.ControlsWidget._pluginTypes[pluginType]) || !Media.ControlsWidget._pluginTypes.hasOwnProperty(pluginType)) {
pluginTypeArray = [];
Media.ControlsWidget._pluginTypes[pluginType] = pluginTypeArray;
Media.ControlsWidget._pluginTypes.push(pluginType);
}
if (!pluginTypeArray.hasOwnProperty(pluginName)) {
pluginTypeArray[pluginName] = pluginName;
pluginTypeArray.push(pluginName);
}
Media.Controller.fireEvent('PluginClass:Added', {
'plugin': aPluginClass,
'name': pluginName,
'type': pluginType
});
};
Media.ControlsWidget._pluginTypes = [];
Media.ControlsWidget.pluginTypes = function(aPluginType) {
return this._pluginTypes;
};
Media.ControlsWidget.pluginClassesForType = function(aPluginType) {
return this.pluginTypes[aPluginType];
};
Media.ControlsWidget.TEMPLATE = '\
<div id="ACMedia-controls" class="ACMediaControls" tabindex="0">\
<a href="#video"></a>\
<div id="ACMedia-alert-display-container" class="ACMediaAlertDisplay"></div>\
<div id="ACMedia-track-text" class="ACMediaTrackText"><span id="ACMedia-track-text-span"></span></div>\
<div id="ACMedia-controls-panel" class="mediaControllerPanel">\
<div class="slim-left-cap"></div>\
<div id="ACMedia-media-controller" class="ACMediaController">\
<div id="ACMedia-volume-mute" class="volumeMute"></div>\
<div class="volumePanel">\
<div id="ACMedia-volume-track" class="volumeTrack">\
<div id="ACMedia-control-volume-progress" class="volumeTrackProgress"></div>\
<div id="ACMedia-volume-handle" class="volumePlayHead"></div>\
</div>\
</div>\
<div id="ACMedia-volume-full" class="volumeFull"></div>\
<div id="ACMedia-control-fastbackward" class="fastBackward"></div>\
<div id="ACMedia-control-play-pause"></div>\
<div id="ACMedia-control-fastforward" class="fastForward"></div>\
<div id="ACMedia-track-container" class="track-container">\
<div id="ACMedia-control-time-display" class="timeDisplay"><span id="ACMedia-min-played">00</span>:<span id="ACMedia-sec-played">00</span></div>\
<div class="trackPanel">\
<div id="ACMedia-control-track" class="track">\
<div id="ACMedia-control-loaded-progress" class="loadedProgress"></div>\
<div id="ACMedia-control-track-progress" class="trackProgress"></div>\
<div id="ACMedia-control-playhead" class="playHead"></div>\
</div>\
<div id="ACMedia-track-end-cap" class="track-right-cap"></div>\
</div>\
<div id="ACMedia-control-duration-display" class="durationDisplay">-<span id="ACMedia-min-remain">00</span>:<span id="ACMedia-sec-remain">00</span></div>\
</div>\
<div id="ACMedia-settings-controls" class="settingsControls">\
<div id="ACMedia-captions-control" class="captionsControl"></div>\
<div id="ACMedia-sizes-control" class="sizesControl"></div>\
<div id="ACMedia-download-control" class="downloadControl"></div>\
<div id="ACMedia-share-control" class="shareControl"></div>\
</div>\
</div>\
<div class="slim-right-cap"></div>\
</div>\
</div>';
// fullscreen removal
// <div id="ACMedia-fullscreen-control" class="fullscreenControl"></div>\
Media.ControlsWidget.show = function(controls) {
if (controls.fadeElement && !controls._showing) {
if (controls._effect) {
try {
controls._effect.cancel();
} catch(e) {}
delete controls._effect;
}
controls._showing = true;
controls._hiding = false;
if (controls.fadeElement) {
if (Media.Detection.CSSTransitions() === true) {
controls._effect = function() {
Element.removeClassName(controls.fadeElement, 'fade');
};
controls._effect();
} else {
controls._effect = new Effect.Opacity(controls.fadeElement, {
to: 1,
duration: 0.5,
afterFinish: function(){controls._showing=false;}
});
}
}
}
};
Media.ControlsWidget.hide = function(controls) {
if (controls.fadeElement && !controls._hiding) {
if (controls._effect) {
try {
controls._effect.cancel();
} catch(e) {}
delete controls._effect;
}
controls._hiding = true;
controls._showing = false;
if (controls.fadeElement) {
if (Media.Detection.CSSTransitions() === true) {
controls._effect = function() {
controls.resetSettingsMenus();
//controls._unselectControl(controls._currentSettingsControl);
Element.addClassName(controls.fadeElement, 'fade');
};
controls._effect();
} else {
controls._effect = new Effect.Opacity(controls.fadeElement, {
to: 0,
duration: 0.5,
beforeStart: function(){
controls.resetSettingsMenus();
//controls._unselectControl(controls._currentSettingsControl);
},
afterFinish: function(){
controls._hiding=false;
}
});
}
}
}
};
Media.ControlsWidget.prototype = {
delegate: null,
element: null,
_plugins: [],
_buildControlWithTitleOptions: function(title, menuOptions) {
var control = document.createElement('li'),
anchor = document.createElement('a');
Element.addClassName(control, title);
// console.log('menuOptions.url: '+menuOptions.url+' menuOptions.name: '+menuOptions.name);
if (typeof menuOptions != 'undefined' && typeof menuOptions.url != 'undefined' && typeof menuOptions.name != 'undefined') {
anchor.setAttribute('href', menuOptions.url);
anchor.innerHTML = menuOptions.name;
control.appendChild(anchor);
} else {
return;
}
control.baseClassName = control.baseClassName || control.className;
Event.observe(control, 'mousedown', function(evt) {
Element.addClassName(this, this.baseClassName+'-active');
});
Event.observe(control, 'mouseup', function(evt) {
Element.removeClassName(this, this.baseClassName+'-active');
});
Event.observe(document.documentElement, 'mouseup', function(evt) {
Element.removeClassName(this, this.baseClassName+'-active');
});
Event.observe(control, 'mouseover', function(evt) {
Element.addClassName(this, this.baseClassName+'-hover');
});
Event.observe(control, 'mouseout', function(evt) {
Element.removeClassName(this, this.baseClassName+'-hover');
});
return control;
},
_sizesMenuControls: [],
selectSizeFromMenu: function(control) {
if (typeof control != 'undefined') {
this._unselectMenu();
this._unselectControl(this.sizesControl);
for (var i=0, sizeControl; sizeControl=this._sizesMenuControls[i]; i++) {
(sizeControl === control) ? this._selectControl(sizeControl) : this._unselectControl(sizeControl);
}
this._send('setVideoSizeForSrc', control.optionsUrl);
this.sizesControlSetting = control;
}
},
_getSizesMenuControl: function(size, title, options) {
var control = this._buildControlWithTitleOptions('size'+title, {
'url': options.src,
'name': (ac_media_language[size] || title) + ' ' + options.width + 'x' + options.height
});
control.appendChild(document.createElement('span'));
control.optionsUrl = options.src;
Event.observe(control, 'click', function(evt) {
Event.stop(evt);
this.selectSizeFromMenu(control);
}.bindAsEventListener(this));
if (this.element.offsetWidth == options.width && this.element.offsetHeight == options.height) {
this._selectControl(control);
}
return control;
},
buildSizesMenu: function(options) {
this.originalElementWidth = this.element.offsetWidth;
this.originalElementHeight = this.element.offsetHeight;
if (Media.Detection.CSSTransitions() === true) {
this.element.style.width = this.originalElementWidth + 'px';
this.element.style.height = this.originalElementHeight + 'px';
}
if (typeof options.size_hd != 'undefined' && this.originalElementWidth >= options.size_hd.width && this.originalElementHeight >= options.size_hd.height) {
this.sizesHDControl = this._getSizesMenuControl('hd', 'HD', options.size_hd);
this._sizesMenuControls.push(this.sizesHDControl);
this.sizesMenu.appendChild(this.sizesHDControl);
}
if (typeof options.size_large != 'undefined' && this.originalElementWidth >= options.size_large.width && this.originalElementHeight >= options.size_large.height) {
this.sizesLargeControl = this._getSizesMenuControl('large', 'Large', options.size_large);
this._sizesMenuControls.push(this.sizesLargeControl);
this.sizesMenu.appendChild(this.sizesLargeControl);
}
if (typeof options.size_medium != 'undefined' && this.originalElementWidth >= options.size_medium.width && this.originalElementHeight >= options.size_medium.height) {
this.sizesMediumControl = this._getSizesMenuControl('medium', 'Medium', options.size_medium);
this._sizesMenuControls.push(this.sizesMediumControl);
this.sizesMenu.appendChild(this.sizesMediumControl);
}
if (typeof options.size_small != 'undefined' && this.originalElementWidth >= options.size_small.width && this.originalElementHeight >= options.size_small.height) {
this.sizesSmallControl = this._getSizesMenuControl('small', 'Small', options.size_small);
this._sizesMenuControls.push(this.sizesSmallControl);
this.sizesMenu.appendChild(this.sizesSmallControl);
}
return this._sizesMenuControls;
},
_downloadMenuControls: [],
_getDownloadMenuControl: function(size, title, options) {
var controlTitle = (title.match(/\//)) ? title.substring(0, title.indexOf('/')) : title,
unit = 'mb';
var control = this._buildControlWithTitleOptions('download'+controlTitle, {
'url': options.src,
'name': (ac_media_language[size] || title) + ' ' + options.size + (ac_media_language[unit] || 'MB')
});
Event.observe(control, 'click', function(evt) {
Event.stop(evt);
this._unselectMenu();
this._unselectControl(this.downloadControl);
document.location.href = options.src;
}.bindAsEventListener(this));
return control;
},
buildDownloadMenu: function(options) {
if (typeof options.download_hd != 'undefined') {
this.downloadHDControl = this._getDownloadMenuControl('hd', 'HD', options.download_hd);
this._downloadMenuControls.push(this.downloadHDControl);
this.downloadMenu.appendChild(this.downloadHDControl);
}
if (typeof options.download_large != 'undefined') {
this.downloadLargeControl = this._getDownloadMenuControl('large', 'Large', options.download_large);
this._downloadMenuControls.push(this.downloadLargeControl);
this.downloadMenu.appendChild(this.downloadLargeControl);
}
if (typeof options.download_ipod != 'undefined') {
this.downloadiPodControl = this._getDownloadMenuControl('ipod', 'iPod/iPhone', options.download_ipod);
this._downloadMenuControls.push(this.downloadiPodControl);
this.downloadMenu.appendChild(this.downloadiPodControl);
}
return this._downloadMenuControls;
},
_shareMenuControls: [],
buildShareMenu: function(pluginClass) {
var pluginName = pluginClass.name(),
pluginUrl = pluginClass.url();
// pluginShare = pluginClass.share();
var control = this[pluginName.toLowerCase()+'Control'] = this._buildControlWithTitleOptions(pluginName, {
'url': pluginUrl,
'name': pluginName
});
var video = this._send('video');
Event.observe(control, 'click', function(evt) {
Event.stop(evt);
pluginClass.share(video);
});
//Event.observe(control, 'click', pluginShare);
this._shareMenuControls.push(control);
this.shareMenu.appendChild(control);
Element.addClassName(control, control.baseClassName + '-enabled');
//}
//this.shareMenuControls = this.menuControls;
return this._shareMenuControls;
},
_registeredPlugins: [],
registerPluginClass: function(evt) {
var plugin = new evt.memo.plugin(),
pluginName = plugin.name(),
pluginActionName = plugin.actionName(),
pluginType = plugin.pluginType();
this._registeredPlugins.push(plugin);
this.buildShareMenu(plugin);
//Add an item in menu menuName and set plugin as the recipient for the action. Share plugins need to receive as an argument:
// - the title of the video
// - a description
// - The URL of the video.
if (!this.shareEnabled) {
this.setShareAvailable();
this.enableShareControl();
}
},
_createTemplate: function () {
function templateToNode(str) {
var temporary = document.createElement('div'),
node;
temporary.innerHTML = str;
node = temporary.firstChild;
return node;
}
this.setControllerType();
var datetime = new Date();
this.timestamp = datetime.getTime();
this.container.appendChild(templateToNode(Media.ControlsWidget.TEMPLATE));
this.element = document.getElementById('ACMedia-controls');
this.element.id = 'ACMedia-controls_'+this.timestamp;
this.element.style.outline = 'none';
Event.observe(this.element, 'keydown', this.keyDownHandler.bindAsEventListener(this));
// Click to Play for Snow Leopard < 10.6.3
// if (Media.Detection.SnowLeopard1062()) {
// this.fadeElement = document.getElementById('ACMedia-controls-panel');
// this.fadeElement.style.visibility = 'hidden';
//
// this.clickToPlayElement = document.createElement('ul');
// var clickToPlayItem = document.createElement('li'),
// clickToPlaySpanButton = document.createElement('span'),
// clickToPlaySpan = document.createElement('span'),
// clickToPlayBold = document.createElement('b');
//
// Element.addClassName(clickToPlaySpanButton, 'pillbutton');
// clickToPlaySpan.innerHTML = ac_media_language.play || 'Play';
// clickToPlayBold.innerHTML = '>';
// Event.observe(this.clickToPlayElement, 'click', this.clickToPlay.bindAsEventListener(this));
//
// clickToPlaySpanButton.appendChild(clickToPlaySpan);
// clickToPlaySpanButton.appendChild(clickToPlayBold);
// clickToPlayItem.appendChild(clickToPlaySpanButton);
// this.clickToPlayElement.appendChild(clickToPlayItem);
//
// this.element.appendChild(this.clickToPlayElement);
// }
},
_setRegularControllerType: function() {
Element.removeClassName(this.container, 'slim');
Element.removeClassName(this.container, 'short-slim');
this.controllerType = 'regular';
},
_setSlimControllerType: function() {
Element.addClassName(this.container, 'slim');
Element.removeClassName(this.container, 'short-slim');
this.controllerType = 'slim';
},
_setShortSlimControllerType: function() {
Element.addClassName(this.container, 'slim');
Element.addClassName(this.container, 'short-slim');
this.controllerType = 'short-slim';
},
setControllerType: function() {
switch (true) {
case Media.Detection.Firefox():
case Media.Detection.Opera():
case (typeof this.options != 'undefined' && this.options.slimController === true):
case (typeof this.options != 'undefined' && this.options.controllerType === 'slim'):
if (this.container.offsetWidth < 450) {
this._setShortSlimControllerType();
} else {
this._setSlimControllerType();
}
break;
case (this.container.offsetWidth < 450 && !AC.Detector.isIEStrict()):
this._setShortSlimControllerType();
break;
default:
this._setRegularControllerType();
}
if (!this.volumeScrubber) {
this.createVolumeScrubber();
}
},
setFocus: function() {
if(this.element) {
window.setTimeout(function() {
try{
this.element.focus();
} catch(e) {
this.setFocus();
}
}.bind(this), 50);
}
},
// clickToPlay: function() {
// this.removeClickToPlay();
// this.play();
// },
// removeClickToPlay: function() {
// this.fadeElement.style.visibility = 'visible';
// this.clickToPlayElement.style.display = 'none';
// },
_setupControls: function () {
var timestamp = this.timestamp;
this.fadeElement = get('ACMedia-controls-panel');
this.trackEndCap = get('ACMedia-track-end-cap');
function addTimeStamp(element) {
var currentId = element.id;
element.id = currentId+'_'+timestamp;
return element.id;
}
function addBaseClassName(element) {
element.baseClassName = element.baseClassName || element.className;
}
function addActiveStateSwitching(element) {
addBaseClassName(element);
function onmousedown(event) {
//console.log('adding active to: '+this.baseClassName);
Element.addClassName(this, this.baseClassName+'-active');
}
function onmouseup(event) {
Element.removeClassName(this, this.baseClassName+'-active');
}
Event.observe(element, 'mousedown', onmousedown.bind(element));
Event.observe(element, 'mouseup', onmouseup.bind(element));
Event.observe(document.documentElement, 'mouseup', onmouseup.bind(element));
}
function addHoverStateSwitching(element) {
if (!element.baseClassName) {
addBaseClassName(element);
}
function onmouseover(event) {
Element.addClassName(this, element.baseClassName+'-hover');
}
function onmouseout(event) {
Element.removeClassName(this, element.baseClassName+'-hover');
}
Event.observe(element, 'mouseover', onmouseover.bind(element));
Event.observe(element, 'mouseout', onmouseout.bind(element));
}
function get(id) {
var element = document.getElementById(id),
newId = addTimeStamp(element);
return element;
}
// Play/pause button
this.toggleControl = get('ACMedia-control-play-pause');
this.playControl = document.createElement('div');
Element.addClassName(this.playControl, 'play');
addActiveStateSwitching(this.playControl);
this.playControl.id = 'ACMedia-play-control_'+this.timestamp;
Event.observe(this.playControl, 'click', this.play.bind(this));
this.playControl.innerHTML = ac_media_language.play || 'Play';
this.playControl.style.display = 'none';
this.pauseControl = document.createElement('div');
Element.addClassName(this.pauseControl, 'pause');
addActiveStateSwitching(this.pauseControl);
this.pauseControl.id = 'ACMedia-pause-control_'+this.timestamp;
Event.observe(this.pauseControl, 'click', this.pause.bind(this));
this.pauseControl.innerHTML = ac_media_language.pause || 'Pause';
this.pauseControl.style.display = 'none';
Element.show(this._send('playing') ? this.pauseControl : this.playControl);
//var playpause = get('ACMedia-control-play-pause');
var playpause = this.toggleControl;
playpause.appendChild(this.playControl);
playpause.appendChild(this.pauseControl);
// Fast Backward
this.fastBackwardControl = get('ACMedia-control-fastbackward');
this.fastBackwardControl.innerHTML = ac_media_language.fastreverse || 'Fast Reverse';
Event.observe(this.fastBackwardControl, 'click', this.fastBackward.bind(this));
addActiveStateSwitching(this.fastBackwardControl);
// Fast Forward
this.fastForwardControl = get('ACMedia-control-fastforward');
this.fastForwardControl.innerHTML = ac_media_language.fastforward || 'Fast Forward';
Event.observe(this.fastForwardControl, 'click', this.fastForward.bind(this));
addActiveStateSwitching(this.fastForwardControl);
// Volume Mute
this.volumeMuteControl = get('ACMedia-volume-mute');
this.volumeMuteControl.innerHTML = ac_media_language.mutevolume || 'Mute Volume';
Event.observe(this.volumeMuteControl, 'click', this.muteVolume.bind(this));
addActiveStateSwitching(this.volumeMuteControl);
// Volume Full
this.volumeFullControl = get('ACMedia-volume-full');
this.volumeFullControl.innerHTML = ac_media_language.fullvolume || 'Full Volume';
Event.observe(this.volumeFullControl, 'click', this.fullVolume.bind(this));
addActiveStateSwitching(this.volumeFullControl);
// Settings Controls
this.settingsControls = get('ACMedia-settings-controls');
addBaseClassName(this.settingsControls);
this.captionsControl = get('ACMedia-captions-control');
if (!AC.Detector.isIEStrict()) {
this.captionsControl.innerHTML = ac_media_language.captionscontrol || 'Closed Captions';
}
Event.observe(this.captionsControl, 'click', this.toggleCaptions.bind(this));
addActiveStateSwitching(this.captionsControl);
this.sizesControl = get('ACMedia-sizes-control');
if (!AC.Detector.isIEStrict()) {
this.sizesControl.innerHTML = ac_media_language.sizescontrol || 'Video Size';
}
this.sizesControl.controlName = 'sizes';
Event.observe(this.sizesControl, 'click', this.toggleSizesMenu.bind(this));
addActiveStateSwitching(this.sizesControl);
Event.observe(this.sizesControl, 'mouseover', this.mouseoverSettingsControl.bind(this, this.sizesControl));
Event.observe(this.sizesControl, 'mouseout', this.mouseoutSettingsControl.bindAsEventListener(this, this.sizesControl));
this.downloadControl = get('ACMedia-download-control');
if (!AC.Detector.isIEStrict()) {
this.downloadControl.innerHTML = ac_media_language.downloadcontrol || 'Download Video';
}
this.downloadControl.controlName = 'download';
Event.observe(this.downloadControl, 'click', this.toggleDownloadMenu.bind(this));
addActiveStateSwitching(this.downloadControl);
Event.observe(this.downloadControl, 'mouseover', this.mouseoverSettingsControl.bind(this, this.downloadControl));
Event.observe(this.downloadControl, 'mouseout', this.mouseoutSettingsControl.bindAsEventListener(this, this.downloadControl));
this.shareControl = get('ACMedia-share-control');
if (!AC.Detector.isIEStrict()) {
this.shareControl.innerHTML = ac_media_language.sharecontrol || 'Share Video';
}
this.shareControl.controlName = 'share';
Event.observe(this.shareControl, 'click', this.toggleShareMenu.bind(this));
addActiveStateSwitching(this.shareControl);
Event.observe(this.shareControl, 'mouseover', this.mouseoverSettingsControl.bind(this, this.shareControl));
Event.observe(this.shareControl, 'mouseout', this.mouseoutSettingsControl.bindAsEventListener(this, this.shareControl));
// fullscreen removal
// this.fullscreenControl = get('ACMedia-fullscreen-control');
// if (!AC.Detector.isIEStrict()) {
// this.fullscreenControl.innerHTML = ac_media_language.fullscreencontrol || 'Full Screen';
// }
// Event.observe(this.fullscreenControl, 'click', this.toggleFullscreen.bind(this));
// addActiveStateSwitching(this.fullscreenControl);
this.settingsMenu = document.createElement('div');
if (Media.Detection.CSSBorderRadius() === false) {
this.settingsMenuRoundRect = this.getRoundRectForArcAndOpacity(0.05, 0.9);
this.settingsMenu.appendChild(this.settingsMenuRoundRect);
}
this.settingsMenu.id = 'ACMedia-settings-menu_'+this.timestamp;
Element.addClassName(this.settingsMenu, 'ACMediaSettingsMenu');
document.body.appendChild(this.settingsMenu);
this.settingsMenu.baseClassName = 'ACMediaSettingsMenu';
this.settingsMenuCarrot = document.createElement('div');
Element.addClassName(this.settingsMenuCarrot, 'ACMediaSettingsMenuCarrot');
this.settingsMenu.appendChild(this.settingsMenuCarrot);
this.settingsMenuTitle = document.createElement('div');
Element.addClassName(this.settingsMenuTitle, 'ACMediaSettingsMenuTitle');
this.settingsMenu.appendChild(this.settingsMenuTitle);
this.mediaController = get('ACMedia-media-controller');
this.speedDisplayAlert = document.createElement('div');
this.captionsDisplayAlert = document.createElement('div');
Element.addClassName(this.captionsDisplayAlert, 'ACMediaCaptionsDisplay');
this.alertDisplayContainer = get('ACMedia-alert-display-container');
this.trackText = get('ACMedia-track-text');
this.trackTextSpan = get('ACMedia-track-text-span');
this.volumeThumb = get('ACMedia-volume-handle');
this.volumeTrack = get('ACMedia-volume-track');
this.volumeProgress = get('ACMedia-control-volume-progress');
this.trackContainer = get('ACMedia-track-container');
this.playhead = get('ACMedia-control-playhead');
this.track = get('ACMedia-control-track');
this.trackProgress = get('ACMedia-control-track-progress');
this.controlLoadedProgress = get('ACMedia-control-loaded-progress');
this.mediaTimeDisplay = get('ACMedia-control-time-display');
this.minutesPlayed = get('ACMedia-min-played');
this.secondsPlayed = get('ACMedia-sec-played');
this.mediaDurationDisplay = get('ACMedia-control-duration-display');
this.minutesRemaining = get('ACMedia-min-remain');
this.secondsRemaining = get('ACMedia-sec-remain');
this.settingsMenuList = document.createElement('div');
this.settingsMenu.appendChild(this.settingsMenuList);
this.sizesMenu = document.createElement('ul');
this.sizesMenu.menuName = 'sizes';
this.sizesMenu.menuTitle = this.sizesControl.menuTitle = ac_media_language.sizescontrol || 'Video Size';
this.downloadMenu = document.createElement('ul');
this.downloadMenu.menuName = 'download';
this.downloadMenu.menuTitle = this.downloadControl.menuTitle = ac_media_language.downloadcontrol || 'Download Video';
this.shareMenu = document.createElement('ul');
this.shareMenu.menuName = 'share';
this.shareMenu.menuTitle = this.shareControl.menuTitle = ac_media_language.sharecontrol || 'Share Video';
addBaseClassName(this.alertDisplayContainer);
addBaseClassName(this.trackText);
addBaseClassName(this.mediaTimeDisplay);
addBaseClassName(this.mediaDurationDisplay);
switch (this.controllerType) {
case 'slim':
case 'short-slim':
var trackContainerWidth = +(this.container.offsetWidth - 235);
if (AC.Detector.isWin()) {
trackContainerWidth = trackContainerWidth - 10;
}
this.trackContainer.style.width = trackContainerWidth + 'px';
break;
default:
break;
}
// if (this.controllerType === 'slim' || this.controllerType === 'short-slim') {
// var trackContainerWidth = parseInt(this.container.offsetWidth - 235);
// if (AC.Detector.isWin()) {
// trackContainerWidth = trackContainerWidth - 10;
// }
// this.trackContainer.style.width = trackContainerWidth + 'px';
// }
addActiveStateSwitching(this.volumeThumb);
//this.createVolumeScrubber();
if (!this.scrubber && this.element !== null) {
addActiveStateSwitching(this.playhead);
}
},
SPECIAL_KEYS: [ "ESC", "COMMAND", "CONTROL", "OPTION", "ALT", "SHIFT" ],
KEYS: {
KEY_TAB: 9,
KEY_ESCAPE: 27,
KEY_SPACE: 32,
KEY_PAGE_UP: 33,
KEY_PAGE_DOWN: 34,
KEY_END: 35,
KEY_HOME: 36,
KEY_LEFT_ARROW: 37,
KEY_UP_ARROW: 38,
KEY_RIGHT_ARROW: 39,
KEY_DOWN_ARROW: 40,
KEY_0: 48,
KEY_1: 49,
KEY_2: 50,
KEY_C: 67,
KEY_F: 70,
KEY_R: 82,
KEY_T: 84
},
_keyHandlerTimeout: null,
keyDownHandler: function (evt) {
var oEvent = window.event ? window.event : evt;
var keyCode = (oEvent.keyCode) ? oEvent.keyCode : ( (oEvent.which) ? oEvent.which : 0);
// for (var i =0;i<this.SPECIAL_KEYS.length;i++) { // Quick reset
// showOrHide( this.SPECIAL_KEYS[i], false );
// }
// if (oEvent.shiftKey) { showOrHide( "SHIFT", true ); }
// if (oEvent.ctrlKey) { showOrHide( "CONTROL", true ); }
// if (oEvent.altKey) { showOrHide( "ALT", true ); }
// if (oEvent.metaKey) { showOrHide( "COMMAND", true ); }
// if (keyCode==this.KEYS.KEY_ESCAPE) { showOrHide( "ESC", true ); }
window.clearTimeout(this._keyHandlerTimeout);
var theAction = "";
switch (true) {
// Display size
case ((keyCode == this.KEYS.KEY_0) && oEvent.ctrlKey):
Event.stop(evt);
this.selectSizeFromMenu(this.sizesSmallControl);
break;
case ((keyCode == this.KEYS.KEY_1) && oEvent.ctrlKey):
Event.stop(evt);
this.selectSizeFromMenu(this.sizesMediumControl);
break;
case ((keyCode == this.KEYS.KEY_2) && oEvent.ctrlKey):
Event.stop(evt);
this.selectSizeFromMenu(this.sizesLargeControl);
break;
case ((keyCode == this.KEYS.KEY_3) && oEvent.ctrlKey):
Event.stop(evt);
this.selectSizeFromMenu(this.sizesHDControl);
break;
// fullscreen removal
// case ((keyCode == this.KEYS.KEY_F) && (oEvent.ctrlKey || oEvent.metaKey)):
// Event.stop(evt);
// this.toggleFullscreen();
// break;
// Playback
case (!Media.Detection.Firefox() && ((keyCode == this.KEYS.KEY_T) && oEvent.metaKey && oEvent.altKey)):
case ((keyCode == this.KEYS.KEY_C) && oEvent.ctrlKey && oEvent.shiftKey):
Event.stop(evt);
this.toggleCaptions();
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
//timeout = window.setTimeout(this.removeAlertDisplay.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_RIGHT_ARROW) && oEvent.metaKey):
Event.stop(evt);
this.show();
this.fastForward();
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_LEFT_ARROW) && oEvent.metaKey):
Event.stop(evt);
this.show();
this.fastBackward();
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_RIGHT_ARROW) && oEvent.altKey): // Note: Windows should technically be (oEvent.ctrlKey && oEvent.altKey) here
Event.stop(evt);
this.show();
this.pause();
var value = +(1);
this.scrubber.setValue(value);
if (!this._seeking) {
this._seeking = true;
this._send('beginSeeking');
this.resetRate();
}
this._send('setTime',+(value*this._send('duration')-0.1));
window.setTimeout(function() {
this.trackProgress.style.width = +((this.scrubber.maximum*value)-4) + 'px';
this.playhead.style.left = +((this.scrubber.maximum*value)-4) + 'px';
}.bind(this), 50);
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_LEFT_ARROW) && oEvent.altKey): // Note: Windows should technically be (oEvent.ctrlKey && oEvent.altKey) here
Event.stop(evt);
this.show();
this.pause();
var value = +(0);
this.scrubber.setValue(value);
if (!this._seeking) {
this._seeking = true;
this._send('beginSeeking');
this.resetRate();
}
this._send('setTime',+(value*this._send('duration')+0.1));
window.setTimeout(function() {
this.trackProgress.style.width = value + 'px';
this.playhead.style.left = value + 'px';
}.bind(this), 50);
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_RIGHT_ARROW)):
break;
case ((keyCode == this.KEYS.KEY_LEFT_ARROW)):
break;
case (keyCode == this.KEYS.KEY_SPACE):
Event.stop(evt);
this.show();
this.togglePlaying();
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
// Volume
case ((keyCode == this.KEYS.KEY_UP_ARROW) && oEvent.altKey): // Note: Windows should technically be (oEvent.ctrlKey && oEvent.altKey) here
Event.stop(evt);
this.show();
this.fullVolume();
this.volumeControlSetting = 1;
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case ((keyCode == this.KEYS.KEY_DOWN_ARROW) && oEvent.altKey): // Note: Windows should technically be (oEvent.ctrlKey && oEvent.altKey) here
Event.stop(evt);
this.show();
this.muteVolume();
this.volumeControlSetting = 0;
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case (keyCode == this.KEYS.KEY_UP_ARROW):
Event.stop(evt);
this.show();
var volume = this._send('volume'),
volNumber = +(volume + .1),
newVolume = (volNumber < 1) ? volNumber : 1;
this._send('setVolume', newVolume);
this.volumeScrubber.setValue(newVolume);
this.volumeControlSetting = newVolume;
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
case (keyCode == this.KEYS.KEY_DOWN_ARROW):
Event.stop(evt);
this.show();
var volume = this._send('volume'),
volNumber = +(volume - .1),
newVolume = (volNumber > 0) ? volNumber : 0;
this._send('setVolume', newVolume);
this.volumeScrubber.setValue(newVolume);
this.volumeControlSetting = newVolume;
this._keyHandlerTimeout = window.setTimeout(this.hide.bind(this), 2500);
break;
// reload
case ((keyCode == this.KEYS.KEY_R) && oEvent.metaKey):
Event.stop(evt);
window.location.reload(false);
break;
default:
return true;
break;
}
},
createTrackScrubber: function() {
// Playback Slider
if(this.track) {
var max = this.track.offsetWidth;
if (!this.scrubber && this.element !== null) {
this.scrubber = new Control.Slider(this.playhead, this.track, {
alignX: -5,
increment: 1,
sliderValue: 0,
minimum: 0,
maximum: max,
onSlide: function (value) {
if (!this._seeking) {
this._seeking = true;
this._send('beginSeeking');
this.resetRate();
}
this._send('setTime',value*this._send('duration'));
this.trackProgress.style.width = this.playhead.style.left;
}.bind(this),
onChange: function (value) {
if (this._seeking) {
this._seeking = false;
this._send('endSeeking');
}
this.trackProgress.style.width = this.playhead.style.left;
}.bind(this)
});
}
}
},
createVolumeScrubber: function() {
// Volume Slider
if (!this.volumeScrubber && this.element !== null) {
var max = this.volumeTrack.offsetWidth;
this.volumeScrubber = new Control.Slider(this.volumeThumb, this.volumeTrack, {
alignX: -3,
increment: 1,
sliderValue: 0,
minimum: 0,
maximum: max,
onSlide: function (value) {
this._volSeeking = true;
this._send('setVolume', value);
this.volumeProgress.style.width = this.volumeThumb.style.left;
}.bind(this),
onChange: function (value) {
this._volSeeking = false;
this.volumeProgress.style.width = this.volumeThumb.style.left;
}.bind(this)
});
if (typeof this.volumeControlSetting == 'undefined') {
this.volumeControlSetting = 1;
}
this.volumeScrubber.setValue(this.volumeControlSetting);
}
},
getRoundRectForArcAndOpacity: function(arc, opacity) {
if (Media.Detection.CSSBorderRadius() !== false) {
return false;
}
if (typeof this.hasVMLNameSpaceDefined == 'undefined' || this.hasVMLNameSpaceDefined == false) {
this.setVML();
}
var roundRect = document.createElement('v:roundrect'),
fill = document.createElement('v:fill');
roundRect.setAttribute('arcsize', arc);
roundRect.setAttribute('fill', 'true');
roundRect.setAttribute('fillcolor', '#000000');
roundRect.setAttribute('stroked', 'false');
roundRect.className = 'border-radius-box';
fill.setAttribute('type', 'background');
fill.setAttribute('opacity', opacity);
fill.className = 'border-radius-fill';
if (typeof roundRect == 'object') {
roundRect.appendChild(fill);
return roundRect;
} else {
return false;
}
//return (typeof roundRect == 'object') ? roundRect : false;
},
setVML: function() {
if (!document.namespaces) {
return;
}
var i, countI, style,
head = document.getElementsByTagName('head')[0];
this.hasVMLNameSpaceDefined = false;
for (i=0, countI=document.namespaces.length; i<countI; i++) {
if (document.namespaces(i).name == 'v') {
this.hasVMLNameSpaceDefined = true;
break;
}
}
//<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v" />
if (!this.hasVMLNameSpaceDefined) {
document.namespaces.add('v', 'urn:schemas-microsoft-com:vml');
}
},
setCaptionsAvailable: function() {
this._send('setCaptionsAvailable', this.captionsUrl);
},
_setControlsAvailableForMenu: function(mainControl, controls) {
mainControl.menuListHeight = 0;
for (var i=0, control; control=controls[i]; i++) {
this._enableControl(control);
mainControl.menuListHeight += 25;
}
switch(mainControl) {
case this.sizesControl:
this.enableSizesControl();
break;
case this.downloadControl:
this.enableDownloadControl();
break;
case this.shareControl:
this.enableShareControl();
break;
default:
break;
}
},
setSizesAvailable: function() {
this._setControlsAvailableForMenu(this.sizesControl, this._sizesMenuControls);
},
setDownloadAvailable: function() {
this._setControlsAvailableForMenu(this.downloadControl, this._downloadMenuControls);
},
setShareAvailable: function() {
this._setControlsAvailableForMenu(this.shareControl, this._shareMenuControls);
},
// fullscreen removal
// setFullscreenAvailable: function() {
// this._send('setFullscreenAvailable', this.fullscreenUrl);
// },
enableBasicControls: function() {
if(this.playControl) {
Element.hide(this.playControl);
}
if(this.pauseControl) {
Element.show(this.pauseControl);
}
this._enableControl(this.volumeMuteControl);
this._enableControl(this.volumeFullControl);
this._enableControl(this.volumeThumb);
this._enableControl(this.playControl);
this._enableControl(this.pauseControl);
this._enableControl(this.playhead);
this._enableControl(this.fastBackwardControl);
this._enableControl(this.fastForwardControl);
this.createTrackScrubber();
this._enableControl(this.mediaTimeDisplay);
this._enableControl(this.mediaDurationDisplay);
},
enableCaptionsControl: function() {
if (!this.captionsControl.isEnabled && this.controllerType !== 'short-slim' && !this.captionsControl.isEnabled && !(typeof this.options != 'undefined' && this.options.captionsControlOff === true)) {
Element.addClassName(this.captionsControl, this.captionsControl.baseClassName + '-enabled');
this.captionsControl.isEnabled = true;
this.setSettingsControlsClass();
}
},
_enableSettingsControlWithMenu: function(control, menu) {
if (!control.isEnabled && this.controllerType !== 'short-slim' && !(typeof this.options != 'undefined' && this.options[control.name+'Off'] === true)) {
this.settingsMenuList.appendChild(menu);
control.menuListWidth = (AC.Detector.isIEStrict()) ? 165 : this.settingsMenuList.offsetWidth;
this.settingsMenuList.removeChild(menu);
Element.addClassName(control, control.baseClassName + '-enabled');
control.isEnabled = true;
this.setSettingsControlsClass();
}
},
enableSizesControl: function() {
this.sizesControl.name = 'sizesControl';
this._enableSettingsControlWithMenu(this.sizesControl, this.sizesMenu);
},
enableDownloadControl: function() {
this.downloadControl.name = 'downloadControl';
this._enableSettingsControlWithMenu(this.downloadControl, this.downloadMenu);
},
enableShareControl: function() {
this.shareControl.name = 'shareControl';
this._enableSettingsControlWithMenu(this.shareControl, this.shareMenu);
},
// fullscreen removal
// enableFullscreenControl: function() {
// //console.log('before if in enablefullscreencontrol');
// if (!this.fullscreenControl.isEnabled && this.controllerType !== 'short-slim' && !(typeof this.options != 'undefined' && this.options.fullscreenControlOff === true)) {
// //console.log('enabling fullscreen');
// Element.addClassName(this.fullscreenControl, this.fullscreenControl.baseClassName + '-enabled');
// this.fullscreenControl.isEnabled = true;
//
// this.setSettingsControlsClass();
// }
// },
togglePlaying: function () {
var isPlaying = this._send('playing');
if (isPlaying) {
this.pause();
} else {
this.resetRate();
this.play();
}
},
toggleCaptions: function() {
if (!Element.hasClassName(this.captionsControl, this.captionsControl.baseClassName + '-selected') && !this.resettingController && this.captionsControl.isEnabled === true) {
this._selectControl(this.captionsControl);
if (this._send('movieType') === 'Video' && this._send('enableCaptionsTextDisplay') === false) {
this._enableControl(this.trackText);
}
this._send('enableCaptions');
var captionsText = ac_media_language.captionsturnedon || 'Closed Captions On';
// using while loops to remove children of elements so they aren't completely erased in IE6
while (typeof this.alertDisplayContainer.firstChild != 'undefined' && this.alertDisplayContainer.firstChild != null) {
this.alertDisplayContainer.removeChild(this.alertDisplayContainer.firstChild);
}
if (Media.Detection.CSSBorderRadius() === false) {
var roundRect = this.getRoundRectForArcAndOpacity(0.19, 0.5);
}
if (typeof roundRect != 'undefined' && roundRect !== false) {
var textSpan = document.createElement('span');
this.captionsDisplayAlert.innerHTML = '';
textSpan.appendChild(document.createTextNode(captionsText));
roundRect.appendChild(textSpan);
this.captionsDisplayAlert.appendChild(roundRect);
} else {
this.captionsDisplayAlert.innerHTML = captionsText;
}
this.alertDisplayContainer.appendChild(this.captionsDisplayAlert);
Element.addClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
this.captionsControlSetting = true;
} else if (this.captionsControl.isEnabled === true) {
this._unselectControl(this.captionsControl);
this._disableControl(this.trackText);
this.captionsControlSetting = false;
if (this.resettingController === true) {
this._send('resetCaptions');
} else {
this._send('disableCaptions');
var captionsText = ac_media_language.captionsturnedoff || 'Closed Captions Off';
while (typeof this.alertDisplayContainer.firstChild != 'undefined' && this.alertDisplayContainer.firstChild != null) {
this.alertDisplayContainer.removeChild(this.alertDisplayContainer.firstChild);
}
var roundRect = this.getRoundRectForArcAndOpacity(0.19, 0.5);
if (roundRect !== false) {
var textSpan = document.createElement('span');
this.captionsDisplayAlert.innerHTML = '';
textSpan.appendChild(document.createTextNode(captionsText));
roundRect.appendChild(textSpan);
this.captionsDisplayAlert.appendChild(roundRect);
} else {
this.captionsDisplayAlert.innerHTML = captionsText;
}
this.alertDisplayContainer.appendChild(this.captionsDisplayAlert);
Element.addClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
}
}
},
_toggleMenuForControlAndMenuControls: function(menu, control, menuControls) {
if (!Element.hasClassName(control, control.baseClassName + '-selected') && !this.resettingMenus && !this.resettingController) {
this._selectControl(control);
this._selectSettingsMenuForMenu(menu);
this.positionSettingsMenuForControl(control);
} else {
this._unselectControl(control);
this._unselectMenu();
if (this.resettingController === true) {
for (var i=0, menuControl; menuControl = menuControls[i]; i++) {
this._unselectControl(menuControl);
}
}
}
},
toggleSizesMenu: function() {
if (this.sizesControl && this.sizesControl.isEnabled === true && this.sizesMenu) {
this._toggleMenuForControlAndMenuControls(this.sizesMenu, this.sizesControl, this._sizesMenuControls);
}
},
toggleDownloadMenu: function() {
if (this.downloadControl && this.downloadControl.isEnabled === true && this.downloadMenu) {
this._toggleMenuForControlAndMenuControls(this.downloadMenu, this.downloadControl, this._downloadMenuControls);
}
},
toggleShareMenu: function() {
if (this.shareControl && this.shareControl.isEnabled === true && this.shareMenu) {
this._toggleMenuForControlAndMenuControls(this.shareMenu, this.shareControl, this._shareMenuControls);
}
},
// fullscreen removal
// toggleFullscreen: function() {
// if (!this.resettingController && this.fullscreenControl.isEnabled === true) {
// this._send('enableFullscreen');
// }
// },
volumeControlSetting: 1,
// fullscreen removal
// fullscreenControlSetting: false,
sizesControlSetting: false,
setSettingsControls: function() {
// fullscreen removal
// if (typeof this.fullscreenControlSetting != 'undefined' && this.fullscreenControlSetting != false) {
// this._send('enableFullscreen');
// }
if (typeof this.sizesControlSetting != 'undefined' && this.sizesControlSetting != false) {
this.selectSizeFromMenu(this.sizesControlSetting);
}
if (typeof this.volumeControlSetting != 'undefined' && this.volumeControlSetting != 1) {
this.volumeScrubber.setValue(this.volumeControlSetting);
this._send('setVolume', this.volumeControlSetting);
}
},
mouseoverSettingsControl: function(control) {
this.settingsMenuTitle.innerHTML = control.menuTitle;
if (typeof this.currentMenu != 'undefined' && this.currentMenu != false) {
if (this.settingsMenuList.childNodes.length > 0) {
this.settingsMenuList.removeChild(this.currentMenu);
}
this.currentMenu = false;
}
this.positionSettingsMenuForControl(control);
Element.addClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-hovered');
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName);
this._unselectControl(this.sizesControl);
this._unselectControl(this.downloadControl);
this._unselectControl(this.shareControl);
},
mouseoutSettingsControl: function(evt, control) {
return;
var evt = evt || window.event,
menuTop = Element.cumulativeOffset(this.settingsMenu).top,
menuLeft = Element.cumulativeOffset(this.settingsMenu).left,
menuWidth = this.settingsMenu.offsetWidth,
menuHeight = this.settingsMenu.offsetHeight,
mouseX, mouseY;
if (evt) {
mouseX = evt.pageX || (evt.clientX + (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft);
mouseY = evt.pageY || (evt.clientY + (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop);
if (!(mouseX > menuLeft && mouseX < (menuLeft + menuWidth) && mouseY > menuTop && mouseY < (menuTop + menuHeight + 14))) {
Element.addClassName(this.settingsMenu, this.settingsMenu.baseClassName);
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-hovered');
}
}
},
positionSettingsMenuForControl: function(control) {
this.positionCarrotForControl(control);
if (typeof this.settingsMenuRoundRect != 'undefined' && this.settingsMenuRoundRect !== false) {
var items = this.settingsMenuList.getElementsByTagName('li'),
width = control.menuListWidth,
height = parseInt(((items.length > 0) ? 22 : 0) + this.settingsMenuTitle.offsetHeight + (items.length * 25)),
arc = Math.min((7 / Math.min(height, width)), 1).toFixed(2),
settingsMenuChildren = this.settingsMenu.childNodes,
node = this.settingsMenu.node;
try{
while(typeof this.settingsMenuRoundRect != 'undefined' && this.settingsMenuRoundRect.firstChild) {
this.settingsMenuRoundRect.removeChild(this.settingsMenuRoundRect.firstChild);
}
} catch(e) {}
this.settingsMenu.removeChild(this.settingsMenuRoundRect);
//alert('in positionSettingsMenuForControl')
this.settingsMenuRoundRect = this.getRoundRectForArcAndOpacity(arc, 0.9);
this.settingsMenu.insertBefore(this.settingsMenuRoundRect, this.settingsMenu.firstChild);
if (width && height) {
this.settingsMenuList.style.display = 'block';
this.settingsMenu.style.width = width + 'px';
this.settingsMenu.style.height = height + 'px';
} else {
this.settingsMenu.style.display = 'none';
}
} else if (typeof control.menuListWidth != 'undefined') {
this.settingsMenuList.style.width = control.menuListWidth + 'px';
}
var carrotTop = parseInt(this.settingsMenuCarrot.style.top),
carrotLeft = parseInt(this.settingsMenuCarrot.style.left),
menuHeight = this.settingsMenu.offsetHeight,
menuWidth = this.settingsMenu.offsetWidth,
mediaControllerLeft = Element.cumulativeOffset(this.mediaController).left,
mediaControllerWidth = this.mediaController.offsetWidth,
carrotHeight = this.settingsMenuCarrot.offsetHeight,
carrotWidth = this.settingsMenuCarrot.offsetWidth,
menuTop = carrotTop - menuHeight + carrotHeight,
menuLeft = (mediaControllerLeft + mediaControllerWidth) - menuWidth,
controlLeft = Element.cumulativeOffset(control).left,
controlCenter = controlLeft + (control.offsetWidth / 2),
newMenuLeft, newMenuBottom, newCarrotTop, newCarrotLeft, menuListWidth;
switch (this.controllerType) {
case 'slim':
case 'short-slim':
var slimMenuLeft = (mediaControllerLeft + mediaControllerWidth + 20) - menuWidth;
this.settingsMenu.style.top = (carrotTop + carrotHeight) + 'px';
this.settingsMenu.style.left = ((slimMenuLeft < carrotLeft) ? slimMenuLeft : carrotLeft) + 'px';
break;
default:
this.settingsMenu.style.top = menuTop + 'px';
this.settingsMenu.style.left = ((menuLeft - 7 < carrotLeft) ? (menuLeft - 7) : carrotLeft) + 'px';
break;
}
// if (this.controllerType === 'slim' || this.controllerType === 'short-slim') {
// var slimMenuLeft = (mediaControllerLeft + mediaControllerWidth + 20) - menuWidth;
// this.settingsMenu.style.top = (carrotTop + carrotHeight) + 'px';
// this.settingsMenu.style.left = ((slimMenuLeft < carrotLeft) ? slimMenuLeft : carrotLeft) + 'px';
// } else {
// this.settingsMenu.style.top = menuTop + 'px';
// this.settingsMenu.style.left = ((menuLeft - 7 < carrotLeft) ? (menuLeft - 7) : carrotLeft) + 'px';
// //this.settingsMenu.style.left = parseInt(controlCenter - (menuWidth / 2)) + 'px';
// }
newMenuLeft = parseInt(this.settingsMenu.style.left);
newCarrotTop = menuHeight;
newCarrotLeft = parseInt(this.settingsMenuCarrot.style.left) - newMenuLeft;
switch (this.controllerType) {
case 'slim':
case 'short-slim':
this.settingsMenuCarrot.style.top = (0 - (carrotHeight + 6)) + 'px';
break;
default:
this.settingsMenuCarrot.style.top = ((AC.Detector.isIEStrict()) ? ((menuHeight - carrotHeight) + 8) : (menuHeight - carrotHeight)) + 'px';
break;
}
// if (this.controllerType === 'slim' || this.controllerType === 'short-slim') {
// this.settingsMenuCarrot.style.top = (0 - (carrotHeight + 6)) + 'px';
// } else {
// this.settingsMenuCarrot.style.top = (AC.Detector.isIEStrict()) ? ((menuHeight - carrotHeight) + 8) + 'px' : (menuHeight - carrotHeight) + 'px';
// }
this.settingsMenuCarrot.style.left = (newCarrotLeft - (carrotWidth / 2)) + 'px';
this.settingsMenu.style.overflow = 'visible';
},
positionCarrotForControl: function(control) {
var mediaControllerTop = Element.cumulativeOffset(this.mediaController).top,
mediaControllerWidth = this.mediaController.offsetWidth,
mediaControllerHeight = this.mediaController.offsetHeight,
controlLeft = Element.cumulativeOffset(control).left,
controlWidth = control.offsetWidth,
carrotWidth = this.settingsMenuCarrot.offsetWidth,
carrotHeight = this.settingsMenuCarrot.offsetHeight,
carrotTop = mediaControllerTop - carrotHeight,
carrotLeft = controlLeft + ((controlWidth - carrotWidth) / 2);
this.settingsMenu.style.overflow = 'hidden';
switch (this.controllerType) {
case 'slim':
case 'short-slim':
Element.addClassName(this.settingsMenuCarrot, 'slim-menu-carrot');
this.settingsMenuCarrot.style.top = (mediaControllerTop + mediaControllerHeight) + 'px';
break;
default:
this.settingsMenuCarrot.style.top = carrotTop + 'px';
break;
}
// if (this.controllerType === 'slim' || this.controllerType === 'short-slim') {
// Element.addClassName(this.settingsMenuCarrot, 'slim-menu-carrot');
// this.settingsMenuCarrot.style.top = (mediaControllerTop + mediaControllerHeight) + 'px';
// } else {
// this.settingsMenuCarrot.style.top = carrotTop + 'px';
// }
this.settingsMenuCarrot.style.left = carrotLeft + 'px';
},
_selectSettingsMenuForMenu: function(menu) {
var menuTitle = menu.menuTitle,
menuName = menu.menuName;
this.settingsMenuTitle.innerHTML = menuTitle;
if (typeof this.currentMenu != 'undefined' && this.currentMenu != false) {
if (this.settingsMenuList.childNodes > 0) {
this.settingsMenuList.removeChild(this.currentMenu);
}
}
this.settingsMenuList.appendChild(menu);
this.currentMenu = menu;
},
_unselectMenu: function() {
Element.addClassName(this.settingsMenu, this.settingsMenu.baseClassName);
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-selected');
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-hovered');
},
_selectControl: function(control) {
Element.addClassName(control, control.baseClassName+'-selected');
if (control === this.sizesControl || control === this.downloadControl || control === this.shareControl) {
Element.addClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-selected');
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName);
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-hovered');
this._currentSettingsControl = control;
}
},
_unselectControl: function(control) {
if(control) {
Element.removeClassName(control, control.baseClassName+'-selected');
}
},
_enableControl: function(control) {
if(control) {
Element.addClassName(control, control.baseClassName+'-enabled');
}
},
_disableControl: function(control) {
if(control) {
Element.removeClassName(control, control.baseClassName+'-enabled');
}
},
reset: function () {
if (typeof this.scrubber != 'undefined') {
this.playhead.style.left = '0px';
this.trackProgress.style.width = this.playhead.style.left;
this.show();
if(this.playControl) {
Element.show(this.playControl);
}
if(this.pauseControl) {
Element.hide(this.pauseControl);
}
this._disableControl(this.volumeMuteControl);
this._disableControl(this.volumeFullControl);
this._disableControl(this.volumeThumb);
this._disableControl(this.playControl);
this._disableControl(this.pauseControl);
this._disableControl(this.playhead);
this._disableControl(this.fastBackwardControl);
this._disableControl(this.fastForwardControl);
this.removeAdvancedPlayDisplay();
}
},
resetSettingsControls: function() {
this.resetSettingsMenus();
},
resetSettingsMenus: function() {
this.resettingMenus = true;
if(this.alertDisplayContainer) {
Element.removeClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
}
if(this.settingsMenu) {
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-hovered');
Element.removeClassName(this.settingsMenu, this.settingsMenu.baseClassName+'-selected');
}
this.toggleSizesMenu();
this.toggleDownloadMenu();
this.toggleShareMenu();
this.resettingMenus = false;
},
resetRate: function() {
if (this._send('rate') !== 1) {
this.removeAdvancedPlayDisplay();
this._send('setRate', 1);
}
},
removeAdvancedPlayDisplay: function() {
this.removeAlertDisplay();
Element.removeClassName(this.fastBackwardControl, 'fastBackward-active');
Element.removeClassName(this.fastForwardControl, 'fastForward-active');
},
removeAlertDisplay: function () {
if(this.fastBackwardControl) {
this.setRateDisplay(this.fastBackwardControl, null);
}
if(this.fastForwardControl) {
this.setRateDisplay(this.fastForwardControl, null);
}
if(this.alertDisplayContainer) {
//alert(this.alertDisplayContainer.baseClassName + '-active')
Element.removeClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
}
},
setSettingsControlsClass: function() {
var settingsControlsClass = this.settingsControls.baseClassName,
buttonCount = 0;
if (typeof this.captionsControl.isEnabled != 'undefined' && this.captionsControl.isEnabled === true) {
settingsControlsClass += '-captions';
buttonCount++;
}
if (typeof this.sizesControl.isEnabled != 'undefined' && this.sizesControl.isEnabled === true) {
settingsControlsClass += '-sizes';
buttonCount++;
}
if (typeof this.downloadControl.isEnabled != 'undefined' && this.downloadControl.isEnabled === true) {
settingsControlsClass += '-download';
buttonCount++;
}
if (typeof this.shareControl.isEnabled != 'undefined' && this.shareControl.isEnabled === true) {
settingsControlsClass += '-share';
buttonCount++;
}
// fullscreen removal
// if (typeof this.fullscreenControl.isEnabled != 'undefined' && this.fullscreenControl.isEnabled === true) {
// settingsControlsClass += '-fullscreen';
// buttonCount++;
// }
this.settingsControls.className = '';
Element.addClassName(this.settingsControls, this.settingsControls.baseClassName);
Element.addClassName(this.settingsControls, settingsControlsClass);
this.setTrackContainerWidth();
},
setTrackContainerWidth: function() {
if (this.controllerType === 'regular' || !this.settingsControls || !this.trackContainer ) {
return;
}
// if (this.controllerType === 'slim' || this.controllerType === 'short-slim') {
var buttonWidth = (this.settingsControls.offsetWidth > 0) ? parseInt(this.settingsControls.offsetWidth + 10) : 0,
controllerLeft = this.mediaController.offsetLeft,
controllerWidth = this.mediaController.offsetWidth,
controllerRight = parseInt(controllerLeft + controllerWidth);
newTrackWidth = parseInt(((controllerRight - this.trackContainer.offsetLeft) <= 600) ? (controllerRight - this.trackContainer.offsetLeft) : 600),
newTrackContainerWidth = parseInt(newTrackWidth - (buttonWidth + 10));
// this is to make sure that the track doesn't go past the right edge for the slim controller
if (this.controllerType === 'slim') {
var trackRight = parseInt(this.trackContainer.offsetLeft + newTrackContainerWidth + 20);
if (controllerRight < trackRight) {
newTrackContainerWidth = parseInt(newTrackContainerWidth - (trackRight - controllerRight));
}
}
this.trackContainer.style.width = newTrackContainerWidth + 'px';
this.track.parentNode.style.width = (this.controllerType === 'short-slim') ? newTrackContainerWidth + 'px' : parseInt(newTrackContainerWidth - 80) + 'px';
this.scrubberMax = (this.controllerType === 'short-slim') ? newTrackContainerWidth : parseInt(newTrackContainerWidth - 80);
this.volumeScrubber = null;
this.createVolumeScrubber();
this.scrubber = null;
this.createTrackScrubber();
// }
},
_send: function (msg, params) {
if (this.delegate && msg in this.delegate) {
params = [].concat(params);
return this.delegate[msg].apply(this.delegate, params);
}
},
show: function () {
Media.ControlsWidget.show(this);
},
hide: function () {
if (this._seeking || this._volSeeking) {
return;
}
Media.ControlsWidget.hide(this);
this.removeAlertDisplay();
},
play: function() {
this.resetRate();
if (this._send('playing') === false) {
if(AC.Detector.isiPad()) {
this._send('forcePlay');
}
else {
this._send('play');
}
}
if(this.playControl) {
Element.hide(this.playControl);
}
if(this.pauseControl) {
Element.show(this.pauseControl);
}
},
pause: function() {
this.resetRate();
if (this._send('playing') === true) {
if(AC.Detector.isiPad()) {
this._send('forcePause');
}
else {
this._send('pause');
}
}
if(this.pauseControl) {
Element.hide(this.pauseControl);
}
if(this.playControl) {
Element.show(this.playControl);
}
},
fastBackward: function () {
var currentRate = this._send('rate'),
speedText = '';
if (this._send('playing') === false) {
this._send('play');
} else {
if(this.pauseControl) {
Element.hide(this.pauseControl);
}
if(this.playControl) {
Element.show(this.playControl);
}
}
switch(currentRate) {
case -2:
this._send('setRate', -4);
speedText = '4x';
this.setRateDisplay(this.speedDisplayAlert, 'four-times-speed-display');
this.setRateDisplay(this.fastBackwardControl, 'four-times-fast-backward');
break;
case -4:
this._send('setRate', -8);
speedText = '8x';
this.setRateDisplay(this.speedDisplayAlert, 'eight-times-speed-display');
this.setRateDisplay(this.fastBackwardControl, 'eight-times-fast-backward');
break;
default:
this._send('setRate', -2);
speedText = '2x';
this.setRateDisplay(this.speedDisplayAlert, 'two-times-speed-display');
this.setRateDisplay(this.fastBackwardControl, 'two-times-fast-backward');
break;
}
this.setRateDisplay(this.fastForwardControl, null);
while (typeof this.alertDisplayContainer.firstChild != 'undefined' && this.alertDisplayContainer.firstChild != null) {
this.alertDisplayContainer.removeChild(this.alertDisplayContainer.firstChild);
}
this.speedDisplayAlert.innerHTML = '';
//alert('in fastBackward');
var roundRect = this.getRoundRectForArcAndOpacity(0.19, 0.5);
if (roundRect !== false) {
var textSpan = document.createElement('span');
textSpan.appendChild(document.createTextNode(speedText));
roundRect.appendChild(textSpan);
this.speedDisplayAlert.appendChild(roundRect);
} else {
this.speedDisplayAlert.appendChild(document.createTextNode(speedText));
}
this.alertDisplayContainer.appendChild(this.speedDisplayAlert);
Element.addClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
Element.removeClassName(this.fastForwardControl, 'fastForward-active');
Element.addClassName(this.fastBackwardControl, 'fastBackward-active');
},
fastForward: function () {
var currentRate = this._send('rate'),
speedText = '';
if (this._send('playing') === false) {
this._send('play');
} else {
if(this.pauseControl) {
Element.hide(this.pauseControl);
}
if(this.playControl) {
Element.show(this.playControl);
}
}
switch(currentRate) {
case 2:
this._send('setRate', 4);
speedText = '4x';
this.setRateDisplay(this.speedDisplayAlert, 'four-times-speed-display');
this.setRateDisplay(this.fastForwardControl, 'four-times-fast-forward');
break;
case 4:
this._send('setRate', 8);
speedText = '8x';
this.setRateDisplay(this.speedDisplayAlert, 'eight-times-speed-display');
this.setRateDisplay(this.fastForwardControl, 'eight-times-fast-forward');
break;
default:
this._send('setRate', 2);
speedText = '2x';
this.setRateDisplay(this.speedDisplayAlert, 'two-times-speed-display');
this.setRateDisplay(this.fastForwardControl, 'two-times-fast-forward');
break;
}
this.setRateDisplay(this.fastBackwardControl, null);
while (typeof this.alertDisplayContainer.firstChild != 'undefined' && this.alertDisplayContainer.firstChild != null) {
this.alertDisplayContainer.removeChild(this.alertDisplayContainer.firstChild);
}
this.speedDisplayAlert.innerHTML = '';
//alert('in fastForward');
var roundRect = this.getRoundRectForArcAndOpacity(0.19, 0.5);
if (roundRect !== false) {
var textSpan = document.createElement('span');
textSpan.appendChild(document.createTextNode(speedText));
roundRect.appendChild(textSpan);
this.speedDisplayAlert.appendChild(roundRect);
} else {
this.speedDisplayAlert.appendChild(document.createTextNode(speedText));
}
this.alertDisplayContainer.appendChild(this.speedDisplayAlert);
Element.addClassName(this.alertDisplayContainer, this.alertDisplayContainer.baseClassName + '-active');
Element.removeClassName(this.fastBackwardControl, 'fastBackward-active');
Element.addClassName(this.fastForwardControl, 'fastForward-active');
},
setRateDisplay: function(control, rate) {
if(!control) return;
switch(true) {
case (typeof control.currentRateDisplay != 'undefined' && control.currentRateDisplay !== rate):
Element.removeClassName(control, control.currentRateDisplay);
break;
default:
break;
}
switch(rate) {
case null:
break;
default:
Element.addClassName(control, rate);
break;
}
control.currentRateDisplay = rate;
},
muteVolume: function() {
this._send('setMuted', true);
this.volumeScrubber.setValue(0);
},
fullVolume: function() {
this._send('setMuted', false);
this._send('setVolume', 1);
this.volumeScrubber.setValue(1);
},
updatePercentLoaded: function (newPercent) {
if (typeof this.controlLoadedProgress !== 'undefined' && newPercent) {
this.controlLoadedProgress.style.width = newPercent*100 + '%';
}
if (newPercent === 1) {
Element.addClassName(this.trackEndCap, 'track-right-cap-loaded');
Element.removeClassName(this.trackEndCap, 'track-right-cap');
}
},
updateTime: function (newTime) {
var duration = this._send('duration'),
remainingTime = (duration - newTime);
if ((newTime < 1 || remainingTime < 1) && this._send('rate') !== 1) {
this.resetRate();
this._send('pause');
Element.removeClassName(this.fastBackwardControl, 'fastBackward-active');
Element.removeClassName(this.fastForwardControl, 'fastForward-active');
}
try {
this.scrubber.setValue((newTime / duration) || 0);
} catch(e) {}
this.updateElapsedTime(newTime);
this.updateRemainingTime(remainingTime);
},
_setTimeForReadout: function(time, minutes, seconds) {
if(minutes && seconds) {
var min = parseInt(time / 60, 10),
sec = parseInt(time % 60, 10);
if (min < 10) {
min = '0'+min;
}
if (sec < 10) {
sec = '0'+sec;
}
minutes.innerHTML = min;
seconds.innerHTML = sec;
}
},
updateElapsedTime: function (newTime) {
var minutes = this.minutesPlayed,
seconds = this.secondsPlayed;
this._setTimeForReadout(newTime, minutes, seconds);
},
updateRemainingTime: function (newTime) {
var minutes = this.minutesRemaining,
seconds = this.secondsRemaining;
this._setTimeForReadout(newTime, minutes, seconds);
}
};
/* adding a method to check that the URL exists using http HEAD so that the file doesn't load */
Ajax.checkURL = function(url, callback) {
var transport = Ajax.getTransport();
transport.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
callback();
}
};
transport.open('HEAD', url, true);
transport.send(null);
};
Ajax.Request.prototype._overrideMimeType = null;
Ajax.Request.prototype.overrideMimeType = function(overrideMimeTypeValue) {
this._overrideMimeType = overrideMimeTypeValue;
if (this.transport.overrideMimeType) {
this.transport.overrideMimeType(overrideMimeTypeValue);
}
};
Ajax.Response.prototype.responseXMLValue = function() {
if (AC.Detector.isIEStrict()) {
var xmlDocument = this.transport.responseXML.documentElement;
if (!xmlDocument && this.request._doesOverrideXMLMimeType()) {
this.transport.responseXML.loadXML(this.transport.responseText);
}
}
return this.transport.responseXML;
};
Media.ControlsWidget.SharePlugin = function(){}
Media.ControlsWidget.SharePlugin.prototype.name = function() {
return this._name;
}
Media.ControlsWidget.SharePlugin.prototype.actionName = function() {
return "share";
}
Media.ControlsWidget.SharePlugin.prototype.pluginType = function() {
return "Share";
}