revolution.extension.video.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. /********************************************
  2. * REVOLUTION 5.0 EXTENSION - VIDEO FUNCTIONS
  3. * @version: 1.1.0 (01.10.2015)
  4. * @requires jquery.themepunch.revolution.js
  5. * @author ThemePunch
  6. *********************************************/
  7. (function($) {
  8. var _R = jQuery.fn.revolution,
  9. _ISM = _R.is_mobile();
  10. ///////////////////////////////////////////
  11. // EXTENDED FUNCTIONS AVAILABLE GLOBAL //
  12. ///////////////////////////////////////////
  13. jQuery.extend(true,_R, {
  14. resetVideo : function(_nc,opt) {
  15. switch (_nc.data('videotype')) {
  16. case "youtube":
  17. var player=_nc.data('player');
  18. try{
  19. if (_nc.data('forcerewind')=="on" && !_ISM) {
  20. var s = getStartSec(_nc.data('videostartat'));
  21. s= s==-1 ? 0 : s;
  22. _nc.data('player').seekTo(s);
  23. _nc.data('player').pauseVideo();
  24. }
  25. } catch(e) {}
  26. if (_nc.find('.tp-videoposter').length==0)
  27. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  28. break;
  29. case "vimeo":
  30. var f = $f(_nc.find('iframe').attr("id"));
  31. try{
  32. if (_nc.data('forcerewind')=="on" && !_ISM) {
  33. var s = getStartSec(_nc.data('videostartat')),
  34. ct = 0;
  35. s= s==-1 ? 0 : s;
  36. f.api("seekTo",s);
  37. f.api("pause");
  38. }
  39. } catch(e) {}
  40. if (_nc.find('.tp-videoposter').length==0)
  41. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  42. break;
  43. case "html5":
  44. if (_ISM && _nc.data('disablevideoonmobile')==1) return false;
  45. var jvideo = _nc.find('video'),
  46. video = jvideo[0];
  47. punchgs.TweenLite.to(jvideo,0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  48. if (_nc.data('forcerewind')=="on" && !_nc.hasClass("videoisplaying")) {
  49. try{
  50. var s = getStartSec(_nc.data('videostartat'));
  51. video.currentTime = s == -1 ? 0 : s;
  52. } catch(e) {}
  53. }
  54. if (_nc.data('volume')=="mute")
  55. video.muted = true;
  56. break;
  57. }
  58. },
  59. stopVideo : function(_nc,opt) {
  60. switch (_nc.data('videotype')) {
  61. case "youtube":
  62. try{
  63. var player=_nc.data('player');
  64. player.pauseVideo();
  65. } catch(e) {}
  66. break;
  67. case "vimeo":
  68. try{
  69. var f = $f(_nc.find('iframe').attr("id"));
  70. f.api("pause");
  71. } catch(e) {}
  72. break;
  73. case "html5":
  74. var jvideo = _nc.find('video'),
  75. video = jvideo[0];
  76. video.pause();
  77. break;
  78. }
  79. },
  80. playVideo : function(_nc,opt) {
  81. clearTimeout(_nc.data('videoplaywait'));
  82. switch (_nc.data('videotype')) {
  83. case "youtube":
  84. if (_nc.find('iframe').length==0) {
  85. _nc.append(_nc.data('videomarkup'));
  86. addVideoListener(_nc,opt,true);
  87. } else {
  88. if (_nc.data('player').playVideo !=undefined) {
  89. _nc.data('player').playVideo();
  90. var s = getStartSec(_nc.data('videostartat'));
  91. if (s!=-1) _nc.data('player').seekTo(s);
  92. } else {
  93. _nc.data('videoplaywait',setTimeout(function() {
  94. _R.playVideo(_nc,opt);
  95. },50));
  96. }
  97. }
  98. break;
  99. case "vimeo":
  100. if (_nc.find('iframe').length==0) {
  101. _nc.append(_nc.data('videomarkup'));
  102. addVideoListener(_nc,opt,true);
  103. } else {
  104. if (_nc.hasClass("rs-apiready")) {
  105. var id = _nc.find('iframe').attr("id"),
  106. f = $f(id);
  107. if (f.api("play")==undefined) {
  108. _nc.data('videoplaywait',setTimeout(function() {
  109. _R.playVideo(_nc,opt);
  110. },50));
  111. } else {
  112. setTimeout(function() {
  113. f.api("play");
  114. var s = getStartSec(_nc.data('videostartat'));
  115. if (s!=-1) f.api("seekTo",s);
  116. },510);
  117. }
  118. } else {
  119. _nc.data('videoplaywait',setTimeout(function() {
  120. _R.playVideo(_nc,opt);
  121. },50));
  122. }
  123. }
  124. break;
  125. case "html5":
  126. if (_ISM && _nc.data('disablevideoonmobile')==1) return false;
  127. var jvideo = _nc.find('video'),
  128. video = jvideo[0],
  129. html5vid = jvideo.parent();
  130. if (html5vid.data('metaloaded') != 1) {
  131. addEvent(video,'loadedmetadata',function(_nc) {
  132. _R.resetVideo(_nc,opt);
  133. video.play();
  134. var s = getStartSec(_nc.data('videostartat'));
  135. if (s!=-1) video.currentTime = s;
  136. }(_nc));
  137. } else {
  138. video.play();
  139. var s = getStartSec(_nc.data('videostartat'));
  140. if (s!=-1) video.currentTime = s;
  141. }
  142. break;
  143. }
  144. },
  145. isVideoPlaying : function(_nc,opt) {
  146. var ret = false;
  147. if (opt.playingvideos != undefined) {
  148. jQuery.each(opt.playingvideos,function(i,nc) {
  149. if (_nc.attr('id') == nc.attr('id'))
  150. ret = true;
  151. });
  152. }
  153. return ret;
  154. },
  155. prepareCoveredVideo : function(asprat,opt,nextcaption) {
  156. var ifr = nextcaption.find('iframe, video'),
  157. wa = asprat.split(':')[0],
  158. ha = asprat.split(':')[1],
  159. li = nextcaption.closest('.tp-revslider-slidesli'),
  160. od = li.width()/li.height(),
  161. vd = wa/ha,
  162. nvh = (od/vd)*100,
  163. nvw = (vd/od)*100;
  164. if (od>vd)
  165. punchgs.TweenLite.to(ifr,0.001,{height:nvh+"%", width:"100%", top:-(nvh-100)/2+"%",left:"0px",position:"absolute"});
  166. else
  167. punchgs.TweenLite.to(ifr,0.001,{width:nvw+"%", height:"100%", left:-(nvw-100)/2+"%",top:"0px",position:"absolute"});
  168. },
  169. checkVideoApis : function(_nc,opt,addedApis) {
  170. var httpprefix = location.protocol === 'https:' ? "https" : "http";
  171. if ((_nc.data('ytid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('youtube')>0)) opt.youtubeapineeded = true;
  172. if ((_nc.data('ytid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('youtube')>0) && addedApis.addedyt==0) {
  173. opt.youtubestarttime = jQuery.now();
  174. addedApis.addedyt=1;
  175. var s = document.createElement("script");
  176. s.src = "https://www.youtube.com/iframe_api"; /* Load Player API*/
  177. var before = document.getElementsByTagName("script")[0],
  178. loadit = true;
  179. jQuery('head').find('*').each(function(){
  180. if (jQuery(this).attr('src') == "https://www.youtube.com/iframe_api")
  181. loadit = false;
  182. });
  183. if (loadit) before.parentNode.insertBefore(s, before);
  184. }
  185. if ((_nc.data('vimeoid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('vimeo')>0)) opt.vimeoapineeded = true;
  186. if ((_nc.data('vimeoid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('vimeo')>0) && addedApis.addedvim==0) {
  187. opt.vimeostarttime = jQuery.now();
  188. addedApis.addedvim=1;
  189. var f = document.createElement("script"),
  190. before = document.getElementsByTagName("script")[0],
  191. loadit = true;
  192. f.src = httpprefix+"://f.vimeocdn.com/js/froogaloop2.min.js"; /* Load Player API*/
  193. jQuery('head').find('*').each(function(){
  194. if (jQuery(this).attr('src') == httpprefix+"://a.vimeocdn.com/js/froogaloop2.min.js")
  195. loadit = false;
  196. });
  197. if (loadit)
  198. before.parentNode.insertBefore(f, before);
  199. }
  200. return addedApis;
  201. },
  202. manageVideoLayer : function(_nc,opt,recalled,internrecalled) {
  203. // YOUTUBE AND VIMEO LISTENRES INITIALISATION
  204. var vida = _nc.data("videoattributes"),
  205. vidytid = _nc.data('ytid'),
  206. vimeoid = _nc.data('vimeoid'),
  207. videopreload = _nc.data('videpreload'),
  208. videomp = _nc.data('videomp4'),
  209. videowebm = _nc.data('videowebm'),
  210. videoogv = _nc.data('videoogv'),
  211. videoafs = _nc.data('allowfullscreenvideo'),
  212. videocontrols = _nc.data('videocontrols'),
  213. httpprefix = "http",
  214. videoloop = _nc.data('videoloop')=="loop" ? "loop" : _nc.data('videoloop')=="loopandnoslidestop" ? "loop" : "",
  215. videotype = (videomp!=undefined || videowebm!=undefined) ? "html5" :
  216. (vidytid!=undefined && String(vidytid).length>1) ? "youtube" :
  217. (vimeoid!=undefined && String(vimeoid).length>1) ? "vimeo" : "none",
  218. newvideotype = (videotype=="html5" && _nc.find('video').length==0) ? "html5" :
  219. (videotype=="youtube" && _nc.find('iframe').length==0) ? "youtube" :
  220. (videotype=="vimeo" && _nc.find('iframe').length==0) ? "vimeo" : "none";
  221. _nc.data('videotype',videotype);
  222. // ADD HTML5 VIDEO IF NEEDED
  223. switch (newvideotype) {
  224. case "html5":
  225. if (videocontrols!="controls") videocontrols="";
  226. var apptxt = '<video style="object-fit:cover;background-size:cover;visible:hidden;width:100%; height:100%" class="" '+videoloop+' preload="'+videopreload+'">';
  227. //if (_nc.data('videoposter')!=undefined) apptxt = apptxt + 'poster="'+_nc.data('videoposter')+'">';
  228. if (videowebm!=undefined && _R.get_browser().toLowerCase()=="firefox") apptxt = apptxt + '<source src="'+videowebm+'" type="video/webm" />';
  229. if (videomp!=undefined) apptxt = apptxt + '<source src="'+videomp+'" type="video/mp4" />';
  230. if (videoogv!=undefined) apptxt = apptxt + '<source src="'+videoogv+'" type="video/ogg" />';
  231. apptxt = apptxt + '</video>';
  232. var hfm ="";
  233. if (videoafs==="true" || videoafs===true)
  234. hfm = '<div class="tp-video-button-wrap"><button type="button" class="tp-video-button tp-vid-full-screen">Full-Screen</button></div>';
  235. if (videocontrols=="controls")
  236. apptxt = apptxt + ('<div class="tp-video-controls">'+
  237. '<div class="tp-video-button-wrap"><button type="button" class="tp-video-button tp-vid-play-pause">Play</button></div>'+
  238. '<div class="tp-video-seek-bar-wrap"><input type="range" class="tp-seek-bar" value="0"></div>'+
  239. '<div class="tp-video-button-wrap"><button type="button" class="tp-video-button tp-vid-mute">Mute</button></div>'+
  240. '<div class="tp-video-vol-bar-wrap"><input type="range" class="tp-volume-bar" min="0" max="1" step="0.1" value="1"></div>'+
  241. hfm+
  242. '</div>');
  243. _nc.data('videomarkup',apptxt)
  244. _nc.append(apptxt);
  245. // START OF HTML5 VIDEOS
  246. if ((_ISM && _nc.data('disablevideoonmobile')==1) ||_R.isIE(8)) _nc.find('video').remove();
  247. // ADD HTML5 VIDEO CONTAINER
  248. _nc.find('video').each(function(i) {
  249. var video = this,
  250. jvideo = jQuery(this);
  251. if (!jvideo.parent().hasClass("html5vid"))
  252. jvideo.wrap('<div class="html5vid" style="position:relative;top:0px;left:0px;width:100%;height:100%; overflow:hidden;"></div>');
  253. var html5vid = jvideo.parent();
  254. if (html5vid.data('metaloaded') != 1) {
  255. addEvent(video,'loadedmetadata',function(_nc) {
  256. htmlvideoevents(_nc,opt);
  257. _R.resetVideo(_nc,opt);
  258. }(_nc));
  259. }
  260. });
  261. break;
  262. case "youtube":
  263. httpprefix = "http";
  264. if (location.protocol === 'https:')
  265. httpprefix = "https";
  266. if (videocontrols=="none") {
  267. vida = vida.replace("controls=1","controls=0");
  268. if (vida.toLowerCase().indexOf('controls')==-1)
  269. vida = vida+"&controls=0";
  270. }
  271. var s = getStartSec(_nc.data('videostartat')),
  272. e = getStartSec(_nc.data('videoendat'));
  273. if (s!=-1) vida=vida+"&start="+s;
  274. if (e!=-1) vida=vida+"&end="+e;
  275. // CHECK VIDEO ORIGIN, AND EXTEND WITH WWW IN CASE IT IS MISSING !
  276. var orig = vida.split('origin='+httpprefix+'://'),
  277. vida_new = "";
  278. if (orig.length>1) {
  279. vida_new = orig[0]+'origin='+httpprefix+'://';
  280. if (self.location.href.match(/www/gi) && !orig[1].match(/www/gi))
  281. vida_new=vida_new+"www."
  282. vida_new=vida_new+orig[1];
  283. } else {
  284. vida_new = vida;
  285. }
  286. var yafv = videoafs==="true" || videoafs===true ? "allowfullscreen" : "";
  287. _nc.data('videomarkup','<iframe style="visible:hidden" src="'+httpprefix+'://www.youtube.com/embed/'+vidytid+'?'+vida_new+'" '+yafv+' width="100%" height="100%" style="width:100%;height:100%"></iframe>');
  288. break;
  289. case "vimeo":
  290. if (location.protocol === 'https:')
  291. httpprefix = "https";
  292. _nc.data('videomarkup','<iframe style="visible:hidden" src="'+httpprefix+'://player.vimeo.com/video/'+vimeoid+'?'+vida+'" width="100%" height="100%" style="100%;height:100%"></iframe>');
  293. break;
  294. }
  295. //if (videotype=="vimeo" || videotype=="youtube") {
  296. // IF VIDEOPOSTER EXISTING
  297. var posteronlyonmobile = (_ISM!=true && (_nc.data('posterOnMobile')!="on" && _nc.data('posteronmobile')!="on")) || _ISM;
  298. if (_nc.data('videoposter')!=undefined && _nc.data('videoposter').length>2 && posteronlyonmobile) {
  299. if (_nc.find('.tp-videoposter').length==0)
  300. _nc.append('<div class="tp-videoposter noSwipe" style="cursor:pointer; position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:3;background-image:url('+_nc.data('videoposter')+'); background-size:cover;background-position:center center;"></div>');
  301. if (_nc.find('iframe').length==0)
  302. _nc.find('.tp-videoposter').click(function() {
  303. _R.playVideo(_nc,opt);
  304. if (_ISM) {
  305. if (_nc.data('disablevideoonmobile')==1) return false;
  306. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
  307. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  308. }
  309. })
  310. } else {
  311. if (_nc.find('iframe').length==0 && (videotype=="youtube" || videotype=="vimeo")) {
  312. _nc.append(_nc.data('videomarkup'));
  313. addVideoListener(_nc,opt,false);
  314. }
  315. }
  316. // ADD DOTTED OVERLAY IF NEEDED
  317. if (_nc.data('dottedoverlay')!="none" && _nc.data('dottedoverlay')!=undefined && _nc.find('.tp-dottedoverlay').length!=1)
  318. _nc.append('<div class="tp-dottedoverlay '+_nc.data('dottedoverlay')+'"></div>');
  319. _nc.addClass("HasListener");
  320. if (_nc.data('bgvideo')==1) {
  321. punchgs.TweenLite.set(_nc.find('video, iframe'),{autoAlpha:0});
  322. }
  323. }
  324. });
  325. //////////////////////////////////////////////////////
  326. // * Revolution Slider - VIDEO / API FUNCTIONS //
  327. // * @version: 1.0 (30.10.2014) //
  328. // * @author ThemePunch //
  329. //////////////////////////////////////////////////////
  330. function getStartSec(st) {
  331. return st == undefined ? -1 :jQuery.isNumeric(st) ? st : st.split(":").length>1 ? parseInt(st.split(":")[0],0)*60 + parseInt(st.split(":")[1],0) : st;
  332. };
  333. // - VIMEO ADD EVENT /////
  334. var addEvent = function(element, eventName, callback) {
  335. if (element.addEventListener)
  336. element.addEventListener(eventName, callback, false);
  337. else
  338. element.attachEvent(eventName, callback, false);
  339. };
  340. var getVideoDatas = function(p,t,d) {
  341. var a = {};
  342. a.video = p;
  343. a.videotype = t;
  344. a.settings = d;
  345. return a;
  346. }
  347. var addVideoListener = function(_nc,opt,startnow) {
  348. var ifr = _nc.find('iframe'),
  349. frameID = "iframe"+Math.round(Math.random()*100000+1),
  350. loop = _nc.data('videoloop'),
  351. pforv = loop != "loopandnoslidestop";
  352. loop = loop =="loop" || loop =="loopandnoslidestop";
  353. // CARE ABOUT ASPECT RATIO
  354. if (_nc.data('forcecover')==1) {
  355. _nc.removeClass("fullscreenvideo").addClass("coverscreenvideo");
  356. var asprat = _nc.data('aspectratio');
  357. if (asprat!=undefined && asprat.split(":").length>1)
  358. _R.prepareCoveredVideo(asprat,opt,_nc);
  359. }
  360. // IF LISTENER DOES NOT EXIST YET
  361. ifr.attr('id',frameID);
  362. if (startnow) _nc.data('startvideonow',true);
  363. if (_nc.data('videolistenerexist')!==1) {
  364. switch (_nc.data('videotype')) {
  365. // YOUTUBE LISTENER
  366. case "youtube":
  367. var player = new YT.Player(frameID, {
  368. events: {
  369. "onStateChange": function(event) {
  370. var embedCode = event.target.getVideoEmbedCode(),
  371. ytcont = jQuery('#'+embedCode.split('id="')[1].split('"')[0]),
  372. container = ytcont.closest('.tp-simpleresponsive'),
  373. _nc = ytcont.parent(),
  374. player = ytcont.parent().data('player');
  375. if (event.data == YT.PlayerState.PLAYING) {
  376. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
  377. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  378. if (_nc.data('volume')=="mute") {
  379. player.mute();
  380. } else {
  381. player.unMute();
  382. player.setVolume(parseInt(_nc.data('volume'),0) || 75);
  383. }
  384. opt.videoplaying=true;
  385. addVidtoList(_nc,opt);
  386. container.trigger('stoptimer');
  387. opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(player,"youtube",_nc.data()));
  388. } else {
  389. if (event.data==0 && loop) {
  390. //player.playVideo();
  391. var s = getStartSec(_nc.data('videostartat'));
  392. if (s!=-1) player.seekTo(s);
  393. player.playVideo();
  394. }
  395. if ((event.data==0 || event.data==2) && _nc.data('showcoveronpause')=="on" && _nc.find('.tp-videoposter').length>0) {
  396. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
  397. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:0,ease:punchgs.Power3.easeInOut});
  398. }
  399. if ((event.data!=-1 && event.data!=3)) {
  400. opt.videoplaying=false;
  401. remVidfromList(_nc,opt);
  402. container.trigger('starttimer');
  403. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(player,"youtube",_nc.data()));
  404. }
  405. if (event.data==0 && _nc.data('nextslideatend')==true) {
  406. opt.c.revnext();
  407. remVidfromList(_nc,opt);
  408. } else {
  409. remVidfromList(_nc,opt);
  410. opt.videoplaying=false;
  411. container.trigger('starttimer');
  412. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(player,"youtube",_nc.data()));
  413. }
  414. }
  415. },
  416. 'onReady': function(event) {
  417. var embedCode = event.target.getVideoEmbedCode(),
  418. ytcont = jQuery('#'+embedCode.split('id="')[1].split('"')[0]),
  419. _nc = ytcont.parent(),
  420. videorate = _nc.data('videorate'),
  421. videostart = _nc.data('videostart');
  422. _nc.addClass("rs-apiready");
  423. if (videorate!=undefined)
  424. event.target.setPlaybackRate(parseFloat(videorate));
  425. // PLAY VIDEO IF THUMBNAIL HAS BEEN CLICKED
  426. _nc.find('.tp-videoposter').unbind("click");
  427. _nc.find('.tp-videoposter').click(function() {
  428. if (!_ISM) {
  429. player.playVideo();
  430. }
  431. })
  432. if (_nc.data('startvideonow')) {
  433. _nc.data('player').playVideo();
  434. var s = getStartSec(_nc.data('videostartat'));
  435. if (s!=-1) _nc.data('player').seekTo(s);
  436. //_nc.find('.tp-videoposter').click();
  437. }
  438. _nc.data('videolistenerexist',1);
  439. }
  440. }
  441. });
  442. _nc.data('player',player);
  443. break;
  444. // VIMEO LISTENER
  445. case "vimeo":
  446. var isrc = ifr.attr('src'),
  447. queryParameters = {}, queryString = isrc,
  448. re = /([^&=]+)=([^&]*)/g, m;
  449. // Creates a map with the query string parameters
  450. while (m = re.exec(queryString)) {
  451. queryParameters[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  452. }
  453. if (queryParameters['player_id']!=undefined)
  454. isrc = isrc.replace(queryParameters['player_id'],frameID);
  455. else
  456. isrc=isrc+"&player_id="+frameID;
  457. try{ isrc = isrc.replace('api=0','api=1'); } catch(e) {}
  458. isrc=isrc+"&api=1";
  459. ifr.attr('src',isrc);
  460. var player = _nc.find('iframe')[0],
  461. vimcont = jQuery('#'+frameID),
  462. f = $f(frameID);
  463. f.addEvent('ready', function(){
  464. _nc.addClass("rs-apiready");
  465. f.addEvent('play', function(data) {
  466. _nc.data('nextslidecalled',0);
  467. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
  468. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  469. opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(f,"vimeo",_nc.data()));
  470. opt.videoplaying=true;
  471. addVidtoList(_nc,opt);
  472. if (pforv)
  473. opt.c.trigger('stoptimer');
  474. if (_nc.data('volume')=="mute")
  475. f.api('setVolume',"0")
  476. else
  477. f.api('setVolume',(parseInt(_nc.data('volume'),0)/100 || 0.75));
  478. });
  479. f.addEvent('playProgress',function(data) {
  480. var et = getStartSec(_nc.data('videoendat'))
  481. if (et!=0 && (Math.abs(et-data.seconds) <0.3 && et>data.seconds) && _nc.data('nextslidecalled') != 1) {
  482. if (loop) {
  483. f.api("play");
  484. var s = getStartSec(_nc.data('videostartat'));
  485. if (s!=-1) f.api("seekTo",s);
  486. } else {
  487. if (_nc.data('nextslideatend')==true) {
  488. _nc.data('nextslidecalled',1);
  489. opt.c.revnext();
  490. }
  491. f.api("pause");
  492. }
  493. }
  494. });
  495. f.addEvent('finish', function(data) {
  496. remVidfromList(_nc,opt);
  497. opt.videoplaying=false;
  498. opt.c.trigger('starttimer');
  499. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(f,"vimeo",_nc.data()));
  500. if (_nc.data('nextslideatend')==true)
  501. opt.c.revnext();
  502. });
  503. f.addEvent('pause', function(data) {
  504. if (_nc.find('.tp-videoposter').length>0 && _nc.data('showcoveronpause')=="on") {
  505. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
  506. punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:0,ease:punchgs.Power3.easeInOut});
  507. }
  508. opt.videoplaying=false;
  509. remVidfromList(_nc,opt);
  510. opt.c.trigger('starttimer');
  511. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(f,"vimeo",_nc.data()));
  512. });
  513. _nc.find('.tp-videoposter').unbind("click");
  514. _nc.find('.tp-videoposter').click(function() {
  515. if (!_ISM) {
  516. f.api("play");
  517. return false;
  518. }
  519. })
  520. if (_nc.data('startvideonow')) {
  521. f.api("play");
  522. var s = getStartSec(_nc.data('videostartat'));
  523. if (s!=-1) f.api("seekTo",s);
  524. }
  525. _nc.data('videolistenerexist',1);
  526. });
  527. break;
  528. }
  529. } else {
  530. var s = getStartSec(_nc.data('videostartat'));
  531. switch (_nc.data('videotype')) {
  532. // YOUTUBE LISTENER
  533. case "youtube":
  534. if (startnow) {
  535. _nc.data('player').playVideo();
  536. if (s!=-1) _nc.data('player').seekTo()
  537. }
  538. break;
  539. case "vimeo":
  540. if (startnow) {
  541. var f = $f(_nc.find('iframe').attr("id"));
  542. f.api("play");
  543. if (s!=-1) f.api("seekTo",s);
  544. }
  545. break;
  546. }
  547. }
  548. }
  549. ///////////////////////////////////////// HTML5 VIDEOS ///////////////////////////////////////////
  550. var htmlvideoevents = function(_nc,opt,startnow) {
  551. if (_ISM && _nc.data('disablevideoonmobile')==1) return false;
  552. var jvideo = _nc.find('video'),
  553. video = jvideo[0],
  554. html5vid = jvideo.parent(),
  555. loop = _nc.data('videoloop'),
  556. pforv = loop != "loopandnoslidestop";
  557. loop = loop =="loop" || loop =="loopandnoslidestop";
  558. html5vid.data('metaloaded',1);
  559. // FIRST TIME LOADED THE HTML5 VIDEO
  560. //PLAY, STOP VIDEO ON CLICK OF PLAY, POSTER ELEMENTS
  561. if (jvideo.attr('control') == undefined ) {
  562. if (_nc.find('.tp-video-play-button').length==0 && !_ISM)
  563. _nc.append('<div class="tp-video-play-button"><i class="revicon-right-dir"></i><span class="tp-revstop">&nbsp;</span></div>');
  564. _nc.find('video, .tp-poster, .tp-video-play-button').click(function() {
  565. if (_nc.hasClass("videoisplaying"))
  566. video.pause();
  567. else
  568. video.play();
  569. })
  570. }
  571. // PRESET FULLCOVER VIDEOS ON DEMAND
  572. if (_nc.data('forcecover')==1 || _nc.hasClass('fullscreenvideo')) {
  573. if (_nc.data('forcecover')==1) {
  574. html5vid.addClass("fullcoveredvideo");
  575. var asprat = _nc.data('aspectratio');
  576. _R.prepareCoveredVideo(asprat,opt,_nc);
  577. }
  578. else
  579. html5vid.addClass("fullscreenvideo");
  580. }
  581. // FIND CONTROL BUTTONS IN VIDEO, AND ADD EVENT LISTENERS ON THEM
  582. var playButton = _nc.find('.tp-vid-play-pause')[0],
  583. muteButton = _nc.find('.tp-vid-mute')[0],
  584. fullScreenButton = _nc.find('.tp-vid-full-screen')[0],
  585. seekBar = _nc.find('.tp-seek-bar')[0],
  586. volumeBar = _nc.find('.tp-volume-bar')[0];
  587. if (playButton!=undefined) {
  588. // Event listener for the play/pause button
  589. addEvent(playButton,"click", function() {
  590. if (video.paused == true)
  591. video.play();
  592. else
  593. video.pause();
  594. });
  595. // Event listener for the mute button
  596. addEvent(muteButton,"click", function() {
  597. if (video.muted == false) {
  598. video.muted = true;
  599. muteButton.innerHTML = "Unmute";
  600. } else {
  601. video.muted = false;
  602. muteButton.innerHTML = "Mute";
  603. }
  604. });
  605. // Event listener for the full-screen button
  606. if (fullScreenButton)
  607. addEvent(fullScreenButton,"click", function() {
  608. if (video.requestFullscreen) {
  609. video.requestFullscreen();
  610. } else if (video.mozRequestFullScreen) {
  611. video.mozRequestFullScreen(); // Firefox
  612. } else if (video.webkitRequestFullscreen) {
  613. video.webkitRequestFullscreen(); // Chrome and Safari
  614. }
  615. });
  616. // Event listener for the seek bar
  617. addEvent(seekBar,"change", function() {
  618. var time = video.duration * (seekBar.value / 100);
  619. video.currentTime = time;
  620. });
  621. // Update the seek bar as the video plays
  622. addEvent(video,"timeupdate", function() {
  623. var value = (100 / video.duration) * video.currentTime,
  624. et = getStartSec(_nc.data('videoendat')),
  625. cs =video.currentTime;
  626. seekBar.value = value;
  627. if (et!=0 && (Math.abs(et-cs) <=0.3 && et>cs) && _nc.data('nextslidecalled') != 1) {
  628. if (loop) {
  629. video.play();
  630. var s = getStartSec(_nc.data('videostartat'));
  631. if (s!=-1) video.currentTime = s;
  632. } else {
  633. if (_nc.data('nextslideatend')==true) {
  634. _nc.data('nextslidecalled',1);
  635. opt.c.revnext();
  636. }
  637. video.pause();
  638. }
  639. }
  640. });
  641. // Pause the video when the seek handle is being dragged
  642. addEvent(seekBar,"mousedown", function() {
  643. _nc.addClass("seekbardragged");
  644. video.pause();
  645. });
  646. // Play the video when the seek handle is dropped
  647. addEvent(seekBar,"mouseup", function() {
  648. _nc.removeClass("seekbardragged");
  649. video.play();
  650. });
  651. // Event listener for the volume bar
  652. addEvent(volumeBar,"change", function() {
  653. // Update the video volume
  654. video.volume = volumeBar.value;
  655. });
  656. }
  657. // VIDEO EVENT LISTENER FOR "PLAY"
  658. addEvent(video,"play",function() {
  659. _nc.data('nextslidecalled',0);
  660. if (_nc.data('volume')=="mute")
  661. video.muted=true;
  662. _nc.addClass("videoisplaying");
  663. addVidtoList(_nc,opt);
  664. if (!pforv) {
  665. opt.videoplaying=false;
  666. opt.c.trigger('starttimer');
  667. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_nc.data()));
  668. } else {
  669. opt.videoplaying=true;
  670. opt.c.trigger('stoptimer');
  671. opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(video,"html5",_nc.data()));
  672. }
  673. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
  674. punchgs.TweenLite.to(_nc.find('video'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
  675. var playButton = _nc.find('.tp-vid-play-pause')[0],
  676. muteButton = _nc.find('.tp-vid-mute')[0];
  677. if (playButton!=undefined)
  678. playButton.innerHTML = "Pause";
  679. if (muteButton!=undefined && video.muted)
  680. muteButton.innerHTML = "Unmute";
  681. });
  682. // VIDEO EVENT LISTENER FOR "PAUSE"
  683. addEvent(video,"pause",function() {
  684. if (_nc.find('.tp-videoposter').length>0 && _nc.data('showcoveronpause')=="on" && !_nc.hasClass("seekbardragged")) {
  685. punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
  686. punchgs.TweenLite.to(_nc.find('video'),0.3,{autoAlpha:0,ease:punchgs.Power3.easeInOut});
  687. }
  688. _nc.removeClass("videoisplaying");
  689. opt.videoplaying=false;
  690. remVidfromList(_nc,opt);
  691. opt.c.trigger('starttimer');
  692. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_nc.data()));
  693. var playButton = _nc.find('.tp-vid-play-pause')[0];
  694. if (playButton!=undefined)
  695. playButton.innerHTML = "Play";
  696. });
  697. // VIDEO EVENT LISTENER FOR "END"
  698. addEvent(video,"ended",function() {
  699. remVidfromList(_nc,opt);
  700. opt.videoplaying=false;
  701. remVidfromList(_nc,opt);
  702. opt.c.trigger('starttimer');
  703. opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_nc.data()));
  704. if (_nc.data('nextslideatend')==true)
  705. opt.c.revnext();
  706. _nc.removeClass("videoisplaying");
  707. });
  708. }
  709. var addVidtoList = function(_nc,opt) {
  710. if (opt.playingvideos == undefined) opt.playingvideos = new Array();
  711. // STOP OTHER VIDEOS
  712. if (_nc.data('stopallvideos')) {
  713. if (opt.playingvideos != undefined && opt.playingvideos.length>0) {
  714. opt.lastplayedvideos = jQuery.extend(true,[],opt.playingvideos);
  715. jQuery.each(opt.playingvideos,function(i,_nc) {
  716. _R.stopVideo(_nc,opt);
  717. });
  718. }
  719. }
  720. opt.playingvideos.push(_nc);
  721. }
  722. var remVidfromList = function(_nc,opt) {
  723. if (opt.playingvideos != undefined)
  724. opt.playingvideos.splice(jQuery.inArray(_nc,opt.playingvideos),1);
  725. }
  726. })(jQuery);