You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2002 lines
79 KiB

1 year ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. /*___________________________________________________________________________________________________________________________________________________
  2. _ jquery.mb.components _
  3. _ _
  4. _ file: jquery.mb.YTPlayer.src.js _
  5. _ last modified: 05/01/16 17.43 _
  6. _ _
  7. _ Open Lab s.r.l., Florence - Italy _
  8. _ _
  9. _ email: matteo@open-lab.com _
  10. _ site: http://pupunzi.com _
  11. _ http://open-lab.com _
  12. _ blog: http://pupunzi.open-lab.com _
  13. _ Q&A: http://jquery.pupunzi.com _
  14. _ _
  15. _ Licences: MIT, GPL _
  16. _ http://www.opensource.org/licenses/mit-license.php _
  17. _ http://www.gnu.org/licenses/gpl.html _
  18. _ _
  19. _ Copyright (c) 2001-2016. Matteo Bicocchi (Pupunzi); _
  20. ___________________________________________________________________________________________________________________________________________________*/
  21. var ytp = ytp || {};
  22. function onYouTubeIframeAPIReady() {
  23. if( ytp.YTAPIReady ) return;
  24. ytp.YTAPIReady = true;
  25. jQuery( document ).trigger( "YTAPIReady" );
  26. }
  27. var getYTPVideoID = function( url ) {
  28. var videoID, playlistID;
  29. if( url.indexOf( "youtu.be" ) > 0 ) {
  30. videoID = url.substr( url.lastIndexOf( "/" ) + 1, url.length );
  31. playlistID = videoID.indexOf( "?list=" ) > 0 ? videoID.substr( videoID.lastIndexOf( "=" ), videoID.length ) : null;
  32. videoID = playlistID ? videoID.substr( 0, videoID.lastIndexOf( "?" ) ) : videoID;
  33. } else if( url.indexOf( "http" ) > -1 ) {
  34. //videoID = url.match( /([\/&]v\/([^&#]*))|([\\?&]v=([^&#]*))/ )[ 1 ];
  35. videoID = url.match( /[\\?&]v=([^&#]*)/ )[ 1 ];
  36. playlistID = url.indexOf( "list=" ) > 0 ? url.match( /[\\?&]list=([^&#]*)/ )[ 1 ] : null;
  37. } else {
  38. videoID = url.length > 15 ? null : url;
  39. playlistID = videoID ? null : url;
  40. }
  41. return {
  42. videoID: videoID,
  43. playlistID: playlistID
  44. };
  45. };
  46. ( function( jQuery, ytp ) {
  47. jQuery.mbYTPlayer = {
  48. name: "jquery.mb.YTPlayer",
  49. version: "3.0.5",
  50. build: "5852",
  51. author: "Matteo Bicocchi",
  52. apiKey: "",
  53. defaults: {
  54. containment: "body",
  55. ratio: "auto", // "auto", "16/9", "4/3"
  56. videoURL: null,
  57. playlistURL: null,
  58. startAt: 0,
  59. stopAt: 0,
  60. autoPlay: true,
  61. vol: 50, // 1 to 100
  62. addRaster: false,
  63. mask: false,
  64. opacity: 1,
  65. quality: "default", //or “small”, “medium”, “large”, “hd720”, “hd1080”, “highres”
  66. mute: false,
  67. loop: true,
  68. showControls: false,
  69. showAnnotations: false,
  70. showYTLogo: false,
  71. stopMovieOnBlur: false,
  72. realfullscreen: true,
  73. mobileFallbackImage: null,
  74. gaTrack: true,
  75. optimizeDisplay: true,
  76. align: "center,center", // top,bottom,left,right
  77. onReady: function( player ) {}
  78. },
  79. /**
  80. * @fontface icons
  81. * */
  82. controls: {
  83. play: "P",
  84. pause: "p",
  85. mute: "M",
  86. unmute: "A",
  87. onlyYT: "O",
  88. showSite: "R",
  89. ytLogo: "Y"
  90. },
  91. locationProtocol: "https:",
  92. filters: {
  93. grayscale: {
  94. value: 0,
  95. unit: "%"
  96. },
  97. hue_rotate: {
  98. value: 0,
  99. unit: "deg"
  100. },
  101. invert: {
  102. value: 0,
  103. unit: "%"
  104. },
  105. opacity: {
  106. value: 0,
  107. unit: "%"
  108. },
  109. saturate: {
  110. value: 0,
  111. unit: "%"
  112. },
  113. sepia: {
  114. value: 0,
  115. unit: "%"
  116. },
  117. brightness: {
  118. value: 0,
  119. unit: "%"
  120. },
  121. contrast: {
  122. value: 0,
  123. unit: "%"
  124. },
  125. blur: {
  126. value: 0,
  127. unit: "px"
  128. }
  129. },
  130. /**
  131. *
  132. * @param options
  133. * @returns [players]
  134. */
  135. buildPlayer: function( options ) {
  136. return this.each( function() {
  137. var YTPlayer = this;
  138. var $YTPlayer = jQuery( YTPlayer );
  139. YTPlayer.loop = 0;
  140. YTPlayer.opt = {};
  141. YTPlayer.state = {};
  142. YTPlayer.filters = jQuery.mbYTPlayer.filters;
  143. YTPlayer.filtersEnabled = true;
  144. YTPlayer.id = YTPlayer.id || "YTP_" + new Date().getTime();
  145. $YTPlayer.addClass( "mb_YTPlayer" );
  146. var property = $YTPlayer.data( "property" ) && typeof $YTPlayer.data( "property" ) == "string" ? eval( '(' + $YTPlayer.data( "property" ) + ')' ) : $YTPlayer.data( "property" );
  147. if( typeof property != "undefined" && typeof property.vol != "undefined" ) property.vol = property.vol === 0 ? property.vol = 1 : property.vol;
  148. jQuery.extend( YTPlayer.opt, jQuery.mbYTPlayer.defaults, options, property );
  149. if( !YTPlayer.hasChanged ) {
  150. YTPlayer.defaultOpt = {};
  151. jQuery.extend( YTPlayer.defaultOpt, jQuery.mbYTPlayer.defaults, options );
  152. }
  153. if( YTPlayer.opt.loop == "true" )
  154. YTPlayer.opt.loop = 9999;
  155. YTPlayer.isRetina = ( window.retina || window.devicePixelRatio > 1 );
  156. var isIframe = function() {
  157. var isIfr = false;
  158. try {
  159. if( self.location.href != top.location.href ) isIfr = true;
  160. } catch( e ) {
  161. isIfr = true;
  162. }
  163. return isIfr;
  164. };
  165. YTPlayer.canGoFullScreen = !( jQuery.browser.msie || jQuery.browser.opera || isIframe() );
  166. if( !YTPlayer.canGoFullScreen ) YTPlayer.opt.realfullscreen = false;
  167. if( !$YTPlayer.attr( "id" ) ) $YTPlayer.attr( "id", "video_" + new Date().getTime() );
  168. var playerID = "mbYTP_" + YTPlayer.id;
  169. YTPlayer.isAlone = false;
  170. YTPlayer.hasFocus = true;
  171. var videoID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).videoID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).videoID : false;
  172. var playlistID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).playlistID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).playlistID : false;
  173. YTPlayer.videoID = videoID;
  174. YTPlayer.playlistID = playlistID;
  175. YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? '0' : '3';
  176. var playerVars = {
  177. 'modestbranding': 1,
  178. 'autoplay': 0,
  179. 'controls': 0,
  180. 'showinfo': 0,
  181. 'rel': 0,
  182. 'enablejsapi': 1,
  183. 'version': 3,
  184. 'playerapiid': playerID,
  185. 'origin': '*',
  186. 'allowfullscreen': true,
  187. 'wmode': 'transparent',
  188. 'iv_load_policy': YTPlayer.opt.showAnnotations
  189. };
  190. if( document.createElement( 'video' ).canPlayType ) jQuery.extend( playerVars, {
  191. 'html5': 1
  192. } );
  193. if( jQuery.browser.msie && jQuery.browser.version < 9 ) this.opt.opacity = 1;
  194. YTPlayer.isSelf = YTPlayer.opt.containment == "self";
  195. YTPlayer.defaultOpt.containment = YTPlayer.opt.containment = YTPlayer.opt.containment == "self" ? jQuery( this ) : jQuery( YTPlayer.opt.containment );
  196. YTPlayer.isBackground = YTPlayer.opt.containment.is( "body" );
  197. if( YTPlayer.isBackground && ytp.backgroundIsInited )
  198. return;
  199. var isPlayer = YTPlayer.opt.containment.is( jQuery( this ) );
  200. YTPlayer.canPlayOnMobile = isPlayer && jQuery( this ).children().length === 0;
  201. YTPlayer.isPlayer = false;
  202. if( !isPlayer ) {
  203. $YTPlayer.hide();
  204. } else {
  205. YTPlayer.isPlayer = true;
  206. }
  207. var overlay = jQuery( "<div/>" ).css( {
  208. position: "absolute",
  209. top: 0,
  210. left: 0,
  211. width: "100%",
  212. height: "100%"
  213. } ).addClass( "YTPOverlay" );
  214. if( YTPlayer.isPlayer ) {
  215. overlay.on( "click", function() {
  216. $YTPlayer.YTPTogglePlay();
  217. } )
  218. }
  219. var wrapper = jQuery( "<div/>" ).addClass( "mbYTP_wrapper" ).attr( "id", "wrapper_" + playerID );
  220. wrapper.css( {
  221. position: "absolute",
  222. zIndex: 0,
  223. minWidth: "100%",
  224. minHeight: "100%",
  225. left: 0,
  226. top: 0,
  227. overflow: "hidden",
  228. opacity: 0
  229. } );
  230. var playerBox = jQuery( "<div/>" ).attr( "id", playerID ).addClass( "playerBox" );
  231. playerBox.css( {
  232. position: "absolute",
  233. zIndex: 0,
  234. width: "100%",
  235. height: "100%",
  236. top: 0,
  237. left: 0,
  238. overflow: "hidden"
  239. } );
  240. wrapper.append( playerBox );
  241. YTPlayer.opt.containment.children().not( "script, style" ).each( function() {
  242. if( jQuery( this ).css( "position" ) == "static" ) jQuery( this ).css( "position", "relative" );
  243. } );
  244. if( YTPlayer.isBackground ) {
  245. jQuery( "body" ).css( {
  246. boxSizing: "border-box"
  247. } );
  248. wrapper.css( {
  249. position: "fixed",
  250. top: 0,
  251. left: 0,
  252. zIndex: 0
  253. } );
  254. $YTPlayer.hide();
  255. } else if( YTPlayer.opt.containment.css( "position" ) == "static" )
  256. YTPlayer.opt.containment.css( {
  257. position: "relative"
  258. } );
  259. YTPlayer.opt.containment.prepend( wrapper );
  260. YTPlayer.wrapper = wrapper;
  261. playerBox.css( {
  262. opacity: 1
  263. } );
  264. if( !jQuery.browser.mobile ) {
  265. playerBox.after( overlay );
  266. YTPlayer.overlay = overlay;
  267. }
  268. if( !YTPlayer.isBackground ) {
  269. overlay.on( "mouseenter", function() {
  270. if( YTPlayer.controlBar.length )
  271. YTPlayer.controlBar.addClass( "visible" );
  272. } ).on( "mouseleave", function() {
  273. if( YTPlayer.controlBar.length )
  274. YTPlayer.controlBar.removeClass( "visible" );
  275. } );
  276. }
  277. if( !ytp.YTAPIReady ) {
  278. jQuery( "#YTAPI" ).remove();
  279. var tag = jQuery( "<script></script>" ).attr( {
  280. "src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version,
  281. "id": "YTAPI"
  282. } );
  283. jQuery( "head" ).prepend( tag );
  284. } else {
  285. setTimeout( function() {
  286. jQuery( document ).trigger( "YTAPIReady" );
  287. }, 100 )
  288. }
  289. if( jQuery.browser.mobile && !YTPlayer.canPlayOnMobile ) {
  290. if( YTPlayer.opt.mobileFallbackImage ) {
  291. YTPlayer.opt.containment.css( {
  292. backgroundImage: "url(" + YTPlayer.opt.mobileFallbackImage + ")",
  293. backgroundPosition: "center center",
  294. backgroundSize: "cover",
  295. backgroundRepeat: "no-repeat"
  296. } )
  297. };
  298. $YTPlayer.remove();
  299. jQuery( document ).trigger( "YTPUnavailable" );
  300. return;
  301. }
  302. jQuery( document ).on( "YTAPIReady", function() {
  303. if( ( YTPlayer.isBackground && ytp.backgroundIsInited ) || YTPlayer.isInit ) return;
  304. if( YTPlayer.isBackground ) {
  305. ytp.backgroundIsInited = true;
  306. }
  307. YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? ( YTPlayer.isBackground ? true : false ) : YTPlayer.opt.autoPlay;
  308. YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100;
  309. jQuery.mbYTPlayer.getDataFromAPI( YTPlayer );
  310. jQuery( YTPlayer ).on( "YTPChanged", function() {
  311. if( YTPlayer.isInit )
  312. return;
  313. YTPlayer.isInit = true;
  314. //if is mobile && isPlayer fallback to the default YT player
  315. if( jQuery.browser.mobile && YTPlayer.canPlayOnMobile ) {
  316. // Try to adjust the player dimention
  317. if( YTPlayer.opt.containment.outerWidth() > jQuery( window ).width() ) {
  318. YTPlayer.opt.containment.css( {
  319. maxWidth: "100%"
  320. } );
  321. var h = YTPlayer.opt.containment.outerWidth() * .563;
  322. YTPlayer.opt.containment.css( {
  323. maxHeight: h
  324. } );
  325. }
  326. new YT.Player( playerID, {
  327. videoId: YTPlayer.videoID.toString(),
  328. width: '100%',
  329. height: h,
  330. playerVars: playerVars,
  331. events: {
  332. 'onReady': function( event ) {
  333. YTPlayer.player = event.target;
  334. playerBox.css( {
  335. opacity: 1
  336. } );
  337. YTPlayer.wrapper.css( {
  338. opacity: 1
  339. } );
  340. }
  341. }
  342. } );
  343. return;
  344. }
  345. new YT.Player( playerID, {
  346. videoId: YTPlayer.videoID.toString(),
  347. playerVars: playerVars,
  348. events: {
  349. 'onReady': function( event ) {
  350. YTPlayer.player = event.target;
  351. if( YTPlayer.isReady ) return;
  352. YTPlayer.isReady = YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ? false : true;
  353. YTPlayer.playerEl = YTPlayer.player.getIframe();
  354. jQuery( YTPlayer.playerEl ).unselectable();
  355. $YTPlayer.optimizeDisplay();
  356. YTPlayer.videoID = videoID;
  357. jQuery( window ).off( "resize.YTP_" + YTPlayer.id ).on( "resize.YTP_" + YTPlayer.id, function() {
  358. $YTPlayer.optimizeDisplay();
  359. } );
  360. jQuery.mbYTPlayer.checkForState( YTPlayer );
  361. },
  362. /**
  363. *
  364. * @param event
  365. *
  366. * -1 (unstarted)
  367. * 0 (ended)
  368. * 1 (playing)
  369. * 2 (paused)
  370. * 3 (buffering)
  371. * 5 (video cued).
  372. *
  373. *
  374. */
  375. 'onStateChange': function( event ) {
  376. if( typeof event.target.getPlayerState != "function" ) return;
  377. var state = event.target.getPlayerState();
  378. if( YTPlayer.state == state ) return;
  379. if( YTPlayer.preventTrigger ) {
  380. YTPlayer.preventTrigger = false;
  381. return
  382. }
  383. YTPlayer.state = state;
  384. var eventType;
  385. switch( state ) {
  386. case -1: //----------------------------------------------- unstarted
  387. eventType = "YTPUnstarted";
  388. break;
  389. case 0: //------------------------------------------------ ended
  390. eventType = "YTPEnd";
  391. break;
  392. case 1: //------------------------------------------------ play
  393. eventType = "YTPPlay";
  394. if( YTPlayer.controlBar.length )
  395. YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.pause );
  396. if( typeof _gaq != "undefined" && eval( YTPlayer.opt.gaTrack ) ) _gaq.push( [ '_trackEvent', 'YTPlayer', 'Play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) ] );
  397. if( typeof ga != "undefined" && eval( YTPlayer.opt.gaTrack ) ) ga( 'send', 'event', 'YTPlayer', 'play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) );
  398. break;
  399. case 2: //------------------------------------------------ pause
  400. eventType = "YTPPause";
  401. if( YTPlayer.controlBar.length )
  402. YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play );
  403. break;
  404. case 3: //------------------------------------------------ buffer
  405. YTPlayer.player.setPlaybackQuality( YTPlayer.opt.quality );
  406. eventType = "YTPBuffering";
  407. if( YTPlayer.controlBar.length )
  408. YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play );
  409. break;
  410. case 5: //------------------------------------------------ cued
  411. eventType = "YTPCued";
  412. break;
  413. default:
  414. break;
  415. }
  416. // Trigger state events
  417. var YTPEvent = jQuery.Event( eventType );
  418. YTPEvent.time = YTPlayer.currentTime;
  419. if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent );
  420. },
  421. /**
  422. *
  423. * @param e
  424. */
  425. 'onPlaybackQualityChange': function( e ) {
  426. var quality = e.target.getPlaybackQuality();
  427. var YTPQualityChange = jQuery.Event( "YTPQualityChange" );
  428. YTPQualityChange.quality = quality;
  429. jQuery( YTPlayer ).trigger( YTPQualityChange );
  430. },
  431. /**
  432. *
  433. * @param err
  434. */
  435. 'onError': function( err ) {
  436. if( err.data == 150 ) {
  437. console.log( "Embedding this video is restricted by Youtube." );
  438. if( YTPlayer.isPlayList ) jQuery( YTPlayer ).playNext();
  439. }
  440. if( err.data == 2 && YTPlayer.isPlayList )
  441. jQuery( YTPlayer ).playNext();
  442. if( typeof YTPlayer.opt.onError == "function" )
  443. YTPlayer.opt.onError( $YTPlayer, err );
  444. }
  445. }
  446. } );
  447. } );
  448. } );
  449. $YTPlayer.off( "YTPTime.mask" );
  450. jQuery.mbYTPlayer.applyMask( YTPlayer );
  451. } );
  452. },
  453. /**
  454. *
  455. * @param YTPlayer
  456. */
  457. getDataFromAPI: function( YTPlayer ) {
  458. YTPlayer.videoData = jQuery.mbStorage.get( "YTPlayer_data_" + YTPlayer.videoID );
  459. jQuery( YTPlayer ).off( "YTPData.YTPlayer" ).on( "YTPData.YTPlayer", function() {
  460. if( YTPlayer.hasData ) {
  461. if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) {
  462. var bgndURL = YTPlayer.videoData.thumb_max || YTPlayer.videoData.thumb_high || YTPlayer.videoData.thumb_medium;
  463. YTPlayer.opt.containment.css( {
  464. background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center",
  465. backgroundSize: "cover"
  466. } );
  467. YTPlayer.opt.backgroundUrl = bgndURL;
  468. }
  469. }
  470. } );
  471. if( YTPlayer.videoData ) {
  472. setTimeout( function() {
  473. YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio;
  474. YTPlayer.dataReceived = true;
  475. jQuery( YTPlayer ).trigger( "YTPChanged" );
  476. var YTPData = jQuery.Event( "YTPData" );
  477. YTPData.prop = {};
  478. for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ];
  479. jQuery( YTPlayer ).trigger( YTPData );
  480. }, 500 );
  481. YTPlayer.hasData = true;
  482. } else if( jQuery.mbYTPlayer.apiKey ) {
  483. // Get video info from API3 (needs api key)
  484. // snippet,player,contentDetails,statistics,status
  485. jQuery.getJSON( jQuery.mbYTPlayer.locationProtocol + "//www.googleapis.com/youtube/v3/videos?id=" + YTPlayer.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function( data ) {
  486. YTPlayer.dataReceived = true;
  487. jQuery( YTPlayer ).trigger( "YTPChanged" );
  488. function parseYTPlayer_data( data ) {
  489. YTPlayer.videoData = {};
  490. YTPlayer.videoData.id = YTPlayer.videoID;
  491. YTPlayer.videoData.channelTitle = data.channelTitle;
  492. YTPlayer.videoData.title = data.title;
  493. YTPlayer.videoData.description = data.description.length < 400 ? data.description : data.description.substring( 0, 400 ) + " ...";
  494. YTPlayer.videoData.aspectratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio;
  495. YTPlayer.opt.ratio = YTPlayer.videoData.aspectratio;
  496. YTPlayer.videoData.thumb_max = data.thumbnails.maxres ? data.thumbnails.maxres.url : null;
  497. YTPlayer.videoData.thumb_high = data.thumbnails.high ? data.thumbnails.high.url : null;
  498. YTPlayer.videoData.thumb_medium = data.thumbnails.medium ? data.thumbnails.medium.url : null;
  499. jQuery.mbStorage.set( "YTPlayer_data_" + YTPlayer.videoID, YTPlayer.videoData );
  500. }
  501. parseYTPlayer_data( data.items[ 0 ].snippet );
  502. YTPlayer.hasData = true;
  503. var YTPData = jQuery.Event( "YTPData" );
  504. YTPData.prop = {};
  505. for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ];
  506. jQuery( YTPlayer ).trigger( YTPData );
  507. } );
  508. } else {
  509. setTimeout( function() {
  510. jQuery( YTPlayer ).trigger( "YTPChanged" );
  511. }, 50 );
  512. if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) {
  513. var bgndURL = jQuery.mbYTPlayer.locationProtocol + "//i.ytimg.com/vi/" + YTPlayer.videoID + "/hqdefault.jpg";
  514. YTPlayer.opt.containment.css( {
  515. background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center",
  516. backgroundSize: "cover"
  517. } );
  518. YTPlayer.opt.backgroundUrl = bgndURL;
  519. }
  520. YTPlayer.videoData = null;
  521. YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio;
  522. }
  523. if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) {
  524. YTPlayer.loading = jQuery( "<div/>" ).addClass( "loading" ).html( "Loading" ).hide();
  525. jQuery( YTPlayer ).append( YTPlayer.loading );
  526. YTPlayer.loading.fadeIn();
  527. }
  528. },
  529. /**
  530. *
  531. */
  532. removeStoredData: function() {
  533. jQuery.mbStorage.remove();
  534. },
  535. /**
  536. *
  537. * @returns {*|YTPlayer.videoData}
  538. */
  539. getVideoData: function() {
  540. var YTPlayer = this.get( 0 );
  541. return YTPlayer.videoData;
  542. },
  543. /**
  544. *
  545. * @returns {*|YTPlayer.videoID|boolean}
  546. */
  547. getVideoID: function() {
  548. var YTPlayer = this.get( 0 );
  549. return YTPlayer.videoID || false;
  550. },
  551. /**
  552. *
  553. * @param quality
  554. */
  555. setVideoQuality: function( quality ) {
  556. var YTPlayer = this.get( 0 );
  557. //if( !jQuery.browser.chrome )
  558. YTPlayer.player.setPlaybackQuality( quality );
  559. },
  560. /**
  561. * @param videos
  562. * @param shuffle
  563. * @param callback
  564. * @returns {jQuery.mbYTPlayer}
  565. */
  566. playlist: function( videos, shuffle, callback ) {
  567. var $YTPlayer = this;
  568. var YTPlayer = $YTPlayer.get( 0 );
  569. YTPlayer.isPlayList = true;
  570. if( shuffle ) videos = jQuery.shuffle( videos );
  571. if( !YTPlayer.videoID ) {
  572. YTPlayer.videos = videos;
  573. YTPlayer.videoCounter = 0;
  574. YTPlayer.videoLength = videos.length;
  575. jQuery( YTPlayer ).data( "property", videos[ 0 ] );
  576. jQuery( YTPlayer ).mb_YTPlayer();
  577. }
  578. if( typeof callback == "function" ) jQuery( YTPlayer ).one( "YTPChanged", function() {
  579. callback( YTPlayer );
  580. } );
  581. jQuery( YTPlayer ).on( "YTPEnd", function() {
  582. jQuery( YTPlayer ).playNext();
  583. } );
  584. return $YTPlayer;
  585. },
  586. /**
  587. *
  588. * @returns {jQuery.mbYTPlayer}
  589. */
  590. playNext: function() {
  591. var YTPlayer = this.get( 0 );
  592. if( YTPlayer.checkForStartAt ) {
  593. clearTimeout( YTPlayer.checkForStartAt );
  594. clearInterval( YTPlayer.getState );
  595. }
  596. YTPlayer.videoCounter++;
  597. if( YTPlayer.videoCounter >= YTPlayer.videoLength ) YTPlayer.videoCounter = 0;
  598. jQuery( YTPlayer ).changeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] );
  599. return this;
  600. },
  601. /**
  602. *
  603. * @returns {jQuery.mbYTPlayer}
  604. */
  605. playPrev: function() {
  606. var YTPlayer = this.get( 0 );
  607. if( YTPlayer.checkForStartAt ) {
  608. clearInterval( YTPlayer.checkForStartAt );
  609. clearInterval( YTPlayer.getState );
  610. }
  611. YTPlayer.videoCounter--;
  612. if( YTPlayer.videoCounter < 0 ) YTPlayer.videoCounter = YTPlayer.videoLength - 1;
  613. jQuery( YTPlayer ).changeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] );
  614. return this;
  615. },
  616. /**
  617. *
  618. * @param opt
  619. */
  620. changeMovie: function( opt ) {
  621. var $YTPlayer = this;
  622. var YTPlayer = $YTPlayer.get( 0 );
  623. YTPlayer.opt.startAt = 0;
  624. YTPlayer.opt.stopAt = 0;
  625. YTPlayer.opt.mask = false;
  626. YTPlayer.opt.mute = true;
  627. YTPlayer.hasData = false;
  628. YTPlayer.hasChanged = true;
  629. YTPlayer.player.loopTime = undefined;
  630. if( opt )
  631. jQuery.extend( YTPlayer.opt, opt ); //YTPlayer.defaultOpt,
  632. YTPlayer.videoID = getYTPVideoID( YTPlayer.opt.videoURL ).videoID;
  633. if( YTPlayer.opt.loop == "true" )
  634. YTPlayer.opt.loop = 9999;
  635. jQuery( YTPlayer.playerEl ).CSSAnimate( {
  636. opacity: 0
  637. }, 200, function() {
  638. var YTPChangeMovie = jQuery.Event( "YTPChangeMovie" );
  639. YTPChangeMovie.time = YTPlayer.currentTime;
  640. YTPChangeMovie.videoId = YTPlayer.videoID;
  641. jQuery( YTPlayer ).trigger( YTPChangeMovie );
  642. jQuery( YTPlayer ).YTPGetPlayer().cueVideoByUrl( encodeURI( jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/v/" + YTPlayer.videoID ), 1, YTPlayer.opt.quality );
  643. jQuery( YTPlayer ).optimizeDisplay();
  644. jQuery.mbYTPlayer.checkForState( YTPlayer );
  645. jQuery.mbYTPlayer.getDataFromAPI( YTPlayer );
  646. } );
  647. jQuery.mbYTPlayer.applyMask( YTPlayer );
  648. },
  649. /**
  650. *
  651. * @returns {player}
  652. */
  653. getPlayer: function() {
  654. return jQuery( this ).get( 0 ).player;
  655. },
  656. playerDestroy: function() {
  657. var YTPlayer = this.get( 0 );
  658. ytp.YTAPIReady = true;
  659. ytp.backgroundIsInited = false;
  660. YTPlayer.isInit = false;
  661. YTPlayer.videoID = null;
  662. var playerBox = YTPlayer.wrapper;
  663. playerBox.remove();
  664. jQuery( "#controlBar_" + YTPlayer.id ).remove();
  665. clearInterval( YTPlayer.checkForStartAt );
  666. clearInterval( YTPlayer.getState );
  667. return this;
  668. },
  669. /**
  670. *
  671. * @param real
  672. * @returns {jQuery.mbYTPlayer}
  673. */
  674. fullscreen: function( real ) {
  675. var YTPlayer = this.get( 0 );
  676. if( typeof real == "undefined" ) real = YTPlayer.opt.realfullscreen;
  677. real = eval( real );
  678. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  679. var fullScreenBtn = controls.find( ".mb_OnlyYT" );
  680. var videoWrapper = YTPlayer.isSelf ? YTPlayer.opt.containment : YTPlayer.wrapper;
  681. //var videoWrapper = YTPlayer.wrapper;
  682. if( real ) {
  683. var fullscreenchange = jQuery.browser.mozilla ? "mozfullscreenchange" : jQuery.browser.webkit ? "webkitfullscreenchange" : "fullscreenchange";
  684. jQuery( document ).off( fullscreenchange ).on( fullscreenchange, function() {
  685. var isFullScreen = RunPrefixMethod( document, "IsFullScreen" ) || RunPrefixMethod( document, "FullScreen" );
  686. if( !isFullScreen ) {
  687. YTPlayer.isAlone = false;
  688. fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT );
  689. jQuery( YTPlayer ).YTPSetVideoQuality( YTPlayer.opt.quality );
  690. videoWrapper.removeClass( "YTPFullscreen" );
  691. videoWrapper.CSSAnimate( {
  692. opacity: YTPlayer.opt.opacity
  693. }, 500 );
  694. videoWrapper.css( {
  695. zIndex: 0
  696. } );
  697. if( YTPlayer.isBackground ) {
  698. jQuery( "body" ).after( controls );
  699. } else {
  700. YTPlayer.wrapper.before( controls );
  701. }
  702. jQuery( window ).resize();
  703. jQuery( YTPlayer ).trigger( "YTPFullScreenEnd" );
  704. } else {
  705. jQuery( YTPlayer ).YTPSetVideoQuality( "default" );
  706. jQuery( YTPlayer ).trigger( "YTPFullScreenStart" );
  707. }
  708. } );
  709. }
  710. if( !YTPlayer.isAlone ) {
  711. function hideMouse() {
  712. YTPlayer.overlay.css( {
  713. cursor: "none"
  714. } );
  715. }
  716. jQuery( document ).on( "mousemove.YTPlayer", function( e ) {
  717. YTPlayer.overlay.css( {
  718. cursor: "auto"
  719. } );
  720. clearTimeout( YTPlayer.hideCursor );
  721. if( !jQuery( e.target ).parents().is( ".mb_YTPBar" ) ) YTPlayer.hideCursor = setTimeout( hideMouse, 3000 );
  722. } );
  723. hideMouse();
  724. if( real ) {
  725. videoWrapper.css( {
  726. opacity: 0
  727. } );
  728. videoWrapper.addClass( "YTPFullscreen" );
  729. launchFullscreen( videoWrapper.get( 0 ) );
  730. setTimeout( function() {
  731. videoWrapper.CSSAnimate( {
  732. opacity: 1
  733. }, 1000 );
  734. YTPlayer.wrapper.append( controls );
  735. jQuery( YTPlayer ).optimizeDisplay();
  736. YTPlayer.player.seekTo( YTPlayer.player.getCurrentTime() + .1, true );
  737. }, 500 )
  738. } else videoWrapper.css( {
  739. zIndex: 10000
  740. } ).CSSAnimate( {
  741. opacity: 1
  742. }, 1000 );
  743. fullScreenBtn.html( jQuery.mbYTPlayer.controls.showSite );
  744. YTPlayer.isAlone = true;
  745. } else {
  746. jQuery( document ).off( "mousemove.YTPlayer" );
  747. YTPlayer.overlay.css( {
  748. cursor: "auto"
  749. } );
  750. if( real ) {
  751. cancelFullscreen();
  752. } else {
  753. videoWrapper.CSSAnimate( {
  754. opacity: YTPlayer.opt.opacity
  755. }, 500 );
  756. videoWrapper.css( {
  757. zIndex: 0
  758. } );
  759. }
  760. fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT );
  761. YTPlayer.isAlone = false;
  762. }
  763. function RunPrefixMethod( obj, method ) {
  764. var pfx = [ "webkit", "moz", "ms", "o", "" ];
  765. var p = 0,
  766. m, t;
  767. while( p < pfx.length && !obj[ m ] ) {
  768. m = method;
  769. if( pfx[ p ] == "" ) {
  770. m = m.substr( 0, 1 ).toLowerCase() + m.substr( 1 );
  771. }
  772. m = pfx[ p ] + m;
  773. t = typeof obj[ m ];
  774. if( t != "undefined" ) {
  775. pfx = [ pfx[ p ] ];
  776. return( t == "function" ? obj[ m ]() : obj[ m ] );
  777. }
  778. p++;
  779. }
  780. }
  781. function launchFullscreen( element ) {
  782. RunPrefixMethod( element, "RequestFullScreen" );
  783. }
  784. function cancelFullscreen() {
  785. if( RunPrefixMethod( document, "FullScreen" ) || RunPrefixMethod( document, "IsFullScreen" ) ) {
  786. RunPrefixMethod( document, "CancelFullScreen" );
  787. }
  788. }
  789. return this;
  790. },
  791. /**
  792. *
  793. * @returns {jQuery.mbYTPlayer}
  794. */
  795. toggleLoops: function() {
  796. var YTPlayer = this.get( 0 );
  797. var data = YTPlayer.opt;
  798. if( data.loop == 1 ) {
  799. data.loop = 0;
  800. } else {
  801. if( data.startAt ) {
  802. YTPlayer.player.seekTo( data.startAt );
  803. } else {
  804. YTPlayer.player.playVideo();
  805. }
  806. data.loop = 1;
  807. }
  808. return this;
  809. },
  810. /**
  811. *
  812. * @returns {jQuery.mbYTPlayer}
  813. */
  814. play: function() {
  815. var YTPlayer = this.get( 0 );
  816. if( !YTPlayer.isReady ) return;
  817. YTPlayer.player.playVideo();
  818. YTPlayer.wrapper.CSSAnimate( {
  819. opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
  820. }, 2000 );
  821. jQuery( YTPlayer.playerEl ).CSSAnimate( {
  822. opacity: 1
  823. }, 1000 );
  824. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  825. var playBtn = controls.find( ".mb_YTPPlaypause" );
  826. playBtn.html( jQuery.mbYTPlayer.controls.pause );
  827. jQuery( YTPlayer ).css( "background-image", "none" );
  828. return this;
  829. },
  830. /**
  831. *
  832. * @param callback
  833. * @returns {jQuery.mbYTPlayer}
  834. */
  835. togglePlay: function( callback ) {
  836. var YTPlayer = this.get( 0 );
  837. if( YTPlayer.state == 1 ) this.YTPPause();
  838. else this.YTPPlay();
  839. if( typeof callback == "function" )
  840. callback( YTPlayer.state );
  841. return this;
  842. },
  843. /**
  844. *
  845. * @returns {jQuery.mbYTPlayer}
  846. */
  847. stop: function() {
  848. var YTPlayer = this.get( 0 );
  849. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  850. var playBtn = controls.find( ".mb_YTPPlaypause" );
  851. playBtn.html( jQuery.mbYTPlayer.controls.play );
  852. YTPlayer.player.stopVideo();
  853. return this;
  854. },
  855. /**
  856. *
  857. * @returns {jQuery.mbYTPlayer}
  858. */
  859. pause: function() {
  860. var YTPlayer = this.get( 0 );
  861. YTPlayer.player.pauseVideo();
  862. return this;
  863. },
  864. /**
  865. *
  866. * @param val
  867. * @returns {jQuery.mbYTPlayer}
  868. */
  869. seekTo: function( val ) {
  870. var YTPlayer = this.get( 0 );
  871. YTPlayer.player.seekTo( val, true );
  872. return this;
  873. },
  874. /**
  875. *
  876. * @param val
  877. * @returns {jQuery.mbYTPlayer}
  878. */
  879. setVolume: function( val ) {
  880. var YTPlayer = this.get( 0 );
  881. if( !val && !YTPlayer.opt.vol && YTPlayer.player.getVolume() == 0 ) jQuery( YTPlayer ).YTPUnmute();
  882. else if( ( !val && YTPlayer.player.getVolume() > 0 ) || ( val && YTPlayer.opt.vol == val ) ) {
  883. if( !YTPlayer.isMute ) jQuery( YTPlayer ).YTPMute();
  884. else jQuery( YTPlayer ).YTPUnmute();
  885. } else {
  886. YTPlayer.opt.vol = val;
  887. YTPlayer.player.setVolume( YTPlayer.opt.vol );
  888. if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( val )
  889. }
  890. return this;
  891. },
  892. /**
  893. *
  894. * @returns {boolean}
  895. */
  896. toggleVolume: function() {
  897. var YTPlayer = this.get( 0 );
  898. if( !YTPlayer ) return;
  899. if( YTPlayer.player.isMuted() ) {
  900. jQuery( YTPlayer ).YTPUnmute();
  901. return true;
  902. } else {
  903. jQuery( YTPlayer ).YTPMute();
  904. return false;
  905. }
  906. },
  907. /**
  908. *
  909. * @returns {jQuery.mbYTPlayer}
  910. */
  911. mute: function() {
  912. var YTPlayer = this.get( 0 );
  913. if( YTPlayer.isMute ) return;
  914. YTPlayer.player.mute();
  915. YTPlayer.isMute = true;
  916. YTPlayer.player.setVolume( 0 );
  917. if( YTPlayer.volumeBar && YTPlayer.volumeBar.length && YTPlayer.volumeBar.width() > 10 ) {
  918. YTPlayer.volumeBar.updateSliderVal( 0 );
  919. }
  920. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  921. var muteBtn = controls.find( ".mb_YTPMuteUnmute" );
  922. muteBtn.html( jQuery.mbYTPlayer.controls.unmute );
  923. jQuery( YTPlayer ).addClass( "isMuted" );
  924. if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.addClass( "muted" );
  925. var YTPEvent = jQuery.Event( "YTPMuted" );
  926. YTPEvent.time = YTPlayer.currentTime;
  927. if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent );
  928. return this;
  929. },
  930. /**
  931. *
  932. * @returns {jQuery.mbYTPlayer}
  933. */
  934. unmute: function() {
  935. var YTPlayer = this.get( 0 );
  936. if( !YTPlayer.isMute ) return;
  937. YTPlayer.player.unMute();
  938. YTPlayer.isMute = false;
  939. YTPlayer.player.setVolume( YTPlayer.opt.vol );
  940. if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol > 10 ? YTPlayer.opt.vol : 10 );
  941. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  942. var muteBtn = controls.find( ".mb_YTPMuteUnmute" );
  943. muteBtn.html( jQuery.mbYTPlayer.controls.mute );
  944. jQuery( YTPlayer ).removeClass( "isMuted" );
  945. if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.removeClass( "muted" );
  946. var YTPEvent = jQuery.Event( "YTPUnmuted" );
  947. YTPEvent.time = YTPlayer.currentTime;
  948. if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent );
  949. return this;
  950. },
  951. /**
  952. * FILTERS
  953. *
  954. *
  955. * @param filter
  956. * @param value
  957. * @returns {jQuery.mbYTPlayer}
  958. */
  959. applyFilter: function( filter, value ) {
  960. return this.each( function() {
  961. var YTPlayer = this;
  962. YTPlayer.filters[ filter ].value = value;
  963. if( YTPlayer.filtersEnabled )
  964. jQuery( YTPlayer ).YTPEnableFilters();
  965. } );
  966. },
  967. /**
  968. *
  969. * @param filters
  970. * @returns {jQuery.mbYTPlayer}
  971. */
  972. applyFilters: function( filters ) {
  973. return this.each( function() {
  974. var YTPlayer = this;
  975. if( !YTPlayer.isReady ) {
  976. jQuery( YTPlayer ).on( "YTPReady", function() {
  977. jQuery( YTPlayer ).YTPApplyFilters( filters );
  978. } );
  979. return;
  980. }
  981. for( var key in filters )
  982. jQuery( YTPlayer ).YTPApplyFilter( key, filters[ key ] );
  983. jQuery( YTPlayer ).trigger( "YTPFiltersApplied" );
  984. } );
  985. },
  986. /**
  987. *
  988. * @param filter
  989. * @param value
  990. * @returns {*}
  991. */
  992. toggleFilter: function( filter, value ) {
  993. return this.each( function() {
  994. var YTPlayer = this;
  995. if( !YTPlayer.filters[ filter ].value ) YTPlayer.filters[ filter ].value = value;
  996. else YTPlayer.filters[ filter ].value = 0;
  997. if( YTPlayer.filtersEnabled ) jQuery( this ).YTPEnableFilters();
  998. } );
  999. },
  1000. /**
  1001. *
  1002. * @param callback
  1003. * @returns {*}
  1004. */
  1005. toggleFilters: function( callback ) {
  1006. return this.each( function() {
  1007. var YTPlayer = this;
  1008. if( YTPlayer.filtersEnabled ) {
  1009. jQuery( YTPlayer ).trigger( "YTPDisableFilters" );
  1010. jQuery( YTPlayer ).YTPDisableFilters();
  1011. } else {
  1012. jQuery( YTPlayer ).YTPEnableFilters();
  1013. jQuery( YTPlayer ).trigger( "YTPEnableFilters" );
  1014. }
  1015. if( typeof callback == "function" )
  1016. callback( YTPlayer.filtersEnabled );
  1017. } )
  1018. },
  1019. /**
  1020. *
  1021. * @returns {*}
  1022. */
  1023. disableFilters: function() {
  1024. return this.each( function() {
  1025. var YTPlayer = this;
  1026. var iframe = jQuery( YTPlayer.playerEl );
  1027. iframe.css( "-webkit-filter", "" );
  1028. iframe.css( "filter", "" );
  1029. YTPlayer.filtersEnabled = false;
  1030. } )
  1031. },
  1032. /**
  1033. *
  1034. * @returns {*}
  1035. */
  1036. enableFilters: function() {
  1037. return this.each( function() {
  1038. var YTPlayer = this;
  1039. var iframe = jQuery( YTPlayer.playerEl );
  1040. var filterStyle = "";
  1041. for( var key in YTPlayer.filters ) {
  1042. if( YTPlayer.filters[ key ].value )
  1043. filterStyle += key.replace( "_", "-" ) + "(" + YTPlayer.filters[ key ].value + YTPlayer.filters[ key ].unit + ") ";
  1044. }
  1045. iframe.css( "-webkit-filter", filterStyle );
  1046. iframe.css( "filter", filterStyle );
  1047. YTPlayer.filtersEnabled = true;
  1048. } );
  1049. },
  1050. /**
  1051. *
  1052. * @param filter
  1053. * @param callback
  1054. * @returns {*}
  1055. */
  1056. removeFilter: function( filter, callback ) {
  1057. return this.each( function() {
  1058. var YTPlayer = this;
  1059. if( typeof filter == "function" ) {
  1060. callback = filter;
  1061. filter = null;
  1062. }
  1063. if( !filter )
  1064. for( var key in YTPlayer.filters ) {
  1065. jQuery( this ).YTPApplyFilter( key, 0 );
  1066. if( typeof callback == "function" ) callback( key );
  1067. } else {
  1068. jQuery( this ).YTPApplyFilter( filter, 0 );
  1069. if( typeof callback == "function" ) callback( filter );
  1070. }
  1071. } );
  1072. },
  1073. /**
  1074. *
  1075. * @returns {*}
  1076. */
  1077. getFilters: function() {
  1078. var YTPlayer = this.get( 0 );
  1079. return YTPlayer.filters;
  1080. },
  1081. /**
  1082. * MASK
  1083. *
  1084. *
  1085. * @param mask
  1086. * @returns {jQuery.mbYTPlayer}
  1087. */
  1088. addMask: function( mask ) {
  1089. var YTPlayer = this.get( 0 );
  1090. var overlay = YTPlayer.overlay;
  1091. if( !mask ) {
  1092. mask = YTPlayer.actualMask;
  1093. }
  1094. var tempImg = jQuery( "<img/>" ).attr( "src", mask ).on( "load", function() {
  1095. overlay.CSSAnimate( {
  1096. opacity: 0
  1097. }, 500, function() {
  1098. YTPlayer.hasMask = true;
  1099. tempImg.remove();
  1100. overlay.css( {
  1101. backgroundImage: "url(" + mask + ")",
  1102. backgroundRepeat: "no-repeat",
  1103. backgroundPosition: "center center",
  1104. backgroundSize: "cover"
  1105. } );
  1106. overlay.CSSAnimate( {
  1107. opacity: 1
  1108. }, 500 );
  1109. } );
  1110. } );
  1111. return this;
  1112. },
  1113. /**
  1114. *
  1115. * @returns {jQuery.mbYTPlayer}
  1116. */
  1117. removeMask: function() {
  1118. var YTPlayer = this.get( 0 );
  1119. var overlay = YTPlayer.overlay;
  1120. overlay.CSSAnimate( {
  1121. opacity: 0
  1122. }, 500, function() {
  1123. YTPlayer.hasMask = false;
  1124. overlay.css( {
  1125. backgroundImage: "",
  1126. backgroundRepeat: "",
  1127. backgroundPosition: "",
  1128. backgroundSize: ""
  1129. } );
  1130. overlay.CSSAnimate( {
  1131. opacity: 1
  1132. }, 500 );
  1133. } );
  1134. return this;
  1135. },
  1136. /**
  1137. *
  1138. * @param YTPlayer
  1139. */
  1140. applyMask: function( YTPlayer ) {
  1141. var $YTPlayer = jQuery( YTPlayer );
  1142. $YTPlayer.off( "YTPTime.mask" );
  1143. if( YTPlayer.opt.mask ) {
  1144. if( typeof YTPlayer.opt.mask == "string" ) {
  1145. $YTPlayer.YTPAddMask( YTPlayer.opt.mask );
  1146. YTPlayer.actualMask = YTPlayer.opt.mask;
  1147. } else if( typeof YTPlayer.opt.mask == "object" ) {
  1148. for( var time in YTPlayer.opt.mask ) {
  1149. if( YTPlayer.opt.mask[ time ] )
  1150. var img = jQuery( "<img/>" ).attr( "src", YTPlayer.opt.mask[ time ] );
  1151. }
  1152. if( YTPlayer.opt.mask[ 0 ] )
  1153. $YTPlayer.YTPAddMask( YTPlayer.opt.mask[ 0 ] );
  1154. $YTPlayer.on( "YTPTime.mask", function( e ) {
  1155. for( var time in YTPlayer.opt.mask ) {
  1156. if( e.time == time )
  1157. if( !YTPlayer.opt.mask[ time ] ) {
  1158. $YTPlayer.YTPRemoveMask();
  1159. } else {
  1160. $YTPlayer.YTPAddMask( YTPlayer.opt.mask[ time ] );
  1161. YTPlayer.actualMask = YTPlayer.opt.mask[ time ];
  1162. }
  1163. }
  1164. } );
  1165. }
  1166. }
  1167. },
  1168. /**
  1169. *
  1170. * @returns {{totalTime: number, currentTime: number}}
  1171. */
  1172. manageProgress: function() {
  1173. var YTPlayer = this.get( 0 );
  1174. var controls = jQuery( "#controlBar_" + YTPlayer.id );
  1175. var progressBar = controls.find( ".mb_YTPProgress" );
  1176. var loadedBar = controls.find( ".mb_YTPLoaded" );
  1177. var timeBar = controls.find( ".mb_YTPseekbar" );
  1178. var totW = progressBar.outerWidth();
  1179. var currentTime = Math.floor( YTPlayer.player.getCurrentTime() );
  1180. var totalTime = Math.floor( YTPlayer.player.getDuration() );
  1181. var timeW = ( currentTime * totW ) / totalTime;
  1182. var startLeft = 0;
  1183. var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100;
  1184. loadedBar.css( {
  1185. left: startLeft,
  1186. width: loadedW + "%"
  1187. } );
  1188. timeBar.css( {
  1189. left: 0,
  1190. width: timeW
  1191. } );
  1192. return {
  1193. totalTime: totalTime,
  1194. currentTime: currentTime
  1195. };
  1196. },
  1197. /**
  1198. *
  1199. * @param YTPlayer
  1200. */
  1201. buildControls: function( YTPlayer ) {
  1202. var data = YTPlayer.opt;
  1203. // @data.printUrl: is deprecated; use data.showYTLogo
  1204. data.showYTLogo = data.showYTLogo || data.printUrl;
  1205. if( jQuery( "#controlBar_" + YTPlayer.id ).length ) return;
  1206. YTPlayer.controlBar = jQuery( "<span/>" ).attr( "id", "controlBar_" + YTPlayer.id ).addClass( "mb_YTPBar" ).css( {
  1207. whiteSpace: "noWrap",
  1208. position: YTPlayer.isBackground ? "fixed" : "absolute",
  1209. zIndex: YTPlayer.isBackground ? 10000 : 1000
  1210. } ).hide();
  1211. var buttonBar = jQuery( "<div/>" ).addClass( "buttonBar" );
  1212. /* play/pause button*/
  1213. var playpause = jQuery( "<span>" + jQuery.mbYTPlayer.controls.play + "</span>" ).addClass( "mb_YTPPlaypause ytpicon" ).click( function() {
  1214. if( YTPlayer.player.getPlayerState() == 1 ) jQuery( YTPlayer ).YTPPause();
  1215. else jQuery( YTPlayer ).YTPPlay();
  1216. } );
  1217. /* mute/unmute button*/
  1218. var MuteUnmute = jQuery( "<span>" + jQuery.mbYTPlayer.controls.mute + "</span>" ).addClass( "mb_YTPMuteUnmute ytpicon" ).click( function() {
  1219. if( YTPlayer.player.getVolume() == 0 ) {
  1220. jQuery( YTPlayer ).YTPUnmute();
  1221. } else {
  1222. jQuery( YTPlayer ).YTPMute();
  1223. }
  1224. } );
  1225. /* volume bar*/
  1226. var volumeBar = jQuery( "<div/>" ).addClass( "mb_YTPVolumeBar" ).css( {
  1227. display: "inline-block"
  1228. } );
  1229. YTPlayer.volumeBar = volumeBar;
  1230. /* time elapsed */
  1231. var idx = jQuery( "<span/>" ).addClass( "mb_YTPTime" );
  1232. var vURL = data.videoURL ? data.videoURL : "";
  1233. if( vURL.indexOf( "http" ) < 0 ) vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + data.videoURL;
  1234. var movieUrl = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.ytLogo ).addClass( "mb_YTPUrl ytpicon" ).attr( "title", "view on YouTube" ).on( "click", function() {
  1235. window.open( vURL, "viewOnYT" )
  1236. } );
  1237. var onlyVideo = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.onlyYT ).addClass( "mb_OnlyYT ytpicon" ).on( "click", function() {
  1238. jQuery( YTPlayer ).YTPFullscreen( data.realfullscreen );
  1239. } );
  1240. var progressBar = jQuery( "<div/>" ).addClass( "mb_YTPProgress" ).css( "position", "absolute" ).click( function( e ) {
  1241. timeBar.css( {
  1242. width: ( e.clientX - timeBar.offset().left )
  1243. } );
  1244. YTPlayer.timeW = e.clientX - timeBar.offset().left;
  1245. YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( {
  1246. width: 0
  1247. } );
  1248. var totalTime = Math.floor( YTPlayer.player.getDuration() );
  1249. YTPlayer.goto = ( timeBar.outerWidth() * totalTime ) / progressBar.outerWidth();
  1250. YTPlayer.player.seekTo( parseFloat( YTPlayer.goto ), true );
  1251. YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( {
  1252. width: 0
  1253. } );
  1254. } );
  1255. var loadedBar = jQuery( "<div/>" ).addClass( "mb_YTPLoaded" ).css( "position", "absolute" );
  1256. var timeBar = jQuery( "<div/>" ).addClass( "mb_YTPseekbar" ).css( "position", "absolute" );
  1257. progressBar.append( loadedBar ).append( timeBar );
  1258. buttonBar.append( playpause ).append( MuteUnmute ).append( volumeBar ).append( idx );
  1259. if( data.showYTLogo ) {
  1260. buttonBar.append( movieUrl );
  1261. }
  1262. if( YTPlayer.isBackground || ( eval( YTPlayer.opt.realfullscreen ) && !YTPlayer.isBackground ) ) buttonBar.append( onlyVideo );
  1263. YTPlayer.controlBar.append( buttonBar ).append( progressBar );
  1264. if( !YTPlayer.isBackground ) {
  1265. YTPlayer.controlBar.addClass( "inlinePlayer" );
  1266. YTPlayer.wrapper.before( YTPlayer.controlBar );
  1267. } else {
  1268. jQuery( "body" ).after( YTPlayer.controlBar );
  1269. }
  1270. volumeBar.simpleSlider( {
  1271. initialval: YTPlayer.opt.vol,
  1272. scale: 100,
  1273. orientation: "h",
  1274. callback: function( el ) {
  1275. if( el.value == 0 ) {
  1276. jQuery( YTPlayer ).YTPMute();
  1277. } else {
  1278. jQuery( YTPlayer ).YTPUnmute();
  1279. }
  1280. YTPlayer.player.setVolume( el.value );
  1281. if( !YTPlayer.isMute ) YTPlayer.opt.vol = el.value;
  1282. }
  1283. } );
  1284. },
  1285. /**
  1286. *
  1287. * @param YTPlayer
  1288. */
  1289. checkForState: function( YTPlayer ) {
  1290. var interval = YTPlayer.opt.showControls ? 100 : 400;
  1291. clearInterval( YTPlayer.getState );
  1292. //Checking if player has been removed from scene
  1293. if( !jQuery.contains( document, YTPlayer ) ) {
  1294. jQuery( YTPlayer ).YTPPlayerDestroy();
  1295. clearInterval( YTPlayer.getState );
  1296. clearInterval( YTPlayer.checkForStartAt );
  1297. return;
  1298. }
  1299. jQuery.mbYTPlayer.checkForStart( YTPlayer );
  1300. YTPlayer.getState = setInterval( function() {
  1301. var prog = jQuery( YTPlayer ).YTPManageProgress();
  1302. var $YTPlayer = jQuery( YTPlayer );
  1303. var data = YTPlayer.opt;
  1304. var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
  1305. var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0;
  1306. stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0;
  1307. if( YTPlayer.currentTime != prog.currentTime ) {
  1308. var YTPEvent = jQuery.Event( "YTPTime" );
  1309. YTPEvent.time = YTPlayer.currentTime;
  1310. jQuery( YTPlayer ).trigger( YTPEvent );
  1311. }
  1312. YTPlayer.currentTime = prog.currentTime;
  1313. YTPlayer.totalTime = YTPlayer.player.getDuration();
  1314. if( YTPlayer.player.getVolume() == 0 ) $YTPlayer.addClass( "isMuted" );
  1315. else $YTPlayer.removeClass( "isMuted" );
  1316. if( YTPlayer.opt.showControls )
  1317. if( prog.totalTime ) {
  1318. YTPlayer.controlBar.find( ".mb_YTPTime" ).html( jQuery.mbYTPlayer.formatTime( prog.currentTime ) + " / " + jQuery.mbYTPlayer.formatTime( prog.totalTime ) );
  1319. } else {
  1320. YTPlayer.controlBar.find( ".mb_YTPTime" ).html( "-- : -- / -- : --" );
  1321. }
  1322. if( eval( YTPlayer.opt.stopMovieOnBlur ) )
  1323. if( !document.hasFocus() ) {
  1324. if( YTPlayer.state == 1 ) {
  1325. YTPlayer.hasFocus = false;
  1326. $YTPlayer.YTPPause();
  1327. }
  1328. } else if( document.hasFocus() && !YTPlayer.hasFocus && !( YTPlayer.state == -1 || YTPlayer.state == 0 ) ) {
  1329. YTPlayer.hasFocus = true;
  1330. $YTPlayer.YTPPlay();
  1331. }
  1332. if( YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact ) {
  1333. YTPlayer.controlBar.addClass( "compact" );
  1334. YTPlayer.isCompact = true;
  1335. if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol );
  1336. } else if( YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact ) {
  1337. YTPlayer.controlBar.removeClass( "compact" );
  1338. YTPlayer.isCompact = false;
  1339. if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol );
  1340. }
  1341. if( YTPlayer.player.getPlayerState() == 1 && ( parseFloat( YTPlayer.player.getDuration() - 1.5 ) < YTPlayer.player.getCurrentTime() || ( stopAt > 0 && parseFloat( YTPlayer.player.getCurrentTime() ) > stopAt ) ) ) {
  1342. if( YTPlayer.isEnded ) return;
  1343. YTPlayer.isEnded = true;
  1344. setTimeout( function() {
  1345. YTPlayer.isEnded = false
  1346. }, 1000 );
  1347. if( YTPlayer.isPlayList ) {
  1348. if( !data.loop || ( data.loop > 0 && YTPlayer.player.loopTime === data.loop - 1 ) ) {
  1349. YTPlayer.player.loopTime = undefined;
  1350. clearInterval( YTPlayer.getState );
  1351. var YTPEnd = jQuery.Event( "YTPEnd" );
  1352. YTPEnd.time = YTPlayer.currentTime;
  1353. jQuery( YTPlayer ).trigger( YTPEnd );
  1354. YTPlayer.state = 0;
  1355. return;
  1356. }
  1357. } else if( !data.loop || ( data.loop > 0 && YTPlayer.player.loopTime === data.loop - 1 ) ) {
  1358. YTPlayer.player.loopTime = undefined;
  1359. YTPlayer.preventTrigger = true;
  1360. jQuery( YTPlayer ).YTPPause();
  1361. YTPlayer.state = 0;
  1362. YTPlayer.wrapper.CSSAnimate( {
  1363. opacity: 0
  1364. }, 500, function() {
  1365. if( YTPlayer.controlBar.length )
  1366. YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play );
  1367. var YTPEnd = jQuery.Event( "YTPEnd" );
  1368. YTPEnd.time = YTPlayer.currentTime;
  1369. jQuery( YTPlayer ).trigger( YTPEnd );
  1370. YTPlayer.player.seekTo( startAt, true );
  1371. if( !YTPlayer.isBackground ) {
  1372. YTPlayer.opt.containment.css( {
  1373. background: "rgba(0,0,0,0.5) url(" + YTPlayer.opt.backgroundUrl + ") center center",
  1374. backgroundSize: "cover"
  1375. } );
  1376. }
  1377. } );
  1378. return;
  1379. }
  1380. YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1;
  1381. startAt = startAt || 1;
  1382. YTPlayer.preventTrigger = true;
  1383. jQuery( YTPlayer ).YTPPause();
  1384. YTPlayer.player.seekTo( startAt, true );
  1385. $YTPlayer.YTPPlay();
  1386. }
  1387. }, interval );
  1388. },
  1389. /**
  1390. *
  1391. * @returns {string} time
  1392. */
  1393. getTime: function() {
  1394. var YTPlayer = this.get( 0 );
  1395. return jQuery.mbYTPlayer.formatTime( YTPlayer.currentTime );
  1396. },
  1397. /**
  1398. *
  1399. * @returns {string} total time
  1400. */
  1401. getTotalTime: function() {
  1402. var YTPlayer = this.get( 0 );
  1403. return jQuery.mbYTPlayer.formatTime( YTPlayer.totalTime );
  1404. },
  1405. /**
  1406. *
  1407. * @param YTPlayer
  1408. */
  1409. checkForStart: function( YTPlayer ) {
  1410. var $YTPlayer = jQuery( YTPlayer );
  1411. //Checking if player has been removed from scene
  1412. if( !jQuery.contains( document, YTPlayer ) ) {
  1413. jQuery( YTPlayer ).YTPPlayerDestroy();
  1414. return
  1415. }
  1416. /*
  1417. if( jQuery.browser.chrome )
  1418. YTPlayer.opt.quality = "default";
  1419. */
  1420. YTPlayer.preventTrigger = true;
  1421. jQuery( YTPlayer ).YTPPause();
  1422. jQuery( YTPlayer ).muteYTPVolume();
  1423. jQuery( "#controlBar_" + YTPlayer.id ).remove();
  1424. YTPlayer.controlBar = false;
  1425. if( YTPlayer.opt.showControls )
  1426. jQuery.mbYTPlayer.buildControls( YTPlayer );
  1427. if( YTPlayer.opt.addRaster ) {
  1428. var classN = YTPlayer.opt.addRaster == "dot" ? "raster-dot" : "raster";
  1429. YTPlayer.overlay.addClass( YTPlayer.isRetina ? classN + " retina" : classN );
  1430. } else {
  1431. YTPlayer.overlay.removeClass( function( index, classNames ) {
  1432. // change the list into an array
  1433. var current_classes = classNames.split( " " ),
  1434. // array of classes which are to be removed
  1435. classes_to_remove = [];
  1436. jQuery.each( current_classes, function( index, class_name ) {
  1437. // if the classname begins with bg add it to the classes_to_remove array
  1438. if( /raster.*/.test( class_name ) ) {
  1439. classes_to_remove.push( class_name );
  1440. }
  1441. } );
  1442. classes_to_remove.push( "retina" );
  1443. // turn the array back into a string
  1444. return classes_to_remove.join( " " );
  1445. } )
  1446. }
  1447. var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
  1448. YTPlayer.player.playVideo();
  1449. YTPlayer.player.seekTo( startAt, true );
  1450. YTPlayer.checkForStartAt = setInterval( function() {
  1451. jQuery( YTPlayer ).YTPMute();
  1452. var canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration();
  1453. if( YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo ) {
  1454. //YTPlayer.player.playVideo();
  1455. //console.timeEnd( "checkforStart" );
  1456. clearInterval( YTPlayer.checkForStartAt );
  1457. if( typeof YTPlayer.opt.onReady == "function" )
  1458. YTPlayer.opt.onReady( YTPlayer );
  1459. YTPlayer.isReady = true;
  1460. var YTPready = jQuery.Event( "YTPReady" );
  1461. YTPready.time = YTPlayer.currentTime;
  1462. jQuery( YTPlayer ).trigger( YTPready );
  1463. YTPlayer.preventTrigger = true;
  1464. jQuery( YTPlayer ).YTPPause();
  1465. if( !YTPlayer.opt.mute ) jQuery( YTPlayer ).YTPUnmute();
  1466. YTPlayer.canTrigger = true;
  1467. if( YTPlayer.opt.autoPlay ) {
  1468. var YTPStart = jQuery.Event( "YTPStart" );
  1469. YTPStart.time = YTPlayer.currentTime;
  1470. jQuery( YTPlayer ).trigger( YTPStart );
  1471. $YTPlayer.css( "background-image", "none" );
  1472. jQuery( YTPlayer.playerEl ).CSSAnimate( {
  1473. opacity: 1
  1474. }, 1000 );
  1475. $YTPlayer.YTPPlay();
  1476. YTPlayer.wrapper.CSSAnimate( {
  1477. opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
  1478. }, 1000 );
  1479. /* Fix for Safari freeze */
  1480. if( jQuery.browser.safari ) {
  1481. YTPlayer.safariPlay = setInterval( function() {
  1482. if( YTPlayer.state != 1 )
  1483. $YTPlayer.YTPPlay();
  1484. else
  1485. clearInterval( YTPlayer.safariPlay )
  1486. }, 10 )
  1487. }
  1488. $YTPlayer.on( "YTPReady", function() {
  1489. $YTPlayer.YTPPlay();
  1490. } );
  1491. } else {
  1492. //$YTPlayer.YTPPause();
  1493. YTPlayer.player.pauseVideo();
  1494. if( !YTPlayer.isPlayer ) {
  1495. jQuery( YTPlayer.playerEl ).CSSAnimate( {
  1496. opacity: 1
  1497. }, 500 );
  1498. YTPlayer.wrapper.CSSAnimate( {
  1499. opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
  1500. }, 500 );
  1501. }
  1502. if( YTPlayer.controlBar.length )
  1503. YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play );
  1504. }
  1505. if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) {
  1506. YTPlayer.loading.html( "Ready" );
  1507. setTimeout( function() {
  1508. YTPlayer.loading.fadeOut();
  1509. }, 100 )
  1510. }
  1511. if( YTPlayer.controlBar.length )
  1512. YTPlayer.controlBar.slideDown( 1000 );
  1513. } else if( jQuery.browser.safari ) {
  1514. YTPlayer.player.playVideo();
  1515. if( startAt >= 0 ) YTPlayer.player.seekTo( startAt, true );
  1516. }
  1517. }, 1 );
  1518. },
  1519. /**
  1520. *
  1521. * @param align
  1522. */
  1523. setAlign: function( align ) {
  1524. var $YTplayer = this;
  1525. $YTplayer.optimizeDisplay( align );
  1526. },
  1527. /**
  1528. *
  1529. * @param align
  1530. */
  1531. getAlign: function() {
  1532. var YTPlayer = this.get( 0 );
  1533. return YTPlayer.opt.align;
  1534. },
  1535. /**
  1536. *
  1537. * @param s
  1538. * @returns {string}
  1539. */
  1540. formatTime: function( s ) {
  1541. var min = Math.floor( s / 60 );
  1542. var sec = Math.floor( s - ( 60 * min ) );
  1543. return( min <= 9 ? "0" + min : min ) + " : " + ( sec <= 9 ? "0" + sec : sec );
  1544. }
  1545. };
  1546. /**
  1547. *
  1548. * @param align
  1549. * can be center, top, bottom, right, left; (default is center,center)
  1550. */
  1551. jQuery.fn.optimizeDisplay = function( align ) {
  1552. var YTPlayer = this.get( 0 );
  1553. var playerBox = jQuery( YTPlayer.playerEl );
  1554. var vid = {};
  1555. YTPlayer.opt.align = align || YTPlayer.opt.align;
  1556. YTPlayer.opt.align = typeof YTPlayer.opt.align != "undefined " ? YTPlayer.opt.align : "center,center";
  1557. var YTPAlign = YTPlayer.opt.align.split( "," );
  1558. //data.optimizeDisplay = YTPlayer.isPlayer ? false : data.optimizeDisplay;
  1559. if( YTPlayer.opt.optimizeDisplay ) {
  1560. var win = {};
  1561. var el = YTPlayer.wrapper;
  1562. win.width = el.outerWidth();
  1563. win.height = el.outerHeight();
  1564. vid.width = win.width;
  1565. vid.height = YTPlayer.opt.ratio == "16/9" ? Math.ceil( win.width * ( 9 / 16 ) ) : Math.ceil( win.width * ( 3 / 4 ) );
  1566. vid.width = win.width;
  1567. vid.height = YTPlayer.opt.ratio == "16/9" ? Math.ceil( win.width * ( 9 / 16 ) ) : Math.ceil( win.width * ( 3 / 4 ) );
  1568. vid.marginTop = -( ( vid.height - win.height ) / 2 );
  1569. vid.marginLeft = 0;
  1570. var lowest = vid.height < win.height;
  1571. if( lowest ) {
  1572. vid.height = win.height;
  1573. vid.width = YTPlayer.opt.ratio == "16/9" ? Math.floor( win.height * ( 16 / 9 ) ) : Math.floor( win.height * ( 4 / 3 ) );
  1574. vid.marginTop = 0;
  1575. vid.marginLeft = -( ( vid.width - win.width ) / 2 );
  1576. }
  1577. for( var a in YTPAlign ) {
  1578. var al = YTPAlign[ a ].trim();
  1579. switch( al ) {
  1580. case "top":
  1581. vid.marginTop = lowest ? -( ( vid.height - win.height ) / 2 ) : 0;
  1582. break;
  1583. case "bottom":
  1584. vid.marginTop = lowest ? 0 : -( vid.height - win.height );
  1585. break;
  1586. case "left":
  1587. vid.marginLeft = 0;
  1588. break;
  1589. case "right":
  1590. vid.marginLeft = lowest ? -( vid.width - win.width ) : 0;
  1591. break;
  1592. default:
  1593. break;
  1594. }
  1595. }
  1596. } else {
  1597. vid.width = "100%";
  1598. vid.height = "100%";
  1599. vid.marginTop = 0;
  1600. vid.marginLeft = 0;
  1601. }
  1602. playerBox.css( {
  1603. width: vid.width,
  1604. height: vid.height,
  1605. marginTop: vid.marginTop,
  1606. marginLeft: vid.marginLeft
  1607. } );
  1608. };
  1609. /**
  1610. *
  1611. * @param arr
  1612. * @returns {Array|string|Blob|*}
  1613. *
  1614. */
  1615. jQuery.shuffle = function( arr ) {
  1616. var newArray = arr.slice();
  1617. var len = newArray.length;
  1618. var i = len;
  1619. while( i-- ) {
  1620. var p = parseInt( Math.random() * len );
  1621. var t = newArray[ i ];
  1622. newArray[ i ] = newArray[ p ];
  1623. newArray[ p ] = t;
  1624. }
  1625. return newArray;
  1626. };
  1627. jQuery.fn.unselectable = function() {
  1628. return this.each( function() {
  1629. jQuery( this ).css( {
  1630. "-moz-user-select": "none",
  1631. "-webkit-user-select": "none",
  1632. "user-select": "none"
  1633. } ).attr( "unselectable", "on" );
  1634. } );
  1635. };
  1636. /* Exposed public method */
  1637. jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer;
  1638. jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer;
  1639. jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID;
  1640. jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeMovie;
  1641. jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy;
  1642. jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play;
  1643. jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay;
  1644. jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop;
  1645. jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause;
  1646. jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo;
  1647. jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist;
  1648. jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext;
  1649. jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev;
  1650. jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute;
  1651. jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute;
  1652. jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume;
  1653. jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume;
  1654. jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData;
  1655. jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen;
  1656. jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops;
  1657. jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality;
  1658. jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress;
  1659. jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter;
  1660. jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters;
  1661. jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter;
  1662. jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters;
  1663. jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter;
  1664. jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters;
  1665. jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters;
  1666. jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters;
  1667. jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime;
  1668. jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime;
  1669. jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask;
  1670. jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask;
  1671. jQuery.fn.YTPSetAlign = jQuery.mbYTPlayer.setAlign;
  1672. jQuery.fn.YTPGetAlign = jQuery.mbYTPlayer.getAlign;
  1673. /**
  1674. *
  1675. * @deprecated
  1676. * todo: Above methods will be removed with version 3.5.0
  1677. *
  1678. **/
  1679. jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer;
  1680. jQuery.fn.playNext = jQuery.mbYTPlayer.playNext;
  1681. jQuery.fn.playPrev = jQuery.mbYTPlayer.playPrev;
  1682. jQuery.fn.changeMovie = jQuery.mbYTPlayer.changeMovie;
  1683. jQuery.fn.getVideoID = jQuery.mbYTPlayer.getVideoID;
  1684. jQuery.fn.getPlayer = jQuery.mbYTPlayer.getPlayer;
  1685. jQuery.fn.playerDestroy = jQuery.mbYTPlayer.playerDestroy;
  1686. jQuery.fn.fullscreen = jQuery.mbYTPlayer.fullscreen;
  1687. jQuery.fn.buildYTPControls = jQuery.mbYTPlayer.buildControls;
  1688. jQuery.fn.playYTP = jQuery.mbYTPlayer.play;
  1689. jQuery.fn.toggleLoops = jQuery.mbYTPlayer.toggleLoops;
  1690. jQuery.fn.stopYTP = jQuery.mbYTPlayer.stop;
  1691. jQuery.fn.pauseYTP = jQuery.mbYTPlayer.pause;
  1692. jQuery.fn.seekToYTP = jQuery.mbYTPlayer.seekTo;
  1693. jQuery.fn.muteYTPVolume = jQuery.mbYTPlayer.mute;
  1694. jQuery.fn.unmuteYTPVolume = jQuery.mbYTPlayer.unmute;
  1695. jQuery.fn.setYTPVolume = jQuery.mbYTPlayer.setVolume;
  1696. jQuery.fn.setVideoQuality = jQuery.mbYTPlayer.setVideoQuality;
  1697. jQuery.fn.manageYTPProgress = jQuery.mbYTPlayer.manageProgress;
  1698. jQuery.fn.YTPGetDataFromFeed = jQuery.mbYTPlayer.getVideoData;
  1699. } )( jQuery, ytp );
  1700. ;
  1701. /*
  1702. * ******************************************************************************
  1703. * jquery.mb.components
  1704. * file: jquery.mb.CSSAnimate.min.js
  1705. *
  1706. * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi);
  1707. * Open lab srl, Firenze - Italy
  1708. * email: matteo@open-lab.com
  1709. * site: http://pupunzi.com
  1710. * blog: http://pupunzi.open-lab.com
  1711. * http://open-lab.com
  1712. *
  1713. * Licences: MIT, GPL
  1714. * http://www.opensource.org/licenses/mit-license.php
  1715. * http://www.gnu.org/licenses/gpl.html
  1716. *
  1717. * last modified: 26/03/14 21.40
  1718. * *****************************************************************************
  1719. */
  1720. function uncamel(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function setUnit(a,b){return"string"!=typeof a||a.match(/^[\-0-9\.]+jQuery/)?""+a+b:a}function setFilter(a,b,c){var d=uncamel(b),e=jQuery.browser.mozilla?"":jQuery.CSS.sfx;a[e+"filter"]=a[e+"filter"]||"",c=setUnit(c>jQuery.CSS.filters[b].max?jQuery.CSS.filters[b].max:c,jQuery.CSS.filters[b].unit),a[e+"filter"]+=d+"("+c+") ",delete a[b]}jQuery.support.CSStransition=function(){var a=document.body||document.documentElement,b=a.style;return void 0!==b.transition||void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.MsTransition||void 0!==b.OTransition}(),jQuery.CSS={name:"mb.CSSAnimate",author:"Matteo Bicocchi",version:"2.0.0",transitionEnd:"transitionEnd",sfx:"",filters:{blur:{min:0,max:100,unit:"px"},brightness:{min:0,max:400,unit:"%"},contrast:{min:0,max:400,unit:"%"},grayscale:{min:0,max:100,unit:"%"},hueRotate:{min:0,max:360,unit:"deg"},invert:{min:0,max:100,unit:"%"},saturate:{min:0,max:400,unit:"%"},sepia:{min:0,max:100,unit:"%"}},normalizeCss:function(a){var b=jQuery.extend(!0,{},a);jQuery.browser.webkit||jQuery.browser.opera?jQuery.CSS.sfx="-webkit-":jQuery.browser.mozilla?jQuery.CSS.sfx="-moz-":jQuery.browser.msie&&(jQuery.CSS.sfx="-ms-");for(var c in b){"transform"===c&&(b[jQuery.CSS.sfx+"transform"]=b[c],delete b[c]),"transform-origin"===c&&(b[jQuery.CSS.sfx+"transform-origin"]=a[c],delete b[c]),"filter"!==c||jQuery.browser.mozilla||(b[jQuery.CSS.sfx+"filter"]=a[c],delete b[c]),"blur"===c&&setFilter(b,"blur",a[c]),"brightness"===c&&setFilter(b,"brightness",a[c]),"contrast"===c&&setFilter(b,"contrast",a[c]),"grayscale"===c&&setFilter(b,"grayscale",a[c]),"hueRotate"===c&&setFilter(b,"hueRotate",a[c]),"invert"===c&&setFilter(b,"invert",a[c]),"saturate"===c&&setFilter(b,"saturate",a[c]),"sepia"===c&&setFilter(b,"sepia",a[c]);var d="";"x"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" translateX("+setUnit(a[c],"px")+")",delete b[c]),"y"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" translateY("+setUnit(a[c],"px")+")",delete b[c]),"z"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" translateZ("+setUnit(a[c],"px")+")",delete b[c]),"rotate"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" rotate("+setUnit(a[c],"deg")+")",delete b[c]),"rotateX"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" rotateX("+setUnit(a[c],"deg")+")",delete b[c]),"rotateY"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" rotateY("+setUnit(a[c],"deg")+")",delete b[c]),"rotateZ"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" rotateZ("+setUnit(a[c],"deg")+")",delete b[c]),"scale"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" scale("+setUnit(a[c],"")+")",delete b[c]),"scaleX"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" scaleX("+setUnit(a[c],"")+")",delete b[c]),"scaleY"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" scaleY("+setUnit(a[c],"")+")",delete b[c]),"scaleZ"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" scaleZ("+setUnit(a[c],"")+")",delete b[c]),"skew"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" skew("+setUnit(a[c],"deg")+")",delete b[c]),"skewX"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" skewX("+setUnit(a[c],"deg")+")",delete b[c]),"skewY"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" skewY("+setUnit(a[c],"deg")+")",delete b[c]),"perspective"===c&&(d=jQuery.CSS.sfx+"transform",b[d]=b[d]||"",b[d]+=" perspective("+setUnit(a[c],"px")+")",delete b[c])}return b},getProp:function(a){var b=[];for(var c in a)b.indexOf(c)<0&&b.push(uncamel(c));return b.join(",")},animate:function(a,b,c,d,e){return this.each(function(){function o(){f.called=!0,f.CSSAIsRunning=!1,g.off(jQuery.CSS.transitionEnd+"."+f.id),clearTimeout(f.timeout),g.css(jQuery.CSS.sfx+"transition",""),"function"==typeof e&&e.apply(f),"function"==typeof f.CSSqueue&&(f.CSSqueue(),f.CSSqueue=null)}var f=this,g=jQuery(this);f.id=f.id||"CSSA_"+(new Date).getTime();var h=h||{type:"noEvent"};if(f.CSSAIsRunning&&f.eventType==h.type&&!jQuery.browser.msi
  1721. ;/*
  1722. * ******************************************************************************
  1723. * jquery.mb.components
  1724. * file: jquery.mb.browser.min.js
  1725. *
  1726. * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi);
  1727. * Open lab srl, Firenze - Italy
  1728. * email: matteo@open-lab.com
  1729. * site: http://pupunzi.com
  1730. * blog: http://pupunzi.open-lab.com
  1731. * http://open-lab.com
  1732. *
  1733. * Licences: MIT, GPL
  1734. * http://www.opensource.org/licenses/mit-license.php
  1735. * http://www.gnu.org/licenses/gpl.html
  1736. *
  1737. * last modified: 26/03/14 21.43
  1738. * *****************************************************************************
  1739. */
  1740. var nAgt=navigator.userAgent;if(!jQuery.browser){jQuery.browser={},jQuery.browser.mozilla=!1,jQuery.browser.webkit=!1,jQuery.browser.opera=!1,jQuery.browser.safari=!1,jQuery.browser.chrome=!1,jQuery.browser.androidStock=!1,jQuery.browser.msie=!1,jQuery.browser.ua=nAgt,jQuery.browser.name=navigator.appName,jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;if(-1!=(verOffset=nAgt.indexOf("Opera")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+6),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8));else if(-1!=(verOffset=nAgt.indexOf("OPR")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+4);else if(-1!=(verOffset=nAgt.indexOf("MSIE")))jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer",jQuery.browser.fullVersion=nAgt.substring(verOffset+5);else if(-1!=nAgt.indexOf("Trident")||-1!=nAgt.indexOf("Edge")){jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer";var start=nAgt.indexOf("rv:")+3,end=start+4;jQuery.browser.fullVersion=nAgt.substring(start,end)}else-1!=(verOffset=nAgt.indexOf("Chrome"))?(jQuery.browser.webkit=!0,jQuery.browser.chrome=!0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):nAgt.indexOf("mozilla/5.0")>-1&&nAgt.indexOf("android ")>-1&&nAgt.indexOf("applewebkit")>-1&&!(nAgt.indexOf("chrome")>-1)?(verOffset=nAgt.indexOf("Chrome"),jQuery.browser.webkit=!0,jQuery.browser.androidStock=!0,jQuery.browser.name="androidStock",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1!=(verOffset=nAgt.indexOf("Safari"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("AppleWebkit"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("Firefox"))?(jQuery.browser.mozilla=!0,jQuery.browser.name="Firefox",jQuery.browser.fullVersion=nAgt.substring(verOffset+8)):(nameOffset=nAgt.lastIndexOf(" ")+1)<(verOffset=nAgt.lastIndexOf("/"))&&(jQuery.browser.name=nAgt.substring(nameOffset,verOffset),jQuery.browser.fullVersion=nAgt.substring(verOffset+1),jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()&&(jQuery.browser.name=navigator.appName));-1!=(ix=jQuery.browser.fullVersion.indexOf(";"))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix)),-1!=(ix=jQuery.browser.fullVersion.indexOf(" "))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix)),jQuery.browser.majorVersion=parseInt(""+jQuery.browser.fullVersion,10),isNaN(jQuery.browser.majorVersion)&&(jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10)),jQuery.browser.version=jQuery.browser.majorVersion}jQuery.browser.android=/Android/i.test(nAgt),jQuery.browser.blackberry=/BlackBerry|BB|PlayBook/i.test(nAgt),jQuery.browser.ios=/iPhone|iPad|iPod|webOS/i.test(nAgt),jQuery.browser.operaMobile=/Opera Mini/i.test(nAgt),jQuery.browser.windowsMobile=/IEMobile|Windows Phone/i.test(nAgt),jQuery.browser.kindle=/Kindle|Silk/i.test(nAgt),jQuery.browser.mobile=jQuery.browser.android||jQuery.browser.blackberry||jQuery.browser.ios||jQuery.browser.windowsMobile||jQuery.browser.operaMobile||jQuery.browser.kindle,jQuery.isMobile=jQuery.browser.mobile,jQuery.isTablet=jQuery.browser.mobile&&jQuery(window).width()>765,jQuery.isAndroidDefault=jQuery.browser.android&&!/chrome/i.test(nAgt);
  1741. ;/*___________________________________________________________________________________________________________________________________________________
  1742. _ jquery.mb.components _
  1743. _ _
  1744. _ file: jquery.mb.simpleSlider.min.js _
  1745. _ last modified: 16/05/15 23.45 _
  1746. _ _
  1747. _ Open Lab s.r.l., Florence - Italy _
  1748. _ _
  1749. _ email: matteo@open-lab.com _
  1750. _ site: http://pupunzi.com _
  1751. _ http://open-lab.com _
  1752. _ blog: http://pupunzi.open-lab.com _
  1753. _ Q&A: http://jquery.pupunzi.com _
  1754. _ _
  1755. _ Licences: MIT, GPL _
  1756. _ http://www.opensource.org/licenses/mit-license.php _
  1757. _ http://www.gnu.org/licenses/gpl.html _
  1758. _ _
  1759. _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _
  1760. ___________________________________________________________________________________________________________________________________________________*/
  1761. !function(e){var t=(/iphone|ipod|ipad|android|ie|blackberry|fennec/.test(navigator.userAgent.toLowerCase()),"ontouchstart"in window||window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture||window.DocumentTouch&&document instanceof DocumentTouch||!1);e.simpleSlider={defaults:{initialval:0,scale:100,orientation:"h",readonly:!1,callback:!1},events:{start:t?"touchstart":"mousedown",end:t?"touchend":"mouseup",move:t?"touchmove":"mousemove"},init:function(o){return this.each(function(){var a=this,l=e(a);l.addClass("simpleSlider"),a.opt={},e.extend(a.opt,e.simpleSlider.defaults,o),e.extend(a.opt,l.data());var i="h"==a.opt.orientation?"horizontal":"vertical",n=e("<div/>").addClass("level").addClass(i);l.prepend(n),a.level=n,l.css({cursor:"default"}),"auto"==a.opt.scale&&(a.opt.scale=e(a).outerWidth()),l.updateSliderVal(),a.opt.readonly||(l.on(e.simpleSlider.events.start,function(e){t&&(e=e.changedTouches[0]),a.canSlide=!0,l.updateSliderVal(e),l.css({cursor:"col-resize"}),e.preventDefault(),e.stopPropagation()}),e(document).on(e.simpleSlider.events.move,function(o){t&&(o=o.changedTouches[0]),a.canSlide&&(e(document).css({cursor:"default"}),l.updateSliderVal(o),o.preventDefault(),o.stopPropagation())}).on(e.simpleSlider.events.end,function(){e(document).css({cursor:"auto"}),a.canSlide=!1,l.css({cursor:"auto"})}))})},updateSliderVal:function(t){function o(e,t){return Math.floor(100*e/t)}var a=this,l=a.get(0);if(l.opt){l.opt.initialval="number"==typeof l.opt.initialval?l.opt.initialval:l.opt.initialval(l);var i=e(l).outerWidth(),n=e(l).outerHeight();l.x="object"==typeof t?t.clientX+document.body.scrollLeft-a.offset().left:"number"==typeof t?t*i/l.opt.scale:l.opt.initialval*i/l.opt.scale,l.y="object"==typeof t?t.clientY+document.body.scrollTop-a.offset().top:"number"==typeof t?(l.opt.scale-l.opt.initialval-t)*n/l.opt.scale:l.opt.initialval*n/l.opt.scale,l.y=a.outerHeight()-l.y,l.scaleX=l.x*l.opt.scale/i,l.scaleY=l.y*l.opt.scale/n,l.outOfRangeX=l.scaleX>l.opt.scale?l.scaleX-l.opt.scale:l.scaleX<0?l.scaleX:0,l.outOfRangeY=l.scaleY>l.opt.scale?l.scaleY-l.opt.scale:l.scaleY<0?l.scaleY:0,l.outOfRange="h"==l.opt.orientation?l.outOfRangeX:l.outOfRangeY,"undefined"!=typeof t?l.value="h"==l.opt.orientation?l.x>=a.outerWidth()?l.opt.scale:l.x<=0?0:l.scaleX:l.y>=a.outerHeight()?l.opt.scale:l.y<=0?0:l.scaleY:l.value="h"==l.opt.orientation?l.scaleX:l.scaleY,"h"==l.opt.orientation?l.level.width(o(l.x,i)+"%"):l.level.height(o(l.y,n)),"function"==typeof l.opt.callback&&l.opt.callback(l)}}},e.fn.simpleSlider=e.simpleSlider.init,e.fn.updateSliderVal=e.simpleSlider.updateSliderVal}(jQuery);
  1762. ;/*___________________________________________________________________________________________________________________________________________________
  1763. _ jquery.mb.components _
  1764. _ _
  1765. _ file: jquery.mb.storage.min.js _
  1766. _ last modified: 24/05/15 16.08 _
  1767. _ _
  1768. _ Open Lab s.r.l., Florence - Italy _
  1769. _ _
  1770. _ email: matteo@open-lab.com _
  1771. _ site: http://pupunzi.com _
  1772. _ http://open-lab.com _
  1773. _ blog: http://pupunzi.open-lab.com _
  1774. _ Q&A: http://jquery.pupunzi.com _
  1775. _ _
  1776. _ Licences: MIT, GPL _
  1777. _ http://www.opensource.org/licenses/mit-license.php _
  1778. _ http://www.gnu.org/licenses/gpl.html _
  1779. _ _
  1780. _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _
  1781. ___________________________________________________________________________________________________________________________________________________*/
  1782. !function(a){a.mbCookie={set:function(a,b,c,d){b=JSON.stringify(b),c||(c=7),d=d?"; domain="+d:"";var f,e=new Date;e.setTime(e.getTime()+1e3*60*60*24*c),f="; expires="+e.toGMTString(),document.cookie=a+"="+b+f+"; path=/"+d},get:function(a){for(var b=a+"=",c=document.cookie.split(";"),d=0;d<c.length;d++){for(var e=c[d];" "==e.charAt(0);)e=e.substring(1,e.length);if(0==e.indexOf(b))return JSON.parse(e.substring(b.length,e.length))}return null},remove:function(b){a.mbCookie.set(b,"",-1)}},a.mbStorage={set:function(a,b){b=JSON.stringify(b),localStorage.setItem(a,b)},get:function(a){return localStorage[a]?JSON.parse(localStorage[a]):null},remove:function(a){a?localStorage.removeItem(a):localStorage.clear()}}}(jQuery);