PageSourceSearch

https://oneoptimumlifestyles.com/v2/js/jquery.mb.YTPlayer.js

js oneoptimumlifestyles.com collected 2026-10-02 16:03:39 UTC 78,409 bytes, 1,543 lines download raw bytes

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