PageSourceSearch

https://your-scorpion.ru/wp-content/themes/dannel/js/jquery.mb.YTPlayer.js?ver=3.2.8

js your-scorpion.ru collected 2026-10-05 00:06:56 UTC 120,094 bytes, 2,859 lines download raw bytes

1/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2 jquery.mb.components
3 
4 file: jquery.mb.YTPlayer.src.js
5 last modified: 11/2/18 7:23 PM
6 Version:  3.2.8
7 Build:  7398
8 
9 Open Lab s.r.l., Florence - Italy
10 email:  [email protected]
11 blog: 	http://pupunzi.open-lab.com
12 site: 	http://pupunzi.com
13 	http://open-lab.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-2018. Matteo Bicocchi (Pupunzi)
20 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
21
22
23
24var ytp = ytp || {};
25
26function onYouTubeIframeAPIReady() {
27  if (ytp.YTAPIReady) return;
28  ytp.YTAPIReady = true;
29  jQuery(document).trigger("YTAPIReady");
30}
31
32var getYTPVideoID = function (url) {
33  var videoID, playlistID;
34  if (url.indexOf("youtu.be") > 0 || url.indexOf("youtube.com/embed") > 0) {
35    videoID = url.substr(url.lastIndexOf("/") + 1, url.length);
36    playlistID = videoID.indexOf("?list=") > 0 ? videoID.substr(videoID.lastIndexOf("="), videoID.length) : null;
37    videoID = playlistID ? videoID.substr(0, videoID.lastIndexOf("?")) : videoID;
38  } else if (url.indexOf("http") > -1) {
39    //videoID = url.match( /([\/&]v\/([^&#]*))|([\\?&]v=([^&#]*))/ )[ 1 ];
40    videoID = url.match(/[\\?&]v=([^&#]*)/)[1];
41    playlistID = url.indexOf("list=") > 0 ? url.match(/[\\?&]list=([^&#]*)/)[1] : null;
42  } else {
43    videoID = url.length > 15 ? null : url;
44    playlistID = videoID ? null : url;
45  }
46  return {
47    videoID   : videoID,
48    playlistID: playlistID
49  };
50};
51
52function iOSversion() {
53  if (/iP(hone|od|ad)/.test(navigator.platform)) {
54    var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
55    return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
56  }
57}
58
59(function (jQuery, ytp) {
60  
61  jQuery.mbYTPlayer = {
62    name   : "jquery.mb.YTPlayer",
63    version: "3.2.8",
64    build  : "7398",
65    author : "Matteo Bicocchi (pupunzi)",
66    apiKey : "",
67    
68    /*
69     * Default options for the player
70     */
71    defaults        : {
72      /**
73       videoURL (string)
74       the complete Youtube video URL or the short url or the videoID
75       */
76      videoURL: null,
77      
78      /**
79       containment (string)
80       default containment for the player
81       */
82      containment: "body",
83      
84      /**
85       ratio (string or number)
86       "auto", "16/9", "4/3" or number: 4/3, 16/9
87       */
88      ratio: "auto",
89      
90      /**
91       fadeOnStartTime (int)
92       fade in timing at video start
93       */
94      fadeOnStartTime: 1500,
95      
96      /**
97       startAt (int)
98       start second
99       */
100      startAt: 0,
101      
102      /**
103       stopAt (int)
104       stop second
105       */
106      stopAt: 0,
107      
108      /**
109       autoPlay (bool)
110       on page load video should start or pause
111       */
112      autoPlay: true,
113      
114      /**
115       coverImage (string)
116       The path to the image to be used as cover if the autoPlay option is set to false
117       */
118      coverImage: false,
119      
120      /**
121       loop (bool or int)
122       video should loop or not; if number it will loop for the specified times
123       */
124      loop: true,
125      
126      /**
127       addRaster (bool)
128       shows a raster image over the video (added via CSS)
129       You can change the raster image via CSS:
130       .YTPOverlay.raster { background: url(images/raster.png)}
131       */
132      addRaster: false,
133      
134      /**
135       mask (bool or object) the key is the second and the value is the path to the image
136       Ex: mask:{ 0:'assets/mask-1.png', 5:'assets/mask-2.png', 30: false, 50:'assets/mask-3.png'}
137       */
138      mask: false,
139      
140      /**
141       opacity (int)
142       0 to 1
143       */
144      opacity: 1,
145      
146      /**
147       quality (string)
148       “small”, “medium”, “large”, “hd720”, “hd1080”, “highres”, "default"
149       */
150      quality: "default",
151      
152      /**
153       vol (int)
154       0 to 100
155       */
156      vol: 50,
157      
158      /**
159       mute (bool)
160       mute the video at start
161       */
162      mute: false,
163      
164      /**
165       showControls (bool)
166       shows the control bar at the bottom of the containment
167       */
168      showControls: true,
169      
170      /**
171       anchor (string)
172       center,top,bottom,left,right combined in pair
173       */
174      anchor: "center,center",
175      
176      /**
177       showAnnotations (bool)
178       display the annotations on video
179       */
180      showAnnotations: false,
181      
182      /**
183       cc_load_policy (bool)
184       display the subtitles
185       */
186      cc_load_policy: false,
187      
188      /**
189       showYTLogo (bool)
190       display the Youtube logotype inside the button bar
191       */
192      showYTLogo: true,
193      
194      /**
195       useOnMobile (bool)
196       activate the player also on mobile
197       */
198      useOnMobile: true,
199      
200      /**
201       mobileFallbackImage (bool)
202       mobile fallback image if useOnMobile is set to false
203       */
204      mobileFallbackImage: null,
205      
206      /**
207       playOnlyIfVisible (bool)
208       play the video only if the containment is on screen
209       */
210      playOnlyIfVisible: false,
211      
212      /**
213       onScreenPercentage (bool)
214       percentage of the player height the video should stop or start when visible
215       */
216      onScreenPercentage: 30,
217      
218      /**
219       stopMovieOnBlur (bool)
220       stop the video if the window loose the focus
221       */
222      stopMovieOnBlur: true,
223      
224      /**
225       realfullscreen (bool)
226       the video when in full screen covers all the display
227       */
228      realfullscreen: true,
229      
230      /**
231       optimizeDisplay (bool)
232       The video always fit the containment without displaying the black strips
233       */
234      optimizeDisplay: true,
235      
236      /**
237       abundance (bool)
238       the abudance of the video size
239       */
240      abundance: 0.3,
241      
242      /**
243       gaTrack (bool)
244       track the video plays on GA
245       */
246      gaTrack: true,
247      
248      /**
249       remember_last_time (bool)
250       when the page is reloaded the video will start from the last position
251       */
252      remember_last_time: false,
253      
254      /**
255       addFilters (bool or string)
256       add one or more CSS filters as object to the video
257       Ex: {sepia: 50, hue_rotate : 220}
258       */
259      addFilters: false,
260      
261      /**
262       onReady (function)
263       a callback function fired once the player is ready
264       */
265      onReady: function (player) {
266      },
267      
268      /**
269       onReady (function)
270       a callback function fired if there's an error
271       */
272      onError: function (player, err) {
273      }
274    },
275    /**
276     *  @fontface icons
277     *  */
278    controls        : {
279      play    : "P",
280      pause   : "p",
281      mute    : "M",
282      unmute  : "A",
283      onlyYT  : "O",
284      showSite: "R",
285      ytLogo  : "Y"
286    },
287    controlBar      : null,
288    locationProtocol: "https:",
289    
290    /**
291     * Applicable filters
292     */
293    defaultFilters: {
294      grayscale : {value: 0, unit: "%"},
295      hue_rotate: {value: 0, unit: "deg"},
296      invert    : {value: 0, unit: "%"},
297      opacity   : {value: 0, unit: "%"},
298      saturate  : {value: 0, unit: "%"},
299      sepia     : {value: 0, unit: "%"},
300      brightness: {value: 0, unit: "%"},
301      contrast  : {value: 0, unit: "%"},
302      blur      : {value: 0, unit: "px"}
303    },
304    
305    /**
306     * build the player
307     * @param options
308     * @returns [players]
309     */
310    buildPlayer: function (options) {
311      
312      if (!ytp.YTAPIReady && typeof window.YT === 'undefined') {
313        jQuery("#YTAPI").remove();
314        var tag = jQuery("<script></script>").attr({
315          "src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version,
316          "id" : "YTAPI"
317        });
318        jQuery("head").prepend(tag);
319      } else {
320        setTimeout(function () {
321          jQuery(document).trigger("YTAPIReady");
322          ytp.YTAPIReady = true;
323        }, 100);
324      }
325      
326      function isIframe() {
327        var isIfr = false;
328        try {
329          if (self.location.href != top.location.href) isIfr = true;
330        } catch (e) {
331          isIfr = true;
332        }
333        return isIfr;
334      };
335      
336      //console.time( "YTPlayerInit" );
337      
338      return this.each(function () {
339        var YTPlayer = this;
340        var $YTPlayer = jQuery(YTPlayer);
341        $YTPlayer.hide();
342        YTPlayer.loop = 0;
343        YTPlayer.state = 0;
344        YTPlayer.filters = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaultFilters);
345        YTPlayer.filtersEnabled = true;
346        YTPlayer.id = YTPlayer.id || "YTP_" + new Date().getTime();
347        $YTPlayer.addClass("mb_YTPlayer");
348        
349        /**
350         Set properties
351         */
352        var property = $YTPlayer.data("property") && typeof $YTPlayer.data("property") == "string" ?
353            eval('(' + $YTPlayer.data("property") + ')') :
354            $YTPlayer.data("property");
355        
356        if (typeof property !== "object")
357          property = {};
358        
359        YTPlayer.opt = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaults, YTPlayer.opt, options, property);
360        
361        YTPlayer.opt.elementId = YTPlayer.id;
362        
363        if (YTPlayer.opt.vol === 0) {
364          YTPlayer.opt.vol = 1;
365          YTPlayer.opt.mute = true;
366        }
367        
368        /**
369         * If autoPlay is set to true and  mute is set to false
370         * Webkit browser will not auto-play
371         * Start playing after the first click
372         */
373        if (YTPlayer.opt.autoPlay && YTPlayer.opt.mute == false && jQuery.mbBrowser.chrome) {
374          //YTPlayer.opt.mute = true;
375          jQuery(document).one("mousedown.YTPstart", function () {
376            $YTPlayer.YTPPlay();
377          });
378          console.info("YTPlayer info: On Webkit browsers you can not autoplay the video if the audio is on.")
379        }
380        
381        if (YTPlayer.opt.loop && typeof YTPlayer.opt.loop === "boolean") {
382          YTPlayer.opt.loop = 9999;
383        }
384        
385        /**
386         Disable fullScreen if is in an iframe or full-screen API is not available
387         */
388        var fullScreenAvailable = document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled;
389        YTPlayer.opt.realfullscreen = isIframe() || !fullScreenAvailable ? false : YTPlayer.opt.realfullscreen;
390        
391        /**
392         Manage annotations
393         */
394        YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? '1' : '3';
395        
396        /**
397         Manage show subtitle and caption
398         */
399        YTPlayer.opt.cc_load_policy = YTPlayer.opt.cc_load_policy ? '1' : '0';
400        
401        /**
402         Manage cover image
403         */
404        YTPlayer.opt.coverImage = YTPlayer.opt.coverImage || YTPlayer.opt.backgroundImage;
405        
406        /**
407         Manage Opacity for IE < 10
408         */
409        if (jQuery.mbBrowser.msie && jQuery.mbBrowser.version < 9)
410          YTPlayer.opt.opacity = 1;
411        
412        YTPlayer.opt.containment = YTPlayer.opt.containment === "self" ? $YTPlayer : jQuery(YTPlayer.opt.containment);
413        YTPlayer.isRetina = (window.retina || window.devicePixelRatio > 1);
414        
415        YTPlayer.opt.ratio = YTPlayer.opt.ratio === "auto" ? 16 / 9 : YTPlayer.opt.ratio;
416        YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio);
417        
418        YTPlayer.orig_containment_background = YTPlayer.opt.containment.css("background-image");
419        
420        if (!$YTPlayer.attr("id"))
421          $YTPlayer.attr("id", "ytp_" + new Date().getTime());
422        
423        YTPlayer.playerID = "iframe_" + YTPlayer.id;
424        
425        YTPlayer.isAlone = false;
426        YTPlayer.hasFocus = true;
427        YTPlayer.videoID = YTPlayer.opt.videoURL ?
428            getYTPVideoID(YTPlayer.opt.videoURL).videoID : $YTPlayer.attr("href") ?
429                getYTPVideoID($YTPlayer.attr("href")).videoID :
430                false;
431        
432        /**
433         Check if it is a video list
434         */
435        YTPlayer.playlistID = YTPlayer.opt.videoURL ?
436            getYTPVideoID(YTPlayer.opt.videoURL).playlistID : $YTPlayer.attr("href") ?
437                getYTPVideoID($YTPlayer.attr("href")).playlistID :
438                false;
439        
440        var start_from_last = 0;
441        if (jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID))
442          start_from_last = parseFloat(jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID));
443        if (YTPlayer.opt.remember_last_time && start_from_last) {
444          YTPlayer.start_from_last = start_from_last;
445          jQuery.mbCookie.remove("YTPlayer_start_from" + YTPlayer.videoID);
446        }
447        
448        YTPlayer.isPlayer = $YTPlayer.is(YTPlayer.opt.containment);
449        YTPlayer.isBackground = YTPlayer.opt.containment.is("body");
450        
451        if (YTPlayer.isBackground && ytp.backgroundIsInited)
452          return;
453        
454        /**
455         Hide the placeholder if it's not the target of the player
456         */
457        if (YTPlayer.isPlayer)
458          $YTPlayer.show();
459        
460        /**
461         create the overlay
462         */
463        YTPlayer.overlay = jQuery("<div/>").css({
464          position: "absolute",
465          top     : 0,
466          left    : 0,
467          width   : "100%",
468          height  : "100%"
469        }).addClass("YTPOverlay");
470        
471        if (YTPlayer.opt.coverImage || YTPlayer.orig_containment_background != "none") {
472          // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) {
473          var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
474          
475          YTPlayer.opt.containment.css({
476            background      : bgndURL,
477            backgroundColor : "#000",
478            backgroundSize  : "cover",
479            backgroundRepeat: "no-repeat"
480          });
481          
482        }
483        
484        /**
485         create the wrapper
486         */
487        YTPlayer.wrapper = jQuery("<div/>").attr("id", "wrapper_" + YTPlayer.id).css({
488          position : "absolute",
489          zIndex   : 0,
490          minWidth : "100%",
491          minHeight: "100%",
492          left     : 0,
493          top      : 0,
494          overflow : "hidden",
495          opacity  : 0
496        }).addClass("mbYTP_wrapper");
497        
498        /**
499         If is an inline player toggle play if the overlay is clicked
500         */
501        if (YTPlayer.isPlayer) {
502          YTPlayer.inlinePlayButton = jQuery("<div/>").addClass("inlinePlayButton").html(jQuery.mbYTPlayer.controls.play);
503          $YTPlayer.append(YTPlayer.inlinePlayButton);
504          YTPlayer.inlinePlayButton.on("click", function (e) {
505            $YTPlayer.YTPPlay();
506            e.stopPropagation();
507          });
508          
509          if (YTPlayer.opt.autoPlay)
510            YTPlayer.inlinePlayButton.hide();
511          
512          YTPlayer.overlay.on("click", function () {
513            $YTPlayer.YTPTogglePlay();
514          }).css({cursor: "pointer"})
515        }
516        
517        /**
518         create the playerBox where the YT iframe will be placed
519         */
520        var playerBox = jQuery("<div/>").attr("id", YTPlayer.playerID).addClass("playerBox");
521        playerBox.css({
522          position: "absolute",
523          zIndex  : 0,
524          width   : "100%",
525          height  : "100%",
526          top     : 0,
527          left    : 0,
528          overflow: "hidden",
529          opacity : 1
530        });
531        
532        YTPlayer.wrapper.append(playerBox);
533        playerBox.after(YTPlayer.overlay);
534        
535        if (YTPlayer.isPlayer) {
536          YTPlayer.inlineWrapper = jQuery("<div/>").addClass("inline-YTPlayer");
537          
538          YTPlayer.inlineWrapper.css({
539            position: "relative",
540            maxWidth: YTPlayer.opt.containment.css("width")
541          });
542          
543          YTPlayer.opt.containment.css({
544            position     : "relative",
545            paddingBottom: "56.25%",
546            overflow     : "hidden",
547            height       : 0
548          });
549          YTPlayer.opt.containment.wrap(YTPlayer.inlineWrapper);
550        }
551        
552        /**
553         Loop all the elements inside the container and check if their position is not "static"
554         */
555        YTPlayer.opt.containment.children().not("script, style").each(function () {
556          if (jQuery(this).css("position") == "static")
557            jQuery(this).css("position", "relative");
558        });
559        
560        if (YTPlayer.isBackground) {
561          jQuery("body").css({
562            boxSizing: "border-box"
563          });
564          
565          YTPlayer.wrapper.css({
566            position: "fixed",
567            top     : 0,
568            left    : 0,
569            zIndex  : 0
570          });
571          
572        } else if (YTPlayer.opt.containment.css("position") == "static") {
573          
574          YTPlayer.opt.containment.css({
575            position: "relative"
576          });
577          $YTPlayer.show();
578        }
579        YTPlayer.opt.containment.prepend(YTPlayer.wrapper);
580        
581        if (!YTPlayer.isBackground) {
582          YTPlayer.overlay.on("mouseenter", function () {
583            if (YTPlayer.controlBar && YTPlayer.controlBar.length)
584              YTPlayer.controlBar.addClass("visible");
585          }).on("mouseleave", function () {
586            if (YTPlayer.controlBar && YTPlayer.controlBar.length)
587              YTPlayer.controlBar.removeClass("visible");
588          });
589        }
590        
591        if (jQuery.mbBrowser.mobile && !YTPlayer.opt.useOnMobile) {
592          if (YTPlayer.opt.mobileFallbackImage) {
593            YTPlayer.wrapper.css({
594              backgroundImage   : "url(" + YTPlayer.opt.mobileFallbackImage + ")",
595              backgroundPosition: "center center",
596              backgroundSize    : "cover",
597              backgroundRepeat  : "no-repeat",
598              opacity           : 1
599            });
600            YTPlayer.wrapper.css({opacity: 1})
601          }
602          return $YTPlayer;
603        }
604        
605        /**
606         If is on device start playing on first touch
607         */
608        if (jQuery.mbBrowser.mobile && YTPlayer.opt.autoPlay && YTPlayer.opt.useOnMobile)
609          jQuery("body").one("touchstart", function () {
610            YTPlayer.player.playVideo();
611          });
612        
613        jQuery(document).one("YTAPIReady", function () {
614          $YTPlayer.trigger("YTAPIReady_" + YTPlayer.id);
615          ytp.YTAPIReady = true;
616        });
617        
618        YTPlayer.isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage);
619        
620        $YTPlayer.one("YTAPIReady_" + YTPlayer.id, function () {
621          
622          var YTPlayer = this;
623          var $YTPlayer = jQuery(YTPlayer);
624          
625          if ((YTPlayer.isBackground && ytp.backgroundIsInited) || YTPlayer.isInit)
626            return;
627          
628          if (YTPlayer.isBackground)
629            ytp.backgroundIsInited = true;
630          
631          YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? (YTPlayer.isBackground ? true : false) : YTPlayer.opt.autoPlay;
632          YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100;
633          
634          jQuery.mbYTPlayer.getDataFromAPI(YTPlayer);
635          
636          jQuery(YTPlayer).on("YTPChanged", function (e) {
637            
638            if (YTPlayer.isInit)
639              return;
640            
641            YTPlayer.isInit = true;
642            
643            /** Initialize the YT player ------------------------------------
644             * Youtube player variables
645             * @type {{modestbranding: number, autoplay: number, controls: number, showinfo: number, rel: number, enablejsapi: number, version: number, playerapiid: string, origin: string, allowfullscreen: boolean, iv_load_policy: (string|*|jQuery.mbYTPlayer.opt.showAnnotations), playsinline: number}}
646             */
647            var playerVars = {
648              'modestbranding' : 1,
649              'autoplay'       : 0,
650              'controls'       : 0,
651              'showinfo'       : 0,
652              'rel'            : 0,
653              'enablejsapi'    : 1,
654              'version'        : 3,
655              'playerapiid'    : YTPlayer.playerID,
656              'origin'         : '*',
657              'allowfullscreen': true,
658              'wmode'          : 'transparent',
659              'iv_load_policy' : YTPlayer.opt.showAnnotations,
660              'cc_load_policy' : YTPlayer.opt.cc_load_policy,
661              'playsinline'    : jQuery.mbBrowser.mobile ? 1 : 0,
662              
663              /**
664               Check if the browser can play HTML5 videos
665               */
666              'html5': document.createElement('video').canPlayType ? 1 : 0
667            };
668            
669            new YT.Player(YTPlayer.playerID, {
670              //videoId: YTPlayer.videoID.toString(),
671              playerVars: playerVars,
672              events    : {
673                'onReady'                : function (event) {
674                  
675                  YTPlayer.player = event.target;
676                  
677                  //todo: make playlist works
678                  /* if (YTPlayer.playlistID && YTPlayer.apiKey) {
679                      YTPlayer.isList = true;
680                      YTPlayer.videos = [];
681                      YTPlayer.player.cuePlaylist({
682                        listType: 'playlist',
683                        list: YTPlayer.playlistID.toString(),
684                        startSeconds: YTPlayer.opt.startAt,
685                        endSeconds: YTPlayer.opt.stopAt,
686                        suggestedQuality: YTPlayer.opt.quality
687                      });
688                    }
689                     else { */
690                  
691                  YTPlayer.player.loadVideoById({
692                    videoId         : YTPlayer.videoID.toString(),
693                    // startSeconds: YTPlayer.start_from_last || YTPlayer.opt.startAt,
694                    // endSeconds: YTPlayer.opt.stopAt,
695                    suggestedQuality: YTPlayer.opt.quality
696                  });
697                  
698                  /*}*/
699                  
700                  $YTPlayer.trigger("YTPlayerIsReady_" + YTPlayer.id);
701                },
702                /**
703                 * on State Change
704                 * @param event
705                 *
706                 * -1 (unstarted)
707                 * 0 (ended)
708                 * 1 (playing)
709                 * 2 (paused)
710                 * 3 (buffering)
711                 * 5 (video cued)
712                 */
713                'onStateChange'          : function (event) {
714                  
715                  if (typeof event.target.getPlayerState != "function")
716                    return;
717                  
718                  var state = event.target.getPlayerState();
719                  
720                  if (YTPlayer.preventTrigger || YTPlayer.isStarting) {
721                    YTPlayer.preventTrigger = false;
vendor: 4,224 bytes, lines 722-814
722                    return
723                  }
724                  
725                  YTPlayer.state = state;
726                  // console.debug(YTPlayer.state);
727                  
728                  var eventType;
729                  switch (state) {
730                      
731                      /** unstarted */
732                    case -1:
733                      eventType = "YTPUnstarted";
734                      break;
735                      
736                      /** unstarted */
737                    case 0:
738                      eventType = "YTPRealEnd";
739                      break;
740                      
741                      /** play */
742                    case 1:
743                      eventType = "YTPPlay";
744                      if (YTPlayer.controlBar.length)
745                        YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause);
746                      
747                      if (YTPlayer.isPlayer)
748                        YTPlayer.inlinePlayButton.hide();
749                      
750                      jQuery(document).off("mousedown.YTPstart");
751                      break;
752                      
753                      /** pause */
754                    case 2:
755                      eventType = "YTPPause";
756                      if (YTPlayer.controlBar.length)
757                        YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
758                      
759                      if (YTPlayer.isPlayer)
760                        YTPlayer.inlinePlayButton.show();
761                      break;
762                      
763                      /** buffer */
764                    case 3:
765                      YTPlayer.player.setPlaybackQuality(YTPlayer.opt.quality);
766                      eventType = "YTPBuffering";
767                      if (YTPlayer.controlBar.length)
768                        YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
769                      break;
770                      
771                      /** cued */
772                    case 5:
773                      eventType = "YTPCued";
774                      break;
775                    
776                    default:
777                      break;
778                  }
779                  
780                  /**
781                   Trigger state events
782                   */
783                  var YTPEvent = jQuery.Event(eventType);
784                  YTPEvent.time = YTPlayer.currentTime;
785                  jQuery(YTPlayer).trigger(YTPEvent);
786                },
787                /**
788                 * onPlaybackQualityChange
789                 * @param e
790                 */
791                'onPlaybackQualityChange': function (e) {
792                  var quality = e.target.getPlaybackQuality();
793                  var YTPQualityChange = jQuery.Event("YTPQualityChange");
794                  YTPQualityChange.quality = quality;
795                  jQuery(YTPlayer).trigger(YTPQualityChange);
796                },
797                /**
798                 * onError
799                 * @param err
800                 *
801                 2 – The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.
802                 5 – The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.
803                 100 – The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.
804                 101 – The owner of the requested video does not allow it to be played in embedded players.
805                 150 – This error is the same as 101. It's just a 101 error in disguise!
806                 */
807                'onError'                : function (err) {
808                  
809                  if (typeof YTPlayer.opt.onError == "function")
810                    YTPlayer.opt.onError($YTPlayer, err);
811                  
812                  switch (err.data) {
813                    case 2:
814                      console.error("video ID:: " + YTPlayer.videoID + ": The request contains an invali
814d parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.");
815                      break;
816                    case 5:
817                      console.error("video ID:: " + YTPlayer.videoID + ": The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.");
818                      break;
819                    case 100:
820                      console.error("video ID:: " + YTPlayer.videoID + ": The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.");
821                      break;
822                    case 101:
823                    case 150:
824                      console.error("video ID:: " + YTPlayer.videoID + ": The owner of the requested video does not allow it to be played in embedded players.");
825                      break;
826                  }
827                  
828                  if (YTPlayer.isList)
829                    jQuery(YTPlayer).YTPPlayNext();
830                  
831                }
832              }
833            });
834            
835            $YTPlayer.on("YTPlayerIsReady_" + YTPlayer.id, function () {
836              
837              if (YTPlayer.isReady)
838                return this;
839              
840              YTPlayer.playerEl = YTPlayer.player.getIframe();
841              jQuery(YTPlayer.playerEl).unselectable();
842              $YTPlayer.optimizeDisplay();
843              
844              /**
845               * Optimize display on resize
846               */
847              jQuery(window).off("resize.YTP_" + YTPlayer.id).on("resize.YTP_" + YTPlayer.id, function () {
848                $YTPlayer.optimizeDisplay();
849              });
850              
851              /**
852               * Set the time of the last visit progress
853               */
854              if (YTPlayer.opt.remember_last_time) {
855                jQuery(window).on("unload.YTP_" + YTPlayer.id, function () {
856                  var current_time = YTPlayer.player.getCurrentTime();
857                  jQuery.mbCookie.set("YTPlayer_start_from" + YTPlayer.videoID, current_time, 0);
858                });
859              }
860              
861              $YTPlayer.YTPCheckForState();
862              
863            });
864          });
865        });
866        
867        $YTPlayer.off("YTPTime.mask");
868        jQuery.mbYTPlayer.applyMask(YTPlayer);
869        
870        // console.timeEnd( "YTPlayerInit" );
871      });
872    },
873    
874    /**
875     * isOnScreen
876     * Check if the YTPlayer is on screen
877     * @param YTPlayer
878     * @returns {boolean}
879     */
880    isOnScreen: function (YTPlayer, perc) {
881      perc = perc || 10;
882      var playerBox = YTPlayer.wrapper;
883      var winTop = jQuery(window).scrollTop();
884      var winBottom = winTop + jQuery(window).height();
885      
886      var margin = (playerBox.height() * perc) / 100;
887      var elTop = playerBox.offset().top + margin;
888      var elBottom = playerBox.offset().top + (playerBox.height() - margin);
889      
890      return ((elBottom <= winBottom) && (elTop >= winTop));
891    },
892    
893    /**
894     * getDataFromAPI
895     * @param YTPlayer
896     */
897    getDataFromAPI: function (YTPlayer) {
898      
899      //console.debug("getDataFromAPI", YTPlayer.id, YTPlayer.videoID)
900      
901      YTPlayer.videoData = jQuery.mbStorage.get("YTPlayer_data_" + YTPlayer.videoID);
902      /*
903            jQuery(YTPlayer).off("YTPData.YTPlayer").on("YTPData.YTPlayer", function () {
904              if (YTPlayer.hasData) {
905                if (YTPlayer.opt.coverImage || YTPlayer.orig_containment_background != "none") {
906                  // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) {
907                  var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
908                  YTPlayer.opt.containment.css({
909                    background: bgndURL,
910                    backgroundColor: "#000",
911                    backgroundSize: "cover",
912                    backgroundRepeat: "no-repeat"
913                  });
914                }
915              }
916            });
917      */
918      
919      if (YTPlayer.videoData) {
920        
921        setTimeout(function () {
922          YTPlayer.dataReceived = true;
923          
924          var YTPChanged = jQuery.Event("YTPChanged");
925          YTPChanged.time = YTPlayer.currentTime;
926          YTPChanged.videoId = YTPlayer.videoID;
927          YTPChanged.opt = YTPlayer.opt;
928          jQuery(YTPlayer).trigger(YTPChanged);
929          
930          var YTPData = jQuery.Event("YTPData");
931          YTPData.prop = {};
932          for (var x in YTPlayer.videoData)
933            YTPData.prop[x] = YTPlayer.videoData[x];
934          jQuery(YTPlayer).trigger(YTPData);
935          
936        }, YTPlayer.opt.fadeOnStartTime);
937        
938        YTPlayer.hasData = true;
939        
940      } else if (jQuery.mbYTPlayer.apiKey) {
941        
942        /**
943         * Get video info from API3 (needs api key)
944         * snippet,player,contentDetails,statistics,status
945         */
946        jQuery.getJSON(jQuery.mbYTPlayer.locationProtocol + "//www.googleapis.com/youtube/v3/videos?id=" + YTPlayer.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function (data) {
947          YTPlayer.dataReceived = true;
948          
949          var YTPChanged = jQuery.Event("YTPChanged");
950          YTPChanged.time = YTPlayer.currentTime;
951          YTPChanged.videoId = YTPlayer.videoID;
952          jQuery(YTPlayer).trigger(YTPChanged);
953          
954          function parseYTPlayer_data(data) {
955            YTPlayer.videoData = {};
956            YTPlayer.videoData.id = YTPlayer.videoID;
957            YTPlayer.videoData.channelTitle = data.channelTitle;
958            YTPlayer.videoData.title = data.title;
959            YTPlayer.videoData.description = data.description.length < 400 ? data.description : data.description.substring(0, 400) + " ...";
960            YTPlayer.videoData.thumb_max = data.thumbnails.maxres ? data.thumbnails.maxres.url : null;
961            YTPlayer.videoData.thumb_high = data.thumbnails.high ? data.thumbnails.high.url : null;
962            YTPlayer.videoData.thumb_medium = data.thumbnails.medium ? data.thumbnails.medium.url : null;
963            jQuery.mbStorage.set("YTPlayer_data_" + YTPlayer.videoID, YTPlayer.videoData);
964          }
965          
966          if (!data.items[0]) {
967            YTPlayer.videoData = {};
968            YTPlayer.hasData = false;
969          } else {
970            parseYTPlayer_data(data.items[0].snippet);
971            YTPlayer.hasData = true;
972          }
973          
974          var YTPData = jQuery.Event("YTPData");
975          YTPData.prop = {};
976          for (var x in YTPlayer.videoData) YTPData.prop[x] = YTPlayer.videoData[x];
977          jQuery(YTPlayer).trigger(YTPData);
978        });
979        
980      } else {
981        
982        setTimeout(function () {
983          var YTPChanged = jQuery.Event("YTPChanged");
984          YTPChanged.time = YTPlayer.currentTime;
985          YTPChanged.videoId = YTPlayer.videoID;
986          jQuery(YTPlayer).trigger(YTPChanged);
987        }, 10);
988        
989        /*
990                if (!YTPlayer.opt.autoPlay) {
991                  // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) {
992                  var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
993                  
994                  if (bgndURL) {
995                    
996                    YTPlayer.opt.containment.css({
997                      background: bgndURL,
998                      backgroundSize: "cover"
999                    });
1000                  }
1001                }
1002        */
1003        YTPlayer.videoData = null;
1004        
1005      }
1006      
1007      YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? 16 / 9 : YTPlayer.opt.ratio;
1008      
1009      if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) { //&& ( !jQuery.mbBrowser.mobile && !jQuery.isTablet )
1010        YTPlayer.loading = jQuery("<div/>").addClass("loading").html("Loading").hide();
1011        jQuery(YTPlayer).append(YTPlayer.loading);
1012        YTPlayer.loading.fadeIn();
1013      }
1014    },
1015    
1016    /**
1017     * removeStoredData
1018     */
1019    removeStoredData: function () {
1020      jQuery.mbStorage.remove();
1021    },
1022    
1023    /**
1024     * getVideoData
1025     * @returns {*|YTPlayer.videoData}
1026     */
1027    getVideoData: function () {
1028      var YTPlayer = this.get(0);
1029      return YTPlayer.videoData;
1030    },
1031    
1032    /**
1033     * getVideoID
1034     * @returns {*|YTPlayer.videoID|boolean}
1035     */
1036    getVideoID: function () {
1037      var YTPlayer = this.get(0);
1038      return YTPlayer.videoID || false;
1039    },
1040    
1041    /**
1042     * getPlaylistID
1043     * @returns {*|YTPlayer.videoID|boolean}
1044     */
1045    getPlaylistID  : function () {
1046      var YTPlayer = this.get(0);
1047      return YTPlayer.playlistID || false;
1048    },
1049    /**
1050     * setVideoQuality
1051     * @param quality
1052     * @returns {jQuery.mbYTPlayer}
1053     */
1054    setVideoQuality: function (quality) {
1055      var YTPlayer = this.get(0);
1056      YTPlayer.player.setPlaybackQuality(quality);
1057      return this;
1058    },
1059    
1060    /**
1061     * playlist
1062     * @param videos -> Array or String (videoList ID)
1063     * @param shuffle
1064     * @param callback
1065     * @returns {jQuery.mbYTPlayer}
1066     *
1067     * To retrieve a Youtube playlist the Youtube API key is required:
1068     * https://console.developers.google.com/
1069     * jQuery.mbYTPlayer.apiKey
1070     */
1071    playlist: function (videos, shuffle, callback) {
1072      
1073      var $YTPlayer = this;
1074      var YTPlayer = $YTPlayer.get(0);
1075      
1076      /*
1077      if (typeof videos == "String" && jQuery.mbYTPlayer.apiKey != "") {
1078        function getVideoListFromYoutube(playListID, page) {
1079          page = page || '';
1080          var youtubeAPI = "https://www.googleapis.com/youtube/v3/playlistItems";
1081          jQuery.getJSON(youtubeAPI, {
1082            part      : "snippet,contentDetails",
1083            playlistId: playListID, //You have to enter the PlaylistID
1084            maxResults: 50,
1085            pageToken : page,
1086            key       : jQuery.mbYTPlayer.apiKey //You have to enter your own YoutubeAPIKey
1087          }).done(function (response) {
1088            CreateVideosArray(response);
1089            if (response.nextPageToken) {
1090              page = response.nextPageToken;
1091              getVideoListFromYoutube(plID, page, videos);
1092            } else {
1093              $YTPlayer.YTPlaylist(YTPlayer.videos, shuffle, callback)
1094            }
1095            ;
1096          });
1097        };
1098        
1099        function CreateVideosArray(response) {
1100          var k = response.items.length;
1101          for (var i = 0; i < k; i++) {
1102            YTPlayer.videos.push({
1103              "videoURL": response.items[i].contentDetails.videoId
1104            });
1105          }
1106          ;
1107        };
1108        
1109        getVideoListFromYoutube(videos);
1110        return this;
1111      }
1112      */
1113      
1114      YTPlayer.isList = true;
1115      
1116      if (shuffle)
1117        videos = jQuery.shuffle(videos);
1118      
1119      if (!YTPlayer.videoID) {
1120        YTPlayer.videos = videos;
1121        YTPlayer.videoCounter = 1;
vendor: 4,143 bytes, lines 1122-1275
1122        YTPlayer.videoLength = videos.length;
1123        jQuery(YTPlayer).data("property", videos[0]);
1124        jQuery(YTPlayer).YTPlayer();
1125      }
1126      
1127      if (typeof callback == "function")
1128        jQuery(YTPlayer).one("YTPChanged", function () {
1129          callback(YTPlayer);
1130        });
1131      
1132      jQuery(YTPlayer).on("YTPEnd", function () {
1133        jQuery(YTPlayer).YTPPlayNext();
1134      });
1135      return this;
1136    },
1137    
1138    /**
1139     * playNext
1140     * @returns {jQuery.mbYTPlayer}
1141     */
1142    playNext: function () {
1143      var YTPlayer = this.get(0);
1144      YTPlayer.videoCounter++;
1145      if (YTPlayer.videoCounter > YTPlayer.videoLength)
1146        YTPlayer.videoCounter = 1;
1147      jQuery(YTPlayer).YTPPlayIndex(YTPlayer.videoCounter);
1148      return this;
1149    },
1150    
1151    /**
1152     * playPrev
1153     * @returns {jQuery.mbYTPlayer}
1154     */
1155    playPrev: function () {
1156      var YTPlayer = this.get(0);
1157      YTPlayer.videoCounter--;
1158      if (YTPlayer.videoCounter <= 0)
1159        YTPlayer.videoCounter = YTPlayer.videoLength;
1160      jQuery(YTPlayer).YTPPlayIndex(YTPlayer.videoCounter);
1161      return this;
1162    },
1163    
1164    /**
1165     * playIndex
1166     * @param idx
1167     * @returns {jQuery.mbYTPlayer}
1168     */
1169    playIndex: function (idx) {
1170      var YTPlayer = this.get(0);
1171      if (YTPlayer.checkForStartAt) {
1172        clearInterval(YTPlayer.checkForStartAt);
1173        clearInterval(YTPlayer.getState);
1174      }
1175      YTPlayer.videoCounter = idx;
1176      
1177      if (YTPlayer.videoCounter >= YTPlayer.videoLength)
1178        YTPlayer.videoCounter = YTPlayer.videoLength;
1179      
1180      var video = YTPlayer.videos[YTPlayer.videoCounter - 1];
1181      
1182      jQuery(YTPlayer).YTPChangeVideo(video);
1183      return this;
1184    },
1185    
1186    /**
1187     * changeVideo
1188     * @param opt
1189     * @returns {jQuery.mbYTPlayer}
1190     */
1191    changeVideo: function (opt) {
1192      var $YTPlayer = this;
1193      var YTPlayer = $YTPlayer.get(0);
1194      
1195      YTPlayer.opt.startAt = 0;
1196      YTPlayer.opt.stopAt = 0;
1197      YTPlayer.opt.mask = false;
1198      YTPlayer.opt.mute = true;
1199      YTPlayer.opt.autoPlay = true;
1200      YTPlayer.opt.addFilters = false;
1201      YTPlayer.opt.coverImage = false;
1202      
1203      YTPlayer.hasData = false;
1204      YTPlayer.hasChanged = true;
1205      
1206      YTPlayer.player.loopTime = undefined;
1207      
1208      if (opt)
1209        jQuery.extend(YTPlayer.opt, opt);
1210      
1211      //console.debug("changeVideo::", YTPlayer.opt);
1212      
1213      YTPlayer.videoID = getYTPVideoID(YTPlayer.opt.videoURL).videoID;
1214      
1215      if (YTPlayer.opt.loop && typeof YTPlayer.opt.loop == "boolean")
1216        YTPlayer.opt.loop = 9999;
1217      
1218      YTPlayer.wrapper.css({
1219        background: "none"
1220      });
1221      
1222      jQuery(YTPlayer.playerEl).CSSAnimate({
1223        opacity: 0
1224      }, YTPlayer.opt.fadeOnStartTime, function () {
1225        
1226        jQuery.mbYTPlayer.getDataFromAPI(YTPlayer);
1227        
1228        //console.debug("YTPGetPlayer::", $YTPlayer.YTPGetPlayer());
1229        
1230        $YTPlayer.YTPGetPlayer().loadVideoById({
1231          videoId         : YTPlayer.videoID,
1232          // startSeconds: YTPlayer.opt.startAt,
1233          // endSeconds: YTPlayer.opt.stopAt,
1234          suggestedQuality: YTPlayer.opt.quality
1235        });
1236        $YTPlayer.YTPPause();
1237        $YTPlayer.optimizeDisplay();
1238        
1239        $YTPlayer.YTPCheckForState();
1240      });
1241      
1242      var YTPChangeVideo = jQuery.Event("YTPChangeVideo");
1243      YTPChangeVideo.time = YTPlayer.currentTime;
1244      jQuery(YTPlayer).trigger(YTPChangeVideo);
1245      
1246      jQuery.mbYTPlayer.applyMask(YTPlayer);
1247      
1248      return this;
1249    },
1250    
1251    /**
1252     * getPlayer
1253     * @returns {player}
1254     */
1255    getPlayer: function () {
1256      var YTPlayer = this.get(0);
1257      if (!YTPlayer.isReady)
1258        return null;
1259      return YTPlayer.player || null;
1260    },
1261    
1262    /**
1263     * playerDestroy
1264     * @returns {jQuery.mbYTPlayer}
1265     */
1266    playerDestroy: function () {
1267      var YTPlayer = this.get(0);
1268      if (!YTPlayer.isReady)
1269        return this;
1270      
1271      ytp.YTAPIReady = true;
1272      ytp.backgroundIsInited = false;
1273      YTPlayer.isInit = false;
1274      YTPlayer.videoID = null;
1275      YTPlayer.isReady = false;
1276      YTPlayer.wrapper.remove();
1277      jQuery("#controlBar_" + YTPlayer.id).remove();
1278      clearInterval(YTPlayer.checkForStartAt);
1279      clearInterval(YTPlayer.getState);
1280      return this;
1281    },
1282    
1283    /**
1284     * fullscreen
1285     * @param real
1286     * @returns {jQuery.mbYTPlayer}
1287     */
1288    fullscreen: function (real) {
1289      var YTPlayer = this.get(0);
1290      
1291      if (typeof real == "undefined")
1292        real = eval(YTPlayer.opt.realfullscreen);
1293      
1294      var controls = jQuery("#controlBar_" + YTPlayer.id);
1295      var fullScreenBtn = controls.find(".mb_OnlyYT");
1296      var videoWrapper = YTPlayer.isPlayer ? YTPlayer.opt.containment : YTPlayer.wrapper;
1297      
1298      if (real) {
1299        var fullscreenchange = jQuery.mbBrowser.mozilla ? "mozfullscreenchange" : jQuery.mbBrowser.webkit ? "webkitfullscreenchange" : "fullscreenchange";
1300        jQuery(document).off(fullscreenchange).on(fullscreenchange, function () {
1301          var isFullScreen = RunPrefixMethod(document, "IsFullScreen") || RunPrefixMethod(document, "FullScreen");
1302          if (!isFullScreen) {
1303            YTPlayer.isAlone = false;
1304            fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT);
1305            jQuery(YTPlayer).YTPSetVideoQuality(YTPlayer.opt.quality);
1306            videoWrapper.removeClass("YTPFullscreen");
1307            videoWrapper.CSSAnimate({
1308              opacity: YTPlayer.opt.opacity
1309            }, YTPlayer.opt.fadeOnStartTime);
1310            
1311            videoWrapper.css({
1312              zIndex: 0
1313            });
1314            
1315            if (YTPlayer.isBackground) {
1316              jQuery("body").after(controls);
1317            } else {
1318              YTPlayer.wrapper.before(controls);
1319            }
1320            jQuery(window).resize();
1321            jQuery(YTPlayer).trigger("YTPFullScreenEnd");
1322            
1323          } else {
1324            
1325            jQuery(YTPlayer).YTPSetVideoQuality("default");
1326            jQuery(YTPlayer).trigger("YTPFullScreenStart");
1327            
1328          }
1329        });
1330      }
1331      if (!YTPlayer.isAlone) {
1332        function hideMouse() {
1333          YTPlayer.overlay.css({
1334            cursor: "none"
1335          });
1336        }
1337        
1338        jQuery(document).on("mousemove.YTPlayer", function (e) {
1339          YTPlayer.overlay.css({
1340            cursor: "auto"
1341          });
1342          clearTimeout(YTPlayer.hideCursor);
1343          if (!jQuery(e.target).parents().is(".mb_YTPBar"))
1344            YTPlayer.hideCursor = setTimeout(hideMouse, 3000);
1345        });
1346        
1347        hideMouse();
1348        
1349        if (real) {
1350          videoWrapper.css({
1351            opacity: 0
1352          });
1353          videoWrapper.addClass("YTPFullscreen");
1354          launchFullscreen(videoWrapper.get(0));
1355          
1356          setTimeout(function () {
1357            videoWrapper.CSSAnimate({
1358              opacity: 1
1359            }, YTPlayer.opt.fadeOnStartTime * 2);
1360            
1361            videoWrapper.append(controls);
1362            jQuery(YTPlayer).optimizeDisplay();
1363            YTPlayer.player.seekTo(YTPlayer.player.getCurrentTime() + .1, true);
1364            
1365          }, YTPlayer.opt.fadeOnStartTime)
1366        } else
1367          videoWrapper.css({
1368            zIndex: 10000
1369          }).CSSAnimate({
1370            opacity: 1
1371          }, YTPlayer.opt.fadeOnStartTime * 2);
1372        fullScreenBtn.html(jQuery.mbYTPlayer.controls.showSite);
1373        YTPlayer.isAlone = true;
1374      } else {
1375        jQuery(document).off("mousemove.YTPlayer");
1376        clearTimeout(YTPlayer.hideCursor);
1377        YTPlayer.overlay.css({
1378          cursor: "auto"
1379        });
1380        if (real) {
1381          cancelFullscreen();
1382        } else {
1383          videoWrapper.CSSAnimate({
1384            opacity: YTPlayer.opt.opacity
1385          }, YTPlayer.opt.fadeOnStartTime);
1386          videoWrapper.css({
1387            zIndex: 0
1388          });
1389        }
1390        fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT);
1391        YTPlayer.isAlone = false;
1392      }
1393      
1394      function RunPrefixMethod(obj, method) {
1395        var pfx = ["webkit", "moz", "ms", "o", ""];
1396        var p = 0,
1397            m, t;
1398        while (p < pfx.length && !obj[m]) {
1399          m = method;
1400          if (pfx[p] == "") {
1401            m = m.substr(0, 1).toLowerCase() + m.substr(1);
1402          }
1403          m = pfx[p] + m;
1404          t = typeof obj[m];
1405          if (t != "undefined") {
1406            pfx = [pfx[p]];
1407            return (t == "function" ? obj[m]() : obj[m]);
1408          }
1409          p++;
1410        }
1411      }
1412      
1413      function launchFullscreen(element) {
1414        RunPrefixMethod(element, "RequestFullScreen");
1415      }
1416      
1417      function cancelFullscreen() {
1418        if (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) {
1419          RunPrefixMethod(document, "CancelFullScreen");
1420        }
1421      }
1422      
1423      return this;
1424    },
1425    
1426    /**
1427     * toggleLoops
1428     * @returns {jQuery.mbYTPlayer}
1429     */
1430    toggleLoops: function () {
1431      var YTPlayer = this.get(0);
1432      var data = YTPlayer.opt;
1433      if (data.loop == 1) {
1434        data.loop = 0;
1435      } else {
1436        if (data.startAt) {
1437          YTPlayer.player.seekTo(data.startAt);
1438        } else {
1439          YTPlayer.player.playVideo();
1440        }
1441        data.loop = 1;
1442      }
1443      return this;
1444    },
1445    
1446    /**
1447     * play
1448     * @returns {jQuery.mbYTPlayer}
1449     */
1450    play: function () {
1451      var YTPlayer = this.get(0);
1452      var $YTPlayer = jQuery(YTPlayer);
1453      
1454      if (!YTPlayer.isReady)
1455        return this;
1456      
1457      setTimeout(function () {
1458        $YTPlayer.YTPSetAbundance(YTPlayer.opt.abundance);
1459      }, 300)
1460      
1461      YTPlayer.player.playVideo();
1462      
1463      jQuery(YTPlayer.playerEl).css({
1464        opacity: 1
1465      });
1466      
1467      YTPlayer.wrapper.css({
1468        backgroundImage: "none"
1469      });
1470      
1471      YTPlayer.wrapper.CSSAnimate({
1472        opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
1473      }, YTPlayer.opt.fadeOnStartTime);
1474      
1475      var controls = jQuery("#controlBar_" + YTPlayer.id);
1476      var playBtn = controls.find(".mb_YTPPlayPause");
1477      playBtn.html(jQuery.mbYTPlayer.controls.pause);
1478      YTPlayer.state = 1;
1479      
1480      return this;
1481    },
1482    
1483    /**
1484     * togglePlay
1485     * @param callback
1486     * @returns {jQuery.mbYTPlayer}
1487     */
1488    togglePlay: function (callback) {
1489      var YTPlayer = this.get(0);
1490      if (!YTPlayer.isReady)
1491        return this;
1492      
1493      if (YTPlayer.state == 1)
1494        this.YTPPause();
1495      else
1496        this.YTPPlay();
1497      
1498      if (typeof callback == "function")
1499        callback(YTPlayer.state);
1500      
1501      return this;
1502    },
1503    
1504    /**
1505     * stop
1506     * @returns {jQuery.mbYTPlayer}
1507     */
1508    stop: function () {
1509      var YTPlayer = this.get(0);
1510      if (!YTPlayer.isReady)
1511        return this;
1512      
1513      var controls = jQuery("#controlBar_" + YTPlayer.id);
1514      var playBtn = controls.find(".mb_YTPPlayPause");
1515      playBtn.html(jQuery.mbYTPlayer.controls.play);
1516      YTPlayer.player.stopVideo();
1517      return this;
1518    },
1519    
1520    /**
1521     * pause
1522     * @returns {jQuery.mbYTPlayer}
1523     */
1524    pause: function () {
1525      var YTPlayer = this.get(0);
1526      if (!YTPlayer.isReady)
1527        return this;
1528      
1529      if (YTPlayer.opt.abundance < .2)
1530        this.YTPSetAbundance(.2);
1531      
1532      YTPlayer.player.pauseVideo();
1533      YTPlayer.state = 2;
1534      return this;
1535    },
1536    
1537    /**
1538     * seekTo
1539     * @param sec
1540     * @returns {jQuery.mbYTPlayer}
1541     */
1542    seekTo: function (sec) {
1543      var YTPlayer = this.get(0);
1544      if (!YTPlayer.isReady)
1545        return this;
1546      
1547      YTPlayer.player.seekTo(sec, true);
1548      return this;
1549    },
1550    
1551    /**
1552     * setVolume
1553     * @param val
1554     * @returns {jQuery.mbYTPlayer}
1555     */
1556    setVolume: function (val) {
1557      var YTPlayer = this.get(0);
1558      if (!YTPlayer.isReady)
1559        return this;
1560      
1561      YTPlayer.opt.vol = val;
1562      YTPlayer.player.setVolume(YTPlayer.opt.vol);
1563      
1564      if (YTPlayer.volumeBar && YTPlayer.volumeBar.length)
1565        YTPlayer.volumeBar.updateSliderVal(val);
1566      
1567      return this;
1568    },
1569    /**
1570     * getVolume
1571     * @returns {*}
1572     */
1573    getVolume: function () {
1574      var YTPlayer = this.get(0);
1575      if (!YTPlayer.isReady)
1576        return this;
1577      
1578      return YTPlayer.player.getVolume();
1579    },
1580    
1581    /**
1582     * toggleVolume
1583     * @returns {jQuery.mbYTPlayer}
1584     */
1585    toggleVolume: function () {
1586      
1587      var YTPlayer = this.get(0);
1588      if (!YTPlayer.isReady)
1589        return this;
1590      
1591      if (YTPlayer.isMute) {
1592        if (!jQuery.mbBrowser.mobile)
1593          this.YTPSetVolume(YTPlayer.opt.vol)
1594        this.YTPUnmute();
1595      } else {
1596        this.YTPMute();
1597      }
1598      return this;
1599    },
1600    
1601    /**
1602     * mute
1603     * @returns {jQuery.mbYTPlayer}
1604     */
1605    mute: function () {
1606      var YTPlayer = this.get(0);
1607      if (!YTPlayer.isReady)
1608        return this;
1609      
1610      if (YTPlayer.isMute)
1611        return this;
1612      YTPlayer.player.mute();
1613      YTPlayer.isMute = true;
1614      YTPlayer.player.setVolume(0);
1615      if (YTPlayer.volumeBar && YTPlayer.volumeBar.length && YTPlayer.volumeBar.width() > 10) {
1616        YTPlayer.volumeBar.updateSliderVal(0);
1617      }
1618      var controls = jQuery("#controlBar_" + YTPlayer.id);
1619      var muteBtn = controls.find(".mb_YTPMuteUnmute");
1620      muteBtn.html(jQuery.mbYTPlayer.controls.unmute);
1621      jQuery(YTPlayer).addClass("isMuted");
1622      if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.addClass("muted");
1623      var YTPEvent = jQuery.Event("YTPMuted");
1624      YTPEvent.time = YTPlayer.currentTime;
1625      
1626      if (!YTPlayer.preventTrigger)
1627        jQuery(YTPlayer).trigger(YTPEvent);
1628      
1629      return this;
1630    },
1631    
1632    /**
1633     * unmute
1634     * @returns {jQuery.mbYTPlayer}
1635     */
1636    unmute: function () {
1637      var YTPlayer = this.get(0);
1638      if (!YTPlayer.isReady)
1639        return this;
1640      
1641      if (!YTPlayer.isMute)
1642        return this;
1643      
1644      YTPlayer.player.unMute();
1645      YTPlayer.isMute = false;
1646      jQuery(YTPlayer).YTPSetVolume(YTPlayer.opt.vol);
1647      if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol > 10 ? YTPlayer.opt.vol : 10);
1648      var controls = jQuery("#controlBar_" + YTPlayer.id);
1649      var muteBtn = controls.find(".mb_YTPMuteUnmute");
1650      muteBtn.html(jQuery.mbYTPlayer.controls.mute);
1651      jQuery(YTPlayer).removeClass("isMuted");
1652      if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.removeClass("muted");
1653      var YTPEvent = jQuery.Event("YTPUnmuted");
1654      YTPEvent.time = YTPlayer.currentTime;
1655      
1656      if (!YTPlayer.preventTrigger)
1657        jQuery(YTPlayer).trigger(YTPEvent);
1658      
1659      return this;
1660    },
1661    
1662    /* FILTERS ---------------------------------------------------------------------------------------------------------*/
1663    
1664    /**
1665     * applyFilter
1666     * @param filter
1667     * @param value
1668     * @returns {jQuery.mbYTPlayer}
1669     */
1670    applyFilter: function (filter, value) {
1671      var $YTPlayer = this;
1672      var YTPlayer = $YTPlayer.get(0);
1673      if (!YTPlayer.isReady)
1674        return this;
1675      
1676      YTPlayer.filters[filter].value = value;
1677      if (YTPlayer.filtersEnabled)
1678        $YTPlayer.YTPEnableFilters();
1679    },
1680    
1681    /**
1682     * applyFilters
1683     * @param filters
1684     * @returns {jQuery.mbYTPlayer}
1685     */
1686    applyFilters: function (filters) {
1687      var $YTPlayer = this;
1688      var YTPlayer = $YTPlayer.get(0);
1689      if (!YTPlayer.isReady)
1690        return this;
1691      
1692      if (!YTPlayer.isReady) {
1693        jQuery(YTPlayer).on("YTPReady", function () {
1694          $YTPlayer.YTPApplyFilters(filters);
1695        });
1696        return this;
1697      }
1698      
1699      for (var key in filters) {
1700        $YTPlayer.YTPApplyFilter(key, filters[key]);
1701      }
1702      
1703      $YTPlayer.trigger("YTPFiltersApplied");
1704    },
1705    
1706    /**
1707     * toggleFilter
1708     * @param filter
1709     * @param value
1710     * @returns {jQuery.mbYTPlayer}
1711     */
1712    toggleFilter: function (filter, value) {
1713      var $YTPlayer = this;
1714      var YTPlayer = $YTPlayer.get(0);
1715      if (!YTPlayer.isReady)
1716        return this;
1717      
1718      if (!YTPlayer.filters[filter].value)
1719        YTPlayer.filters[filter].value = value;
1720      else
1721        YTPlayer.filters[filter].value = 0;
1722      
1723      if (YTPlayer.filtersEnabled)
1724        jQuery(YTPlayer).YTPEnableFilters();
1725      
1726      return this;
1727    },
1728    
1729    /**
1730     * toggleFilters
1731     * @param callback
1732     * @returns {jQuery.mbYTPlayer}
1733     */
1734    toggleFilters: function (callback) {
1735      var $YTPlayer = this;
1736      var YTPlayer = $YTPlayer.get(0);
1737      if (!YTPlayer.isReady)
1738        return this;
1739      
1740      if (YTPlayer.filtersEnabled) {
1741        jQuery(YTPlayer).trigger("YTPDisableFilters");
1742        jQuery(YTPlayer).YTPDisableFilters();
1743      } else {
1744        jQuery(YTPlayer).YTPEnableFilters();
1745        jQuery(YTPlayer).trigger("YTPEnableFilters");
1746      }
1747      if (typeof callback == "function")
1748        callback(YTPlayer.filtersEnabled);
1749      
1750      return this;
1751    },
1752    
1753    /**
1754     * disableFilters
1755     * @returns {jQuery.mbYTPlayer}
1756     */
1757    disableFilters: function () {
1758      var $YTPlayer = this;
1759      var YTPlayer = $YTPlayer.get(0);
1760      if (!YTPlayer.isReady)
1761        return this;
1762      
1763      var iframe = jQuery(YTPlayer.playerEl);
1764      iframe.css("-webkit-filter", "");
1765      iframe.css("filter", "");
1766      YTPlayer.filtersEnabled = false;
1767      
1768      return this;
1769    },
1770    
1771    /**
1772     * enableFilters
1773     * @returns {jQuery.mbYTPlayer}
1774     */
1775    enableFilters: function () {
1776      var $YTPlayer = this;
1777      var YTPlayer = $YTPlayer.get(0);
1778      if (!YTPlayer.isReady)
1779        return this;
1780      
1781      var iframe = jQuery(YTPlayer.playerEl);
1782      var filterStyle = "";
1783      for (var key in YTPlayer.filters) {
1784        if (YTPlayer.filters[key].value)
1785          filterStyle += key.replace("_", "-") + "(" + YTPlayer.filters[key].value + YTPlayer.filters[key].unit + ") ";
1786      }
1787      iframe.css("-webkit-filter", filterStyle);
1788      iframe.css("filter", filterStyle);
1789      YTPlayer.filtersEnabled = true;
1790      
1791      return this;
1792    },
1793    
1794    /**
1795     * removeFilter
1796     * @param filter
1797     * @param callback
1798     * @returns {jQuery.mbYTPlayer}
1799     */
1800    removeFilter: function (filter, callback) {
1801      var $YTPlayer = this;
1802      var YTPlayer = $YTPlayer.get(0);
1803      if (!YTPlayer.isReady)
1804        return this;
1805      
1806      if (typeof filter == "function") {
1807        callback = filter;
1808        filter = null;
1809      }
1810      
1811      if (!filter) {
1812        for (var key in YTPlayer.filters) {
1813          $YTPlayer.YTPApplyFilter(key, 0);
1814        }
1815        
1816        if (typeof callback == "function")
1817          callback(key);
1818        
1819        YTPlayer.filters = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaultFilters);
1820        
1821      } else {
1822        $YTPlayer.YTPApplyFilter(filter, 0);
1823        if (typeof callback == "function") callback(filter);
1824      }
1825      
1826      var YTPEvent = jQuery.Event("YTPFiltersApplied");
1827      $YTPlayer.trigger(YTPEvent);
1828      
1829      return this;
1830    },
1831    
1832    /**
1833     * getFilters
1834     * @returns {filters}
1835     */
1836    getFilters: function () {
1837      var YTPlayer = this.get(0);
1838      if (!YTPlayer.isReady)
1839        return this;
1840      
1841      return YTPlayer.filters;
1842    },
1843    
1844    /* MASK ---------------------------------------------------------------------------------------------------------*/
1845    
1846    /**
1847     * addMask
1848     * @param mask
1849     * @returns {jQuery.mbYTPlayer}
1850     */
1851    addMask: function (mask) {
1852      var YTPlayer = this.get(0);
1853      if (!YTPlayer.isReady)
1854        return this;
1855      
1856      if (!mask)
1857        mask = YTPlayer.actualMask;
1858      
1859      var tempImg = jQuery("<img/>").attr("src", mask).on("load", function () {
1860        YTPlayer.overlay.CSSAnimate({
1861          opacity: 0
1862        }, YTPlayer.opt.fadeOnStartTime, function () {
1863          YTPlayer.hasMask = true;
1864          tempImg.remove();
1865          YTPlayer.overlay.css({
1866            backgroundImage   : "url(" + mask + ")",
1867            backgroundRepeat  : "no-repeat",
1868            backgroundPosition: "center center",
1869            backgroundSize    : "cover"
1870          });
1871          YTPlayer.overlay.CSSAnimate({
1872            opacity: 1
1873          }, YTPlayer.opt.fadeOnStartTime);
1874        });
1875      });
1876      
1877      return this;
1878    },
1879    
1880    /**
1881     * removeMask
1882     * @returns {jQuery.mbYTPlayer}
1883     */
1884    removeMask: function () {
1885      var YTPlayer = this.get(0);
1886      if (!YTPlayer.isReady)
1887        return this;
1888      
1889      YTPlayer.overlay.CSSAnimate({
1890        opacity: 0
1891      }, YTPlayer.opt.fadeOnStartTime, function () {
1892        YTPlayer.hasMask = false;
1893        YTPlayer.overlay.css({
1894          backgroundImage   : "",
1895          backgroundRepeat  : "",
1896          backgroundPosition: "",
1897          backgroundSize    : ""
1898        });
1899        YTPlayer.overlay.CSSAnimate({
1900          opacity: 1
1901        }, YTPlayer.opt.fadeOnStartTime);
1902      });
1903      
1904      return this;
1905    },
1906    
1907    /**
1908     * Apply mask
1909     * @param YTPlayer
1910     */
1911    applyMask: function (YTPlayer) {
1912      var $YTPlayer = jQuery(YTPlayer);
1913      if (!YTPlayer.isReady)
1914        return this;
1915      
1916      $YTPlayer.off("YTPTime.mask");
1917      
1918      if (YTPlayer.opt.mask) {
1919        if (typeof YTPlayer.opt.mask == "string") {
1920          $YTPlayer.YTPAddMask(YTPlayer.opt.mask);
1921          YTPlayer.actualMask = YTPlayer.opt.mask;
1922        } else if (typeof YTPlayer.opt.mask == "object") {
1923          for (var time in YTPlayer.opt.mask) {
1924            if (YTPlayer.opt.mask[time])
1925              var img = jQuery("<img/>").attr("src", YTPlayer.opt.mask[time]);
1926          }
1927          if (YTPlayer.opt.mask[0])
1928            $YTPlayer.YTPAddMask(YTPlayer.opt.mask[0]);
1929          $YTPlayer.on("YTPTime.mask", function (e) {
1930            for (var time in YTPlayer.opt.mask) {
1931              if (e.time == time)
1932                if (!YTPlayer.opt.mask[time]) {
1933                  $YTPlayer.YTPRemoveMask();
1934                } else {
1935                  $YTPlayer.YTPAddMask(YTPlayer.opt.mask[time]);
1936                  YTPlayer.actualMask = YTPlayer.opt.mask[time];
1937                }
1938            }
1939          });
1940        }
1941      }
1942    },
1943    
1944    /**
1945     * toggleMask
1946     * @returns {jQuery.mbYTPlayer}
1947     */
1948    toggleMask: function () {
1949      var YTPlayer = this.get(0);
1950      if (!YTPlayer.isReady)
1951        return this;
1952      
1953      var $YTPlayer = jQuery(YTPlayer);
1954      if (YTPlayer.hasMask)
1955        $YTPlayer.YTPRemoveMask();
1956      else
1957        $YTPlayer.YTPAddMask();
1958      return this;
1959    },
1960    
1961    /* CONTROLS --------------------------------------------------------------------------------------------------------*/
1962    
1963    /**
1964     * manageProgress
1965     * @returns {{totalTime: number, currentTime: number}}
1966     */
1967    manageProgress: function () {
1968      var YTPlayer = this.get(0);
1969      var controls = jQuery("#controlBar_" + YTPlayer.id);
1970      var progressBar = controls.find(".mb_YTPProgress");
1971      var loadedBar = controls.find(".mb_YTPLoaded");
1972      var timeBar = controls.find(".mb_YTPseekbar");
1973      var totW = progressBar.outerWidth();
1974      var currentTime = Math.floor(YTPlayer.player.getCurrentTime());
1975      var totalTime = Math.floor(YTPlayer.player.getDuration());
1976      var timeW = (currentTime * totW) / totalTime;
1977      var startLeft = 0;
1978      var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100;
1979      loadedBar.css({
1980        left : startLeft,
1981        width: loadedW + "%"
1982      });
1983      timeBar.css({
1984        left : 0,
1985        width: timeW
1986      });
1987      return {
1988        totalTime  : totalTime,
1989        currentTime: currentTime
1990      };
1991    },
1992    
1993    /**
1994     * buildControls
1995     * @param YTPlayer
1996     */
1997    buildControls: function (YTPlayer) {
1998      
1999      jQuery("#controlBar_" + YTPlayer.id).remove();
2000      if (!YTPlayer.opt.showControls) {
2001        YTPlayer.controlBar = false;
2002        return;
2003      }
2004      
2005      // @YTPlayer.opt.printUrl: is deprecated; use YTPlayer.opt.showYTLogo
2006      YTPlayer.opt.showYTLogo = YTPlayer.opt.showYTLogo || YTPlayer.opt.printUrl;
2007      if (jQuery("#controlBar_" + YTPlayer.id).length)
2008        return;
2009      YTPlayer.controlBar = jQuery("<span/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTPBar").css({
2010        whiteSpace: "noWrap",
2011        position  : YTPlayer.isBackground ? "fixed" : "absolute",
2012        zIndex    : YTPlayer.isBackground ? 10000 : 1000
2013      }).hide().on("click", function (e) {
2014        e.stopPropagation();
2015      });
2016      var buttonBar = jQuery("<div/>").addClass("buttonBar");
2017      /**
2018       *  play/pause button
2019       * */
2020      var playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTPPlayPause ytpicon").on("click", function (e) {
2021        e.stopPropagation();
2022        jQuery(YTPlayer).YTPTogglePlay();
2023      });
2024      /**
2025       *  mute/unmute button
2026       * */
2027      var MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTPMuteUnmute ytpicon").on("click", function (e) {
2028        e.stopPropagation();
2029        jQuery(YTPlayer).YTPToggleVolume();
2030      });
2031      /**
2032       *  volume bar
2033       * */
2034      var volumeBar = jQuery("<div/>").addClass("mb_YTPVolumeBar").css({
2035        display: "inline-block"
2036      });
2037      YTPlayer.volumeBar = volumeBar;
2038      
2039      /**
2040       * time elapsed
2041       * */
2042      var idx = jQuery("<span/>").addClass("mb_YTPTime");
2043      var vURL = YTPlayer.opt.videoURL ? YTPlayer.opt.videoURL : "";
2044      if (vURL.indexOf("http") < 0) vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + YTPlayer.opt.videoURL;
2045      var movieUrl = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.ytLogo).addClass("mb_YTPUrl ytpicon").attr("title", "view on YouTube").on("click", function () {
2046        window.open(vURL, "viewOnYT")
2047      });
2048      var onlyVideo = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.onlyYT).addClass("mb_OnlyYT ytpicon").on("click", function (e) {
2049        e.stopPropagation();
2050        jQuery(YTPlayer).YTPFullscreen(YTPlayer.opt.realfullscreen);
2051      });
2052      var progressBar = jQuery("<div/>").addClass("mb_YTPProgress").css("position", "absolute").on("click", function (e) {
2053        e.stopPropagation();
2054        timeBar.css({
2055          width: (e.clientX - timeBar.offset().left)
2056        });
2057        YTPlayer.timeW = e.clientX - timeBar.offset().left;
2058        YTPlayer.controlBar.find(".mb_YTPLoaded").css({
2059          width: 0
2060        });
2061        var totalTime = Math.floor(YTPlayer.player.getDuration());
2062        YTPlayer.goto = (timeBar.outerWidth() * totalTime) / progressBar.outerWidth();
2063        YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), true);
2064        YTPlayer.controlBar.find(".mb_YTPLoaded").css({
2065          width: 0
2066        });
2067      });
2068      var loadedBar = jQuery("<div/>").addClass("mb_YTPLoaded").css("position", "absolute");
2069      var timeBar = jQuery("<div/>").addClass("mb_YTPseekbar").css("position", "absolute");
2070      progressBar.append(loadedBar).append(timeBar);
2071      buttonBar.append(playpause).append(MuteUnmute).append(volumeBar).append(idx);
2072      
2073      if (YTPlayer.opt.showYTLogo) {
2074        buttonBar.append(movieUrl);
2075      }
2076      
2077      /**
2078       * Full screen button
2079       */
2080      if (YTPlayer.isBackground || (eval(YTPlayer.opt.realfullscreen) && !YTPlayer.isBackground))
2081        buttonBar.append(onlyVideo);
2082      
2083      YTPlayer.controlBar.append(buttonBar).append(progressBar);
2084      
2085      if (!YTPlayer.isBackground) {
2086        YTPlayer.controlBar.addClass("inlinePlayer");
2087        YTPlayer.wrapper.before(YTPlayer.controlBar);
2088      } else {
2089        jQuery("body").after(YTPlayer.controlBar);
2090      }
2091      
2092      /**
2093       * Volume slider
2094       */
2095      volumeBar.simpleSlider({
2096        initialval : YTPlayer.opt.vol,
2097        scale      : 100,
2098        orientation: "h",
2099        callback   : function (el) {
2100          if (el.value == 0) {
2101            jQuery(YTPlayer).YTPMute();
2102          } else {
2103            jQuery(YTPlayer).YTPUnmute();
2104          }
2105          YTPlayer.player.setVolume(el.value);
2106          if (!YTPlayer.isMute)
2107            YTPlayer.opt.vol = el.value;
2108        }
2109      });
2110    },
2111    
2112    /* MANAGE PLAYER STATE ------------------------------------------------------------------------------------------*/
2113    
2114    /**
2115     * checkForState
2116     */
2117    checkForState: function () {
2118      var YTPlayer = this.get(0);
2119      var $YTPlayer = jQuery(YTPlayer);
2120      
2121      clearInterval(YTPlayer.getState);
2122      var interval = 100;
2123      //Checking if player has been removed from the scene
2124      if (!jQuery.contains(document, YTPlayer)) {
2125        $YTPlayer.YTPPlayerDestroy();
2126        clearInterval(YTPlayer.getState);
2127        clearInterval(YTPlayer.checkForStartAt);
2128        return;
2129      }
2130      
2131      jQuery.mbYTPlayer.checkForStart(YTPlayer);
2132      
2133      YTPlayer.getState = setInterval(function () {
2134        var $YTPlayer = jQuery(YTPlayer);
2135        
2136        if (!YTPlayer.isReady)
2137          return;
2138        
2139        var prog = jQuery(YTPlayer).YTPManageProgress();
2140        
2141        var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0;
2142        stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0;
2143        if (YTPlayer.currentTime != prog.currentTime) {
2144          var YTPEvent = jQuery.Event("YTPTime");
2145          YTPEvent.time = YTPlayer.currentTime;
2146          jQuery(YTPlayer).trigger(YTPEvent);
2147        }
2148        
2149        YTPlayer.currentTime = prog.currentTime;
2150        YTPlayer.totalTime = YTPlayer.player.getDuration();
2151        if (YTPlayer.player.getVolume() == 0) $YTPlayer.addClass("isMuted");
2152        else $YTPlayer.removeClass("isMuted");
2153        
2154        if (YTPlayer.opt.showControls)
2155          if (prog.totalTime) {
2156            YTPlayer.controlBar.find(".mb_YTPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime));
2157          } else {
2158            YTPlayer.controlBar.find(".mb_YTPTime").html("-- : -- / -- : --");
2159          }
2160        
2161        /**
2162         * Manage video pause on window blur
2163         */
2164        if (eval(YTPlayer.opt.stopMovieOnBlur)) {
2165          if (!document.hasFocus()) {
2166            if (YTPlayer.state == 1) {
2167              YTPlayer.hasFocus = false;
2168              YTPlayer.preventTrigger = true;
2169              $YTPlayer.YTPPause();
2170            }
2171          } else if (document.hasFocus() && !YTPlayer.hasFocus && !(YTPlayer.state == -1 || YTPlayer.state == 0)) {
2172            YTPlayer.hasFocus = true;
2173            YTPlayer.preventTrigger = true;
2174            $YTPlayer.YTPPlay();
2175          }
2176        }
2177        
2178        /**
2179         * Manage video pause if not on screen
2180         */
2181        if (YTPlayer.opt.playOnlyIfVisible) {
2182          var isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage);
2183          if (!isOnScreen && YTPlayer.state == 1) {
2184            YTPlayer.isOnScreen = false;
2185            $YTPlayer.YTPPause();
2186          } else if (isOnScreen && !YTPlayer.isOnScreen) {
2187            YTPlayer.isOnScreen = true;
2188            YTPlayer.player.playVideo();
2189          }
2190        }
2191        
2192        if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact) {
2193          YTPlayer.controlBar.addClass("compact");
2194          YTPlayer.isCompact = true;
2195          if (!YTPlayer.isMute && YTPlayer.volumeBar) YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol);
2196        } else if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact) {
2197          YTPlayer.controlBar.removeClass("compact");
2198          YTPlayer.isCompact = false;
2199          
2200          if (!YTPlayer.isMute && YTPlayer.volumeBar)
2201            YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol);
2202        }
2203        // the video is ended
2204        if (YTPlayer.player.getPlayerState() > 0 && ((parseFloat(YTPlayer.player.getDuration() - .5) < YTPlayer.player.getCurrentTime()) || (stopAt > 0 && parseFloat(YTPlayer.player.getCurrentTime()) > stopAt))) {
2205          
2206          if (YTPlayer.isEnded)
2207            return;
2208          
2209          YTPlayer.isEnded = true;
2210          setTimeout(function () {
2211            YTPlayer.isEnded = false
2212          }, 1000);
2213          
2214          if (YTPlayer.isList) {
2215            if (!YTPlayer.opt.loop || (YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1)) {
2216              YTPlayer.player.loopTime = undefined;
2217              clearInterval(YTPlayer.getState);
2218              var YTPEnd = jQuery.Event("YTPEnd");
2219              YTPEnd.time = YTPlayer.currentTime;
2220              jQuery(YTPlayer).trigger(YTPEnd);
2221              return;
2222            }
2223          } else if (!YTPlayer.opt.loop || (YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1)) {
2224            YTPlayer.player.loopTime = undefined;
2225            
2226            YTPlayer.state = 2;
2227            
2228            var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
2229            
2230            YTPlayer.opt.containment.css({
2231              background    : bgndURL,
2232              backgroundSize: "cover"
2233            });
2234            
2235            jQuery(YTPlayer).YTPPause();
2236            YTPlayer.wrapper.CSSAnimate({
2237              opacity: 0
2238            }, YTPlayer.opt.fadeOnStartTime, function () {
2239              
2240              if (YTPlayer.controlBar.length)
2241                YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
2242              
2243              var YTPEnd = jQuery.Event("YTPEnd");
2244              YTPEnd.time = YTPlayer.currentTime;
2245              jQuery(YTPlayer).trigger(YTPEnd);
2246              YTPlayer.player.seekTo(YTPlayer.opt.startAt, true);
2247              
2248              var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
2249              YTPlayer.opt.containment.css({
2250                background    : bgndURL,
2251                backgroundSize: "cover"
2252              });
2253              
2254            });
2255            return;
2256          }
2257          
2258          YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1;
2259          YTPlayer.opt.startAt = YTPlayer.opt.startAt || 1;
2260          YTPlayer.preventTrigger = true;
2261          YTPlayer.state = 2;
2262          //YTPlayer.player.pauseVideo();
2263          YTPlayer.player.seekTo(YTPlayer.opt.startAt, true);
2264          //YTPlayer.player.playVideo();
2265        }
2266      }, interval);
2267    },
2268    
2269    /**
2270     * checkForStart
2271     * @param YTPlayer
2272     */
2273    checkForStart: function (YTPlayer) {
2274      var $YTPlayer = jQuery(YTPlayer);
2275      
2276      /* If the player has been removed from scene destroy it */
2277      if (!jQuery.contains(document, YTPlayer)) {
2278        $YTPlayer.YTPPlayerDestroy();
2279        return;
2280      }
2281      
2282      /* CREATE CONTROL BAR */
2283      jQuery.mbYTPlayer.buildControls(YTPlayer);
2284      
2285      if (YTPlayer.overlay)
2286        if (YTPlayer.opt.addRaster) {
2287          var classN = YTPlayer.opt.addRaster == "dot" ? "raster-dot" : "raster";
2288          YTPlayer.overlay.addClass(YTPlayer.isRetina ? classN + " retina" : classN);
2289        } else {
2290          YTPlayer.overlay.removeClass(function (index, classNames) {
2291            // change the list into an array
2292            var current_classes = classNames.split(" "),
2293                // array of classes which are to be removed
2294                classes_to_remove = [];
2295            jQuery.each(current_classes, function (index, class_name) {
2296              // if the classname begins with bg add it to the classes_to_remove array
2297              if (/raster.*/.test(class_name)) {
2298                classes_to_remove.push(class_name);
2299              }
2300            });
2301            classes_to_remove.push("retina");
2302            // turn the array back into a string
2303            return classes_to_remove.join(" ");
2304          })
2305        }
2306      
2307      YTPlayer.preventTrigger = true;
2308      YTPlayer.state = 2;
2309      YTPlayer.preventTrigger = true;
2310      
2311      YTPlayer.player.mute();
2312      YTPlayer.player.playVideo();
2313      YTPlayer.isStarting = true;
2314      
2315      var startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
2316      
2317      YTPlayer.preventTrigger = true;
2318      YTPlayer.checkForStartAt = setInterval(function () {
2319        
2320        YTPlayer.player.mute();
2321        YTPlayer.player.seekTo(startAt, true);
2322        
2323        var canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration();
2324        if (YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo) {
2325          YTPlayer.start_from_last = null;
2326          
2327          YTPlayer.preventTrigger = true;
2328          $YTPlayer.YTPPause();
2329          
2330          clearInterval(YTPlayer.checkForStartAt);
2331          
2332          if (typeof YTPlayer.opt.onReady == "function")
2333            YTPlayer.opt.onReady(YTPlayer);
2334          
2335          YTPlayer.isReady = true;
2336          
2337          $YTPlayer.YTPRemoveFilter();
2338          
2339          if (YTPlayer.opt.addFilters) {
2340            $YTPlayer.YTPApplyFilters(YTPlayer.opt.addFilters);
2341          } else {
2342            $YTPlayer.YTPApplyFilters();
2343          }
2344          $YTPlayer.YTPEnableFilters();
2345          var YTPready = jQuery.Event("YTPReady");
2346          YTPready.time = YTPlayer.currentTime;
2347          $YTPlayer.trigger(YTPready);
2348          
2349          YTPlayer.state = 2;
2350          
2351          if (!YTPlayer.opt.mute) {
2352            YTPlayer.player.unMute();
2353            if (YTPlayer.opt.autoPlay)
2354              console.debug("To make the video 'auto-play' you must mute the audio according with the new vend
2354or policy");
2355          }
2356          else
2357            YTPlayer.player.mute();
2358          
2359          if (typeof _gaq != "undefined" && eval(YTPlayer.opt.gaTrack))
2360            _gaq.push(['_trackEvent', 'YTPlayer', 'Play', (YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString())]);
2361          else if (typeof ga != "undefined" && eval(YTPlayer.opt.gaTrack))
2362            ga('send', 'event', 'YTPlayer', 'play', (YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString()));
2363          
2364          if (YTPlayer.opt.autoPlay) {
2365            
2366            var YTPStart = jQuery.Event("YTPStart");
2367            YTPStart.time = YTPlayer.currentTime;
2368            jQuery(YTPlayer).trigger(YTPStart);
2369            
2370            YTPlayer.isStarting = false;
2371            
2372            /* Fix for Safari freeze */
2373            if (jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari) {
2374              jQuery("body").one("mousedown.YTPstart", function () {
2375                $YTPlayer.YTPPlay();
2376              });
2377            }
2378            
2379            $YTPlayer.YTPPlay();
2380            
2381          } else {
2382            
2383            YTPlayer.preventTrigger = true;
2384            $YTPlayer.YTPPause();
2385            
2386            if (YTPlayer.start_from_last)
2387              YTPlayer.player.seekTo(startAt, true);
2388            
2389            
2390            setTimeout(function () {
2391              YTPlayer.preventTrigger = true;
2392              $YTPlayer.YTPPause();
2393              
2394              console.debug("YTPPause");
2395              
2396              if (!YTPlayer.isPlayer) {
2397                if (!YTPlayer.opt.coverImage) {
2398                  jQuery(YTPlayer.playerEl).CSSAnimate({
2399                    opacity: 1
2400                  }, YTPlayer.opt.fadeOnStartTime);
2401                  YTPlayer.wrapper.CSSAnimate({
2402                    opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity
2403                  }, YTPlayer.opt.fadeOnStartTime);
2404                } else {
2405                  YTPlayer.wrapper.css({opacity: 0});
2406                  setTimeout(function () {
2407                    var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background;
2408                    YTPlayer.wrapper.css({
2409                      background      : bgndURL,
2410                      backgroundSize  : "cover",
2411                      backgroundRepeat: "no-repeat"
2412                    })
2413                  }, YTPlayer.opt.fadeOnStartTime)
2414                }
2415              }
2416              YTPlayer.isStarting = false;
2417            }, 500);
2418            
2419            if (YTPlayer.controlBar.length)
2420              YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play);
2421          }
2422          
2423          if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && (YTPlayer.loading && YTPlayer.loading.length)) {
2424            YTPlayer.loading.html("Ready");
2425            setTimeout(function () {
2426              YTPlayer.loading.fadeOut();
2427            }, 100)
2428          }
2429          
2430          if (YTPlayer.controlBar && YTPlayer.controlBar.length)
2431            YTPlayer.controlBar.slideDown(1000);
2432        }
2433        
2434        if (jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari) {
2435          
2436          YTPlayer.player.playVideo();
2437          if (startAt >= 0)
2438            YTPlayer.player.seekTo(startAt, true);
2439          
2440        }
2441        
2442      }, 100);
2443      
2444      return $YTPlayer;
2445    },
2446    
2447    /* TIME METHODS -------------------------------------------------------------------------------------------*/
2448    
2449    /**
2450     * getTime
2451     * @returns {string} time
2452     */
2453    getTime: function () {
2454      var YTPlayer = this.get(0);
2455      return jQuery.mbYTPlayer.formatTime(YTPlayer.currentTime);
2456    },
2457    
2458    /**
2459     * getTotalTime
2460     * @returns {string} total time
2461     */
2462    getTotalTime: function (format) {
2463      var YTPlayer = this.get(0);
2464      return jQuery.mbYTPlayer.formatTime(YTPlayer.totalTime);
2465    },
2466    
2467    /**
2468     * formatTime
2469     * @param s
2470     * @returns {string}
2471     */
2472    formatTime: function (s) {
2473      var min = Math.floor(s / 60);
2474      var sec = Math.floor(s - (60 * min));
2475      return (min <= 9 ? "0" + min : min) + " : " + (sec <= 9 ? "0" + sec : sec);
2476    },
2477    
2478    /* PLAYER POSITION AND SIZE OPTIMIZATION-------------------------------------------------------------------------------------------*/
2479    
2480    /**
2481     * setAnchor
2482     * @param anchor
2483     */
2484    setAnchor: function (anchor) {
2485      var $YTplayer = this;
2486      $YTplayer.optimizeDisplay(anchor);
2487    },
2488    
2489    /**
2490     * getAnchor
2491     * @param anchor
2492     */
2493    getAnchor: function () {
2494      var YTPlayer = this.get(0);
2495      return YTPlayer.opt.anchor;
2496    },
2497    
2498    /**
2499     * setAbundance
2500     * @param val
2501     * @returns {jQuery.mbYTPlayer}
2502     */
2503    setAbundance: function (val, updateOptions) {
2504      var YTPlayer = this.get(0);
2505      var $YTPlayer = this;
2506      if (updateOptions)
2507        YTPlayer.opt.abundance = val;
2508      $YTPlayer.optimizeDisplay(YTPlayer.opt.anchor, val);
2509      return $YTPlayer;
2510    },
2511    
2512    /**
2513     * getAbundance
2514     * @returns {*}
2515     */
2516    getAbundance: function () {
2517      var YTPlayer = this.get(0);
2518      return YTPlayer.opt.abundance;
2519    },
2520    
2521    /**
2522     *
2523     * @param opt
2524     * @param val
2525     * @returns {jQuery.mbYTPlayer}
2526     */
2527    setOption: function (opt, val) {
2528      var YTPlayer = this.get(0);
2529      var $YTPlayer = this;
2530      YTPlayer.opt[opt] = val;
2531      return $YTPlayer;
2532    }
2533  };
2534  
2535  /**
2536   * optimizeDisplay
2537   * @param anchor
2538   * can be center, top, bottom, right, left; (default is center,center)
2539   */
2540  jQuery.fn.optimizeDisplay = function (anchor, abundanceX) {
2541    var YTPlayer = this.get(0);
2542    var vid = {};
2543    var el = YTPlayer.wrapper;
2544    var iframe = jQuery(YTPlayer.playerEl);
2545    
2546    YTPlayer.opt.anchor = anchor || YTPlayer.opt.anchor;
2547    YTPlayer.opt.anchor = typeof YTPlayer.opt.anchor != "undefined " ? YTPlayer.opt.anchor : "center,center";
2548    var YTPAlign = YTPlayer.opt.anchor.split(",");
2549    var ab = abundanceX ? abundanceX : YTPlayer.opt.abundance;
2550    if (YTPlayer.opt.optimizeDisplay) {
2551      var abundance = el.height() * ab;
2552      var win = {};
2553      win.width = el.outerWidth();
2554      win.height = el.outerHeight() + abundance;
2555      
2556      YTPlayer.opt.ratio = YTPlayer.opt.ratio === "auto" ? 16 / 9 : YTPlayer.opt.ratio;
2557      YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio);
2558      
2559      vid.width = win.width + abundance;
2560      vid.height = Math.ceil(vid.width / YTPlayer.opt.ratio);
2561      vid.marginTop = Math.ceil(-((vid.height - win.height) / 2));
2562      vid.marginLeft = -(abundance / 2);
2563      var lowest = vid.height < win.height;
2564      
2565      if (lowest) {
2566        vid.height = win.height + abundance;
2567        vid.width = Math.ceil(vid.height * YTPlayer.opt.ratio);
2568        vid.marginTop = -(abundance / 2);
2569        vid.marginLeft = Math.ceil(-((vid.width - win.width) / 2));
2570      }
2571      
2572      for (var a in YTPAlign) {
2573        if (YTPAlign.hasOwnProperty(a)) {
2574          var al = YTPAlign[a].replace(/ /g, "");
2575          switch (al) {
2576            case "top":
2577              vid.marginTop = -(abundance / 2);
2578              break;
2579            case "bottom":
2580              vid.marginTop = Math.ceil(-(vid.height - (win.height)) - (abundance / 2));
2581              break;
2582            case "left":
2583              vid.marginLeft = -(abundance / 2);
2584              break;
2585            case "right":
2586              vid.marginLeft = Math.ceil(-(vid.width - win.width) + (abundance / 2));
2587              break;
2588            default:
2589              if (vid.width > win.width)
2590                vid.marginLeft = -((vid.width - win.width) / 2) + (abundance / 2);
2591              break;
2592          }
2593        }
2594      }
2595      
2596    } else {
2597      vid.width = "100%";
2598      vid.height = "100%";
2599      vid.marginTop = 0;
2600      vid.marginLeft = 0;
2601    }
2602    
2603    
2604    /*
2605        console.debug("YTPAlign", YTPAlign)
2606        console.debug("lowest", lowest)
2607        console.debug("abundance", abundance)
2608        console.debug("----------------------------")
2609        console.debug("vid.width", vid.width)
2610        console.debug("vid.height", vid.height)
2611        console.debug("----------------------------")
2612        console.debug("win.width", win.width)
2613        console.debug("win.height", win.height)
2614        console.debug("----------------------------")
2615        console.debug("vid.marginTop", vid.marginTop)
2616        console.debug("vid.marginLeft", vid.marginLeft)
2617    */
2618    
2619    
2620    iframe.css({
2621      width     : vid.width,
2622      height    : vid.height,
2623      marginTop : vid.marginTop,
2624      marginLeft: vid.marginLeft,
2625      maxWidth  : "initial"
2626    });
2627  };
2628  
2629  
2630  /* UTILITIES -----------------------------------------------------------------------------------------------------------------------*/
2631  
2632  /**
2633   * shuffle
2634   * @param arr
2635   * @returns {Array|string|Blob|*}
2636   *
2637   */
2638  jQuery.shuffle = function (arr) {
2639    var newArray = arr.slice();
2640    var len = newArray.length;
2641    var i = len;
2642    while (i--) {
2643      var p = parseInt(Math.random() * len);
2644      var t = newArray[i];
2645      newArray[i] = newArray[p];
2646      newArray[p] = t;
2647    }
2648    return newArray;
2649  };
2650  
2651  /**
2652   * Unselectable
2653   * @returns {*}
2654   */
2655  jQuery.fn.unselectable = function () {
2656    return this.each(function () {
2657      jQuery(this).css({
2658        "-moz-user-select"   : "none",
2659        "-webkit-user-select": "none",
2660        "user-select"        : "none"
2661      }).attr("unselectable", "on");
2662    });
2663  };
2664  
2665  /* EXTERNAL METHODS -----------------------------------------------------------------------------------------------------------------------*/
2666  
2667  jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer;
2668  jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer;
2669  
2670  jQuery.fn.YTPCheckForState = jQuery.mbYTPlayer.checkForState;
2671  
2672  jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer;
2673  jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID;
2674  jQuery.fn.YTPGetPlaylistID = jQuery.mbYTPlayer.getPlaylistID;
2675  jQuery.fn.YTPChangeVideo = jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeVideo;
2676  jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy;
2677  
2678  jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play;
2679  jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay;
2680  jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop;
2681  jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause;
2682  jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo;
2683  
2684  jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist;
2685  jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext;
2686  jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev;
2687  jQuery.fn.YTPPlayIndex = jQuery.mbYTPlayer.playIndex;
2688  
2689  jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute;
2690  jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute;
2691  jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume;
2692  jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume;
2693  jQuery.fn.YTPGetVolume = jQuery.mbYTPlayer.getVolume;
2694  
2695  jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData;
2696  jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen;
2697  jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops;
2698  jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality;
2699  jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress;
2700  
2701  jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter;
2702  jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters;
2703  jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter;
2704  jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters;
2705  jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter;
2706  jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters;
2707  jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters;
2708  jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters;
2709  
2710  jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime;
2711  jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime;
2712  
2713  jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask;
2714  jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask;
2715  jQuery.fn.YTPToggleMask = jQuery.mbYTPlayer.toggleMask;
2716  
2717  jQuery.fn.YTPGetAbundance = jQuery.mbYTPlayer.getAbundance;
2718  jQuery.fn.YTPSetAbundance = jQuery.mbYTPlayer.setAbundance;
2719  
2720  jQuery.fn.YTPSetAnchor = jQuery.mbYTPlayer.setAnchor;
2721  jQuery.fn.YTPGetAnchor = jQuery.mbYTPlayer.getAnchor;
2722  
2723  jQuery.fn.YTPSetOption = jQuery.mbYTPlayer.setOption;
2724  
2725})(jQuery, ytp);
2726;/*___________________________________________________________________________________________________________________________________________________
2727 _ jquery.mb.components                                                                                                                             _
2728 _                                                                                                                                                  _
2729 _ file: jquery.mb.browser.min.js                                                                                                                   _
2730 _ last modified: 24/05/17 19.56                                                                                                                    _
2731 _                                                                                                                                                  _
2732 _ Open Lab s.r.l., Florence - Italy                                                                                                                _
2733 _                                                                                                                                                  _
2734 _ email: [email protected]                                                                                                                       _
vendor: 30,011 bytes, lines 2735-2859
2735 _ site: http://pupunzi.com                                                                                                                         _
2736 _       http://open-lab.com                                                                                                                        _
2737 _ blog: http://pupunzi.open-lab.com                                                                                                                _
2738 _ Q&A:  http://jquery.pupunzi.com                                                                                                                  _
2739 _                                                                                                                                                  _
2740 _ Licences: MIT, GPL                                                                                                                               _
2741 _    http://www.opensource.org/licenses/mit-license.php                                                                                            _
2742 _    http://www.gnu.org/licenses/gpl.html                                                                                                          _
2743 _                                                                                                                                                  _
2744 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi);                                                                                              _
2745 ___________________________________________________________________________________________________________________________________________________*/
2746
2747var nAgt=navigator.userAgent;jQuery.browser=jQuery.browser||{};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.safari=!1;jQuery.browser.chrome=!1;jQuery.browser.androidStock=!1;jQuery.browser.msie=!1;jQuery.browser.edge=!1;jQuery.browser.ua=nAgt;function isTouchSupported(){var a=nAgt.msMaxTouchPoints,e="ontouchstart"in document.createElement("div");return a||e?!0:!1}
2748var getOS=function(){var a={version:"Unknown version",name:"Unknown OS"};-1!=navigator.appVersion.indexOf("Win")&&(a.name="Windows");-1!=navigator.appVersion.indexOf("Mac")&&0>navigator.appVersion.indexOf("Mobile")&&(a.name="Mac");-1!=navigator.appVersion.indexOf("Linux")&&(a.name="Linux");/Mac OS X/.test(nAgt)&&!/Mobile/.test(nAgt)&&(a.version=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1],a.version=a.version.replace(/_/g,".").substring(0,5));/Windows/.test(nAgt)&&(a.version="Unknown.Unknown");/Windows NT 5.1/.test(nAgt)&&
2749(a.version="5.1");/Windows NT 6.0/.test(nAgt)&&(a.version="6.0");/Windows NT 6.1/.test(nAgt)&&(a.version="6.1");/Windows NT 6.2/.test(nAgt)&&(a.version="6.2");/Windows NT 10.0/.test(nAgt)&&(a.version="10.0");/Linux/.test(nAgt)&&/Linux/.test(nAgt)&&(a.version="Unknown.Unknown");a.name=a.name.toLowerCase();a.major_version="Unknown";a.minor_version="Unknown";"Unknown.Unknown"!=a.version&&(a.major_version=parseFloat(a.version.split(".")[0]),a.minor_version=parseFloat(a.version.split(".")[1]));return a};
2750jQuery.browser.os=getOS();jQuery.browser.hasTouch=isTouchSupported();jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;
2751if(-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",
2752		jQuery.browser.fullVersion=nAgt.substring(verOffset+5);else if(-1!=nAgt.indexOf("Trident")){jQuery.browser.msie=!0;jQuery.browser.name="Microsoft Internet Explorer";var start=nAgt.indexOf("rv:")+3,end=start+4;jQuery.browser.fullVersion=nAgt.substring(start,end)}else-1!=(verOffset=nAgt.indexOf("Edge"))?(jQuery.browser.edge=!0,jQuery.browser.name="Microsoft Edge",jQuery.browser.fullVersion=nAgt.substring(verOffset+5)):-1!=(verOffset=nAgt.indexOf("Chrome"))?(jQuery.browser.webkit=!0,jQuery.browser.chrome=
2753		!0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1<nAgt.indexOf("mozilla/5.0")&&-1<nAgt.indexOf("android ")&&-1<nAgt.indexOf("applewebkit")&&!(-1<nAgt.indexOf("chrome"))?(verOffset=nAgt.indexOf("Chrome"),jQuery.browser.webkit=!0,jQuery.browser.androidStock=!0,jQuery.browser.name="androidStock",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1!=(verOffset=nAgt.indexOf("Safari"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name=
2754		"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=
2755		!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));
2756-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));
2757jQuery.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);
2758jQuery.browser.mobile=jQuery.browser.android||jQuery.browser.blackberry||jQuery.browser.ios||jQuery.browser.windowsMobile||jQuery.browser.operaMobile||jQuery.browser.kindle;jQuery.isMobile=jQuery.browser.mobile;jQuery.isTablet=jQuery.browser.mobile&&765<jQuery(window).width();jQuery.isAndroidDefault=jQuery.browser.android&&!/chrome/i.test(nAgt);jQuery.mbBrowser=jQuery.browser;
2759jQuery.browser.versionCompare=function(a,e){if("stringstring"!=typeof a+typeof e)return!1;for(var c=a.split("."),d=e.split("."),b=0,f=Math.max(c.length,d.length);b<f;b++){if(c[b]&&!d[b]&&0<parseInt(c[b])||parseInt(c[b])>parseInt(d[b]))return 1;if(d[b]&&!c[b]&&0<parseInt(d[b])||parseInt(c[b])<parseInt(d[b]))return-1}return 0};
2760;
2761/*
2762 * ******************************************************************************
2763 *  jquery.mb.components
2764 *  file: jquery.mb.CSSAnimate.min.js
2765 *
2766 *  Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi);
2767 *  Open lab srl, Firenze - Italy
2768 *  email: [email protected]
2769 *  site: 	http://pupunzi.com
2770 *  blog:	http://pupunzi.open-lab.com
2771 * 	http://open-lab.com
2772 *
2773 *  Licences: MIT, GPL
2774 *  http://www.opensource.org/licenses/mit-license.php
2775 *  http://www.gnu.org/licenses/gpl.html
2776 *
2777 *  last modified: 26/03/14 21.40
2778 *  *****************************************************************************
2779 */
2780
2781jQuery.support.CSStransition=function(){var d=(document.body||document.documentElement).style;return void 0!==d.transition||void 0!==d.WebkitTransition||void 0!==d.MozTransition||void 0!==d.MsTransition||void 0!==d.OTransition}();function uncamel(d){return d.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function setUnit(d,a){return"string"!==typeof d||d.match(/^[\-0-9\.]+jQuery/)?""+d+a:d}
2782function setFilter(d,a,b){var c=uncamel(a),g=jQuery.browser.mozilla?"":jQuery.CSS.sfx;d[g+"filter"]=d[g+"filter"]||"";b=setUnit(b>jQuery.CSS.filters[a].max?jQuery.CSS.filters[a].max:b,jQuery.CSS.filters[a].unit);d[g+"filter"]+=c+"("+b+") ";delete d[a]}
2783jQuery.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(d){var a=jQuery.extend(!0,{},d);jQuery.browser.webkit||jQuery.browser.opera?jQuery.CSS.sfx=
2784		"-webkit-":jQuery.browser.mozilla?jQuery.CSS.sfx="-moz-":jQuery.browser.msie&&(jQuery.CSS.sfx="-ms-");jQuery.CSS.sfx="";for(var b in a){"transform"===b&&(a[jQuery.CSS.sfx+"transform"]=a[b],delete a[b]);"transform-origin"===b&&(a[jQuery.CSS.sfx+"transform-origin"]=d[b],delete a[b]);"filter"!==b||jQuery.browser.mozilla||(a[jQuery.CSS.sfx+"filter"]=d[b],delete a[b]);"blur"===b&&setFilter(a,"blur",d[b]);"brightness"===b&&setFilter(a,"brightness",d[b]);"contrast"===b&&setFilter(a,"contrast",d[b]);"grayscale"===
2785b&&setFilter(a,"grayscale",d[b]);"hueRotate"===b&&setFilter(a,"hueRotate",d[b]);"invert"===b&&setFilter(a,"invert",d[b]);"saturate"===b&&setFilter(a,"saturate",d[b]);"sepia"===b&&setFilter(a,"sepia",d[b]);if("x"===b){var c=jQuery.CSS.sfx+"transform";a[c]=a[c]||"";a[c]+=" translateX("+setUnit(d[b],"px")+")";delete a[b]}"y"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" translateY("+setUnit(d[b],"px")+")",delete a[b]);"z"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" translateZ("+
2786		setUnit(d[b],"px")+")",delete a[b]);"rotate"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotate("+setUnit(d[b],"deg")+")",delete a[b]);"rotateX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateX("+setUnit(d[b],"deg")+")",delete a[b]);"rotateY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateY("+setUnit(d[b],"deg")+")",delete a[b]);"rotateZ"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateZ("+setUnit(d[b],"deg")+")",delete a[b]);"scale"===b&&
2787(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scale("+setUnit(d[b],"")+")",delete a[b]);"scaleX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleX("+setUnit(d[b],"")+")",delete a[b]);"scaleY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleY("+setUnit(d[b],"")+")",delete a[b]);"scaleZ"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleZ("+setUnit(d[b],"")+")",delete a[b]);"skew"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skew("+setUnit(d[b],
2788		"deg")+")",delete a[b]);"skewX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skewX("+setUnit(d[b],"deg")+")",delete a[b]);"skewY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skewY("+setUnit(d[b],"deg")+")",delete a[b]);"perspective"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" perspective("+setUnit(d[b],"px")+")",delete a[b])}return a},getProp:function(d){var a=[],b;for(b in d)0>a.indexOf(b)&&a.push(uncamel(b));return a.join(",")},animate:function(d,a,b,c,g){return this.each(function(){function n(){e.called=
2789		!0;e.CSSAIsRunning=!1;h.off(jQuery.CSS.transitionEnd+"."+e.id);clearTimeout(e.timeout);h.css(jQuery.CSS.sfx+"transition","");"function"==typeof g&&g.apply(e);"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null)}var e=this,h=jQuery(this);e.id=e.id||"CSSA_"+(new Date).getTime();var k=k||{type:"noEvent"};if(e.CSSAIsRunning&&e.eventType==k.type&&!jQuery.browser.msie&&9>=jQuery.browser.version)e.CSSqueue=function(){h.CSSAnimate(d,a,b,c,g)};else if(e.CSSqueue=null,e.eventType=k.type,0!==h.length&&
2790		d){d=jQuery.normalizeCss(d);e.CSSAIsRunning=!0;"function"==typeof a&&(g=a,a=jQuery.fx.speeds._default);"function"==typeof b&&(c=b,b=0);"string"==typeof b&&(g=b,b=0);"function"==typeof c&&(g=c,c="cubic-bezier(0.65,0.03,0.36,0.72)");if("string"==typeof a)for(var l in jQuery.fx.speeds)if(a==l){a=jQuery.fx.speeds[l];break}else a=jQuery.fx.speeds._default;a||(a=jQuery.fx.speeds._default);"string"===typeof g&&(c=g,g=null);if(jQuery.support.CSStransition){var f={"default":"ease","in":"ease-in",out:"ease-out",
2791	"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)",
2792	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)"};
2793	f[c]&&(c=f[c]);h.off(jQuery.CSS.transitionEnd+"."+e.id);f=jQuery.CSS.getProp(d);var m={};jQuery.extend(m,d);m[jQuery.CSS.sfx+"transition-property"]=f;m[jQuery.CSS.sfx+"transition-duration"]=a+"ms";m[jQuery.CSS.sfx+"transition-delay"]=b+"ms";m[jQuery.CSS.sfx+"transition-timing-function"]=c;setTimeout(function(){h.one(jQuery.CSS.transitionEnd+"."+e.id,n);h.css(m)},1);e.timeout=setTimeout(function(){e.called||!g?(e.called=!1,e.CSSAIsRunning=!1):(h.css(jQuery.CSS.sfx+"transition",""),g.apply(e),e.CSSAIsRunning=
2794			!1,"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null))},a+b+10)}else{for(f in d)"transform"===f&&delete d[f],"filter"===f&&delete d[f],"transform-origin"===f&&delete d[f],"auto"===d[f]&&delete d[f],"x"===f&&(k=d[f],l="left",d[l]=k,delete d[f]),"y"===f&&(k=d[f],l="top",d[l]=k,delete d[f]),"-ms-transform"!==f&&"-ms-filter"!==f||delete d[f];h.delay(b).animate(d,a,g)}}})}};jQuery.fn.CSSAnimate=jQuery.CSS.animate;jQuery.normalizeCss=jQuery.CSS.normalizeCss;
2795jQuery.fn.css3=function(d){return this.each(function(){var a=jQuery(this),b=jQuery.normalizeCss(d);a.css(b)})};
2796;/*___________________________________________________________________________________________________________________________________________________
2797 _ jquery.mb.components                                                                                                                             _
2798 _                                                                                                                                                  _
2799 _ file: jquery.mb.simpleSlider.min.js                                                                                                              _
2800 _ last modified: 09/05/17 19.31                                                                                                                    _
2801 _                                                                                                                                                  _
2802 _ Open Lab s.r.l., Florence - Italy                                                                                                                _
2803 _                                                                                                                                                  _
2804 _ email: [email protected]                                                                                                                       _
2805 _ site: http://pupunzi.com                                                                                                                         _
2806 _       http://open-lab.com                                                                                                                        _
2807 _ blog: http://pupunzi.open-lab.com                                                                                                                _
2808 _ Q&A:  http://jquery.pupunzi.com                                                                                                                  _
2809 _                                                                                                                                                  _
2810 _ Licences: MIT, GPL                                                                                                                               _
2811 _    http://www.opensource.org/licenses/mit-license.php                                                                                            _
2812 _    http://www.gnu.org/licenses/gpl.html                                                                                                          _
2813 _                                                                                                                                                  _
2814 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi);                                                                                              _
2815 ___________________________________________________________________________________________________________________________________________________*/
2816
2817
2818var nAgt=navigator.userAgent;jQuery.browser=jQuery.browser||{};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.safari=!1;jQuery.browser.chrome=!1;jQuery.browser.androidStock=!1;jQuery.browser.msie=!1;jQuery.browser.edge=!1;jQuery.browser.ua=nAgt;function isTouchSupported(){var a=nAgt.msMaxTouchPoints,e="ontouchstart"in document.createElement("div");return a||e?!0:!1}
2819var getOS=function(){var a={version:"Unknown version",name:"Unknown OS"};-1!=navigator.appVersion.indexOf("Win")&&(a.name="Windows");-1!=navigator.appVersion.indexOf("Mac")&&0>navigator.appVersion.indexOf("Mobile")&&(a.name="Mac");-1!=navigator.appVersion.indexOf("Linux")&&(a.name="Linux");/Mac OS X/.test(nAgt)&&!/Mobile/.test(nAgt)&&(a.version=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1],a.version=a.version.replace(/_/g,".").substring(0,5));/Windows/.test(nAgt)&&(a.version="Unknown.Unknown");/Windows NT 5.1/.test(nAgt)&&
2820(a.version="5.1");/Windows NT 6.0/.test(nAgt)&&(a.version="6.0");/Windows NT 6.1/.test(nAgt)&&(a.version="6.1");/Windows NT 6.2/.test(nAgt)&&(a.version="6.2");/Windows NT 10.0/.test(nAgt)&&(a.version="10.0");/Linux/.test(nAgt)&&/Linux/.test(nAgt)&&(a.version="Unknown.Unknown");a.name=a.name.toLowerCase();a.major_version="Unknown";a.minor_version="Unknown";"Unknown.Unknown"!=a.version&&(a.major_version=parseFloat(a.version.split(".")[0]),a.minor_version=parseFloat(a.version.split(".")[1]));return a};
2821jQuery.browser.os=getOS();jQuery.browser.hasTouch=isTouchSupported();jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;
2822if(-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",
2823		jQuery.browser.fullVersion=nAgt.substring(verOffset+5);else if(-1!=nAgt.indexOf("Trident")){jQuery.browser.msie=!0;jQuery.browser.name="Microsoft Internet Explorer";var start=nAgt.indexOf("rv:")+3,end=start+4;jQuery.browser.fullVersion=nAgt.substring(start,end)}else-1!=(verOffset=nAgt.indexOf("Edge"))?(jQuery.browser.edge=!0,jQuery.browser.name="Microsoft Edge",jQuery.browser.fullVersion=nAgt.substring(verOffset+5)):-1!=(verOffset=nAgt.indexOf("Chrome"))?(jQuery.browser.webkit=!0,jQuery.browser.chrome=
2824		!0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1<nAgt.indexOf("mozilla/5.0")&&-1<nAgt.indexOf("android ")&&-1<nAgt.indexOf("applewebkit")&&!(-1<nAgt.indexOf("chrome"))?(verOffset=nAgt.indexOf("Chrome"),jQuery.browser.webkit=!0,jQuery.browser.androidStock=!0,jQuery.browser.name="androidStock",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1!=(verOffset=nAgt.indexOf("Safari"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name=
2825		"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=
2826		!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));
2827-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));
2828jQuery.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);
2829jQuery.browser.mobile=jQuery.browser.android||jQuery.browser.blackberry||jQuery.browser.ios||jQuery.browser.windowsMobile||jQuery.browser.operaMobile||jQuery.browser.kindle;jQuery.isMobile=jQuery.browser.mobile;jQuery.isTablet=jQuery.browser.mobile&&765<jQuery(window).width();jQuery.isAndroidDefault=jQuery.browser.android&&!/chrome/i.test(nAgt);jQuery.mbBrowser=jQuery.browser;
2830jQuery.browser.versionCompare=function(a,e){if("stringstring"!=typeof a+typeof e)return!1;for(var c=a.split("."),d=e.split("."),b=0,f=Math.max(c.length,d.length);b<f;b++){if(c[b]&&!d[b]&&0<parseInt(c[b])||parseInt(c[b])>parseInt(d[b]))return 1;if(d[b]&&!c[b]&&0<parseInt(d[b])||parseInt(c[b])<parseInt(d[b]))return-1}return 0};
2831
2832(function(b){b.simpleSlider={defaults:{initialval:0,scale:100,orientation:"h",readonly:!1,callback:!1},events:{start:b.browser.mobile?"touchstart":"mousedown",end:b.browser.mobile?"touchend":"mouseup",move:b.browser.mobile?"touchmove":"mousemove"},init:function(c){return this.each(function(){var a=this,d=b(a);d.addClass("simpleSlider");a.opt={};b.extend(a.opt,b.simpleSlider.defaults,c);b.extend(a.opt,d.data());var e="h"==a.opt.orientation?"horizontal":"vertical";e=b("<div/>").addClass("level").addClass(e);
2833	d.prepend(e);a.level=e;d.css({cursor:"default"});"auto"==a.opt.scale&&(a.opt.scale=b(a).outerWidth());d.updateSliderVal();a.opt.readonly||(d.on(b.simpleSlider.events.start,function(c){b.browser.mobile&&(c=c.changedTouches[0]);a.canSlide=!0;d.updateSliderVal(c);"h"==a.opt.orientation?d.css({cursor:"col-resize"}):d.css({cursor:"row-resize"});b.browser.mobile||(c.preventDefault(),c.stopPropagation())}),b(document).on(b.simpleSlider.events.move,function(c){b.browser.mobile&&(c=c.changedTouches[0]);a.canSlide&&
2834	(b(document).css({cursor:"default"}),d.updateSliderVal(c),b.browser.mobile||(c.preventDefault(),c.stopPropagation()))}).on(b.simpleSlider.events.end,function(){b(document).css({cursor:"auto"});a.canSlide=!1;d.css({cursor:"auto"})}))})},updateSliderVal:function(c){var a=this.get(0);if(a.opt){a.opt.initialval="number"==typeof a.opt.initialval?a.opt.initialval:a.opt.initialval(a);var d=b(a).outerWidth(),e=b(a).outerHeight();a.x="object"==typeof c?c.clientX+document.body.scrollLeft-this.offset().left:
2835				"number"==typeof c?c*d/a.opt.scale:a.opt.initialval*d/a.opt.scale;a.y="object"==typeof c?c.clientY+document.body.scrollTop-this.offset().top:"number"==typeof c?(a.opt.scale-a.opt.initialval-c)*e/a.opt.scale:a.opt.initialval*e/a.opt.scale;a.y=this.outerHeight()-a.y;a.scaleX=a.x*a.opt.scale/d;a.scaleY=a.y*a.opt.scale/e;a.outOfRangeX=a.scaleX>a.opt.scale?a.scaleX-a.opt.scale:0>a.scaleX?a.scaleX:0;a.outOfRangeY=a.scaleY>a.opt.scale?a.scaleY-a.opt.scale:0>a.scaleY?a.scaleY:0;a.outOfRange="h"==a.opt.orientation?
2836		a.outOfRangeX:a.outOfRangeY;a.value="undefined"!=typeof c?"h"==a.opt.orientation?a.x>=this.outerWidth()?a.opt.scale:0>=a.x?0:a.scaleX:a.y>=this.outerHeight()?a.opt.scale:0>=a.y?0:a.scaleY:"h"==a.opt.orientation?a.scaleX:a.scaleY;"h"==a.opt.orientation?a.level.width(Math.floor(100*a.x/d)+"%"):a.level.height(Math.floor(100*a.y/e));"function"==typeof a.opt.callback&&a.opt.callback(a)}}};b.fn.simpleSlider=b.simpleSlider.init;b.fn.updateSliderVal=b.simpleSlider.updateSliderVal})(jQuery);
2837;/*___________________________________________________________________________________________________________________________________________________
2838 _ jquery.mb.components                                                                                                                             _
2839 _                                                                                                                                                  _
2840 _ file: jquery.mb.storage.min.js                                                                                                                   _
2841 _ last modified: 24/05/15 16.08                                                                                                                    _
2842 _                                                                                                                                                  _
2843 _ Open Lab s.r.l., Florence - Italy                                                                                                                _
2844 _                                                                                                                                                  _
2845 _ email: [email protected]                                                                                                                       _
2846 _ site: http://pupunzi.com                                                                                                                         _
2847 _       http://open-lab.com                                                                                                                        _
2848 _ blog: http://pupunzi.open-lab.com                                                                                                                _
2849 _ Q&A:  http://jquery.pupunzi.com                                                                                                                  _
2850 _                                                                                                                                                  _
2851 _ Licences: MIT, GPL                                                                                                                               _
2852 _    http://www.opensource.org/licenses/mit-license.php                                                                                            _
2853 _    http://www.gnu.org/licenses/gpl.html                                                                                                          _
2854 _                                                                                                                                                  _
2855 _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi);                                                                                              _
2856 ___________________________________________________________________________________________________________________________________________________*/
2857
2858(function(d){d.mbCookie={set:function(a,c,f,b){"object"==typeof c&&(c=JSON.stringify(c));b=b?"; domain="+b:"";var e=new Date,d="";0<f&&(e.setTime(e.getTime()+864E5*f),d="; expires="+e.toGMTString());document.cookie=a+"="+c+d+"; path=/"+b},get:function(a){a+="=";for(var c=document.cookie.split(";"),d=0;d<c.length;d++){for(var b=c[d];" "==b.charAt(0);)b=b.substring(1,b.length);if(0==b.indexOf(a))try{return JSON.parse(b.substring(a.length,b.length))}catch(e){return b.substring(a.length,b.length)}}return null},
2859	remove:function(a){d.mbCookie.set(a,"",-1)}};d.mbStorage={set:function(a,c){"object"==typeof c&&(c=JSON.stringify(c));localStorage.setItem(a,c)},get:function(a){if(localStorage[a])try{return JSON.parse(localStorage[a])}catch(c){return localStorage[a]}else return null},remove:function(a){a?localStorage.removeItem(a):localStorage.clear()}}})(jQuery);

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