diff --git a/airtime_mvc/application/controllers/DashboardController.php b/airtime_mvc/application/controllers/DashboardController.php index fc2461d3f..bdcaf2f1b 100644 --- a/airtime_mvc/application/controllers/DashboardController.php +++ b/airtime_mvc/application/controllers/DashboardController.php @@ -97,7 +97,7 @@ class DashboardController extends Zend_Controller_Action $baseUrl = Application_Common_OsPath::getBaseDir(); $this->view->headLink()->appendStylesheet($baseUrl.'js/jplayer/skin/jplayer.blue.monday.css?'.$CC_CONFIG['airtime_version']); - $this->_helper->layout->setLayout('bare'); + $this->_helper->layout->setLayout('livestream'); $logo = Application_Model_Preference::GetStationLogo(); if ($logo) { diff --git a/airtime_mvc/application/layouts/scripts/bare.phtml b/airtime_mvc/application/layouts/scripts/bare.phtml index f6b3f99bf..4194f7f78 100644 --- a/airtime_mvc/application/layouts/scripts/bare.phtml +++ b/airtime_mvc/application/layouts/scripts/bare.phtml @@ -2,7 +2,7 @@ - <?php echo _("Live stream") ?> + headLink() ?> headScript() ?> google_analytics)?$this->google_analytics:"" ?> diff --git a/airtime_mvc/application/layouts/scripts/livestream.phtml b/airtime_mvc/application/layouts/scripts/livestream.phtml new file mode 100644 index 000000000..d21c4d92d --- /dev/null +++ b/airtime_mvc/application/layouts/scripts/livestream.phtml @@ -0,0 +1,17 @@ +doctype() ?> + + + + + + + + <?php echo _("Live stream") ?> + headLink() ?> + headScript() ?> + google_analytics)?$this->google_analytics:"" ?> + + +
layout()->content ?>
+ + diff --git a/airtime_mvc/public/js/jplayer/Jplayer.as b/airtime_mvc/public/js/jplayer/Jplayer.as deleted file mode 100644 index 1178dacc3..000000000 --- a/airtime_mvc/public/js/jplayer/Jplayer.as +++ /dev/null @@ -1,415 +0,0 @@ -/* - * jPlayer Plugin for jQuery JavaScript Library - * http://www.happyworm.com/jquery/jplayer - * - * Copyright (c) 2009 - 2011 Happyworm Ltd - * Dual licensed under the MIT and GPL licenses. - * - http://www.opensource.org/licenses/mit-license.php - * - http://www.gnu.org/copyleft/gpl.html - * - * Author: Mark J Panaghiston - * Version: 2.1.0 - * Date: 1st September 2011 - * - * FlashVars expected: (AS3 property of: loaderInfo.parameters) - * id: (URL Encoded: String) Id of jPlayer instance - * vol: (Number) Sets the initial volume - * muted: (Boolean in a String) Sets the initial muted state - * jQuery: (URL Encoded: String) Sets the jQuery var name. Used with: someVar = jQuery.noConflict(true); - * - * Compiled using: Adobe Flex Compiler (mxmlc) Version 4.5.1 build 21328 - */ - -package { - import flash.system.Security; - import flash.external.ExternalInterface; - - import flash.utils.Timer; - import flash.events.TimerEvent; - - import flash.text.TextField; - import flash.text.TextFormat; - - import flash.events.KeyboardEvent; - - import flash.display.Sprite; - import happyworm.jPlayer.*; - - import flash.display.StageAlign; - import flash.display.StageScaleMode; - import flash.events.Event; - import flash.events.MouseEvent; - - import flash.ui.ContextMenu; - import flash.ui.ContextMenuItem; - import flash.events.ContextMenuEvent; - import flash.net.URLRequest; - import flash.net.navigateToURL; - - public class Jplayer extends Sprite { - private var jQuery:String; - private var sentNumberFractionDigits:uint = 2; - - public var commonStatus:JplayerStatus = new JplayerStatus(); // Used for inital ready event so volume is correct. - - private var myInitTimer:Timer = new Timer(100, 0); - - private var myMp3Player:JplayerMp3; - private var myMp4Player:JplayerMp4; - - private var isMp3:Boolean = false; - private var isVideo:Boolean = false; - - private var txLog:TextField; - private var debug:Boolean = false; // Set debug to false for release compile! - - public function Jplayer() { - flash.system.Security.allowDomain("*"); - - jQuery = loaderInfo.parameters.jQuery + "('#" + loaderInfo.parameters.id + "').jPlayer"; - commonStatus.volume = Number(loaderInfo.parameters.vol); - commonStatus.muted = loaderInfo.parameters.muted == "true"; - - stage.scaleMode = StageScaleMode.NO_SCALE; - stage.align = StageAlign.TOP_LEFT; - stage.addEventListener(Event.RESIZE, resizeHandler); - stage.addEventListener(MouseEvent.CLICK, clickHandler); - - var initialVolume:Number = commonStatus.volume; - if(commonStatus.muted) { - initialVolume = 0; - } - myMp3Player = new JplayerMp3(initialVolume); - addChild(myMp3Player); - - myMp4Player = new JplayerMp4(initialVolume); - addChild(myMp4Player); - - setupListeners(!isMp3, isMp3); // Set up the listeners to the default isMp3 state. - - // The ContextMenu only partially works. The menu select events never occur. - // Investigated and it is something to do with the way jPlayer inserts the Flash on the page. - // A simple test inserting the Jplayer.swf on a page using: 1) SWFObject 2.2 works. 2) AC_FL_RunContent() works. - // jPlayer Flash insertion is based on SWFObject 2.2 and the resaon behind this failure is not clear. The Flash insertion HTML on the page looks similar. - var myContextMenu:ContextMenu = new ContextMenu(); - myContextMenu.hideBuiltInItems(); - var menuItem_jPlayer:ContextMenuItem = new ContextMenuItem("jPlayer " + JplayerStatus.VERSION); - var menuItem_happyworm:ContextMenuItem = new ContextMenuItem("© 2009-2011 Happyworm Ltd", true); - menuItem_jPlayer.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_jPlayer); - menuItem_happyworm.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_happyworm); - myContextMenu.customItems.push(menuItem_jPlayer, menuItem_happyworm); - contextMenu = myContextMenu; - - // Log console for dev compile option: debug - if(debug) { - txLog = new TextField(); - txLog.x = 5; - txLog.y = 5; - txLog.width = 540; - txLog.height = 390; - txLog.border = true; - txLog.background = true; - txLog.backgroundColor = 0xEEEEFF; - txLog.multiline = true; - txLog.text = "jPlayer " + JplayerStatus.VERSION; - txLog.visible = false; - this.addChild(txLog); - this.stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler); - - myMp3Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler); - myMp4Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler); - } - - // Delay init() because Firefox 3.5.7+ developed a bug with local testing in Firebug. - myInitTimer.addEventListener(TimerEvent.TIMER, init); - myInitTimer.start(); - } - - private function init(e:TimerEvent):void { - myInitTimer.stop(); - if(ExternalInterface.available) { - ExternalInterface.addCallback("fl_setAudio_mp3", fl_setAudio_mp3); - ExternalInterface.addCallback("fl_setAudio_m4a", fl_setAudio_m4a); - ExternalInterface.addCallback("fl_setVideo_m4v", fl_setVideo_m4v); - ExternalInterface.addCallback("fl_clearMedia", fl_clearMedia); - ExternalInterface.addCallback("fl_load", fl_load); - ExternalInterface.addCallback("fl_play", fl_play); - ExternalInterface.addCallback("fl_pause", fl_pause); - ExternalInterface.addCallback("fl_play_head", fl_play_head); - ExternalInterface.addCallback("fl_volume", fl_volume); - ExternalInterface.addCallback("fl_mute", fl_mute); - - ExternalInterface.call(jQuery, "jPlayerFlashEvent", JplayerEvent.JPLAYER_READY, extractStatusData(commonStatus)); // See JplayerStatus() class for version number. - } - } - private function setupListeners(oldMP3:Boolean, newMP3:Boolean):void { - if(oldMP3 != newMP3) { - if(newMP3) { - listenToMp3(true); - listenToMp4(false); - } else { - listenToMp3(false); - listenToMp4(true); - } - } - } - private function listenToMp3(active:Boolean):void { - if(active) { - myMp3Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); - - myMp3Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); - - myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); - myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); - } else { - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); - - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); - - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); - myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); - } - } - private function listenToMp4(active:Boolean):void { - if(active) { - myMp4Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); - - myMp4Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); - - myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); - myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); - - myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler - } else { - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); - - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); - - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); - - myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler - } - } - private function fl_setAudio_mp3(src:String):Boolean { - if (src != null) { - log("fl_setAudio_mp3: "+src); - setupListeners(isMp3, true); - isMp3 = true; - isVideo = false; - myMp4Player.clearFile(); - myMp3Player.setFile(src); - return true; - } else { - log("fl_setAudio_mp3: null"); - return false; - } - } - private function fl_setAudio_m4a(src:String):Boolean { - if (src != null) { - log("fl_setAudio_m4a: "+src); - setupListeners(isMp3, false); - isMp3 = false; - isVideo = false; - myMp3Player.clearFile(); - myMp4Player.setFile(src); - return true; - } else { - log("fl_setAudio_m4a: null"); - return false; - } - } - private function fl_setVideo_m4v(src:String):Boolean { - if (src != null) { - log("fl_setVideo_m4v: "+src); - setupListeners(isMp3, false); - isMp3 = false; - isVideo = true; - myMp3Player.clearFile(); - myMp4Player.setFile(src); - return true; - } else { - log("fl_setVideo_m4v: null"); - return false; - } - } - private function fl_clearMedia():void { - log("clearMedia."); - myMp3Player.clearFile(); - myMp4Player.clearFile(); - } - private function fl_load():Boolean { - log("load."); - if(isMp3) { - return myMp3Player.load(); - } else { - return myMp4Player.load(); - } - } - private function fl_play(time:Number = NaN):Boolean { - log("play: time = " + time); - if(isMp3) { - return myMp3Player.play(time * 1000); // Flash uses milliseconds - } else { - return myMp4Player.play(time * 1000); // Flash uses milliseconds - } - } - private function fl_pause(time:Number = NaN):Boolean { - log("pause: time = " + time); - if(isMp3) { - return myMp3Player.pause(time * 1000); // Flash uses milliseconds - } else { - return myMp4Player.pause(time * 1000); // Flash uses milliseconds - } - } - private function fl_play_head(percent:Number):Boolean { - log("play_head: "+percent+"%"); - if(isMp3) { - return myMp3Player.playHead(percent); - } else { - return myMp4Player.playHead(percent); - } - } - private function fl_volume(v:Number):void { - log("volume: "+v); - commonStatus.volume = v; - if(!commonStatus.muted) { - myMp3Player.setVolume(v); - myMp4Player.setVolume(v); - } - } - private function fl_mute(mute:Boolean):void { - log("mute: "+mute); - commonStatus.muted = mute; - if(mute) { - myMp3Player.setVolume(0); - myMp4Player.setVolume(0); - } else { - myMp3Player.setVolume(commonStatus.volume); - myMp4Player.setVolume(commonStatus.volume); - } - } - private function jPlayerFlashEvent(e:JplayerEvent):void { - log("jPlayer Flash Event: " + e.type + ": " + e.target); - if(ExternalInterface.available) { - ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data)); - } - } - private function extractStatusData(data:JplayerStatus):Object { - var myStatus:Object = { - version: JplayerStatus.VERSION, - src: data.src, - paused: !data.isPlaying, // Changing this name requires inverting all assignments and conditional statements. - srcSet: data.srcSet, - seekPercent: data.seekPercent, - currentPercentRelative: data.currentPercentRelative, - currentPercentAbsolute: data.currentPercentAbsolute, - currentTime: data.currentTime / 1000, // JavaScript uses seconds - duration: data.duration / 1000, // JavaScript uses seconds - volume: commonStatus.volume, - muted: commonStatus.muted - }; - log("extractStatusData: sp="+myStatus.seekPercent+" cpr="+myStatus.currentPercentRelative+" cpa="+myStatus.currentPercentAbsolute+" ct="+myStatus.currentTime+" d="+myStatus.duration); - return myStatus; - } - private function jPlayerMetaDataHandler(e:JplayerEvent):void { - log("jPlayerMetaDataHandler:" + e.target); - if(ExternalInterface.available) { - resizeHandler(new Event(Event.RESIZE)); - ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data)); - } - } - private function resizeHandler(e:Event):void { - log("resizeHandler: stageWidth = " + stage.stageWidth + " | stageHeight = " + stage.stageHeight); - - var mediaX:Number = 0; - var mediaY:Number = 0; - var mediaWidth:Number = 0; - var mediaHeight:Number = 0; - - if(stage.stageWidth > 0 && stage.stageHeight > 0 && myMp4Player.myVideo.width > 0 && myMp4Player.myVideo.height > 0) { - var aspectRatioStage:Number = stage.stageWidth / stage.stageHeight; - var aspectRatioVideo:Number = myMp4Player.myVideo.width / myMp4Player.myVideo.height; - if(aspectRatioStage < aspectRatioVideo) { - mediaWidth = stage.stageWidth; - mediaHeight = stage.stageWidth / aspectRatioVideo; - mediaX = 0; - mediaY = (stage.stageHeight - mediaHeight) / 2; - } else { - mediaWidth = stage.stageHeight * aspectRatioVideo; - mediaHeight = stage.stageHeight; - mediaX = (stage.stageWidth - mediaWidth) / 2; - mediaY = 0; - } - resizeEntity(myMp4Player, mediaX, mediaY, mediaWidth, mediaHeight); - } - if(debug && stage.stageWidth > 20 && stage.stageHeight > 20) { - txLog.width = stage.stageWidth - 10; - txLog.height = stage.stageHeight - 10; - } - } - private function resizeEntity(entity:Sprite, mediaX:Number, mediaY:Number, mediaWidth:Number, mediaHeight:Number):void { - entity.x = mediaX; - entity.y = mediaY; - entity.width = mediaWidth; - entity.height = mediaHeight; - } - private function clickHandler(e:MouseEvent):void { - if(isMp3) { - jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp3Player.myStatus, "click")) - } else { - jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp4Player.myStatus, "click")) - } - } - // This event is never called. See comments in class constructor. - private function menuSelectHandler_jPlayer(e:ContextMenuEvent):void { - navigateToURL(new URLRequest("http://jplayer.org/"), "_blank"); - } - // This event is never called. See comments in class constructor. - private function menuSelectHandler_happyworm(e:ContextMenuEvent):void { - navigateToURL(new URLRequest("http://happyworm.com/"), "_blank"); - } - private function log(t:String):void { - if(debug) { - txLog.text = t + "\n" + txLog.text; - } - } - private function debugMsgHandler(e:JplayerEvent):void { - log(e.msg); - } - private function keyboardHandler(e:KeyboardEvent):void { - log("keyboardHandler: e.keyCode = " + e.keyCode); - switch(e.keyCode) { - case 68 : // d - txLog.visible = !txLog.visible; - log("Toggled log display: " + txLog.visible); - break; - case 76 : // l - if(e.ctrlKey && e.shiftKey) { - txLog.text = "Cleared log."; - } - break; - } - } - } -} diff --git a/airtime_mvc/public/js/jplayer/Jplayer.fla b/airtime_mvc/public/js/jplayer/Jplayer.fla deleted file mode 100644 index 61ae40d3a..000000000 Binary files a/airtime_mvc/public/js/jplayer/Jplayer.fla and /dev/null differ diff --git a/airtime_mvc/public/js/jplayer/Jplayer.swf b/airtime_mvc/public/js/jplayer/Jplayer.swf index 85c0ba38e..2121715c8 100644 Binary files a/airtime_mvc/public/js/jplayer/Jplayer.swf and b/airtime_mvc/public/js/jplayer/Jplayer.swf differ diff --git a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerEvent.as b/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerEvent.as deleted file mode 100644 index addb97a7a..000000000 --- a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerEvent.as +++ /dev/null @@ -1,69 +0,0 @@ -/* - * jPlayer Plugin for jQuery JavaScript Library - * http://www.happyworm.com/jquery/jplayer - * - * Copyright (c) 2009 - 2011 Happyworm Ltd - * Dual licensed under the MIT and GPL licenses. - * - http://www.opensource.org/licenses/mit-license.php - * - http://www.gnu.org/copyleft/gpl.html - * - * Author: Mark J Panaghiston - * Date: 8th August 2011 - */ - -package happyworm.jPlayer { - import flash.events.Event; - - public class JplayerEvent extends Event { - - // The event strings must match those in the JavaScript's $.jPlayer.event object - - public static const JPLAYER_READY:String = "jPlayer_ready"; - public static const JPLAYER_FLASHRESET:String = "jPlayer_flashreset"; // Handled in JavaScript - public static const JPLAYER_RESIZE:String = "jPlayer_resize"; // Handled in JavaScript - public static const JPLAYER_REPEAT:String = "jPlayer_repeat"; // Handled in JavaScript - public static const JPLAYER_CLICK:String = "jPlayer_click"; - public static const JPLAYER_ERROR:String = "jPlayer_error"; - public static const JPLAYER_WARNING:String = "jPlayer_warning"; // Currently not used by the flash solution - - public static const JPLAYER_LOADSTART:String = "jPlayer_loadstart"; - public static const JPLAYER_PROGRESS:String = "jPlayer_progress"; - public static const JPLAYER_SUSPEND:String = "jPlayer_suspend"; // Not implemented - public static const JPLAYER_ABORT:String = "jPlayer_abort"; // Not implemented - public static const JPLAYER_EMPTIED:String = "jPlayer_emptied"; // Not implemented - public static const JPLAYER_STALLED:String = "jPlayer_stalled"; // Not implemented - public static const JPLAYER_PLAY:String = "jPlayer_play"; - public static const JPLAYER_PAUSE:String = "jPlayer_pause"; - public static const JPLAYER_LOADEDMETADATA:String = "jPlayer_loadedmetadata"; // MP3 has no equivilent - public static const JPLAYER_LOADEDDATA:String = "jPlayer_loadeddata"; // Not implemented - public static const JPLAYER_WAITING:String = "jPlayer_waiting"; // Not implemented - public static const JPLAYER_PLAYING:String = "jPlayer_playing"; // Not implemented - public static const JPLAYER_CANPLAY:String = "jPlayer_canplay"; // Not implemented - public static const JPLAYER_CANPLAYTHROUGH:String = "jPlayer_canplaythrough"; // Not implemented - public static const JPLAYER_SEEKING:String = "jPlayer_seeking"; - public static const JPLAYER_SEEKED:String = "jPlayer_seeked"; - public static const JPLAYER_TIMEUPDATE:String = "jPlayer_timeupdate"; - public static const JPLAYER_ENDED:String = "jPlayer_ended"; - public static const JPLAYER_RATECHANGE:String = "jPlayer_ratechange"; // Not implemented - public static const JPLAYER_DURATIONCHANGE:String = "jPlayer_durationchange"; // Not implemented - public static const JPLAYER_VOLUMECHANGE:String = "jPlayer_volumechange"; // See JavaScript - - // Events used internal to jPlayer's Flash. - public static const DEBUG_MSG:String = "debug_msg"; - - public var data:JplayerStatus; - public var msg:String = "" - - public function JplayerEvent(type:String, data:JplayerStatus, msg:String = "", bubbles:Boolean = false, cancelable:Boolean = false) { - super(type, bubbles, cancelable); - this.data = data; - this.msg = msg; - } - public override function clone():Event { - return new JplayerEvent(type, data, msg, bubbles, cancelable); - } - public override function toString():String { - return formatToString("JplayerEvent", "type", "bubbles", "cancelable", "eventPhase", "data", "msg"); - } - } -} \ No newline at end of file diff --git a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp3.as b/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp3.as deleted file mode 100644 index 8c51d5b76..000000000 --- a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp3.as +++ /dev/null @@ -1,328 +0,0 @@ -/* - * jPlayer Plugin for jQuery JavaScript Library - * http://www.happyworm.com/jquery/jplayer - * - * Copyright (c) 2009 - 2011 Happyworm Ltd - * Dual licensed under the MIT and GPL licenses. - * - http://www.opensource.org/licenses/mit-license.php - * - http://www.gnu.org/copyleft/gpl.html - * - * Author: Mark J Panaghiston - * Date: 1st September 2011 - */ - -package happyworm.jPlayer { - import flash.display.Sprite; - - import flash.media.Sound; - import flash.media.SoundChannel; - import flash.media.SoundLoaderContext; - import flash.media.SoundTransform; - import flash.net.URLRequest; - import flash.utils.Timer; - import flash.errors.IOError; - import flash.events.*; - - public class JplayerMp3 extends Sprite { - private var mySound:Sound = new Sound(); - private var myChannel:SoundChannel = new SoundChannel(); - private var myContext:SoundLoaderContext = new SoundLoaderContext(3000, false); - private var myTransform:SoundTransform = new SoundTransform(); - private var myRequest:URLRequest = new URLRequest(); - - private var timeUpdateTimer:Timer = new Timer(250, 0); // Matched to HTML event freq - private var progressTimer:Timer = new Timer(250, 0); // Matched to HTML event freq - private var seekingTimer:Timer = new Timer(100, 0); // Internal: How often seeking is checked to see if it is over. - - public var myStatus:JplayerStatus = new JplayerStatus(); - - public function JplayerMp3(volume:Number) { - timeUpdateTimer.addEventListener(TimerEvent.TIMER, timeUpdateHandler); - progressTimer.addEventListener(TimerEvent.TIMER, progressHandler); - seekingTimer.addEventListener(TimerEvent.TIMER, seekingHandler); - setVolume(volume); - } - public function setFile(src:String):void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "setFile: " + src)); - if(myStatus.isPlaying) { - myChannel.stop(); - progressUpdates(false); - timeUpdates(false); - } - try { - mySound.close(); - } catch (err:IOError) { - // Occurs if the file is either yet to be opened or has finished downloading. - } - mySound = null; - mySound = new Sound(); - mySound.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); - mySound.addEventListener(Event.OPEN, loadOpen); - mySound.addEventListener(Event.COMPLETE, loadComplete); - myRequest = new URLRequest(src); - myStatus.reset(); - myStatus.src = src; - myStatus.srcSet = true; - timeUpdateEvent(); - } - public function clearFile():void { - setFile(""); - myStatus.srcSet = false; - } - private function errorHandler(err:IOErrorEvent):void { - // MP3 player needs to stop progress and timeupdate events as they are started before the error occurs. - // NB: The MP4 player works differently and the error occurs before they are started. - progressUpdates(false); - timeUpdates(false); - myStatus.error(); // Resets status except the src, and it sets srcError property. - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR, myStatus)); - } - private function loadOpen(e:Event):void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "loadOpen:")); - myStatus.loading(); - if(myStatus.playOnLoad) { - myStatus.playOnLoad = false; // Capture the flag - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); // So loadstart event happens before play event occurs. - play(); - } else { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); - pause(); - } - progressUpdates(true); - } - private function loadComplete(e:Event):void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "loadComplete:")); - myStatus.loaded(); - progressUpdates(false); - progressEvent(); - } - private function soundCompleteHandler(e:Event):void { - myStatus.pausePosition = 0; - myStatus.isPlaying = false; - timeUpdates(false); - timeUpdateEvent(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED, myStatus)); - } - private function progressUpdates(active:Boolean):void { - // Using a timer rather than Flash's load progress event, because that event gave data at about 200Hz. The 10Hz timer is closer to HTML5 norm. - if(active) { - progressTimer.start(); - } else { - progressTimer.stop(); - } - } - private function progressHandler(e:TimerEvent):void { - progressEvent(); - } - private function progressEvent():void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressEvent:")); - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS, myStatus)); - } - private function timeUpdates(active:Boolean):void { - if(active) { - timeUpdateTimer.start(); - } else { - timeUpdateTimer.stop(); - } - } - private function timeUpdateHandler(e:TimerEvent):void { - timeUpdateEvent(); - } - private function timeUpdateEvent():void { - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE, myStatus)); - } - private function seeking(active:Boolean):void { - if(active) { - if(!myStatus.isSeeking) { - seekingEvent(); - seekingTimer.start(); - } - } else { - seekingTimer.stop(); - } - } - private function seekingHandler(e:TimerEvent):void { - if(myStatus.pausePosition <= getDuration()) { - seekedEvent(); - seeking(false); - if(myStatus.playOnSeek) { - myStatus.playOnSeek = false; // Capture the flag. - play(); - } - } else if(myStatus.isLoaded && (myStatus.pausePosition > getDuration())) { - // Illegal seek time - seeking(false); - seekedEvent(); - pause(0); - } - } - private function seekingEvent():void { - myStatus.isSeeking = true; - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus)); - } - private function seekedEvent():void { - myStatus.isSeeking = false; - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus)); - } - public function load():Boolean { - if(myStatus.loadRequired()) { - myStatus.startingDownload(); - mySound.load(myRequest, myContext); - return true; - } else { - return false; - } - } - public function play(time:Number = NaN):Boolean { - var wasPlaying:Boolean = myStatus.isPlaying; - - if(!isNaN(time) && myStatus.srcSet) { - if(myStatus.isPlaying) { - myChannel.stop(); - myStatus.isPlaying = false; - } - myStatus.pausePosition = time; - } - - if(myStatus.isStartingDownload) { - myStatus.playOnLoad = true; // Raise flag, captured in loadOpen() - return true; - } else if(myStatus.loadRequired()) { - myStatus.playOnLoad = true; // Raise flag, captured in loadOpen() - return load(); - } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) { - if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end. - myStatus.pausePosition = 0; - timeUpdates(false); - timeUpdateEvent(); - if(wasPlaying) { // For when playing and then get a play(huge) - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); - } - } else if(myStatus.pausePosition > getDuration()) { - myStatus.playOnSeek = true; - seeking(true); - } else { - myStatus.isPlaying = true; // Set immediately before playing. Could affects events. - myChannel = mySound.play(myStatus.pausePosition); - myChannel.soundTransform = myTransform; - myChannel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); - timeUpdates(true); - if(!wasPlaying) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus)); - } - } - return true; - } else { - return false; - } - } - public function pause(time:Number = NaN):Boolean { - myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before loadOpen() event. - myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set. - - var wasPlaying:Boolean = myStatus.isPlaying; - - // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem. - var alreadyPausedAtTime:Boolean = false; - if(!isNaN(time) && myStatus.pausePosition == time) { - alreadyPausedAtTime = true; - } - - if(myStatus.isPlaying) { - myStatus.isPlaying = false; - myChannel.stop(); - if(myChannel.position > 0) { // Required otherwise a fast play then pause causes myChannel.position to equal zero and not the correct value. ie., When it happens leave pausePosition alone. - myStatus.pausePosition = myChannel.position; - } - } - - if(!isNaN(time) && myStatus.srcSet) { - myStatus.pausePosition = time; - } - - if(wasPlaying) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); - } - - if(myStatus.isStartingDownload) { - return true; - } else if(myStatus.loadRequired()) { - if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. - return load(); - } else { - return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required. - } - } else if(myStatus.isLoading || myStatus.isLoaded) { - if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end. - myStatus.pausePosition = 0; - } else if(myStatus.pausePosition > getDuration()) { - seeking(true); - } - timeUpdates(false); - // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop. - // Neither pause() nor pause(time) will cause a timeupdate loop. - if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) { - timeUpdateEvent(); - } - return true; - } else { - return false; - } - } - public function playHead(percent:Number):Boolean { - var time:Number = percent * getDuration() / 100; - if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) { - return play(time); - } else { - return pause(time); - } - } - public function setVolume(v:Number):void { - myStatus.volume = v; - myTransform.volume = v; - myChannel.soundTransform = myTransform; - } - private function updateStatusValues():void { - myStatus.seekPercent = 100 * getLoadRatio(); - myStatus.currentTime = getCurrentTime(); - myStatus.currentPercentRelative = 100 * getCurrentRatioRel(); - myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs(); - myStatus.duration = getDuration(); - } - public function getLoadRatio():Number { - if((myStatus.isLoading || myStatus.isLoaded) && mySound.bytesTotal > 0) { - return mySound.bytesLoaded / mySound.bytesTotal; - } else { - return 0; - } - } - public function getDuration():Number { - if(mySound.length > 0) { - return mySound.length; - } else { - return 0; - } - } - public function getCurrentTime():Number { - if(myStatus.isPlaying) { - return myChannel.position; - } else { - return myStatus.pausePosition; - } - } - public function getCurrentRatioRel():Number { - if((getDuration() > 0) && (getCurrentTime() <= getDuration())) { - return getCurrentTime() / getDuration(); - } else { - return 0; - } - } - public function getCurrentRatioAbs():Number { - return getCurrentRatioRel() * getLoadRatio(); - } - } -} diff --git a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp4.as b/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp4.as deleted file mode 100644 index dcdc0655d..000000000 --- a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp4.as +++ /dev/null @@ -1,413 +0,0 @@ -/* - * jPlayer Plugin for jQuery JavaScript Library - * http://www.happyworm.com/jquery/jplayer - * - * Copyright (c) 2009 - 2011 Happyworm Ltd - * Dual licensed under the MIT and GPL licenses. - * - http://www.opensource.org/licenses/mit-license.php - * - http://www.gnu.org/copyleft/gpl.html - * - * Author: Mark J Panaghiston - * Date: 7th August 2011 - */ - -package happyworm.jPlayer { - import flash.display.Sprite; - - import flash.media.Video; - import flash.media.SoundTransform; - - import flash.net.NetConnection; - import flash.net.NetStream; - - import flash.utils.Timer; - - import flash.events.NetStatusEvent; - import flash.events.SecurityErrorEvent; - import flash.events.TimerEvent; - - public class JplayerMp4 extends Sprite { - - public var myVideo:Video = new Video(); - private var myConnection:NetConnection; - private var myStream:NetStream; - - private var myTransform:SoundTransform = new SoundTransform(); - - public var myStatus:JplayerStatus = new JplayerStatus(); - - private var timeUpdateTimer:Timer = new Timer(250, 0); // Matched to HTML event freq - private var progressTimer:Timer = new Timer(250, 0); // Matched to HTML event freq - private var seekingTimer:Timer = new Timer(100, 0); // Internal: How often seeking is checked to see if it is over. - - public function JplayerMp4(volume:Number) { - myConnection = new NetConnection(); - myConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - myConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); - myVideo.smoothing = true; - this.addChild(myVideo); - - timeUpdateTimer.addEventListener(TimerEvent.TIMER, timeUpdateHandler); - progressTimer.addEventListener(TimerEvent.TIMER, progressHandler); - seekingTimer.addEventListener(TimerEvent.TIMER, seekingHandler); - - myStatus.volume = volume; - } - private function progressUpdates(active:Boolean):void { - if(active) { - progressTimer.start(); - } else { - progressTimer.stop(); - } - } - private function progressHandler(e:TimerEvent):void { - if(myStatus.isLoading) { - if(getLoadRatio() == 1) { // Close as can get to a loadComplete event since client.onPlayStatus only works with FMS - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressHandler: loadComplete")); - myStatus.loaded(); - progressUpdates(false); - } - } - progressEvent(); - } - private function progressEvent():void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressEvent:")); - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS, myStatus)); - } - private function timeUpdates(active:Boolean):void { - if(active) { - timeUpdateTimer.start(); - } else { - timeUpdateTimer.stop(); - } - } - private function timeUpdateHandler(e:TimerEvent):void { - timeUpdateEvent(); - } - private function timeUpdateEvent():void { - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE, myStatus)); - } - private function seeking(active:Boolean):void { - if(active) { - if(!myStatus.isSeeking) { - seekingEvent(); - } - seekingTimer.start(); - } else { - if(myStatus.isSeeking) { - seekedEvent(); - } - seekingTimer.stop(); - } - } - private function seekingHandler(e:TimerEvent):void { - if(getSeekTimeRatio() <= getLoadRatio()) { - seeking(false); - if(myStatus.playOnSeek) { - myStatus.playOnSeek = false; // Capture the flag. - play(myStatus.pausePosition); // Must pass time or the seek time is never set. - } else { - pause(myStatus.pausePosition); // Must pass time or the stream.time is read. - } - } else if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { - // Illegal seek time - seeking(false); - pause(0); - } - } - private function seekingEvent():void { - myStatus.isSeeking = true; - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus)); - } - private function seekedEvent():void { - myStatus.isSeeking = false; - updateStatusValues(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus)); - } - private function netStatusHandler(e:NetStatusEvent):void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "netStatusHandler: '" + e.info.code + "'")); - switch(e.info.code) { - case "NetConnection.Connect.Success": - connectStream(); - break; - case "NetStream.Play.Start": - // This event code occurs once, when the media is opened. Equiv to loadOpen() in mp3 player. - myStatus.loading(); - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); - progressUpdates(true); - // See onMetaDataHandler() for other condition, since duration is vital. - break; - case "NetStream.Play.Stop": - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "NetStream.Play.Stop: getDuration() - getCurrentTime() = " + (getDuration() - getCurrentTime()))); - - // Check if media is at the end (or close) otherwise this was due to download bandwidth stopping playback. ie., Download is not fast enough. - if(Math.abs(getDuration() - getCurrentTime()) < 150) { // Testing found 150ms worked best for M4A files, where playHead(99.9) caused a stuck state due to firing with ~116ms left to play. - endedEvent(); - } - break; - case "NetStream.Seek.InvalidTime": - // Used for capturing invalid set times and clicks on the end of the progress bar. - endedEvent(); - break; - case "NetStream.Play.StreamNotFound": - myStatus.error(); // Resets status except the src, and it sets srcError property. - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR, myStatus)); - break; - } - // "NetStream.Seek.Notify" event code is not very useful. It occurs after every seek(t) command issued and does not appear to wait for the media to be ready. - } - private function endedEvent():void { - var wasPlaying:Boolean = myStatus.isPlaying; - pause(0); - timeUpdates(false); - timeUpdateEvent(); - if(wasPlaying) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED, myStatus)); - } - } - private function securityErrorHandler(event:SecurityErrorEvent):void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "securityErrorHandler.")); - } - private function connectStream():void { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "connectStream.")); - var customClient:Object = new Object(); - customClient.onMetaData = onMetaDataHandler; - // customClient.onPlayStatus = onPlayStatusHandler; // According to the forums and my tests, onPlayStatus only works with FMS (Flash Media Server). - myStream = null; - myStream = new NetStream(myConnection); - myStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - myStream.client = customClient; - myVideo.attachNetStream(myStream); - setVolume(myStatus.volume); - myStream.play(myStatus.src); - } - public function setFile(src:String):void { - if(myStream != null) { - myStream.close(); - } - myVideo.clear(); - progressUpdates(false); - timeUpdates(false); - - myStatus.reset(); - myStatus.src = src; - myStatus.srcSet = true; - timeUpdateEvent(); - } - public function clearFile():void { - setFile(""); - myStatus.srcSet = false; - } - public function load():Boolean { - if(myStatus.loadRequired()) { - myStatus.startingDownload(); - myConnection.connect(null); - return true; - } else { - return false; - } - } - public function play(time:Number = NaN):Boolean { - var wasPlaying:Boolean = myStatus.isPlaying; - - if(!isNaN(time) && myStatus.srcSet) { - if(myStatus.isPlaying) { - myStream.pause(); - myStatus.isPlaying = false; - } - myStatus.pausePosition = time; - } - - if(myStatus.isStartingDownload) { - myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() - return true; - } else if(myStatus.loadRequired()) { - myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() - return load(); - } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) { - if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end. - myStream.pause(); // Since it is playing by default at this point. - myStatus.pausePosition = 0; - myStream.seek(0); - timeUpdates(false); - timeUpdateEvent(); - if(wasPlaying) { // For when playing and then get a play(huge) - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); - } - } else if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount - myStatus.playOnSeek = true; - seeking(true); - myStream.pause(); // Since it is playing by default at this point. - } else { - if(!isNaN(time)) { // Avoid using seek() when it is already correct. - myStream.seek(myStatus.pausePosition/1000); // Since time is in ms and seek() takes seconds - } - myStatus.isPlaying = true; // Set immediately before playing. Could affects events. - myStream.resume(); - timeUpdates(true); - if(!wasPlaying) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus)); - } - } - return true; - } else { - return false; - } - } - public function pause(time:Number = NaN):Boolean { - myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before onMetadata() event. - myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set. - - var wasPlaying:Boolean = myStatus.isPlaying; - - // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem. - var alreadyPausedAtTime:Boolean = false; - if(!isNaN(time) && myStatus.pausePosition == time) { - alreadyPausedAtTime = true; - } - - // Need to wait for metadata to load before ever issuing a pause. The metadata handler will call this function if needed, when ready. - if(myStream != null && myStatus.metaDataReady) { // myStream is a null until the 1st media is loaded. ie., The 1st ever setMedia being followed by a pause() or pause(t). - myStream.pause(); - } - if(myStatus.isPlaying) { - myStatus.isPlaying = false; - myStatus.pausePosition = myStream.time * 1000; - } - - if(!isNaN(time) && myStatus.srcSet) { - myStatus.pausePosition = time; - } - - if(wasPlaying) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); - } - - if(myStatus.isStartingDownload) { - return true; - } else if(myStatus.loadRequired()) { - if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. - return load(); - } else { - return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required. - } - } else if(myStatus.isLoading || myStatus.isLoaded) { - if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end. - myStatus.pausePosition = 0; - myStream.seek(0); - seekedEvent(); // Deals with seeking effect when using setMedia() then pause(huge). NB: There is no preceeding seeking event. - } else if(!isNaN(time)) { - if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount - seeking(true); - } else { - if(myStatus.metaDataReady) { // Otherwise seek(0) will stop the metadata loading. - myStream.seek(myStatus.pausePosition/1000); - } - } - } - timeUpdates(false); - // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop. - // Neither pause() nor pause(time) will cause a timeupdate loop. - if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) { - timeUpdateEvent(); - } - return true; - } else { - return false; - } - } - public function playHead(percent:Number):Boolean { - var time:Number = percent * getDuration() * getLoadRatio() / 100; - if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) { - return play(time); - } else { - return pause(time); - } - } - public function setVolume(v:Number):void { - myStatus.volume = v; - myTransform.volume = v; - if(myStream != null) { - myStream.soundTransform = myTransform; - } - } - private function updateStatusValues():void { - myStatus.seekPercent = 100 * getLoadRatio(); - myStatus.currentTime = getCurrentTime(); - myStatus.currentPercentRelative = 100 * getCurrentRatioRel(); - myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs(); - myStatus.duration = getDuration(); - } - public function getLoadRatio():Number { - if((myStatus.isLoading || myStatus.isLoaded) && myStream.bytesTotal > 0) { - return myStream.bytesLoaded / myStream.bytesTotal; - } else { - return 0; - } - } - public function getDuration():Number { - return myStatus.duration; // Set from meta data. - } - public function getCurrentTime():Number { - if(myStatus.isPlaying) { - return myStream.time * 1000; - } else { - return myStatus.pausePosition; - } - } - public function getCurrentRatioRel():Number { - if((getLoadRatio() > 0) && (getCurrentRatioAbs() <= getLoadRatio())) { - return getCurrentRatioAbs() / getLoadRatio(); - } else { - return 0; - } - } - public function getCurrentRatioAbs():Number { - if(getDuration() > 0) { - return getCurrentTime() / getDuration(); - } else { - return 0; - } - } - public function getSeekTimeRatio():Number { - if(getDuration() > 0) { - return myStatus.pausePosition / getDuration(); - } else { - return 1; - } - } - public function onMetaDataHandler(info:Object):void { // Used in connectStream() in myStream.client object. - // This event occurs when jumping to the start of static files! ie., seek(0) will cause this event to occur. - if(!myStatus.metaDataReady) { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: " + info.duration + " | " + info.width + "x" + info.height)); - - myStatus.metaDataReady = true; // Set flag so that this event only effects jPlayer the 1st time. - myStatus.metaData = info; - myStatus.duration = info.duration * 1000; // Only available via Meta Data. - if(info.width != undefined) { - myVideo.width = info.width; - } - if(info.height != undefined) { - myVideo.height = info.height; - } - - if(myStatus.playOnLoad) { - myStatus.playOnLoad = false; // Capture the flag - if(myStatus.pausePosition > 0 ) { // Important for setMedia followed by play(time). - play(myStatus.pausePosition); - } else { - play(); // Not always sending pausePosition avoids the extra seek(0) for a normal play() command. - } - } else { - pause(myStatus.pausePosition); // Always send the pausePosition. Important for setMedia() followed by pause(time). Deals with not reading stream.time with setMedia() and play() immediately followed by stop() or pause(0) - } - this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADEDMETADATA, myStatus)); - } else { - this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: Already read (NO EFFECT)")); - } - } - } -} diff --git a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerStatus.as b/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerStatus.as deleted file mode 100644 index 5cc1e1ff4..000000000 --- a/airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerStatus.as +++ /dev/null @@ -1,101 +0,0 @@ -/* - * jPlayer Plugin for jQuery JavaScript Library - * http://www.happyworm.com/jquery/jplayer - * - * Copyright (c) 2009 - 2011 Happyworm Ltd - * Dual licensed under the MIT and GPL licenses. - * - http://www.opensource.org/licenses/mit-license.php - * - http://www.gnu.org/copyleft/gpl.html - * - * Author: Mark J Panaghiston - * Date: 1st September 2011 - */ - -package happyworm.jPlayer { - public class JplayerStatus { - - public static const VERSION:String = "2.1.0"; // The version of the Flash jPlayer entity. - - public var volume:Number = 0.5; // Not affected by reset() - public var muted:Boolean = false; // Not affected by reset() - - public var src:String; - public var srcError:Boolean; - - public var srcSet:Boolean; - public var isPlaying:Boolean; - public var isSeeking:Boolean; - - public var playOnLoad:Boolean; - public var playOnSeek:Boolean; - - public var isStartingDownload:Boolean; - public var isLoading:Boolean; - public var isLoaded:Boolean; - - public var pausePosition:Number; - - public var seekPercent:Number; - public var currentTime:Number; - public var currentPercentRelative:Number; - public var currentPercentAbsolute:Number; - public var duration:Number; - - public var metaDataReady:Boolean; - public var metaData:Object; - - public function JplayerStatus() { - reset(); - } - public function reset():void { - src = ""; - srcError = false; - - srcSet = false; - isPlaying = false; - isSeeking = false; - - playOnLoad = false; - playOnSeek = false; - - isStartingDownload = false; - isLoading = false; - isLoaded = false; - - pausePosition = 0; - - seekPercent = 0; - currentTime = 0; - currentPercentRelative = 0; - currentPercentAbsolute = 0; - duration = 0; - - metaDataReady = false; - metaData = {}; - } - public function error():void { - var srcSaved:String = src; - reset(); - src = srcSaved; - srcError = true; - } - public function loadRequired():Boolean { - return (srcSet && !isStartingDownload && !isLoading && !isLoaded); - } - public function startingDownload():void { - isStartingDownload = true; - isLoading = false; - isLoaded = false; - } - public function loading():void { - isStartingDownload = false; - isLoading = true; - isLoaded = false; - } - public function loaded():void { - isStartingDownload = false; - isLoading = false; - isLoaded = true; - } - } -} diff --git a/airtime_mvc/public/js/jplayer/jplayer.playlist.min.js b/airtime_mvc/public/js/jplayer/jplayer.playlist.min.js index bb8d38927..138ccfa5e 100644 --- a/airtime_mvc/public/js/jplayer/jplayer.playlist.min.js +++ b/airtime_mvc/public/js/jplayer/jplayer.playlist.min.js @@ -2,451 +2,33 @@ * Playlist Object for the jPlayer Plugin * http://www.jplayer.org * - * Copyright (c) 2009 - 2011 Happyworm Ltd + * Copyright (c) 2009 - 2013 Happyworm Ltd * Dual licensed under the MIT and GPL licenses. * - http://www.opensource.org/licenses/mit-license.php * - http://www.gnu.org/copyleft/gpl.html * * Author: Mark J Panaghiston - * Version: 2.1.0 (jPlayer 2.1.0) - * Date: 1st September 2011 + * Version: 2.3.0 + * Date: 20th April 2013 + * + * Requires: + * - jQuery 1.7.0+ + * - jPlayer 2.3.0+ */ - -/* Code verified using http://www.jshint.com/ */ -/*jshint asi:false, bitwise:false, boss:false, browser:true, curly:true, debug:false, eqeqeq:true, eqnull:false, evil:false, forin:false, immed:false, jquery:true, laxbreak:false, newcap:true, noarg:true, noempty:true, nonew:true, nomem:false, onevar:false, passfail:false, plusplus:false, regexp:false, undef:true, sub:false, strict:false, white:false */ -/*global jPlayerPlaylist: true, jQuery:false, alert:false */ - -(function($, undefined) { - - jPlayerPlaylist = function(cssSelector, playlist, options) { - var self = this; - - this.current = 0; - this.loop = false; // Flag used with the jPlayer repeat event - this.shuffled = false; - this.removing = false; // Flag is true during remove animation, disabling the remove() method until complete. - - this.cssSelector = $.extend({}, this._cssSelector, cssSelector); // Object: Containing the css selectors for jPlayer and its cssSelectorAncestor - this.options = $.extend(true, {}, this._options, options); // Object: The jPlayer constructor options for this playlist and the playlist options - - this.playlist = []; // Array of Objects: The current playlist displayed (Un-shuffled or Shuffled) - this.original = []; // Array of Objects: The original playlist - - this._initPlaylist(playlist); // Copies playlist to this.original. Then mirrors this.original to this.playlist. Creating two arrays, where the element pointers match. (Enables pointer comparison.) - - // Setup the css selectors for the extra interface items used by the playlist. - this.cssSelector.title = this.cssSelector.cssSelectorAncestor + " .jp-title"; // Note that the text is written to the decendant li node. - this.cssSelector.playlist = this.cssSelector.cssSelectorAncestor + " .jp-playlist"; - this.cssSelector.next = this.cssSelector.cssSelectorAncestor + " .jp-next"; - this.cssSelector.previous = this.cssSelector.cssSelectorAncestor + " .jp-previous"; - this.cssSelector.shuffle = this.cssSelector.cssSelectorAncestor + " .jp-shuffle"; - this.cssSelector.shuffleOff = this.cssSelector.cssSelectorAncestor + " .jp-shuffle-off"; - - // Override the cssSelectorAncestor given in options - this.options.cssSelectorAncestor = this.cssSelector.cssSelectorAncestor; - - // Override the default repeat event handler - this.options.repeat = function(event) { - self.loop = event.jPlayer.options.loop; - }; - - // Create a ready event handler to initialize the playlist - $(this.cssSelector.jPlayer).bind($.jPlayer.event.ready, function(event) { - self._init(); - }); - - // Create an ended event handler to move to the next item - $(this.cssSelector.jPlayer).bind($.jPlayer.event.ended, function(event) { - self.next(); - }); - - // Create a play event handler to pause other instances - $(this.cssSelector.jPlayer).bind($.jPlayer.event.play, function(event) { - $(this).jPlayer("pauseOthers"); - }); - - // Create a resize event handler to show the title in full screen mode. - $(this.cssSelector.jPlayer).bind($.jPlayer.event.resize, function(event) { - if(event.jPlayer.options.fullScreen) { - $(self.cssSelector.title).show(); - } else { - $(self.cssSelector.title).hide(); - } - }); - - // Create click handlers for the extra buttons that do playlist functions. - $(this.cssSelector.previous).click(function() { - self.previous(); - $(this).blur(); - return false; - }); - - $(this.cssSelector.next).click(function() { - self.next(); - $(this).blur(); - return false; - }); - - $(this.cssSelector.shuffle).click(function() { - self.shuffle(true); - return false; - }); - $(this.cssSelector.shuffleOff).click(function() { - self.shuffle(false); - return false; - }).hide(); - - // Put the title in its initial display state - if(!this.options.fullScreen) { - $(this.cssSelector.title).hide(); - } - - // Remove the empty
  • from the page HTML. Allows page to be valid HTML, while not interfereing with display animations - $(this.cssSelector.playlist + " ul").empty(); - - // Create .live() handlers for the playlist items along with the free media and remove controls. - this._createItemHandlers(); - - // Instance jPlayer - $(this.cssSelector.jPlayer).jPlayer(this.options); - }; - - jPlayerPlaylist.prototype = { - _cssSelector: { // static object, instanced in constructor - jPlayer: "#jquery_jplayer_1", - cssSelectorAncestor: "#jp_container_1" - }, - _options: { // static object, instanced in constructor - playlistOptions: { - autoPlay: false, - loopOnPrevious: false, - shuffleOnLoop: true, - enableRemoveControls: false, - displayTime: 'slow', - addTime: 'fast', - removeTime: 'fast', - shuffleTime: 'slow', - itemClass: "jp-playlist-item", - freeGroupClass: "jp-free-media", - freeItemClass: "jp-playlist-item-free", - removeItemClass: "jp-playlist-item-remove" - } - }, - option: function(option, value) { // For changing playlist options only - if(value === undefined) { - return this.options.playlistOptions[option]; - } - - this.options.playlistOptions[option] = value; - - switch(option) { - case "enableRemoveControls": - this._updateControls(); - break; - case "itemClass": - case "freeGroupClass": - case "freeItemClass": - case "removeItemClass": - this._refresh(true); // Instant - this._createItemHandlers(); - break; - } - return this; - }, - _init: function() { - var self = this; - this._refresh(function() { - if(self.options.playlistOptions.autoPlay) { - self.play(self.current); - } else { - self.select(self.current); - } - }); - }, - _initPlaylist: function(playlist) { - this.current = 0; - this.shuffled = false; - this.removing = false; - this.original = $.extend(true, [], playlist); // Copy the Array of Objects - this._originalPlaylist(); - }, - _originalPlaylist: function() { - var self = this; - this.playlist = []; - // Make both arrays point to the same object elements. Gives us 2 different arrays, each pointing to the same actual object. ie., Not copies of the object. - $.each(this.original, function(i,v) { - self.playlist[i] = self.original[i]; - }); - }, - _refresh: function(instant) { - /* instant: Can be undefined, true or a function. - * undefined -> use animation timings - * true -> no animation - * function -> use animation timings and excute function at half way point. - */ - var self = this; - - if(instant && !$.isFunction(instant)) { - $(this.cssSelector.playlist + " ul").empty(); - $.each(this.playlist, function(i,v) { - $(self.cssSelector.playlist + " ul").append(self._createListItem(self.playlist[i])); - }); - this._updateControls(); - } else { - var displayTime = $(this.cssSelector.playlist + " ul").children().length ? this.options.playlistOptions.displayTime : 0; - - $(this.cssSelector.playlist + " ul").slideUp(displayTime, function() { - var $this = $(this); - $(this).empty(); - - $.each(self.playlist, function(i,v) { - $this.append(self._createListItem(self.playlist[i])); - }); - self._updateControls(); - if($.isFunction(instant)) { - instant(); - } - if(self.playlist.length) { - $(this).slideDown(self.options.playlistOptions.displayTime); - } else { - $(this).show(); - } - }); - } - }, - _createListItem: function(media) { - var self = this; - - // Wrap the
  • contents in a
    - var listItem = "
  • "; - - // Create remove control - listItem += "×"; - - // Create links to free media - if(media.free) { - var first = true; - listItem += "("; - $.each(media, function(property,value) { - if($.jPlayer.prototype.format[property]) { // Check property is a media format. - if(first) { - first = false; - } else { - listItem += " | "; - } - listItem += "" + property + ""; - } - }); - listItem += ")"; - } - - // The title is given next in the HTML otherwise the float:right on the free media corrupts in IE6/7 - listItem += "" + media.title + (media.artist ? " " : "") + ""; - listItem += "
  • "; - - return listItem; - }, - _createItemHandlers: function() { - var self = this; - // Create .live() handlers for the playlist items - $(this.cssSelector.playlist + " a." + this.options.playlistOptions.itemClass).die("click").live("click", function() { - var index = $(this).parent().parent().index(); - if(self.current !== index) { - self.play(index); - } else { - $(self.cssSelector.jPlayer).jPlayer("play"); - } - $(this).blur(); - return false; - }); - - // Create .live() handlers that disable free media links to force access via right click - $(self.cssSelector.playlist + " a." + this.options.playlistOptions.freeItemClass).die("click").live("click", function() { - $(this).parent().parent().find("." + self.options.playlistOptions.itemClass).click(); - $(this).blur(); - return false; - }); - - // Create .live() handlers for the remove controls - $(self.cssSelector.playlist + " a." + this.options.playlistOptions.removeItemClass).die("click").live("click", function() { - var index = $(this).parent().parent().index(); - self.remove(index); - $(this).blur(); - return false; - }); - }, - _updateControls: function() { - if(this.options.playlistOptions.enableRemoveControls) { - $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).show(); - } else { - $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).hide(); - } - if(this.shuffled) { - $(this.cssSelector.shuffleOff).show(); - $(this.cssSelector.shuffle).hide(); - } else { - $(this.cssSelector.shuffleOff).hide(); - $(this.cssSelector.shuffle).show(); - } - }, - _highlight: function(index) { - if(this.playlist.length && index !== undefined) { - $(this.cssSelector.playlist + " .jp-playlist-current").removeClass("jp-playlist-current"); - $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current"); - $(this.cssSelector.title + " li").html(this.playlist[index].title + (this.playlist[index].artist ? " by " + this.playlist[index].artist + "" : "")); - } - }, - setPlaylist: function(playlist) { - this._initPlaylist(playlist); - this._init(); - }, - add: function(media, playNow) { - $(this.cssSelector.playlist + " ul").append(this._createListItem(media)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime); - this._updateControls(); - this.original.push(media); - this.playlist.push(media); // Both array elements share the same object pointer. Comforms with _initPlaylist(p) system. - - if(playNow) { - this.play(this.playlist.length - 1); - } else { - if(this.original.length === 1) { - this.select(0); - } - } - }, - remove: function(index) { - var self = this; - - if(index === undefined) { - this._initPlaylist([]); - this._refresh(function() { - $(self.cssSelector.jPlayer).jPlayer("clearMedia"); - }); - return true; - } else { - - if(this.removing) { - return false; - } else { - index = (index < 0) ? self.original.length + index : index; // Negative index relates to end of array. - if(0 <= index && index < this.playlist.length) { - this.removing = true; - - $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").slideUp(this.options.playlistOptions.removeTime, function() { - $(this).remove(); - - if(self.shuffled) { - var item = self.playlist[index]; - $.each(self.original, function(i,v) { - if(self.original[i] === item) { - self.original.splice(i, 1); - return false; // Exit $.each - } - }); - self.playlist.splice(index, 1); - } else { - self.original.splice(index, 1); - self.playlist.splice(index, 1); - } - - if(self.original.length) { - if(index === self.current) { - self.current = (index < self.original.length) ? self.current : self.original.length - 1; // To cope when last element being selected when it was removed - self.select(self.current); - } else if(index < self.current) { - self.current--; - } - } else { - $(self.cssSelector.jPlayer).jPlayer("clearMedia"); - self.current = 0; - self.shuffled = false; - self._updateControls(); - } - - self.removing = false; - }); - } - return true; - } - } - }, - select: function(index) { - index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array. - if(0 <= index && index < this.playlist.length) { - this.current = index; - this._highlight(index); - $(this.cssSelector.jPlayer).jPlayer("setMedia", this.playlist[this.current]); - } else { - this.current = 0; - } - }, - play: function(index) { - index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array. - if(0 <= index && index < this.playlist.length) { - if(this.playlist.length) { - this.select(index); - $(this.cssSelector.jPlayer).jPlayer("play"); - } - } else if(index === undefined) { - $(this.cssSelector.jPlayer).jPlayer("play"); - } - }, - pause: function() { - $(this.cssSelector.jPlayer).jPlayer("pause"); - }, - next: function() { - var index = (this.current + 1 < this.playlist.length) ? this.current + 1 : 0; - - if(this.loop) { - // See if we need to shuffle before looping to start, and only shuffle if more than 1 item. - if(index === 0 && this.shuffled && this.options.playlistOptions.shuffleOnLoop && this.playlist.length > 1) { - this.shuffle(true, true); // playNow - } else { - this.play(index); - } - } else { - // The index will be zero if it just looped round - if(index > 0) { - this.play(index); - } - } - }, - previous: function() { - var index = (this.current - 1 >= 0) ? this.current - 1 : this.playlist.length - 1; - - if(this.loop && this.options.playlistOptions.loopOnPrevious || index < this.playlist.length - 1) { - this.play(index); - } - }, - shuffle: function(shuffled, playNow) { - var self = this; - - if(shuffled === undefined) { - shuffled = !this.shuffled; - } - - if(shuffled || shuffled !== this.shuffled) { - - $(this.cssSelector.playlist + " ul").slideUp(this.options.playlistOptions.shuffleTime, function() { - self.shuffled = shuffled; - if(shuffled) { - self.playlist.sort(function() { - return 0.5 - Math.random(); - }); - } else { - self._originalPlaylist(); - } - self._refresh(true); // Instant - - if(playNow || !$(self.cssSelector.jPlayer).data("jPlayer").status.paused) { - self.play(0); - } else { - self.select(0); - } - - $(this).slideDown(self.options.playlistOptions.shuffleTime); - }); - } - } - }; -})(jQuery); \ No newline at end of file +(function(b,f){jPlayerPlaylist=function(a,c,d){var e=this;this.current=0;this.removing=this.shuffled=this.loop=!1;this.cssSelector=b.extend({},this._cssSelector,a);this.options=b.extend(!0,{keyBindings:{next:{key:39,fn:function(){e.next()}},previous:{key:37,fn:function(){e.previous()}}}},this._options,d);this.playlist=[];this.original=[];this._initPlaylist(c);this.cssSelector.title=this.cssSelector.cssSelectorAncestor+" .jp-title";this.cssSelector.playlist=this.cssSelector.cssSelectorAncestor+" .jp-playlist"; +this.cssSelector.next=this.cssSelector.cssSelectorAncestor+" .jp-next";this.cssSelector.previous=this.cssSelector.cssSelectorAncestor+" .jp-previous";this.cssSelector.shuffle=this.cssSelector.cssSelectorAncestor+" .jp-shuffle";this.cssSelector.shuffleOff=this.cssSelector.cssSelectorAncestor+" .jp-shuffle-off";this.options.cssSelectorAncestor=this.cssSelector.cssSelectorAncestor;this.options.repeat=function(a){e.loop=a.jPlayer.options.loop};b(this.cssSelector.jPlayer).bind(b.jPlayer.event.ready,function(){e._init()}); +b(this.cssSelector.jPlayer).bind(b.jPlayer.event.ended,function(){e.next()});b(this.cssSelector.jPlayer).bind(b.jPlayer.event.play,function(){b(this).jPlayer("pauseOthers")});b(this.cssSelector.jPlayer).bind(b.jPlayer.event.resize,function(a){a.jPlayer.options.fullScreen?b(e.cssSelector.title).show():b(e.cssSelector.title).hide()});b(this.cssSelector.previous).click(function(){e.previous();b(this).blur();return!1});b(this.cssSelector.next).click(function(){e.next();b(this).blur();return!1});b(this.cssSelector.shuffle).click(function(){e.shuffle(!0); +return!1});b(this.cssSelector.shuffleOff).click(function(){e.shuffle(!1);return!1}).hide();this.options.fullScreen||b(this.cssSelector.title).hide();b(this.cssSelector.playlist+" ul").empty();this._createItemHandlers();b(this.cssSelector.jPlayer).jPlayer(this.options)};jPlayerPlaylist.prototype={_cssSelector:{jPlayer:"#jquery_jplayer_1",cssSelectorAncestor:"#jp_container_1"},_options:{playlistOptions:{autoPlay:!1,loopOnPrevious:!1,shuffleOnLoop:!0,enableRemoveControls:!1,displayTime:"slow",addTime:"fast", +removeTime:"fast",shuffleTime:"slow",itemClass:"jp-playlist-item",freeGroupClass:"jp-free-media",freeItemClass:"jp-playlist-item-free",removeItemClass:"jp-playlist-item-remove"}},option:function(a,b){if(b===f)return this.options.playlistOptions[a];this.options.playlistOptions[a]=b;switch(a){case "enableRemoveControls":this._updateControls();break;case "itemClass":case "freeGroupClass":case "freeItemClass":case "removeItemClass":this._refresh(!0),this._createItemHandlers()}return this},_init:function(){var a= +this;this._refresh(function(){a.options.playlistOptions.autoPlay?a.play(a.current):a.select(a.current)})},_initPlaylist:function(a){this.current=0;this.removing=this.shuffled=!1;this.original=b.extend(!0,[],a);this._originalPlaylist()},_originalPlaylist:function(){var a=this;this.playlist=[];b.each(this.original,function(b){a.playlist[b]=a.original[b]})},_refresh:function(a){var c=this;if(a&&!b.isFunction(a))b(this.cssSelector.playlist+" ul").empty(),b.each(this.playlist,function(a){b(c.cssSelector.playlist+ +" ul").append(c._createListItem(c.playlist[a]))}),this._updateControls();else{var d=b(this.cssSelector.playlist+" ul").children().length?this.options.playlistOptions.displayTime:0;b(this.cssSelector.playlist+" ul").slideUp(d,function(){var d=b(this);b(this).empty();b.each(c.playlist,function(a){d.append(c._createListItem(c.playlist[a]))});c._updateControls();b.isFunction(a)&&a();c.playlist.length?b(this).slideDown(c.options.playlistOptions.displayTime):b(this).show()})}},_createListItem:function(a){var c= +this,d="
  • ",d=d+("×");if(a.free){var e=!0,d=d+("(");b.each(a,function(a,f){b.jPlayer.prototype.format[a]&&(e?e=!1:d+=" | ",d+=""+a+"")});d+=")"}d+=""+a.title+(a.artist? +" ":"")+"";return d+="
  • "},_createItemHandlers:function(){var a=this;b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.itemClass).on("click","a."+this.options.playlistOptions.itemClass,function(){var c=b(this).parent().parent().index();a.current!==c?a.play(c):b(a.cssSelector.jPlayer).jPlayer("play");b(this).blur();return!1});b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.freeItemClass).on("click", +"a."+this.options.playlistOptions.freeItemClass,function(){b(this).parent().parent().find("."+a.options.playlistOptions.itemClass).click();b(this).blur();return!1});b(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.removeItemClass).on("click","a."+this.options.playlistOptions.removeItemClass,function(){var c=b(this).parent().parent().index();a.remove(c);b(this).blur();return!1})},_updateControls:function(){this.options.playlistOptions.enableRemoveControls?b(this.cssSelector.playlist+ +" ."+this.options.playlistOptions.removeItemClass).show():b(this.cssSelector.playlist+" ."+this.options.playlistOptions.removeItemClass).hide();this.shuffled?(b(this.cssSelector.shuffleOff).show(),b(this.cssSelector.shuffle).hide()):(b(this.cssSelector.shuffleOff).hide(),b(this.cssSelector.shuffle).show())},_highlight:function(a){this.playlist.length&&a!==f&&(b(this.cssSelector.playlist+" .jp-playlist-current").removeClass("jp-playlist-current"),b(this.cssSelector.playlist+" li:nth-child("+(a+1)+ +")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current"),b(this.cssSelector.title+" li").html(this.playlist[a].title+(this.playlist[a].artist?" by "+this.playlist[a].artist+"":"")))},setPlaylist:function(a){this._initPlaylist(a);this._init()},add:function(a,c){b(this.cssSelector.playlist+" ul").append(this._createListItem(a)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime);this._updateControls();this.original.push(a); +this.playlist.push(a);c?this.play(this.playlist.length-1):1===this.original.length&&this.select(0)},remove:function(a){var c=this;if(a===f)return this._initPlaylist([]),this._refresh(function(){b(c.cssSelector.jPlayer).jPlayer("clearMedia")}),!0;if(this.removing)return!1;a=0>a?c.original.length+a:a;0<=a&&aa?this.original.length+a:a;0<=a&&aa?this.original.length+a:a;0<=a&&a','','','',''];c=document.createElement('');for(var e=0;e0?100*d/this.status.duration:0;typeof a.seekable==="object"&&a.seekable.length>0?(g=this.status.duration>0?100*a.seekable.end(a.seekable.length-1)/this.status.duration:100,f=100*a.currentTime/a.seekable.end(a.seekable.length-1)):(g=100,f=e);b&&(e=f=d=0);this.status.seekPercent=g;this.status.currentPercentRelative=f;this.status.currentPercentAbsolute=e;this.status.currentTime=d;this.status.readyState=a.readyState;this.status.networkState=a.networkState;this.status.playbackRate= -a.playbackRate;this.status.ended=a.ended},_resetStatus:function(){this.status=b.extend({},this.status,b.jPlayer.prototype.status)},_trigger:function(a,c,d){a=b.Event(a);a.jPlayer={};a.jPlayer.version=b.extend({},this.version);a.jPlayer.options=b.extend(!0,{},this.options);a.jPlayer.status=b.extend(!0,{},this.status);a.jPlayer.html=b.extend(!0,{},this.html);a.jPlayer.flash=b.extend(!0,{},this.flash);if(c)a.jPlayer.error=b.extend({},c);if(d)a.jPlayer.warning=b.extend({},d);this.element.trigger(a)}, -jPlayerFlashEvent:function(a,c){if(a===b.jPlayer.event.ready)if(this.internal.ready){if(this.flash.gate){if(this.status.srcSet){var d=this.status.currentTime,e=this.status.paused;this.setMedia(this.status.media);d>0&&(e?this.pause(d):this.play(d))}this._trigger(b.jPlayer.event.flashreset)}}else this.internal.ready=!0,this.internal.flash.jq.css({width:"0px",height:"0px"}),this.version.flash=c.version,this.version.needFlash!==this.version.flash&&this._error({type:b.jPlayer.error.VERSION,context:this.version.flash, -message:b.jPlayer.errorMsg.VERSION+this.version.flash,hint:b.jPlayer.errorHint.VERSION}),this._trigger(b.jPlayer.event.repeat),this._trigger(a);if(this.flash.gate)switch(a){case b.jPlayer.event.progress:this._getFlashStatus(c);this._updateInterface();this._trigger(a);break;case b.jPlayer.event.timeupdate:this._getFlashStatus(c);this._updateInterface();this._trigger(a);break;case b.jPlayer.event.play:this._seeked();this._updateButtons(!0);this._trigger(a);break;case b.jPlayer.event.pause:this._updateButtons(!1); -this._trigger(a);break;case b.jPlayer.event.ended:this._updateButtons(!1);this._trigger(a);break;case b.jPlayer.event.click:this._trigger(a);break;case b.jPlayer.event.error:this.status.waitForLoad=!0;this.status.waitForPlay=!0;this.status.video&&this.internal.flash.jq.css({width:"0px",height:"0px"});this._validString(this.status.media.poster)&&this.internal.poster.jq.show();this.css.jq.videoPlay.length&&this.status.video&&this.css.jq.videoPlay.show();this.status.video?this._flash_setVideo(this.status.media): -this._flash_setAudio(this.status.media);this._updateButtons(!1);this._error({type:b.jPlayer.error.URL,context:c.src,message:b.jPlayer.errorMsg.URL,hint:b.jPlayer.errorHint.URL});break;case b.jPlayer.event.seeking:this._seeking();this._trigger(a);break;case b.jPlayer.event.seeked:this._seeked();this._trigger(a);break;case b.jPlayer.event.ready:break;default:this._trigger(a)}return!1},_getFlashStatus:function(a){this.status.seekPercent=a.seekPercent;this.status.currentPercentRelative=a.currentPercentRelative; -this.status.currentPercentAbsolute=a.currentPercentAbsolute;this.status.currentTime=a.currentTime;this.status.duration=a.duration;this.status.readyState=4;this.status.networkState=0;this.status.playbackRate=1;this.status.ended=!1},_updateButtons:function(a){if(a!==f)this.status.paused=!a,this.css.jq.play.length&&this.css.jq.pause.length&&(a?(this.css.jq.play.hide(),this.css.jq.pause.show()):(this.css.jq.play.show(),this.css.jq.pause.hide()));this.css.jq.restoreScreen.length&&this.css.jq.fullScreen.length&& -(this.status.noFullScreen?(this.css.jq.fullScreen.hide(),this.css.jq.restoreScreen.hide()):this.options.fullScreen?(this.css.jq.fullScreen.hide(),this.css.jq.restoreScreen.show()):(this.css.jq.fullScreen.show(),this.css.jq.restoreScreen.hide()));this.css.jq.repeat.length&&this.css.jq.repeatOff.length&&(this.options.loop?(this.css.jq.repeat.hide(),this.css.jq.repeatOff.show()):(this.css.jq.repeat.show(),this.css.jq.repeatOff.hide()))},_updateInterface:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.width(this.status.seekPercent+ -"%");this.css.jq.playBar.length&&this.css.jq.playBar.width(this.status.currentPercentRelative+"%");this.css.jq.currentTime.length&&this.css.jq.currentTime.text(b.jPlayer.convertTime(this.status.currentTime));this.css.jq.duration.length&&this.css.jq.duration.text(b.jPlayer.convertTime(this.status.duration))},_seeking:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.addClass("jp-seeking-bg")},_seeked:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.removeClass("jp-seeking-bg")}, -_resetGate:function(){this.html.audio.gate=!1;this.html.video.gate=!1;this.flash.gate=!1},_resetActive:function(){this.html.active=!1;this.flash.active=!1},setMedia:function(a){var c=this,d=!1,e=this.status.media.poster!==a.poster;this._resetMedia();this._resetGate();this._resetActive();b.each(this.formats,function(e,f){var i=c.format[f].media==="video";b.each(c.solutions,function(b,e){if(c[e].support[f]&&c._validString(a[f])){var g=e==="html";i?(g?(c.html.video.gate=!0,c._html_setVideo(a),c.html.active= -!0):(c.flash.gate=!0,c._flash_setVideo(a),c.flash.active=!0),c.css.jq.videoPlay.length&&c.css.jq.videoPlay.show(),c.status.video=!0):(g?(c.html.audio.gate=!0,c._html_setAudio(a),c.html.active=!0):(c.flash.gate=!0,c._flash_setAudio(a),c.flash.active=!0),c.css.jq.videoPlay.length&&c.css.jq.videoPlay.hide(),c.status.video=!1);d=!0;return!1}});if(d)return!1});if(d){if((!this.status.nativeVideoControls||!this.html.video.gate)&&this._validString(a.poster))e?this.htmlElement.poster.src=a.poster:this.internal.poster.jq.show(); -this.status.srcSet=!0;this.status.media=b.extend({},a);this._updateButtons(!1);this._updateInterface()}else this._error({type:b.jPlayer.error.NO_SUPPORT,context:"{supplied:'"+this.options.supplied+"'}",message:b.jPlayer.errorMsg.NO_SUPPORT,hint:b.jPlayer.errorHint.NO_SUPPORT})},_resetMedia:function(){this._resetStatus();this._updateButtons(!1);this._updateInterface();this._seeked();this.internal.poster.jq.hide();clearTimeout(this.internal.htmlDlyCmdId);this.html.active?this._html_resetMedia():this.flash.active&& -this._flash_resetMedia()},clearMedia:function(){this._resetMedia();this.html.active?this._html_clearMedia():this.flash.active&&this._flash_clearMedia();this._resetGate();this._resetActive()},load:function(){this.status.srcSet?this.html.active?this._html_load():this.flash.active&&this._flash_load():this._urlNotSetError("load")},play:function(a){a=typeof a==="number"?a:NaN;this.status.srcSet?this.html.active?this._html_play(a):this.flash.active&&this._flash_play(a):this._urlNotSetError("play")},videoPlay:function(){this.play()}, -pause:function(a){a=typeof a==="number"?a:NaN;this.status.srcSet?this.html.active?this._html_pause(a):this.flash.active&&this._flash_pause(a):this._urlNotSetError("pause")},pauseOthers:function(){var a=this;b.each(this.instances,function(b,d){a.element!==d&&d.data("jPlayer").status.srcSet&&d.jPlayer("pause")})},stop:function(){this.status.srcSet?this.html.active?this._html_pause(0):this.flash.active&&this._flash_pause(0):this._urlNotSetError("stop")},playHead:function(a){a=this._limitValue(a,0,100); -this.status.srcSet?this.html.active?this._html_playHead(a):this.flash.active&&this._flash_playHead(a):this._urlNotSetError("playHead")},_muted:function(a){this.options.muted=a;this.html.used&&this._html_mute(a);this.flash.used&&this._flash_mute(a);!this.html.video.gate&&!this.html.audio.gate&&(this._updateMute(a),this._updateVolume(this.options.volume),this._trigger(b.jPlayer.event.volumechange))},mute:function(a){a=a===f?!0:!!a;this._muted(a)},unmute:function(a){a=a===f?!0:!!a;this._muted(!a)},_updateMute:function(a){if(a=== -f)a=this.options.muted;this.css.jq.mute.length&&this.css.jq.unmute.length&&(this.status.noVolume?(this.css.jq.mute.hide(),this.css.jq.unmute.hide()):a?(this.css.jq.mute.hide(),this.css.jq.unmute.show()):(this.css.jq.mute.show(),this.css.jq.unmute.hide()))},volume:function(a){a=this._limitValue(a,0,1);this.options.volume=a;this.html.used&&this._html_volume(a);this.flash.used&&this._flash_volume(a);!this.html.video.gate&&!this.html.audio.gate&&(this._updateVolume(a),this._trigger(b.jPlayer.event.volumechange))}, -volumeBar:function(a){if(this.css.jq.volumeBar.length){var b=this.css.jq.volumeBar.offset(),d=a.pageX-b.left,e=this.css.jq.volumeBar.width(),a=this.css.jq.volumeBar.height()-a.pageY+b.top,b=this.css.jq.volumeBar.height();this.options.verticalVolume?this.volume(a/b):this.volume(d/e)}this.options.muted&&this._muted(!1)},volumeBarValue:function(a){this.volumeBar(a)},_updateVolume:function(a){if(a===f)a=this.options.volume;a=this.options.muted?0:a;this.status.noVolume?(this.css.jq.volumeBar.length&&this.css.jq.volumeBar.hide(), -this.css.jq.volumeBarValue.length&&this.css.jq.volumeBarValue.hide(),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.hide()):(this.css.jq.volumeBar.length&&this.css.jq.volumeBar.show(),this.css.jq.volumeBarValue.length&&(this.css.jq.volumeBarValue.show(),this.css.jq.volumeBarValue[this.options.verticalVolume?"height":"width"](a*100+"%")),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.show())},volumeMax:function(){this.volume(1);this.options.muted&&this._muted(!1)},_cssSelectorAncestor:function(a){var c= -this;this.options.cssSelectorAncestor=a;this._removeUiClass();this.ancestorJq=a?b(a):[];a&&this.ancestorJq.length!==1&&this._warning({type:b.jPlayer.warning.CSS_SELECTOR_COUNT,context:a,message:b.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.ancestorJq.length+" found for cssSelectorAncestor.",hint:b.jPlayer.warningHint.CSS_SELECTOR_COUNT});this._addUiClass();b.each(this.options.cssSelector,function(a,b){c._cssSelector(a,b)})},_cssSelector:function(a,c){var d=this;typeof c==="string"?b.jPlayer.prototype.options.cssSelector[a]? -(this.css.jq[a]&&this.css.jq[a].length&&this.css.jq[a].unbind(".jPlayer"),this.options.cssSelector[a]=c,this.css.cs[a]=this.options.cssSelectorAncestor+" "+c,this.css.jq[a]=c?b(this.css.cs[a]):[],this.css.jq[a].length&&this.css.jq[a].bind("click.jPlayer",function(c){d[a](c);b(this).blur();return!1}),c&&this.css.jq[a].length!==1&&this._warning({type:b.jPlayer.warning.CSS_SELECTOR_COUNT,context:this.css.cs[a],message:b.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.css.jq[a].length+" found for "+a+" method.", -hint:b.jPlayer.warningHint.CSS_SELECTOR_COUNT})):this._warning({type:b.jPlayer.warning.CSS_SELECTOR_METHOD,context:a,message:b.jPlayer.warningMsg.CSS_SELECTOR_METHOD,hint:b.jPlayer.warningHint.CSS_SELECTOR_METHOD}):this._warning({type:b.jPlayer.warning.CSS_SELECTOR_STRING,context:c,message:b.jPlayer.warningMsg.CSS_SELECTOR_STRING,hint:b.jPlayer.warningHint.CSS_SELECTOR_STRING})},seekBar:function(a){if(this.css.jq.seekBar){var b=this.css.jq.seekBar.offset(),a=a.pageX-b.left,b=this.css.jq.seekBar.width(); -this.playHead(100*a/b)}},playBar:function(a){this.seekBar(a)},repeat:function(){this._loop(!0)},repeatOff:function(){this._loop(!1)},_loop:function(a){if(this.options.loop!==a)this.options.loop=a,this._updateButtons(),this._trigger(b.jPlayer.event.repeat)},currentTime:function(){},duration:function(){},gui:function(){},noSolution:function(){},option:function(a,c){var d=a;if(arguments.length===0)return b.extend(!0,{},this.options);if(typeof a==="string"){var e=a.split(".");if(c===f){for(var d=b.extend(!0, -{},this.options),g=0;g0?this._html_load():clearTimeout(this.internal.htmlDlyCmdId);this.htmlElement.media.pause();if(!isNaN(a))try{this.htmlElement.media.currentTime=a}catch(d){this.internal.htmlDlyCmdId=setTimeout(function(){b.pause(a)},100);return}a>0&&this._html_checkWaitForPlay()},_html_playHead:function(a){var b=this;this._html_load();try{if(typeof this.htmlElement.media.seekable==="object"&&this.htmlElement.media.seekable.length>0)this.htmlElement.media.currentTime= -a*this.htmlElement.media.seekable.end(this.htmlElement.media.seekable.length-1)/100;else if(this.htmlElement.media.duration>0&&!isNaN(this.htmlElement.media.duration))this.htmlElement.media.currentTime=a*this.htmlElement.media.duration/100;else throw"e";}catch(d){this.internal.htmlDlyCmdId=setTimeout(function(){b.playHead(a)},100);return}this.status.waitForLoad||this._html_checkWaitForPlay()},_html_checkWaitForPlay:function(){if(this.status.waitForPlay)this.status.waitForPlay=!1,this.css.jq.videoPlay.length&& -this.css.jq.videoPlay.hide(),this.status.video&&(this.internal.poster.jq.hide(),this.internal.video.jq.css({width:this.status.width,height:this.status.height}))},_html_volume:function(a){if(this.html.audio.available)this.htmlElement.audio.volume=a;if(this.html.video.available)this.htmlElement.video.volume=a},_html_mute:function(a){if(this.html.audio.available)this.htmlElement.audio.muted=a;if(this.html.video.available)this.htmlElement.video.muted=a},_flash_setAudio:function(a){var c=this;try{if(b.each(this.formats, -function(b,d){if(c.flash.support[d]&&a[d]){switch(d){case "m4a":case "fla":c._getMovie().fl_setAudio_m4a(a[d]);break;case "mp3":c._getMovie().fl_setAudio_mp3(a[d])}c.status.src=a[d];c.status.format[d]=!0;c.status.formatType=d;return!1}}),this.options.preload==="auto")this._flash_load(),this.status.waitForLoad=!1}catch(d){this._flashError(d)}},_flash_setVideo:function(a){var c=this;try{if(b.each(this.formats,function(b,d){if(c.flash.support[d]&&a[d]){switch(d){case "m4v":case "flv":c._getMovie().fl_setVideo_m4v(a[d])}c.status.src= -a[d];c.status.format[d]=!0;c.status.formatType=d;return!1}}),this.options.preload==="auto")this._flash_load(),this.status.waitForLoad=!1}catch(d){this._flashError(d)}},_flash_resetMedia:function(){this.internal.flash.jq.css({width:"0px",height:"0px"});this._flash_pause(NaN)},_flash_clearMedia:function(){try{this._getMovie().fl_clearMedia()}catch(a){this._flashError(a)}},_flash_load:function(){try{this._getMovie().fl_load()}catch(a){this._flashError(a)}this.status.waitForLoad=!1},_flash_play:function(a){try{this._getMovie().fl_play(a)}catch(b){this._flashError(b)}this.status.waitForLoad= -!1;this._flash_checkWaitForPlay()},_flash_pause:function(a){try{this._getMovie().fl_pause(a)}catch(b){this._flashError(b)}if(a>0)this.status.waitForLoad=!1,this._flash_checkWaitForPlay()},_flash_playHead:function(a){try{this._getMovie().fl_play_head(a)}catch(b){this._flashError(b)}this.status.waitForLoad||this._flash_checkWaitForPlay()},_flash_checkWaitForPlay:function(){if(this.status.waitForPlay)this.status.waitForPlay=!1,this.css.jq.videoPlay.length&&this.css.jq.videoPlay.hide(),this.status.video&& -(this.internal.poster.jq.hide(),this.internal.flash.jq.css({width:this.status.width,height:this.status.height}))},_flash_volume:function(a){try{this._getMovie().fl_volume(a)}catch(b){this._flashError(b)}},_flash_mute:function(a){try{this._getMovie().fl_mute(a)}catch(b){this._flashError(b)}},_getMovie:function(){return document[this.internal.flash.id]},_checkForFlash:function(a){var b=!1,d;if(window.ActiveXObject)try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+a),b=!0}catch(e){}else navigator.plugins&& -navigator.mimeTypes.length>0&&(d=navigator.plugins["Shockwave Flash"])&&navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/,"$1")>=a&&(b=!0);return b},_validString:function(a){return a&&typeof a==="string"},_limitValue:function(a,b,d){return ad?d:a},_urlNotSetError:function(a){this._error({type:b.jPlayer.error.URL_NOT_SET,context:a,message:b.jPlayer.errorMsg.URL_NOT_SET,hint:b.jPlayer.errorHint.URL_NOT_SET})},_flashError:function(a){var c;c=this.internal.ready?"FLASH_DISABLED": -"FLASH";this._error({type:b.jPlayer.error[c],context:this.internal.flash.swf,message:b.jPlayer.errorMsg[c]+a.message,hint:b.jPlayer.errorHint[c]});this.internal.flash.jq.css({width:"1px",height:"1px"})},_error:function(a){this._trigger(b.jPlayer.event.error,a);this.options.errorAlerts&&this._alert("Error!"+(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+a.context)},_warning:function(a){this._trigger(b.jPlayer.event.warning,f,a);this.options.warningAlerts&&this._alert("Warning!"+ -(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+a.context)},_alert:function(a){alert("jPlayer "+this.version.script+" : id='"+this.internal.self.id+"' : "+a)},_emulateHtmlBridge:function(){var a=this;b.each(b.jPlayer.emulateMethods.split(/\s+/g),function(b,d){a.internal.domNode[d]=function(b){a[d](b)}});b.each(b.jPlayer.event,function(c,d){var e=!0;b.each(b.jPlayer.reservedEvent.split(/\s+/g),function(a,b){if(b===c)return e=!1});e&&a.element.bind(d+".jPlayer.jPlayerHtml", -function(){a._emulateHtmlUpdate();var b=document.createEvent("Event");b.initEvent(c,!1,!0);a.internal.domNode.dispatchEvent(b)})})},_emulateHtmlUpdate:function(){var a=this;b.each(b.jPlayer.emulateStatus.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.status[d]});b.each(b.jPlayer.emulateOptions.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.options[d]})},_destroyHtmlBridge:function(){var a=this;this.element.unbind(".jPlayerHtml");b.each((b.jPlayer.emulateMethods+" "+b.jPlayer.emulateStatus+ -" "+b.jPlayer.emulateOptions).split(/\s+/g),function(b,d){delete a.internal.domNode[d]})}};b.jPlayer.error={FLASH:"e_flash",FLASH_DISABLED:"e_flash_disabled",NO_SOLUTION:"e_no_solution",NO_SUPPORT:"e_no_support",URL:"e_url",URL_NOT_SET:"e_url_not_set",VERSION:"e_version"};b.jPlayer.errorMsg={FLASH:"jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",FLASH_DISABLED:"jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ", -NO_SOLUTION:"No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.",NO_SUPPORT:"It is not possible to play any media format provided in setMedia() on this browser using your current options.",URL:"Media URL could not be loaded.",URL_NOT_SET:"Attempt to issue media playback commands, while no media url is set.",VERSION:"jPlayer "+b.jPlayer.prototype.version.script+" needs Jplayer.swf version "+b.jPlayer.prototype.version.needFlash+" but found "};b.jPlayer.errorHint= -{FLASH:"Check your swfPath option and that Jplayer.swf is there.",FLASH_DISABLED:"Check that you have not display:none; the jPlayer entity or any ancestor.",NO_SOLUTION:"Review the jPlayer options: support and supplied.",NO_SUPPORT:"Video or audio formats defined in the supplied option are missing.",URL:"Check media URL is valid.",URL_NOT_SET:"Use setMedia() to set the media URL.",VERSION:"Update jPlayer files."};b.jPlayer.warning={CSS_SELECTOR_COUNT:"e_css_selector_count",CSS_SELECTOR_METHOD:"e_css_selector_method", -CSS_SELECTOR_STRING:"e_css_selector_string",OPTION_KEY:"e_option_key"};b.jPlayer.warningMsg={CSS_SELECTOR_COUNT:"The number of css selectors found did not equal one: ",CSS_SELECTOR_METHOD:"The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",CSS_SELECTOR_STRING:"The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",OPTION_KEY:"The option requested in jPlayer('option') is undefined."};b.jPlayer.warningHint={CSS_SELECTOR_COUNT:"Check your css selector and the ancestor.", -CSS_SELECTOR_METHOD:"Check your method name.",CSS_SELECTOR_STRING:"Check your css selector is a string.",OPTION_KEY:"Check your option name."}})(jQuery); \ No newline at end of file diff --git a/airtime_mvc/public/js/jplayer/jquery.jplayer.min.js b/airtime_mvc/public/js/jplayer/jquery.jplayer.min.js index ecd3ab514..796e970e2 100644 --- a/airtime_mvc/public/js/jplayer/jquery.jplayer.min.js +++ b/airtime_mvc/public/js/jplayer/jquery.jplayer.min.js @@ -7,101 +7,108 @@ * http://opensource.org/licenses/MIT * * Author: Mark J Panaghiston - * Version: 2.4.0 - * Date: 5th June 2013 + * Version: 2.5.0 + * Date: 7th November 2013 */ - + (function(b,f){"function"===typeof define&&define.amd?define(["jquery"],f):b.jQuery?f(b.jQuery):f(b.Zepto)})(this,function(b,f){b.fn.jPlayer=function(a){var c="string"===typeof a,d=Array.prototype.slice.call(arguments,1),e=this;a=!c&&d.length?b.extend.apply(null,[!0,a].concat(d)):a;if(c&&"_"===a.charAt(0))return e;c?this.each(function(){var c=b(this).data("jPlayer"),h=c&&b.isFunction(c[a])?c[a].apply(c,d):c;if(h!==c&&h!==f)return e=h,!1}):this.each(function(){var c=b(this).data("jPlayer");c?c.option(a|| {}):b(this).data("jPlayer",new b.jPlayer(a,this))});return e};b.jPlayer=function(a,c){if(arguments.length){this.element=b(c);this.options=b.extend(!0,{},this.options,a);var d=this;this.element.bind("remove.jPlayer",function(){d.destroy()});this._init()}};"function"!==typeof b.fn.stop&&(b.fn.stop=function(){});b.jPlayer.emulateMethods="load play pause";b.jPlayer.emulateStatus="src readyState networkState currentTime duration paused ended playbackRate";b.jPlayer.emulateOptions="muted volume";b.jPlayer.reservedEvent= -"ready flashreset resize repeat error warning";b.jPlayer.event={};b.each("ready flashreset resize repeat click error warning loadstart progress suspend abort emptied stalled play pause loadedmetadata loadeddata waiting playing canplay canplaythrough seeking seeked timeupdate ended ratechange durationchange volumechange".split(" "),function(){b.jPlayer.event[this]="jPlayer_"+this});b.jPlayer.htmlEvent="loadstart abort emptied stalled loadedmetadata loadeddata canplay canplaythrough ratechange".split(" "); -b.jPlayer.pause=function(){b.each(b.jPlayer.prototype.instances,function(a,c){c.data("jPlayer").status.srcSet&&c.jPlayer("pause")})};b.jPlayer.timeFormat={showHour:!1,showMin:!0,showSec:!0,padHour:!1,padMin:!0,padSec:!0,sepHour:":",sepMin:":",sepSec:""};var l=function(){this.init()};l.prototype={init:function(){this.options={timeFormat:b.jPlayer.timeFormat}},time:function(a){var c=new Date(1E3*(a&&"number"===typeof a?a:0)),b=c.getUTCHours();a=this.options.timeFormat.showHour?c.getUTCMinutes():c.getUTCMinutes()+ -60*b;c=this.options.timeFormat.showMin?c.getUTCSeconds():c.getUTCSeconds()+60*a;b=this.options.timeFormat.padHour&&10>b?"0"+b:b;a=this.options.timeFormat.padMin&&10>a?"0"+a:a;c=this.options.timeFormat.padSec&&10>c?"0"+c:c;b=""+(this.options.timeFormat.showHour?b+this.options.timeFormat.sepHour:"");b+=this.options.timeFormat.showMin?a+this.options.timeFormat.sepMin:"";return b+=this.options.timeFormat.showSec?c+this.options.timeFormat.sepSec:""}};var m=new l;b.jPlayer.convertTime=function(a){return m.time(a)}; -b.jPlayer.uaBrowser=function(a){a=a.toLowerCase();var b=/(opera)(?:.*version)?[ \/]([\w.]+)/,d=/(msie) ([\w.]+)/,e=/(mozilla)(?:.*? rv:([\w.]+))?/;a=/(webkit)[ \/]([\w.]+)/.exec(a)||b.exec(a)||d.exec(a)||0>a.indexOf("compatible")&&e.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}};b.jPlayer.uaPlatform=function(a){var b=a.toLowerCase(),d=/(android)/,e=/(mobile)/;a=/(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/.exec(b)||[];b=/(ipad|playbook)/.exec(b)||!e.exec(b)&&d.exec(b)|| -[];a[1]&&(a[1]=a[1].replace(/\s/g,"_"));return{platform:a[1]||"",tablet:b[1]||""}};b.jPlayer.browser={};b.jPlayer.platform={};var j=b.jPlayer.uaBrowser(navigator.userAgent);j.browser&&(b.jPlayer.browser[j.browser]=!0,b.jPlayer.browser.version=j.version);j=b.jPlayer.uaPlatform(navigator.userAgent);j.platform&&(b.jPlayer.platform[j.platform]=!0,b.jPlayer.platform.mobile=!j.tablet,b.jPlayer.platform.tablet=!!j.tablet);b.jPlayer.getDocMode=function(){var a;b.jPlayer.browser.msie&&(document.documentMode? -a=document.documentMode:(a=5,document.compatMode&&"CSS1Compat"===document.compatMode&&(a=7)));return a};b.jPlayer.browser.documentMode=b.jPlayer.getDocMode();b.jPlayer.nativeFeatures={init:function(){var a=document,b=a.createElement("video"),d={w3c:"fullscreenEnabled fullscreenElement requestFullscreen exitFullscreen fullscreenchange fullscreenerror".split(" "),moz:"mozFullScreenEnabled mozFullScreenElement mozRequestFullScreen mozCancelFullScreen mozfullscreenchange mozfullscreenerror".split(" "), -webkit:" webkitCurrentFullScreenElement webkitRequestFullScreen webkitCancelFullScreen webkitfullscreenchange ".split(" "),webkitVideo:"webkitSupportsFullscreen webkitDisplayingFullscreen webkitEnterFullscreen webkitExitFullscreen ".split(" ")},e=["w3c","moz","webkit","webkitVideo"],g,h;this.fullscreen=b={support:{w3c:!!a[d.w3c[0]],moz:!!a[d.moz[0]],webkit:"function"===typeof a[d.webkit[3]],webkitVideo:"function"===typeof b[d.webkitVideo[2]]},used:{}};g=0;for(h=e.length;gb?"0"+b:b;a=this.options.timeFormat.padMin&&10>a?"0"+a:a;c=this.options.timeFormat.padSec&&10>c?"0"+c:c;b=""+(this.options.timeFormat.showHour?b+this.options.timeFormat.sepHour:"");b+=this.options.timeFormat.showMin?a+this.options.timeFormat.sepMin:"";return b+=this.options.timeFormat.showSec?c+this.options.timeFormat.sepSec:""}};var n=new m;b.jPlayer.convertTime=function(a){return n.time(a)}; +b.jPlayer.uaBrowser=function(a){a=a.toLowerCase();var c=/(opera)(?:.*version)?[ \/]([\w.]+)/,b=/(msie) ([\w.]+)/,e=/(mozilla)(?:.*? rv:([\w.]+))?/;a=/(webkit)[ \/]([\w.]+)/.exec(a)||c.exec(a)||b.exec(a)||0>a.indexOf("compatible")&&e.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}};b.jPlayer.uaPlatform=function(a){var c=a.toLowerCase(),b=/(android)/,e=/(mobile)/;a=/(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/.exec(c)||[];c=/(ipad|playbook)/.exec(c)||!e.exec(c)&&b.exec(c)|| +[];a[1]&&(a[1]=a[1].replace(/\s/g,"_"));return{platform:a[1]||"",tablet:c[1]||""}};b.jPlayer.browser={};b.jPlayer.platform={};var k=b.jPlayer.uaBrowser(navigator.userAgent);k.browser&&(b.jPlayer.browser[k.browser]=!0,b.jPlayer.browser.version=k.version);k=b.jPlayer.uaPlatform(navigator.userAgent);k.platform&&(b.jPlayer.platform[k.platform]=!0,b.jPlayer.platform.mobile=!k.tablet,b.jPlayer.platform.tablet=!!k.tablet);b.jPlayer.getDocMode=function(){var a;b.jPlayer.browser.msie&&(document.documentMode? +a=document.documentMode:(a=5,document.compatMode&&"CSS1Compat"===document.compatMode&&(a=7)));return a};b.jPlayer.browser.documentMode=b.jPlayer.getDocMode();b.jPlayer.nativeFeatures={init:function(){var a=document,c=a.createElement("video"),b={w3c:"fullscreenEnabled fullscreenElement requestFullscreen exitFullscreen fullscreenchange fullscreenerror".split(" "),moz:"mozFullScreenEnabled mozFullScreenElement mozRequestFullScreen mozCancelFullScreen mozfullscreenchange mozfullscreenerror".split(" "), +webkit:" webkitCurrentFullScreenElement webkitRequestFullScreen webkitCancelFullScreen webkitfullscreenchange ".split(" "),webkitVideo:"webkitSupportsFullscreen webkitDisplayingFullscreen webkitEnterFullscreen webkitExitFullscreen ".split(" ")},e=["w3c","moz","webkit","webkitVideo"],g,h;this.fullscreen=c={support:{w3c:!!a[b.w3c[0]],moz:!!a[b.moz[0]],webkit:"function"===typeof a[b.webkit[3]],webkitVideo:"function"===typeof c[b.webkitVideo[2]]},used:{}};g=0;for(h=e.length;g','','','',''];c=document.createElement(''); -for(var e=0;e").join(">").split('"').join(""")},_qualifyURL:function(a){var c=document.createElement("div");c.innerHTML='x';return c.firstChild.href},_absoluteMediaUrls:function(a){var c=this;b.each(a,function(b,e){c.format[b]&& +(a[b]=c._qualifyURL(e))});return a},setMedia:function(a){var c=this,d=!1,e=this.status.media.poster!==a.poster;this._resetMedia();this._resetGate();this._resetActive();a=this._absoluteMediaUrls(a);b.each(this.formats,function(e,f){var k="video"===c.format[f].media;b.each(c.solutions,function(b,e){if(c[e].support[f]&&c._validString(a[f])){var g="html"===e;k?(g?(c.html.video.gate=!0,c._html_setVideo(a),c.html.active=!0):(c.flash.gate=!0,c._flash_setVideo(a),c.flash.active=!0),c.css.jq.videoPlay.length&& +c.css.jq.videoPlay.show(),c.status.video=!0):(g?(c.html.audio.gate=!0,c._html_setAudio(a),c.html.active=!0):(c.flash.gate=!0,c._flash_setAudio(a),c.flash.active=!0),c.css.jq.videoPlay.length&&c.css.jq.videoPlay.hide(),c.status.video=!1);d=!0;return!1}});if(d)return!1});d?(this.status.nativeVideoControls&&this.html.video.gate||!this._validString(a.poster)||(e?this.htmlElement.poster.src=a.poster:this.internal.poster.jq.show()),this.status.srcSet=!0,this.status.media=b.extend({},a),this._updateButtons(!1), +this._updateInterface()):this._error({type:b.jPlayer.error.NO_SUPPORT,context:"{supplied:'"+this.options.supplied+"'}",message:b.jPlayer.errorMsg.NO_SUPPORT,hint:b.jPlayer.errorHint.NO_SUPPORT})},_resetMedia:function(){this._resetStatus();this._updateButtons(!1);this._updateInterface();this._seeked();this.internal.poster.jq.hide();clearTimeout(this.internal.htmlDlyCmdId);this.html.active?this._html_resetMedia():this.flash.active&&this._flash_resetMedia()},clearMedia:function(){this._resetMedia(); +this.html.active?this._html_clearMedia():this.flash.active&&this._flash_clearMedia();this._resetGate();this._resetActive()},load:function(){this.status.srcSet?this.html.active?this._html_load():this.flash.active&&this._flash_load():this._urlNotSetError("load")},focus:function(){this.options.keyEnabled&&(b.jPlayer.focus=this)},play:function(a){a="number"===typeof a?a:NaN;this.status.srcSet?(this.focus(),this.html.active?this._html_play(a):this.flash.active&&this._flash_play(a)):this._urlNotSetError("play")}, +videoPlay:function(){this.play()},pause:function(a){a="number"===typeof a?a:NaN;this.status.srcSet?this.html.active?this._html_pause(a):this.flash.active&&this._flash_pause(a):this._urlNotSetError("pause")},tellOthers:function(a,c){var d=this,e="function"===typeof c,g=Array.prototype.slice.call(arguments);"string"===typeof a&&(e&&g.splice(1,1),b.each(this.instances,function(){d.element!==this&&(e&&!c.call(this.data("jPlayer"),d)||this.jPlayer.apply(this,g))}))},pauseOthers:function(a){this.tellOthers("pause", +function(){return this.status.srcSet},a)},stop:function(){this.status.srcSet?this.html.active?this._html_pause(0):this.flash.active&&this._flash_pause(0):this._urlNotSetError("stop")},playHead:function(a){a=this._limitValue(a,0,100);this.status.srcSet?this.html.active?this._html_playHead(a):this.flash.active&&this._flash_playHead(a):this._urlNotSetError("playHead")},_muted:function(a){this.mutedWorker(a);this.options.globalVolume&&this.tellOthers("mutedWorker",function(){return this.options.globalVolume}, +a)},mutedWorker:function(a){this.options.muted=a;this.html.used&&this._html_setProperty("muted",a);this.flash.used&&this._flash_mute(a);this.html.video.gate||this.html.audio.gate||(this._updateMute(a),this._updateVolume(this.options.volume),this._trigger(b.jPlayer.event.volumechange))},mute:function(a){a=a===f?!0:!!a;this._muted(a)},unmute:function(a){a=a===f?!0:!!a;this._muted(!a)},_updateMute:function(a){a===f&&(a=this.options.muted);this.css.jq.mute.length&&this.css.jq.unmute.length&&(this.status.noVolume? +(this.css.jq.mute.hide(),this.css.jq.unmute.hide()):a?(this.css.jq.mute.hide(),this.css.jq.unmute.show()):(this.css.jq.mute.show(),this.css.jq.unmute.hide()))},volume:function(a){this.volumeWorker(a);this.options.globalVolume&&this.tellOthers("volumeWorker",function(){return this.options.globalVolume},a)},volumeWorker:function(a){a=this._limitValue(a,0,1);this.options.volume=a;this.html.used&&this._html_setProperty("volume",a);this.flash.used&&this._flash_volume(a);this.html.video.gate||this.html.audio.gate|| +(this._updateVolume(a),this._trigger(b.jPlayer.event.volumechange))},volumeBar:function(a){if(this.css.jq.volumeBar.length){var c=b(a.currentTarget),d=c.offset(),e=a.pageX-d.left,g=c.width();a=c.height()-a.pageY+d.top;c=c.height();this.options.verticalVolume?this.volume(a/c):this.volume(e/g)}this.options.muted&&this._muted(!1)},volumeBarValue:function(){},_updateVolume:function(a){a===f&&(a=this.options.volume);a=this.options.muted?0:a;this.status.noVolume?(this.css.jq.volumeBar.length&&this.css.jq.volumeBar.hide(), +this.css.jq.volumeBarValue.length&&this.css.jq.volumeBarValue.hide(),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.hide()):(this.css.jq.volumeBar.length&&this.css.jq.volumeBar.show(),this.css.jq.volumeBarValue.length&&(this.css.jq.volumeBarValue.show(),this.css.jq.volumeBarValue[this.options.verticalVolume?"height":"width"](100*a+"%")),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.show())},volumeMax:function(){this.volume(1);this.options.muted&&this._muted(!1)},_cssSelectorAncestor:function(a){var c= +this;this.options.cssSelectorAncestor=a;this._removeUiClass();this.ancestorJq=a?b(a):[];a&&1!==this.ancestorJq.length&&this._warning({type:b.jPlayer.warning.CSS_SELECTOR_COUNT,context:a,message:b.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.ancestorJq.length+" found for cssSelectorAncestor.",hint:b.jPlayer.warningHint.CSS_SELECTOR_COUNT});this._addUiClass();b.each(this.options.cssSelector,function(a,b){c._cssSelector(a,b)});this._updateInterface();this._updateButtons();this._updateAutohide();this._updateVolume(); +this._updateMute()},_cssSelector:function(a,c){var d=this;"string"===typeof c?b.jPlayer.prototype.options.cssSelector[a]?(this.css.jq[a]&&this.css.jq[a].length&&this.css.jq[a].unbind(".jPlayer"),this.options.cssSelector[a]=c,this.css.cs[a]=this.options.cssSelectorAncestor+" "+c,this.css.jq[a]=c?b(this.css.cs[a]):[],this.css.jq[a].length&&this.css.jq[a].bind("click.jPlayer",function(c){c.preventDefault();d[a](c);b(this).blur()}),c&&1!==this.css.jq[a].length&&this._warning({type:b.jPlayer.warning.CSS_SELECTOR_COUNT, +context:this.css.cs[a],message:b.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.css.jq[a].length+" found for "+a+" method.",hint:b.jPlayer.warningHint.CSS_SELECTOR_COUNT})):this._warning({type:b.jPlayer.warning.CSS_SELECTOR_METHOD,context:a,message:b.jPlayer.warningMsg.CSS_SELECTOR_METHOD,hint:b.jPlayer.warningHint.CSS_SELECTOR_METHOD}):this._warning({type:b.jPlayer.warning.CSS_SELECTOR_STRING,context:c,message:b.jPlayer.warningMsg.CSS_SELECTOR_STRING,hint:b.jPlayer.warningHint.CSS_SELECTOR_STRING})}, +seekBar:function(a){if(this.css.jq.seekBar.length){var c=b(a.currentTarget),d=c.offset();a=a.pageX-d.left;c=c.width();this.playHead(100*a/c)}},playBar:function(){},playbackRate:function(a){this._setOption("playbackRate",a)},playbackRateBar:function(a){if(this.css.jq.playbackRateBar.length){var c=b(a.currentTarget),d=c.offset(),e=a.pageX-d.left,g=c.width();a=c.height()-a.pageY+d.top;c=c.height();this.playbackRate((this.options.verticalPlaybackRate?a/c:e/g)*(this.options.maxPlaybackRate-this.options.minPlaybackRate)+ +this.options.minPlaybackRate)}},playbackRateBarValue:function(){},_updatePlaybackRate:function(){var a=(this.options.playbackRate-this.options.minPlaybackRate)/(this.options.maxPlaybackRate-this.options.minPlaybackRate);this.status.playbackRateEnabled?(this.css.jq.playbackRateBar.length&&this.css.jq.playbackRateBar.show(),this.css.jq.playbackRateBarValue.length&&(this.css.jq.playbackRateBarValue.show(),this.css.jq.playbackRateBarValue[this.options.verticalPlaybackRate?"height":"width"](100*a+"%"))): +(this.css.jq.playbackRateBar.length&&this.css.jq.playbackRateBar.hide(),this.css.jq.playbackRateBarValue.length&&this.css.jq.playbackRateBarValue.hide())},repeat:function(){this._loop(!0)},repeatOff:function(){this._loop(!1)},_loop:function(a){this.options.loop!==a&&(this.options.loop=a,this._updateButtons(),this._trigger(b.jPlayer.event.repeat))},currentTime:function(){},duration:function(){},gui:function(){},noSolution:function(){},option:function(a,c){var d=a;if(0===arguments.length)return b.extend(!0, +{},this.options);if("string"===typeof a){var e=a.split(".");if(c===f){for(var d=b.extend(!0,{},this.options),g=0;g=a&&(b=!0);return b},_validString:function(a){return a&&"string"===typeof a},_limitValue:function(a,b,d){return ad?d:a},_urlNotSetError:function(a){this._error({type:b.jPlayer.error.URL_NOT_SET,context:a,message:b.jPlayer.errorMsg.URL_NOT_SET,hint:b.jPlayer.errorHint.URL_NOT_SET})},_flashError:function(a){var c;c=this.internal.ready?"FLASH_DISABLED":"FLASH";this._error({type:b.jPlayer.error[c],context:this.internal.flash.swf, -message:b.jPlayer.errorMsg[c]+a.message,hint:b.jPlayer.errorHint[c]});this.internal.flash.jq.css({width:"1px",height:"1px"})},_error:function(a){this._trigger(b.jPlayer.event.error,a);this.options.errorAlerts&&this._alert("Error!"+(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+a.context)},_warning:function(a){this._trigger(b.jPlayer.event.warning,f,a);this.options.warningAlerts&&this._alert("Warning!"+(a.message?"\n\n"+a.message:"")+(a.hint?"\n\n"+a.hint:"")+"\n\nContext: "+ -a.context)},_alert:function(a){alert("jPlayer "+this.version.script+" : id='"+this.internal.self.id+"' : "+a)},_emulateHtmlBridge:function(){var a=this;b.each(b.jPlayer.emulateMethods.split(/\s+/g),function(b,d){a.internal.domNode[d]=function(b){a[d](b)}});b.each(b.jPlayer.event,function(c,d){var e=!0;b.each(b.jPlayer.reservedEvent.split(/\s+/g),function(a,b){if(b===c)return e=!1});e&&a.element.bind(d+".jPlayer.jPlayerHtml",function(){a._emulateHtmlUpdate();var b=document.createEvent("Event");b.initEvent(c, -!1,!0);a.internal.domNode.dispatchEvent(b)})})},_emulateHtmlUpdate:function(){var a=this;b.each(b.jPlayer.emulateStatus.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.status[d]});b.each(b.jPlayer.emulateOptions.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.options[d]})},_destroyHtmlBridge:function(){var a=this;this.element.unbind(".jPlayerHtml");b.each((b.jPlayer.emulateMethods+" "+b.jPlayer.emulateStatus+" "+b.jPlayer.emulateOptions).split(/\s+/g),function(b,d){delete a.internal.domNode[d]})}}; -b.jPlayer.error={FLASH:"e_flash",FLASH_DISABLED:"e_flash_disabled",NO_SOLUTION:"e_no_solution",NO_SUPPORT:"e_no_support",URL:"e_url",URL_NOT_SET:"e_url_not_set",VERSION:"e_version"};b.jPlayer.errorMsg={FLASH:"jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",FLASH_DISABLED:"jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ",NO_SOLUTION:"No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.", -NO_SUPPORT:"It is not possible to play any media format provided in setMedia() on this browser using your current options.",URL:"Media URL could not be loaded.",URL_NOT_SET:"Attempt to issue media playback commands, while no media url is set.",VERSION:"jPlayer "+b.jPlayer.prototype.version.script+" needs Jplayer.swf version "+b.jPlayer.prototype.version.needFlash+" but found "};b.jPlayer.errorHint={FLASH:"Check your swfPath option and that Jplayer.swf is there.",FLASH_DISABLED:"Check that you have not display:none; the jPlayer entity or any ancestor.", -NO_SOLUTION:"Review the jPlayer options: support and supplied.",NO_SUPPORT:"Video or audio formats defined in the supplied option are missing.",URL:"Check media URL is valid.",URL_NOT_SET:"Use setMedia() to set the media URL.",VERSION:"Update jPlayer files."};b.jPlayer.warning={CSS_SELECTOR_COUNT:"e_css_selector_count",CSS_SELECTOR_METHOD:"e_css_selector_method",CSS_SELECTOR_STRING:"e_css_selector_string",OPTION_KEY:"e_option_key"};b.jPlayer.warningMsg={CSS_SELECTOR_COUNT:"The number of css selectors found did not equal one: ", -CSS_SELECTOR_METHOD:"The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",CSS_SELECTOR_STRING:"The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",OPTION_KEY:"The option requested in jPlayer('option') is undefined."};b.jPlayer.warningHint={CSS_SELECTOR_COUNT:"Check your css selector and the ancestor.",CSS_SELECTOR_METHOD:"Check your method name.",CSS_SELECTOR_STRING:"Check your css selector is a string.",OPTION_KEY:"Check your option name."}}); \ No newline at end of file +this._html_checkWaitForPlay()},_html_checkWaitForPlay:function(){this.status.waitForPlay&&(this.status.waitForPlay=!1,this.css.jq.videoPlay.length&&this.css.jq.videoPlay.hide(),this.status.video&&(this.internal.poster.jq.hide(),this.internal.video.jq.css({width:this.status.width,height:this.status.height})))},_html_setProperty:function(a,b){this.html.audio.available&&(this.htmlElement.audio[a]=b);this.html.video.available&&(this.htmlElement.video[a]=b)},_flash_setAudio:function(a){var c=this;try{b.each(this.formats, +function(b,d){if(c.flash.support[d]&&a[d]){switch(d){case "m4a":case "fla":c._getMovie().fl_setAudio_m4a(a[d]);break;case "mp3":c._getMovie().fl_setAudio_mp3(a[d]);break;case "rtmpa":c._getMovie().fl_setAudio_rtmp(a[d])}c.status.src=a[d];c.status.format[d]=!0;c.status.formatType=d;return!1}}),"auto"===this.options.preload&&(this._flash_load(),this.status.waitForLoad=!1)}catch(d){this._flashError(d)}},_flash_setVideo:function(a){var c=this;try{b.each(this.formats,function(b,d){if(c.flash.support[d]&& +a[d]){switch(d){case "m4v":case "flv":c._getMovie().fl_setVideo_m4v(a[d]);break;case "rtmpv":c._getMovie().fl_setVideo_rtmp(a[d])}c.status.src=a[d];c.status.format[d]=!0;c.status.formatType=d;return!1}}),"auto"===this.options.preload&&(this._flash_load(),this.status.waitForLoad=!1)}catch(d){this._flashError(d)}},_flash_resetMedia:function(){this.internal.flash.jq.css({width:"0px",height:"0px"});this._flash_pause(NaN)},_flash_clearMedia:function(){try{this._getMovie().fl_clearMedia()}catch(a){this._flashError(a)}}, +_flash_load:function(){try{this._getMovie().fl_load()}catch(a){this._flashError(a)}this.status.waitForLoad=!1},_flash_play:function(a){try{this._getMovie().fl_play(a)}catch(b){this._flashError(b)}this.status.waitForLoad=!1;this._flash_checkWaitForPlay()},_flash_pause:function(a){try{this._getMovie().fl_pause(a)}catch(b){this._flashError(b)}0= +a&&(b=!0);return b},_validString:function(a){return a&&"string"===typeof a},_limitValue:function(a,b,d){return ad?d:a},_urlNotSetError:function(a){this._error({type:b.jPlayer.error.URL_NOT_SET,context:a,message:b.jPlayer.errorMsg.URL_NOT_SET,hint:b.jPlayer.errorHint.URL_NOT_SET})},_flashError:function(a){var c;c=this.internal.ready?"FLASH_DISABLED":"FLASH";this._error({type:b.jPlayer.error[c],context:this.internal.flash.swf,message:b.jPlayer.errorMsg[c]+a.message,hint:b.jPlayer.errorHint[c]}); +this.internal.flash.jq.css({width:"1px",height:"1px"})},_error:function(a){this._trigger(b.jPlayer.event.error,a);this.options.errorAlerts&&this._alert("Error!"+(a.message?"\n"+a.message:"")+(a.hint?"\n"+a.hint:"")+"\nContext: "+a.context)},_warning:function(a){this._trigger(b.jPlayer.event.warning,f,a);this.options.warningAlerts&&this._alert("Warning!"+(a.message?"\n"+a.message:"")+(a.hint?"\n"+a.hint:"")+"\nContext: "+a.context)},_alert:function(a){a="jPlayer "+this.version.script+" : id='"+this.internal.self.id+ +"' : "+a;this.options.consoleAlerts?console&&console.log&&console.log(a):alert(a)},_emulateHtmlBridge:function(){var a=this;b.each(b.jPlayer.emulateMethods.split(/\s+/g),function(b,d){a.internal.domNode[d]=function(b){a[d](b)}});b.each(b.jPlayer.event,function(c,d){var e=!0;b.each(b.jPlayer.reservedEvent.split(/\s+/g),function(a,b){if(b===c)return e=!1});e&&a.element.bind(d+".jPlayer.jPlayerHtml",function(){a._emulateHtmlUpdate();var b=document.createEvent("Event");b.initEvent(c,!1,!0);a.internal.domNode.dispatchEvent(b)})})}, +_emulateHtmlUpdate:function(){var a=this;b.each(b.jPlayer.emulateStatus.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.status[d]});b.each(b.jPlayer.emulateOptions.split(/\s+/g),function(b,d){a.internal.domNode[d]=a.options[d]})},_destroyHtmlBridge:function(){var a=this;this.element.unbind(".jPlayerHtml");b.each((b.jPlayer.emulateMethods+" "+b.jPlayer.emulateStatus+" "+b.jPlayer.emulateOptions).split(/\s+/g),function(b,d){delete a.internal.domNode[d]})}};b.jPlayer.error={FLASH:"e_flash",FLASH_DISABLED:"e_flash_disabled", +NO_SOLUTION:"e_no_solution",NO_SUPPORT:"e_no_support",URL:"e_url",URL_NOT_SET:"e_url_not_set",VERSION:"e_version"};b.jPlayer.errorMsg={FLASH:"jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",FLASH_DISABLED:"jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ",NO_SOLUTION:"No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.",NO_SUPPORT:"It is not possible to play any media format provided in setMedia() on this browser using your current options.", +URL:"Media URL could not be loaded.",URL_NOT_SET:"Attempt to issue media playback commands, while no media url is set.",VERSION:"jPlayer "+b.jPlayer.prototype.version.script+" needs Jplayer.swf version "+b.jPlayer.prototype.version.needFlash+" but found "};b.jPlayer.errorHint={FLASH:"Check your swfPath option and that Jplayer.swf is there.",FLASH_DISABLED:"Check that you have not display:none; the jPlayer entity or any ancestor.",NO_SOLUTION:"Review the jPlayer options: support and supplied.",NO_SUPPORT:"Video or audio formats defined in the supplied option are missing.", +URL:"Check media URL is valid.",URL_NOT_SET:"Use setMedia() to set the media URL.",VERSION:"Update jPlayer files."};b.jPlayer.warning={CSS_SELECTOR_COUNT:"e_css_selector_count",CSS_SELECTOR_METHOD:"e_css_selector_method",CSS_SELECTOR_STRING:"e_css_selector_string",OPTION_KEY:"e_option_key"};b.jPlayer.warningMsg={CSS_SELECTOR_COUNT:"The number of css selectors found did not equal one: ",CSS_SELECTOR_METHOD:"The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",CSS_SELECTOR_STRING:"The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.", +OPTION_KEY:"The option requested in jPlayer('option') is undefined."};b.jPlayer.warningHint={CSS_SELECTOR_COUNT:"Check your css selector and the ancestor.",CSS_SELECTOR_METHOD:"Check your method name.",CSS_SELECTOR_STRING:"Check your css selector is a string.",OPTION_KEY:"Check your option name."}}); \ No newline at end of file