PageSourceSearch

https://e-ukmppd.com/wp-content/themes/decades/js/jquery.mb.YTPlayer.js?ver=6.6.9

js e-ukmppd.com collected 2026-10-02 01:28:12 UTC 107,454 bytes, 3,010 lines download raw bytes

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