PageSourceSearch

https://samsandler.com/wp-content/themes/swell/js/jquery.mb.YTPlayer.js?ver=1.0

js samsandler.com collected 2026-10-08 01:30:29 UTC 74,831 bytes, 1,694 lines download raw bytes

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

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.