From 424de61a11e3972de36fa7b2ec62947c3933d524 Mon Sep 17 00:00:00 2001 From: Naomi Date: Mon, 16 Dec 2013 17:14:00 -0500 Subject: [PATCH] CC-5619 : Browser caching can produce unexpected behaviour in the 'Listen Now' window. upgrading to jPlayer 2.5.0 --- .../controllers/DashboardController.php | 2 +- .../application/layouts/scripts/bare.phtml | 2 +- .../layouts/scripts/livestream.phtml | 17 + airtime_mvc/public/js/jplayer/Jplayer.as | 415 ---------------- airtime_mvc/public/js/jplayer/Jplayer.fla | Bin 61952 -> 0 bytes airtime_mvc/public/js/jplayer/Jplayer.swf | Bin 14085 -> 14148 bytes .../jplayer/happyworm/jPlayer/JplayerEvent.as | 69 --- .../jplayer/happyworm/jPlayer/JplayerMp3.as | 328 ------------ .../jplayer/happyworm/jPlayer/JplayerMp4.as | 413 ---------------- .../happyworm/jPlayer/JplayerStatus.as | 101 ---- .../public/js/jplayer/jplayer.playlist.min.js | 466 +----------------- .../js/jplayer/jquery.jplayer.min.221.js | 97 ---- .../public/js/jplayer/jquery.jplayer.min.js | 175 +++---- 13 files changed, 134 insertions(+), 1951 deletions(-) create mode 100644 airtime_mvc/application/layouts/scripts/livestream.phtml delete mode 100644 airtime_mvc/public/js/jplayer/Jplayer.as delete mode 100644 airtime_mvc/public/js/jplayer/Jplayer.fla delete mode 100644 airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerEvent.as delete mode 100644 airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp3.as delete mode 100644 airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerMp4.as delete mode 100644 airtime_mvc/public/js/jplayer/happyworm/jPlayer/JplayerStatus.as delete mode 100644 airtime_mvc/public/js/jplayer/jquery.jplayer.min.221.js 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 61ae40d3ac2811ebcfd63b1ff3bb590f67984445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61952 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�DN>v0;j*NSUn@AEC$So)`x?s<|%m5n{;d9tze zPb=N?B#kN?d(QJ@W9gq(y5~t6RW|mV=gG#>Kdp4nlQgPq>^aYqjirBD>1*Z5riuT# Lr)S@~#Q*$1&)N_z diff --git a/airtime_mvc/public/js/jplayer/Jplayer.swf b/airtime_mvc/public/js/jplayer/Jplayer.swf index 85c0ba38eede8cabc9b85603c2239082a548f549..2121715c8fa1314942889291905cd6da37c7c2ca 100644 GIT binary patch literal 14148 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 literal 14085 zcma)?Lv$q!(57SCPRHulPRHpOH@0mX9ox2Tvt!%Vjn%R5d^2a(|M^!{b!t;@t)7CI zhAJYu6BwB1W~(2(uiDBJsQaZilV27i3@u^jml!$EA6i#dYz|R~$b`Q?>*NPb*^(m_ z*qqEU3bG@L;G*_}BPzf>l$~&2TI*^RMB$klTWjs~y4KaJYil1sc^|vknYaUc{a;UG z;V!p=9)d49E^~sXeZMs5H|w!V_thov=Tbt8X=tOIcQeW}i-<@aP&JmBYo6<_qTFfd z17{dwDU$`Un=R@!8;fj5a+)-IOrBZCh&{Hi?oBL6eXf2!W~6Ga{MUOblO{Ove2czy2HL z_;VLqdKUHZQJg;nJj?!hQY%vWr{`>xh=HX#4}r9JTz>Agv`JF#gr(*8##B)dps>Ss z*`}gaPU zYI8qB!*{rZ#a0bl!I_W2nNU18E1n~dXv8WOD4dG83H*>^zPdV-qi)$%NWhD6a~tV; zI^Wi-w(jCjPD-@*1MZqya2PGwbg465XBNB6rcl$HK5ZwixIA>Juh4XRKYF(-D{?;1 zLYcMALU~WP#+}LKY;KT50cnt6mMJlM3xf^QI#+TT>?TrWjft6Ze^z;LkyqXzNo?6& z7q;!jeOms+i%?%(W~Q7@95xsG-YqF!pzXk5;7k51eN>f~uo`KH14U7|&%460R~h6v zxPu=X#s{$gohTw;V4)YQe>7?(8`ec=(z0diWuK>2_7#I5rGr^$YUbc$QPWy&5l4d? zUmT)L#!b&qLvaEl33NZp+JXhzAd3bZ$%6rK^su2_#WNMhR;ATaO|HId*pj(h2 z>U2yja`rY9>8IjYRhQAFIuP23agJ4+dZ6T)YoG-tSyH~5^`Hb&hs{DIc9c(2hL=g+ z6|c5o?8FltLeu6csMVvQaSTZ$%&#tE{}T5kx!> z6N|g5U}Zl01}gInVk74lYn_m*y#sBcE9VL`YgBO(54pUcDKpS$;x=-OZ=mSU@I6N1 zJTHqTpD3k80(Q`BNhD7LG#xa!V8u;LSdPlK+9cw_8`tap59qs>KV1(M4L?>_Fp;Um zB;Y%FA=$Mo7Ymot#`nvVIJ2GS5|PpT(IJupK~#j77t<%Zg!PKVRUjQR?=&!h~!YLB76H3PbfDE zT@mVV(xP8C-pu0{n(C9xy7^Sg_EinzKe9* zGuWBZZUK~lVB@`8%9e0cxw-IS%F5RBPlTmQt}Ct!y5IIHEXC4#2n)$2K`1RQi#kY! z3KdRgrAj`1%ZFx-;^jSS=N&&0M?zd(gSC2zEK*{rE2y~kxSI&7BK;`E;@ri$^;BTW z-P&jF8&Z4d*EMHj&*7QSy&0xSW{YLWGNUCH`-=BD|V9c8d1?#JdENe1?2=O zeM-5kcw)g@85WEXCCS93*vf1kh9Sc0b$y0kwa7G~X}qcsgl)^-iio_BVLFCwV;At@z2Xi!2~ z-Gh06?p_pgaN>+QodJ+eIVRMiEJxw_0F^*(Ql1#OMMguz}$A)1qmKqkIUtE-lY zJiy(y0`Z?gg&@C&2{4I@_qqU?$;C%MjL*~ye=@;LT~B>uSt(TuusPt=`BA6c(Nfju zY-DBv?AV?O-<;4)6r^i;F3SsD&0A&&U*n8b*O#3Vq)%Vmb{~SAXko6XDOM>H#5*fv zI+ASRW~zJPX4Dq27jHMEBpLe32I>G-COWG##}FuHh!KW6Qv)KL(#=TXDuZ!|<6NwssSpR9dj_%ondmg*MiS zShUMVvFk4p$93-W4sZqTZ#DV_Orp0KtZ|+oNnMzY zvzICk(7H^jx{%ZfoVObFkt+~f#i17?66kI+n!Pfan(F86u5D*Wc%p6k1H$%xHL$JK ztvG#;hJ;2fz(WadRYlHpi0b_i^&XQkV4pbN)`&&$np5@xYqX)QBLR3*-r9Pk&a%`q zVGFD#{o75@Yd6Xh>Ao4x)F_nSq=Bu%73V9yrVmyPN8k47av@<6K=*{BS(vryviT7= zT#+ML<%q}NO(WzHj_b>((1+>8h^m%X3UHIJ<%|W$77oi+;cyH_2Zi1yVOk6JMn>?{ z)L1ZV(5GXSJSy8Vl$4V*xGIj2ByLo+iQMJHb&%|dAEf^MotU3f>+b#+`#L80g+QL^ zoewkDZXx08xQbmnJB^p`Fep#jg5|&#(aqJJq9BTI^C$@W>A3#TQYkbx4$v!~r9n7y z3ZD5KWZ(k$b3~x01|4RrE}FL!baqBx`~#XO?Di1p5t^?U{O2`wm{@G2B=RPn+i;1e z4bJAJ7%_msN3uPKv)XwzGe~QXA>U2cM(bf=(|G~V^@W1LL}skayiUNf%VR`&bfT$}yh8tUvSgWo z0`ilK#UAgZt?TyGJ+SjGN$+9y0cRYMJfw^LmIzy)Yp0Mf6QMqL+vBHERi&#^Pf`H3 zK4WJU&F}*JeW)1uzAu&G@Rjq)vlFa9u$m{P;Dhb1p`vbCkXIIWMozi+)+w?3-DzUf zMA{2_%-k8LG|BZ>5VuslvdI#0=#7Yh1#B~kVVZxikseq zF)J=HjptWklVy#`WW-Anfd=xK-p#A3sdbS|J#f`M&RRU@6Jaw0Gqv;>}+p;d`)Q(TW zC;4^PJq#aQfF@J1t_O*So4B zTSnq2HvBsUV&#oxJKx6nu^3)Mxf+YZhz*-AGZC@wd}k34e6o?G6-x1RU)c&6nq&ov zefZX`65fMmi)e)oL543QDFLh!!r~nTRHO->>>2v2=3=F_4SQN#CV`Ea%61h`eS_8k z160`G3?cF><8|bjI)$mB#eOvsKOiCoH@DKb7_Dm1C12GGq7$%kl%y!rq$j~pUBd?F zLGBvQX5`E-2ZI2O73o=56IC&P^&4481}V3UYyy;>^|T%)ehm!*v?gAb>;(*1Kfsv6hzcU^IFI%sF`EeBPS zl!@a@Lx#CU{~q+ZCb+I%D!U@XVuh!E)$cuuSGiGT^)d}vGs?SSai}p`R@GYxhzYxz zND5g4JY}`c+fj?0uy=Db28zu+Exc-(gDSF4iG3P88k!)c#56Nm=2>9{_yL}PjIUx; z6$AX#UsdTUx5{q*4gfdKoKk#(oyNu6dB21Ny)-clnRWU&Ui(?@Lx$PP0baArVRQHd6sTNQI>EeJyAErJen4W zzf$lw=)Nucp~3O!J<@lLgYFsoN6`5{*2T%F;aRmB=z`_34;>FOsE5%-1yv%93l(sS z#4AcgiKvE=$jlL(TF`{Z%;A-(bAX~m6vK_8)94qvWPN1A+@Y^&XnQz^JY@8LUgOZl z5Lp!?-b8bL3`dHpAvh(WA^y>%6;DN55&el_+=#|0x{Tn|geLn(lU_U*&7Uj{-YE+0 zNt6R_fmS@(F`xQ=7VU;zVpnVMOD}Ql=QbmGJ)k2UQAea>>kmKe_Vpk!#!Z7Eaj*o` zCDu)I=m*h39D+x>qX(jgT!+t}58Z<}L=Vx9F338t zmWW`6Or?6!MtLkKiC^8c9R%Yz1Dt{O%4nF-f<^nf%4oRI@X85T(7i1m!ftSjC;BT?xAK?68{NUW+_L73izKHwk19pM@U>*?e;5QK4$Q`f^gpSPn zLIYocuwbYVBoG2fo=^?2ceMMg14n^0V2TiV5CX`aFn2%yLyd<(Trgpn9w<-zJA{1z zH9`Qy>?hXSWgs^g-7+b|`a}`jCj$g1N?Tkxn-(Fe$X$7vG0M28LJBLFA?mP*mMki% zs6qqlDY6K=2u^?wLNRI}nf$H{1(C=4Ij|>EMN48I~PYUUe`U-g`4Dk*13iX-~9sunN^GbB*F_0b@ z0KQoAi>Cq?Y!!kDMi*iotOLoB*N}bx_rOY^4cHn)9i%R52YLgfBj!HN|LaG02hSDB z@e9Na7KRm{kwb^G}pfir{%L0wL%5fZVxiS`gkH z`99UaRG^01X|-BEDlZZTA;gu&$Z$K@Eto&JC+Z#l%3EO-pD={4+*d$7A1LsiwDOZ? zfF`gX>>J@#ZNwd53m8!cSkQTNMXFl95#2%Wlm6HHK9vz88xC3`!(w_OT&vm65*LDq z#Rjk{<~5egun7*iGT!nB8Lop4eatvQj?-w@{Ot>8-=(*++P zNj4_xc<`D}Pw?#Lmq{)Mw}Q+Z|nvFHLaWD3hQ656%!m_UzmbVkms zr|urjXXqCbtfXbt?9M5mx(V4Z6r5oFsYfc(pYaiia-uuxFubIuK-ZfPg0sS70D@=(N7*k zX(*S`Ng4i5zm(3znR4xtlQq?@qGbZoN@NyJr@St(J<(16EJbpiF^|%o#k$5TTaSZg zKV^}aHj6qUlymY=rmJ&c9r>~=J0>1W`9vtg@(rgejOtU4clOcbO?U5)&SDR%Ioj>kE@9NkBO|WENlr zSJ^Zio0&PkY8(pd2(I~L4N6&xL;xV!6DH=Y#veZt%Uuj8q|9~5Foz^s>>_>sbbRP;FPKN-YT1qwy|j}~ z+l!+Ft7{2j_~lqitP8&rG|95Q2;L?>kfzW8v~2(qy^{TQ#Z9W~PH^StIHd({(|JtE zZ`>|uY%}t@Fq2LCvGp31p^iWP$`qnp3O9R?kb4<_RL&HVe4vY;dW6puqFX9AeQ%M= zPdsmC^HYfP)}K6tp2r5UCJjeRCoz+q`{B#%F-WV!l`j?hD*B`*Cg>-tCx88sSM39- zQVM63@=7tBZWu^?5z5J&s}Rq7a7G+dZ|F;I-m#b1tRFC);#m&5>PbDz5aTbpnFgq1 z?xq+A$d)-wJrYZ9vd26cKQk@5U7boZ8}*BH<@JWULVi$D0N=0|r`GEe?M-hfdUL*D z&Z(buO0o~m*?Zg60{^oM@T*CJu`ru{0}S`R<-Bo0w(XP18R zhH2a#__0Qa54ANX-NcV4<3_UuCS_9NjF^3o4)>iw*T2>*Jg~UI`4peBu`Dd(9#F*n zm3eHa0U{syr_p<(S_zv!@#w(zrOOpSw$v}{|0QN|lkWYjDENUJ(UIyG`pDIBDA$== zdm`5f$;7LAV``Id6Kpe^(!CxkeH#`%o8q%BA?+~)uuyr5N|pGHsxx*S0}5>fs4^8U zmdDhdy3c|}_b0ai-_R!M&fTM+zx%6OcAxn%cE|4gV~go7-TRvEnC<*LY1`A+3UR=? zeRte36%FU^?E0fCdi%MfOWr{+AEEw~X2xy(0dD6%P|wP~m=-#nJ45yRaHvJ1pXzb*gF=yevl}zpLYaFL=;rI?cilW6=o{tPMkn#6CY)tz&2(9V#{11)wej@LZr+Bvv-rSLt&jyDe!BGhFsG&AuSKq&J>Od0iLlYJJh}aqkDj zFwDfe>|OeHQuM^VtO?C-T#UV;t@Qqt4RkK}fK5LQ%^%=s72ni{g1h3CYCD;H#?kICh$W}UoiM0Zd>Om^NU3ir6Q05Y!L;9o<6lE8_(}tde&Ph?s_8o zek_n;^2tK!m-JBHCFS+jSkx<}k@4QqN0y@Lx7qr}`XE&BG%Jl~sVtWy$ikr6g~HhB zAe<`0HV6uTV#+C(H~ZZ?qxV6-sSxK{OZ2L@aD1xj*Gxb5=Y?Q(o4@bvXT^P}?lZ#| zs2TK|KJsY09y)Uh1a5A;b6|dj5J?#vz;)>6H>-7)>nP_`CXJ(4E=sfROAoltMN=@y zDtVCt(u$fW%TL{#lf2XLQgP#JN)DXVyt}Z>498#ig?JVetWUHmX!}r+V!Zm`udpGH zNM7yxP?6=H2EZTvObxSO|HX#?=0YuB{!6oyq_7pISgt5jK6L*0vUDzg&QbLv-WWs_ zb|nqcos7E+2r&Xx8-a$CdUdtF*-3WCTqNAPMN|8{D(|?z#CSMp^D_`gEz%fN z4-lFKgt5QVw1mj8zuUBg=&--zwDdC&=GdnIm3O|)y15AXhH1E^gEU#dkxIu>tvZ=d zMYhSxJ01f@jw6i47WfswbbJKv#{$}Hm$wRVw^ghqmAlhpEiE%NBH#SX@<~VcU!$H5 zLUqLT2ka^oC#tT!MRwcEc&k|D-wP8>vQJOAs$)%g;;(Gi%|c$aMe>fbO7Qjk3lnxh z0m(QwyAr7*72wp~Nnihc^7=*l+x))B6Mw^FbSX``)z?*^dZ8$c#y}PdR-bs)?^7cR z_l_Sv0$e%^{tR71QTB~RYnlu4>W?rC-o@BE<`VVIMO(FJPt+G)yIrwHmt0}BTX=2u zChPx0fLwr99U=~C0w8oxMtF|oDmSA6@&#F{kkZX+!o39R_omu6_a@RG5P9yNVA7QHOujS$`K_+r!~^^YE|#T3iqDqJhugaS z;E&ZAXOV}Oe?WD~+5;-EYvtP(EbmQPEnWv2xZ-1sl}WbKE9X<+3G-v*T{fR@WMTMRx*OUA{EFT6S{;MZEbPGoIe! zG5W5u8q*}16fe4=o3VxQC97j9UW!{I$k1e9fw2Us*|C16Pn22qjn3sYubD$x%o{3& zMoH9(K|RW!0QkLcmDYeCp9~5%#AoR->Hd+AkQLlFCmLF-sCbG39?3dKgm)AuQY(KV z4d)a(`1)e29!>nZ*F`+JAN1mYHx@d+9+189ZzR8-c^(9#u4GPpkTz7O+hI2_k*515 zUU;GuFGpyUe8b-I#GijY?EHPae!b!7*hoR0E%(h{{(D#7m^)()GJN&Jsw)_DQ0hoR z=$AO4r~g#AaYYl&lCG(sQrE2|$%1qp&dOygs&r!mkw0^OW|(^L>22+s$mw9ZmiX$Z z38I|6=oLR-vVzqHd0N0V7>o+0tkX8Ck~i@wu$#IPNoN<|nZb#n{!H0nN7OsEKM#T~ zyi>Ml;TWs!GJ{*Z6wg?VYSvf~07XLDvv+QaxTG~Lu%dK{?X-}&0f z0kmtz;bNSl27W*7HrZ6}Vt@T8n%KT^l@I(P5C;YIo(asC6>f=S%ipq$z|>a!$Yo;6 zk#556KxU$-r`kT;s#--@=@0Z81-8k}Sp7v(J%@{zPvs7n&Q^S}Q?*gF=(|({jomZx zZZCH1Y@U^ldTaZb9~gI@gYP|A3*X;Wdy7OQtM{hUB^Ik56w64dLUzERsA;#8C~Oy? zh_G9oSe?ia!}X6AgjDbaBWSHD_v5GOX7aXz`9Ku!TE0({N zo4&zIrZC8E}SP)ohO3ks&SH$_RiJ0(h+7`e^ z5_pJ4>baflFnCbL@br#&z}CU4boQ&f?m#S6^&{qp{xhpuCN-8Ox3o^fHtGkd){W!- zxo1z!6l0%?zcE%N5&%+tEL2Q3D zFw`tG`_YgsO$Wa{rt;mKDsjb60|@vFnoU*ddJ-(LL_z`YN-08ocEggXf_maTZhH-w zjwzOiGm@>{Z;^P+`vvRLmE2f>8g`VkNUJKp&%3vJi#?}Y_%&`-WPMi&0~bN=qVb$Ffv)J-GeV~Q7Z^3IEU zvr{>5@_%r>9U6UU(?ui@OU8NyW?YW-)4xwc@cF)~W6Zd8(lh0gi6o}57Pl?t+2*-A zwS)AVHR=~|8Rvd_a}|zR%4JPleSWRJ#g~3d&3~Fi)anJguUeB?UkspHtuDQKY^Ym9ax!`DmuEEMOoDPrg4!|K#^<$EqfhQ5^uCQ+S_X{MGOL zEwdj))VFO|`a!tiUz+C6t^MJbT;VRgb4B*4qx<6Hgfs}+=Tp@gL~UA7sh$N0glBSg ztf@7{_}zmKkac(67v20StM8cUI&{h+vnZOrY8EVy*LTTvQ-hu`5{P9(1+(h= zg|*o));ycstlmGKGRP)V2BLaMu$$BabCKo@q8sS6zoS9tP1y4939CLtuA92^U*%r@ zq#~{OPHJXkM_?dF2;rNE&8h1g9=LAqbkc4yN5nCv(<_WLr|K;3hD~Hk?Kx+^W?9B{v!7#vTjS%{HcT~)YUHOO z=Ya#zhC5zVL5KjNW^cyUk1^bL(F;8=Qpar6^?-2Y)!UWii2&ZeYI%cNQ7MwFTL8~LUQuoq2c3|)SqykT4*@Y{T1EH- zhy5YM+o_t?R40o>#!Q@%l_sNZ=lzni7s8IK=qST%W!(n`Y*e7Y+QD9Ss+M zt6|gFSh7DUc?=ER-((!;2mX9gcB~B$-6!wQAx&pS8tSnHyO9M8QslZbzSH*}S3g$O zFQ)sZ_B~fW5*w8Eztdm;E{~Tf?@w09C!^S+mVcR!^|8vY(}LXS_7ER%q$kGOQO}bs z^S}yAd#yJQLsRnOo9R&X*SEFm(c2BjWx{1+&J$8SlDh0e z=8a)*Dok1q*rtTuFbNi;aM0#CNgFC&>Ru`0ql@<)izG+uTek@*V#sGyL z6G^zU41wjzSQHU|!BB9sUMTm5F;Gb;^!ikSAha(8K-g7QGry^%Pza*aL}p-pZRNuL zZq;(+O29sCEw1!y&r$*i=|OaFDyM{h5etdiAeUH((5(8D+I`F{QuyTG5#| zv;5H>M!kvJjMd_0nCRC}`P;9b4VQ`A{I#_&nD=w-Bp9!|U2{V=FRD!pqak46<$HYL zR!6EI)LI;15@)|0Abm)1_qAFx7|F?63{LcDQ0%NI)QVJXhtlF?ZR66?X(^%hjEdaS zDOYywfGMOduJa{=9A#dsuBvXs9x}_NW0<>nLWE>1(Z%h^xX9&Wn4Psr*cs8vYow>M zzjZ1&a8B_ibh}A5~hY?|;*41U=Fte)Cza zzEjO3V9@d*a{fOyh2gXj&(mc?93PPWUF~Hf?2SNd0sfmc_PsfQu>g^W)w1V#4%jZx8ZIHR!kYN{jF$Icy)UWxM4?0{QV{w1+O zlICVXl^L5xHQ{Q#XaI8x)a!Rl9qxs?v#^HXVsodmx4fO{Q{QX*ku6K#Er?~-A9N{D zLL`wY7gCg$Ae;P;MY87KOLbW;HS<5E1J4*Dt)XHDynMn~2hJC1fJ!(_K+4ZWsp`;n|MF zTIwj+?2^WBcoPz>b+J@P3U_=E++-%Pt-uV0IE@Q|Kk!{X2SsMzV~{-umChnalbqqS z%xv_Y{3|05DULl4={tEX7$pj5S9x!&%`Y0E+K#2DDna8#7H&cAC$@luJQ?<3k!`Tw z7)-)G0cRi;0|z3qhjMsN9{9BjR+OprNaEEQ&wVDw;Ij);9V zLS4JU_(W+RpX;nZF%a@VN3v~C^m=a6{oVJ~;3=pvDC3R9`Lb|Ntm7XE8}gSAk7{d= zn%5NH%?Dz14TT?XI_r#N{*`sZ1!5AjQ(TqM8yOV@sExy!nd(JZG@qCpRq6f*6{_+* z3st;QQ+SdTT|}$^_0pKx`yaXdlyg-!Kkc%)@kcEJs5EZ6#8WF(_*u?uUz^RD{b1=e z_rNn+aAHeE47bN5@iG~ZKt}Mt4P%@a)9Cog{Nty^Kv4vXpK8WcLd_D321!dzgNx*2 zDQAofe_d7}^Y*B{>T>H8B6*bhqa{&DJ2rmgkh)c6+K+-4WwfrvqWU?J47$%bq()XI}gEfFJkWIC2kA z^5*h1k)3qP8S!Oj zgrYsc*iW%}>&oO@hs7_ZUipB(cXGd@Pg3_&=u4~ye!ocbTlS2DV6eUs*j_z#t7H?3 zEcy`yNnBPmlv_0i+$wngE_)Z!@C(rJV`kl(s(Duc6s)0=A=$;ey{$&}m)p#{1!4O` zv08O8c;vw>%+Hx-?HRT@uu$E1`L-eU&!)x0-v(!MSaz7#v+t!>-R3*SetA@0kiT=2 z(5EzFn+y21U-+a=j5lzw4G2V^H-foYxut(raQH3;aY#G_27CMfF+aR8d-6;nS}t!G{;S6(WA_um@V z1{CD$`sPl%Z5I3jLQgMGd?4qx$VX0#4u$^w0P9Lqe*Iqlt1t3$+7oC_%D2}d;M14- zarNdt+k7e%VV{3~^gU`wNiP{rDl&2#6NQdi3lI04>@kIk zbvT)SEt5I&PV<`fRjg|ZGSg=l78tfUDZNsf%j_@fxVa7yvgmW*IG@rV9nU?R^qQMq z%V!UG+w-6OG@Erfk>t7;d>9hzvCyBD6teX9jDVeym)rmL&(IlZ)=!T2L_JKfo1e~S z@~lfn4I&-*wVd&d=6Sa^j)BpCDtM90ep;%1;mpoTUIJZx^56wOe z$7pt(MpXLd)D@~ACETB}N0g-DpZcmn8UFOIa0at*>{S%P85BvlUI&q|c~s>y0nD4unqfgs zk^VpH&BI^yCU7=b7(W)eSw0pBx9;9a)ib}1J_xAyc0tz>K4&1VLz2%;F<((8XvrGR zl-PQC;x$l!PK`8 z_&paFo9M2C__&z)9|1~+C%8AhXM?w@K0OkUSNMC)O&VN_D5&mcp)!GV)vOf#P=8KR za-F*&_WwE5c(6&es9K6W5`G86<_K=ne)`*4~5v3R1?{AULx5eiA}`U+4!>*2vy8>PV;iL zZoG5f-q`%^YrQbUp&Q+oG!C4**;ZT>^p|EvvR(CIY}%vrr2F@SUhP|(WuHyUW_%{& zJ$f?ZbUWZdullV`xfbV5Q1-7LsQR(*3zXEpRGScHZljQj%h3A~lkfZA%Wb&HuLz5- zN8#^D-!-esJE=z#&y{xKk-g?$SlJ!_9W!9KUr>-$0I$AoSA^$}11I`j8Nx}gLyLfp z*bUn(JHqr|kLgJNUh_o?NHWB~2hleDei!ao)V#r;z2HuRpln4Sl4H-dxwD3KFlQRWv@)Y(MCf18q-o39xTpWy4PW+J3x(#^1 z@|kT7g(200IjxMg2aRUD@5YO6nM=h`VY9E!73RYXq$TDCVUw@#bhQ&QsRG|0AB3A} za~sZ`_NN_y~&WisS~`$3)+l5B)LS_?;dDps3$m z?iySLUr8~edNG7c$c7wz+l&<3wJ})SyyD_sGjqxvLYDSkAz0K-+-7S@eIk=SXKoD?3L%87IrOj$c%v zyDOm|@d(ztt-lBdP|y}_0^~O-B=YmWyuBRI3Q^39I 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 ? " " : "")); - } - }, - 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?" ":"")))},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