PageSourceSearch

https://uai.edu.ar/js/uai/jquery.mb.YTPlayer.js

js uai.edu.ar collected 2026-09-24 18:17:52 UTC 88,817 bytes, 2,131 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.