PageSourceSearch

https://novacka.com/elements/js/share-element/video_background.js

js novacka.com collected 2026-10-03 00:08:39 UTC 79,978 bytes, 2,065 lines download raw bytes

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