PageSourceSearch

https://sjcmaui.org/Site/javascript/components.js

js sjcmaui.org collected 2026-10-02 13:45:40 UTC 38,180 bytes, 1,317 lines download raw bytes

1/* ===================================================
2:: LIBRARY / SHARED / MENU TOP
3 * ========================================================== */
4// jQuery(function() {
5jQuery(".menu-wrap").addClass("navbar");
6jQuery(".menu").addClass("nav");
7jQuery(".menu ul").addClass("dropdown-menu");
8
9// on the first level li, make it a typical bootstrap top menu drop down
10jQuery(".navbar-nav > li").each(function() {
11
12    if (jQuery(this).children("ul").length > 0) {
13        jQuery(this).addClass("dropdown nav-item");
14        jQuery(this).children("a").addClass("dropdown-toggle nav-link");
15        jQuery(this).children("a").attr("data-toggle", "dropdown");
16        jQuery(this).children("a").html(jQuery(this).children("a").html() + '<strong class="caret"></strong>');
17         jQuery(this).children("ul").addClass("dropdown-menu");
18
19    }
20});
21
22
23
24
25jQuery(document).ready(function() {
26    //H andles menu drop down
27    jQuery('.dropdown-menu').find('form').click(function(e) {
28        e.stopPropagation();
29    });
30    jQuery('.dropdown-menu').on('touchstart.dropdown.data-api').click(function(e) {
31        e.stopPropagation();
32    });
33    // for drop down sub menu on mobile
34  jQuery('.dropdown-submenu').on('touchstart.dropdown.data-api').click(function(e) {
35        e.stopPropagation();
36
37        if (jQuery(this).hasClass("opened")) {
38          jQuery(this).removeClass("opened");
39         } else {
40          jQuery(this).addClass("opened")
41         }
42    });
43
44
45});
46
47
48
49
50/* ===================================================
51:: LIBRARY / SHARED / MENU SIDE
52 * ========================================================== */
53jQuery(function() {
54
55    var menuside_ul = jQuery('.menuside > li > ul'),
56        menuside_a = jQuery('.menuside > li > a');
57
58    menuside_ul.hide();
59
60    menuside_a.click(function(e) {
61        if (jQuery(this).attr("href") == "#") {
62
63            e.preventDefault();
64            if (!jQuery(this).hasClass('active')) {
65                menuside_a.removeClass('active');
66                menuside_ul.filter(':visible').slideUp('normal');
67                jQuery(this).addClass('active').next().stop(true, true).slideDown('normal');
68            } else {
69                jQuery(this).removeClass('active');
70                jQuery(this).next().stop(true, true).slideUp('normal');
71            }
72        }
73    });
74
75});
76
77/* ===================================================
78:: LIBRARY / PRO-COPMPONENTS / CAROUSELS / WELCOME = index page header
79 * ========================================================== */
80
81(function( $ ) {
82
83	//Function to animate slider captions
84	function doAnimations( elems ) {
85		//Cache the animationend event in a variable
86		var animEndEv = 'webkitAnimationEnd animationend';
87
88		elems.each(function () {
89			var $this = $(this),
90				$animationType = $this.data('animation');
91			$this.addClass($animationType).one(animEndEv, function () {
92				$this.removeClass($animationType);
93			});
94		});
95	}
96
97	//Variables on page load
98	var $myCarousel = $('.bs-animate'),
99		$firstAnimatingElems = $myCarousel.find('.item:first').find("[data-animation ^= 'animated']");
100
101	//Initialize carousel
102	$myCarousel.carousel();
103
104	//Animate captions in first slide on page load
105	doAnimations($firstAnimatingElems);
106
107	//Pause carousel
108	$myCarousel.carousel('pause');
109
110
111	//Other slides to be animated on carousel slide event
112	$myCarousel.on('slide.bs.carousel', function (e) {
113		var $animatingElems = $(e.relatedTarget).find("[data-animation ^= 'animated']");
114		doAnimations($animatingElems);
115	});
116
117})(jQuery);
118
119
120
121/* ===================================================
122:: YOUTUBEBACKGROUND
123 * ========================================================== */
124
125/*
126 * YoutubeBackground - A wrapper for the Youtube API - Great for fullscreen background videos or just regular videos.
127 *
128 * Licensed under the MIT license:
129 *   http://www.opensource.org/licenses/mit-license.php
130 *
131 *
132 * Version:  1.0.1
133 *
134 */
135
136// Chain of Responsibility pattern. Creates base class that can be overridden.
137if (typeof Object.create !== "function") {
138  Object.create = function(obj) {
139    function F() {}
140    F.prototype = obj;
141    return new F();
142  };
143}
144
145
146function isPlayerPlaying() {
147       // console.log("checking!");
148        var player = jQuery('#background-video').data('ytPlayer').player;
149        //console.log(player.getVideoLoadedFraction());
150        var totalSeconds = player.getDuration();
151        var secondsSoFar = player.getCurrentTime();
152        var tollerance = .25;
153        if (secondsSoFar >= totalSeconds - tollerance) {
154          console.log(totalSeconds);
155          console.log(secondsSoFar);
156            console.log("yup!");
157            player.seekTo(0);
158            console.log('resetting to zero');
159        }
160
161    }
162function checkPlayer() {
163        setInterval('isPlayerPlaying()', 200);
164        console.log("setting interval");
165
166}
167(function($, window, document) {
168  var
169    loadAPI = function loadAPI(callback) {
170
171      // Load Youtube API
172      var tag = document.createElement('script'),
173      head = document.getElementsByTagName('head')[0];
174
175      tag.src = 'https://www.youtube.com/iframe_api';
176
177      head.appendChild(tag);
178
179      // Clean up Tags.
180      head = null;
181      tag = null;
182
183      iframeIsReady(callback);
184    },
185    iframeIsReady = function iframeIsReady(callback) {
186      // Listen for Gobal YT player callback
187      if (typeof YT === 'undefined' && typeof window.loadingPlayer === 'undefined') {
188        // Prevents Ready Event from being called twice
189        window.loadingPlayer = true;
190
191
192        // Creates deferred so, other players know when to wait.
193        window.dfd = $.Deferred();
194        window.onYouTubeIframeAPIReady = function() {
195          window.onYouTubeIframeAPIReady = null;
196          window.dfd.resolve( "done" );
197          callback();
198        };
199      } else if (typeof YT === 'object')  {
200        callback();
201      } else {
202        window.dfd.done(function( name ) {
203          callback();
204        });
205      }
206    };
207
208
209
210
211  // YTPlayer Object
212  YTPlayer = {
213    player: null,
214
215    // Defaults
216    defaults: {
217      ratio: 16 / 9,
218      videoId: 'l7X4sc_BTtw',
219      mute: true,
220      repeat: true,
221      width: $(window).width(),
222      playButtonClass: 'YTPlayer-play',
223      pauseButtonClass: 'YTPlayer-pause',
224      muteButtonClass: 'YTPlayer-mute',
225      volumeUpClass: 'YTPlayer-volume-up',
226      volumeDownClass: 'YTPlayer-volume-down',
227      start: 3,
228      pauseOnScroll: false,
229      fitToBackground: true,
230      playerVars: {
231        modestbranding: 1,
232        autoplay: 1,
233        controls: 0,
234        showinfo: 0,
235        wmode: 'transparent',
236        branding: 0,
237        rel: 0,
238        autohide: 0
239      },
240      events: null
241    },
242
243    /**
244     * @function init
245     * Intializes YTPlayer object
246     */
247    init: function init(node, userOptions) {
248      var self = this;
249
250      self.userOptions = userOptions;
251
252      self.$body = $('body'),
253      self.$node = $(node),
254      self.$window = $(window);
255
256      // Setup event defaults with the reference to this
257      self.defaults.events = {
258        'onReady': function(e) {
259          self.onPlayerReady(e);
260
261          // setup up pause on scroll
262          if (self.options.pauseOnScroll) {
263            self.pauseOnScroll();
264          }
265
266          // Callback for when finished
267          if (typeof self.options.callback == 'function') {
268            self.options.callback.call(this);
269          }
270        },
271        'onStateChange': function(e) {
272          if (e.data === 1) {
273            self.$node.addClass('loaded');
274          } else if (e.data === 0 && self.options.repeat) { // video ended and repeat option is set true
275            self.player.seekTo(self.options.start);
276          }
277        }
278      }
279
280
281      self.options = $.extend(true, {}, self.defaults, self.userOptions);
282      self.options.height = Math.ceil(self.options.width / self.options.ratio);
283      self.ID = (new Date()).getTime();
284      self.holderID = 'YTPlayer-ID-' + self.ID;
285
286      if (self.options.fitToBackground) {
287        self.createBackgroundVideo();
288      } else {
289        self.createContainerVideo();
290      }
291      // Listen for Resize Event
292      self.$window.on('resize.YTplayer' + self.ID, function() {
293        self.resize(self);
294      });
295
296      loadAPI(self.onYouTubeIframeAPIReady.bind(self));
297
298      self.resize(self);
299
300      return self;
301    },
302
303
304    /**
305     * @function pauseOnScroll
306     * Adds window events to pause video on scroll.
307     */
308    pauseOnScroll: function pauseOnScroll() {
309      var self = this;
310      self.$window.on('scroll.YTplayer' + self.ID, function() {
311        var state = self.player.getPlayerState();
312        if (state === 1) {
313          self.player.pauseVideo();
314        }
315      });
316      self.$window.scrollStopped(function(){
317        var state = self.player.getPlayerState();
318        if (state === 2) {
319          self.player.playVideo();
320        }
321      });
322    },
323    /**
324     * @function createContainerVideo
325     * Adds HTML for video in a container
326     */
327    createContainerVideo: function createContainerVideo() {
328      var self = this;
329
330      /*jshint multistr: true */
331      var $YTPlayerString = $('<div id="ytplayer-container' + self.ID + '" >\
332                                    <div id="' + self.holderID + '" class="ytplayer-player"></div> \
333                                    </div> \
334                                    <div id="ytplayer-shield"></div>');
335
336      self.$node.append($YTPlayerString);
337      self.$YTPlayerString = $YTPlayerString;
338      $YTPlayerString = null;
339    },
340
341    /**
342     * @function createBackgroundVideo
343     * Adds HTML for video background
344     */
345    createBackgroundVideo: function createBackgroundVideo() {
346      /*jshint multistr: true */
347      var self = this,
348        $YTPlayerString = $('<div id="ytplayer-container' + self.ID + '" class="ytplayer-container background">\
349                                    <div id="' + self.holderID + '" class="ytplayer-player"></div>\
350                                    </div>\
351                                    <div id="ytplayer-shield"></div>');
352
353      self.$node.find('img').fadeOut();
354      self.$node.append($YTPlayerString);
355      self.$YTPlayerString = $YTPlayerString;
356      $YTPlayerString = null;
357    },
358
359    /**
360     * @function resize
361     * Resize event to change video size
362     */
363    resize: function resize(self) {
364      //var self = this;
365      var container = $(window);
366
367      if (!self.options.fitToBackground) {
368        container = self.$node;
369      }
370
371      var width = container.width(),
372        pWidth, // player width, to be defined
373        height = container.height(),
374        pHeight, // player height, tbd
375        $YTPlayerPlayer = $('#' + self.holderID);
376
377      // when screen aspect ratio differs from video, video must center and underlay one dimension
378      if (width / self.options.ratio < height) {
379        pWidth = Math.ceil(height * self.options.ratio); // get new player width
380        $YTPlayerPlayer.width(pWidth).height(height).css({
381          left: (width - pWidth) / 2,
382          top: 0
383        }); // player width is greater, offset left; reset top
384      } else { // new video width < window width (gap to right)
385        pHeight = Math.ceil(width / self.options.ratio); // get new player height
386        $YTPlayerPlayer.width(width).height(pHeight).css({
387          left: 0,
388          top: 0
389        }); // player height is greater, offset top; reset left
390      }
391
392      $YTPlayerPlayer = null;
393      container = null;
394    },
395
396    /**
397     * @function onYouTubeIframeAPIReady
398     * @ params {object} YTPlayer object for access to options
399     * Youtube API calls this function when the player is ready.
400     */
401    onYouTubeIframeAPIReady: function onYouTubeIframeAPIReady() {
402      var self = this;
403      console.log("yessss");
404      checkPlayer();
405      self.player = new window.YT.Player(self.holderID, self.options);
406    },
407
408    /**
409     * @function onPlayerReady
410     * @ params {event} window event from youtube player
411     */
412    onPlayerReady: function onPlayerReady(e) {
413      if (this.options.mute) {
414        e.target.mute();
415      }
416      e.target.playVideo();
417    },
418
419    /**
420     * @function getPlayer
421     * returns youtube player
422     */
423    getPlayer: function getPlayer() {
424      return this.player;
425    },
426
427    /**
428     * @function destroy
429     * destroys all!
430     */
431    destroy: function destroy() {
432      var self = this;
433
434      self.$node
435        .removeData('yt-init')
436        .removeData('ytPlayer')
437        .removeClass('loaded');
438
439      self.$YTPlayerString.remove();
440
441      $(window).off('resize.YTplayer' + self.ID);
442      $(window).off('scroll.YTplayer' + self.ID);
443      self.$body = null;
444      self.$node = null;
445      self.$YTPlayerString = null;
446      self.player.destroy();
447      self.player = null;
448    }
449  };
450
451  // Scroll Stopped event.
452  $.fn.scrollStopped = function(callback) {
453    var $this = $(this), self = this;
454    $this.scroll(function(){
455      if ($this.data('scrollTimeout')) {
456        clearTimeout($this.data('scrollTimeout'));
457      }
458      $this.data('scrollTimeout', setTimeout(callback,250,self));
459    });
460  };
461
462  // Create plugin
463  $.fn.YTPlayer = function(options) {
464
465    return this.each(function() {
466      var el = this;
467
468      $(el).data("yt-init", true);
469      var player = Object.create(YTPlayer);
470      player.init(el, options);
471      $.data(el, "ytPlayer", player);
472    });
473  };
474
475})(jQuery, window, document);
476
477
478/* ===================================================
479:: MORPHTEXT
480 * ========================================================== */
481
482/*!
483 * Morphext - Text Rotating Plugin for jQuery
484 * https://github.com/MrSaints/Morphext
485 *
486 * Built on jQuery Boilerplate
487 * http://jqueryboilerplate.com/
488 *
489 * Copyright 2014 Ian Lai and other contributors
490 * Released under the MIT license
491 * http://ian.mit-license.org/
492 */
493
494/*eslint-env browser */
495/*global jQuery:false */
496/*eslint-disable no-underscore-dangle */
497
498(function ($) {
499    "use strict";
500
501    var pluginName = "Morphext",
502        defaults = {
503            animation: "bounceIn",
504            separator: ",",
505            speed: 2000,
506            complete: $.noop
507        };
508
509    function Plugin (element, options) {
510        this.element = $(element);
511
512        this.settings = $.extend({}, defaults, options);
513        this._defaults = defaults;
514        this._init();
515    }
516
517    Plugin.prototype = {
518        _init: function () {
519            var $that = this;
520            this.phrases = [];
521
522            this.element.addClass("morphext");
523
524            $.each(this.element.text().split(this.settings.separator), function (key, value) {
525                $that.phrases.push($.trim(value));
526            });
527
528            this.index = -1;
529            this.animate();
530            this.start();
531        },
532        animate: function () {
533            this.index = ++this.index % this.phrases.length;
534            this.element[0].innerHTML = "<span class=\"animated " + this.settings.animation + "\">" + this.phrases[this.index] + "</span>";
535
536            if ($.isFunction(this.settings.complete)) {
537                this.settings.complete.call(this);
538            }
539        },
540        start: function () {
541            var $that = this;
542            this._interval = setInterval(function () {
543                $that.animate();
544            }, this.settings.speed);
545        },
546        stop: function () {
547            this._interval = clearInterval(this._interval);
548        }
549    };
550
551    $.fn[pluginName] = function (options) {
552        return this.each(function() {
553            if (!$.data(this, "plugin_" + pluginName)) {
554                $.data(this, "plugin_" + pluginName, new Plugin(this, options));
555            }
556        });
557    };
558})(jQuery);
559
560/* ===================================================
561:: IMAGE MIX BLEND MODES
562 * ========================================================== */
563/*
564if('CSS' in window && 'supports' in window.CSS) {
565    var support = window.CSS.supports('mix-blend-mode','overlay');
566        support = support?'mix-blend-mode-overlay':'no-mix-blend-mode-overlay';
567        $('html').addClass(support);
568        alert(support);
569}
570
571if('CSS' in window && 'supports' in window.CSS) {
572    var support = window.CSS.supports('mix-blend-mode','multiply');
573        support = support?'mix-blend-mode-multiply':'no-mix-blend-mode-multiply';
574        $('html').addClass(support);
575                alert(support);
576
577}
578*/
579/*
580    if ('CSS' in window && 'supports' in window.CSS) {
581    alert("yes, has support");
582    } else {
583    alert("no support");
584        var x = document.getElementsByClassName("blendimage");
585        for (i = 0; i < x.length; i++) {
586            x[i].style.display = "none";
587        }
588
589 	}
590*/
591
592/*
593Plugin: jQuery Parallax
594Version 1.1.3
595Author: Ian Lunn
596Twitter: @IanLunn
597Author URL: http://www.ianlunn.co.uk/
598Plugin URL: http://www.ianlunn.co.uk/plugins/jquery-parallax/
599
600Dual licensed under the MIT and GPL licenses:
601http://www.opensource.org/licenses/mit-license.php
602http://www.gnu.org/licenses/gpl.html
603*/
604
605(function( $ ){
606	var $window = $(window);
607	var windowHeight = $window.height();
608
609	$window.resize(function () {
610		windowHeight = $window.height();
611	});
612
613	$.fn.parallax = function(xpos, speedFactor, outerHeight) {
614		var $this = $(this);
615		var getHeight;
616		var firstTop;
617		var paddingTop = 0;
618
619		//get the starting position of each element to have parallax applied to it
620		$this.each(function(){
621		    firstTop = $this.offset().top;
622		});
623
624		if (outerHeight) {
625			getHeight = function(jqo) {
626				return jqo.outerHeight(true);
627			};
628		} else {
629			getHeight = function(jqo) {
630				return jqo.height();
631			};
632		}
633
634		// setup defaults if arguments aren't specified
635		if (arguments.length < 1 || xpos === null) xpos = "50%";
636		if (arguments.length < 2 || speedFactor === null) speedFactor = 0.1;
637		if (arguments.length < 3 || outerHeight === null) outerHeight = true;
638
639		// function to be called whenever the window is scrolled or resized
640		function update(){
641			var pos = $window.scrollTop();
642
643			$this.each(function(){
644				var $element = $(this);
645				var top = $element.offset().top;
646				var height = getHeight($element);
647
648				// Check if totally above or totally below viewport
649				if (top + height < pos || top > pos + windowHeight) {
650					return;
651				}
652
653				$this.css('backgroundPosition', xpos + " " + Math.round((firstTop - pos) * speedFactor) + "px");
654			});
655		}
656
657		$window.bind('scroll', update).resize(update);
658		update();
659	};
660})(jQuery);
661
662
663
664(function() {
665    var imagecanvas = document.createElement('canvas');
666    var imagecontext = imagecanvas.getContext('2d');
667    /* uncomment do see the canvas to debug
668    document.body.appendChild(imagecanvas);
669    */
670    window.addEventListener('load', function() {
671        [].forEach.call(document.querySelectorAll('img.mask'), function(img) {
672            var newImg = document.createElement('img');
673            if (img.src !== 'undefined') {
674                newImg.src = img.src;
675                newImg.onload = function() {
676                    var width = newImg.width;
677                    var height = newImg.height;
678                    var mask = document.createElement('img');
679                    mask.src = img.getAttribute('data-mask');
680                    mask.onload = function() {
681                        imagecanvas.width = width;
682                        imagecanvas.height = height;
683                        imagecontext.drawImage(mask, 0, 0, width, height);
684                        imagecontext.globalCompositeOperation = 'source-atop';
685                        imagecontext.drawImage(img, 0, 0);
686                        img.src = imagecanvas.toDataURL();
687                    }
688                }
689            }
690        });
691    }, false);
692})();
693
694/*!
695
696 =========================================================
697 * Material Kit PRO - v2.1.1
698 =========================================================
699
700 * Product Page: https://www.creative-tim.com/product/material-kit-pro
701 * Copyright 2018 Creative Tim (http://www.creative-tim.com)
702
703 * Designed by www.invisionapp.com Coded by www.creative-tim.com
704
705 =========================================================
706
707 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
708
709 */
710
711materialKit = {
712  misc: {
713    navbar_menu_visible: 0,
714    window_width: 0,
715    transparent: true,
716    colored_shadows: true,
717    fixedTop: false,
718    navbar_initialized: false,
719    isWindow: document.documentMode || /Edge/.test(navigator.userAgent)
720  },
721
722  checkScrollForParallax: function() {
723    oVal = ($(window).scrollTop() / 3);
724    big_image.css({
725      'transform': 'translate3d(0,' + oVal + 'px,0)',
726      '-webkit-transform': 'translate3d(0,' + oVal + 'px,0)',
727      '-ms-transform': 'translate3d(0,' + oVal + 'px,0)',
728      '-o-transform': 'translate3d(0,' + oVal + 'px,0)'
729    });
730  },
731
732  initFormExtendedDatetimepickers: function() {
733    $('.datetimepicker').datetimepicker({
734      icons: {
735        time: "far fa-clock",
736        date: "fa fa-calendar",
737        up: "fa fa-chevron-up",
738        down: "fa fa-chevron-down",
739        previous: 'fa fa-chevron-left',
740        next: 'fa fa-chevron-right',
741        today: 'fa fa-screenshot',
742        clear: 'fa fa-trash',
743        close: 'fa fa-remove'
744      }
745    });
746
747    $('.datepicker').datetimepicker({
748      format: 'MM/DD/YYYY',
749      icons: {
750        time: "far fa-clock",
751        date: "fa fa-calendar",
752        up: "fa fa-chevron-up",
753        down: "fa fa-chevron-down",
754        previous: 'fa fa-chevron-left',
755        next: 'fa fa-chevron-right',
756        today: 'fa fa-screenshot',
757        clear: 'fa fa-trash',
758        close: 'fa fa-remove'
759      }
760    });
761
762    $('.timepicker').datetimepicker({
763      //          format: 'H:mm',    // use this format if you want the 24hours timepicker
764      format: 'h:mm A', //use this format if you want the 12hours timpiecker with AM/PM toggle
765      icons: {
766        time: "far fa-clock",
767        date: "fa fa-calendar",
768        up: "fa fa-chevron-up",
769        down: "fa fa-chevron-down",
770        previous: 'fa fa-chevron-left',
771        next: 'fa fa-chevron-right',
772        today: 'fa fa-screenshot',
773        clear: 'fa fa-trash',
774        close: 'fa fa-remove'
775      }
776    });
777  },
778
779
780
781
782  initColoredShadows: function() {
783    if (materialKit.misc.colored_shadows == true) {
784      if (!(BrowserDetect.browser == 'Explorer' && BrowserDetect.version <= 12)) {
785        $('.card:not([data-colored-shadow="false"]) .card-header-image').each(function() {
786          $card_img = $(this);
787
788          is_on_dark_screen = $(this).closest('.section-dark, .section-image').length;
789
790          // we block the generator of the colored shadows on dark sections, because they are not natural
791          if (is_on_dark_screen == 0) {
792            var img_source = $card_img.find('img').attr('src');
793            var is_rotating = $card_img.closest('.card-rotate').length == 1 ? true : false;
794            var $append_div = $card_img;
795
796            var colored_shadow_div = $('<div class="colored-shadow"/>');
797
798            if (is_rotating) {
799              var card_image_height = $card_img.height();
800              var card_image_width = $card_img.width();
801
802              $(this).find('.back').css({
803                'height': card_image_height + 'px',
804                'width': card_image_width + 'px'
805              });
806              $append_div = $card_img.find('.front');
807            }
808
809            colored_shadow_div.css({
810              'background-image': 'url(' + img_source + ')'
811            }).appendTo($append_div);
812
813            if ($card_img.width() > 700) {
814              colored_shadow_div.addClass('colored-shadow-big');
815            }
816
817            setTimeout(function() {
818              colored_shadow_div.css('opacity', 1);
819            }, 200);
820          }
821
822        });
823      }
824    }
825  },
826
827  initRotateCard: debounce(function() {
828    $('.rotating-card-container .card-rotate').each(function() {
829      var $this = $(this);
830
831      var card_width = $(this).parent().width();
832      var card_height = $(this).find('.front .card-body').outerHeight();
833
834      $this.parent().css({
835        'margin-bottom': 30 + 'px'
836      });
837
838      $this.find('.front').css({
839        'width': card_width + 'px',
840      });
841
842      $this.find('.back').css({
843        'width': card_width + 'px',
844      });
845    });
846  }, 50),
847
848  checkScrollForTransparentNavbar: debounce(function() {
849    if ($(document).scrollTop() > scroll_distance) {
850      if (materialKit.misc.transparent) {
851        materialKit.misc.transparent = false;
852        $('.navbar-color-on-scroll').removeClass('navbar-transparent');
853      }
854    } else {
855      if (!materialKit.misc.transparent) {
856        materialKit.misc.transparent = true;
857        $('.navbar-color-on-scroll').addClass('navbar-transparent');
858      }
859    }
860  }, 17)
861};
862
863var big_image;
864
865$(document).ready(function() {
866  BrowserDetect.init();
867
868  // Init Material scripts for buttons ripples, inputs animations etc, more info on the next link https://github.com/FezVrasta/bootstrap-material-design#materialjs
869  $('body').bootstrapMaterialDesign();
870
871  window_width = $(window).width();
872
873  $navbar = $('.navbar[color-on-scroll]');
874  scroll_distance = $navbar.attr('color-on-scroll') || 500;
875
876  $navbar_collapse = $('.navbar').find('.navbar-collapse');
877
878  // Multilevel Dropdown menu
879
880  $('.dropdown-menu a.dropdown-toggle').on('click', function(e) {
881    var $el = $(this);
882    var $parent = $(this).offsetParent(".dropdown-menu");
883    if (!$(this).next().hasClass('show')) {
884      $(this).parents('.dropdown-menu').first().find('.show').removeClass("show");
885    }
886    var $subMenu = $(this).next(".dropdown-menu");
887    $subMenu.toggleClass('show');
888
889    $(this).closest("a").toggleClass('open');
890
891    $(this).parents('a.dropdown-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
892      $('.dropdown-menu .show').removeClass("show");
893    });
894
895    if (!$parent.parent().hasClass('navbar-nav')) {
896      $el.next().css({
897        "top": $el[0].offsetTop,
898        "left": $parent.outerWidth() - 4
899      });
900    }
901
902    return false;
903  });
904
905  //  Activate the Tooltips
906  $('[data-toggle="tooltip"], [rel="tooltip"]').tooltip();
907
908  // FileInput
909  $('.form-file-simple .inputFileVisible').click(function() {
910    $(this).siblings('.inputFileHidden').trigger('click');
911  });
912
913  $('.form-file-simple .inputFileHidden').change(function() {
914    var filename = $(this).val().replace(/C:\\fakepath\\/i, '');
915    $(this).siblings('.inputFileVisible').val(filename);
916  });
917
918  $('.form-file-multiple .inputFileVisible, .form-file-multiple .input-group-btn').click(function() {
919    $(this).parent().parent().find('.inputFileHidden').trigger('click');
920    $(this).parent().parent().addClass('is-focused');
921  });
922
923  $('.form-file-multiple .inputFileHidden').change(function() {
924    var names = '';
925    for (var i = 0; i < $(this).get(0).files.length; ++i) {
926      if (i < $(this).get(0).files.length - 1) {
927        names += $(this).get(0).files.item(i).name + ',';
928      } else {
929        names += $(this).get(0).files.item(i).name;
930      }
931    }
932    $(this).siblings('.input-group').find('.inputFileVisible').val(names);
933  });
934
935  $('.form-file-multiple .btn').on('focus', function() {
936    $(this).parent().siblings().trigger('focus');
937  });
938
939  $('.form-file-multiple .btn').on('focusout', function() {
940    $(this).parent().siblings().trigger('focusout');
941  });
942
943  // Activate bootstrap-select
944  if ($(".selectpicker").length != 0) {
945    $(".selectpicker").selectpicker();
946  }
947
948  // Activate Popovers
949  $('[data-toggle="popover"]').popover();
950
951  // Active Carousel
952  $('.carousel').carousel();
953
954  //Activate tags
955  // we style the badges with our colors
956  var tagClass = $('.tagsinput').data('color');
957
958  if ($(".tagsinput").length != 0) {
959    $('.tagsinput').tagsinput();
960  }
961
962  $('.bootstrap-tagsinput').addClass('' + tagClass + '-badge');
963
964  if ($('.navbar-color-on-scroll').length != 0) {
965    $(window).on('scroll', materialKit.checkScrollForTransparentNavbar);
966  }
967
968  materialKit.checkScrollForTransparentNavbar();
969
970  if (window_width >= 768) {
971    big_image = $('.page-header[data-parallax="true"]');
972    if (big_image.length != 0) {
973      $(window).on('scroll', materialKit.checkScrollForParallax);
974    }
975
976  }
977
978  //initialise rotating cards
979  materialKit.initRotateCard();
980
981  //initialise colored shadow
982  materialKit.initColoredShadows();
983});
984
985$(window).on('resize', function() {
986  materialKit.initRotateCard();
987});
988
989$(document).on('click', '.card-rotate .btn-rotate', function() {
990  var $rotating_card_container = $(this).closest('.rotating-card-container');
991
992  if ($rotating_card_container.hasClass('hover')) {
993    $rotating_card_container.removeClass('hover');
994  } else {
995    $rotating_card_container.addClass('hover');
996  }
997});
998
999$(document).on('click', '.navbar-toggler', function() {
1000  $toggle = $(this);
1001
1002  if (materialKit.misc.navbar_menu_visible == 1) {
1003    $('html').removeClass('nav-open');
1004    materialKit.misc.navbar_menu_visible = 0;
1005    $('#bodyClick').remove();
1006    setTimeout(function() {
1007      $toggle.removeClass('toggled');
1008    }, 550);
1009
1010    $('html').removeClass('nav-open-absolute');
1011  } else {
1012    setTimeout(function() {
1013      $toggle.addClass('toggled');
1014    }, 580);
1015
1016
1017    div = '<div id="bodyClick"></div>';
1018    $(div).appendTo("body").click(function() {
1019      $('html').removeClass('nav-open');
1020
1021      if ($('nav').hasClass('navbar-absolute')) {
1022        $('html').removeClass('nav-open-absolute');
1023      }
1024      materialKit.misc.navbar_menu_visible = 0;
1025      $('#bodyClick').remove();
1026      setTimeout(function() {
1027        $toggle.removeClass('toggled');
1028      }, 550);
1029    });
1030
1031    if ($('nav').hasClass('navbar-absolute')) {
1032      $('html').addClass('nav-open-absolute');
1033    }
1034
1035    $('html').addClass('nav-open');
1036    materialKit.misc.navbar_menu_visible = 1;
1037  }
1038});
1039
1040// Returns a function, that, as long as it continues to be invoked, will not
1041// be triggered. The function will be called after it stops being called for
1042// N milliseconds. If `immediate` is passed, trigger the function on the
1043// leading edge, instead of the trailing.
1044
1045function debounce(func, wait, immediate) {
1046  var timeout;
1047  return function() {
1048    var context = this,
1049      args = arguments;
1050    clearTimeout(timeout);
1051    timeout = setTimeout(function() {
1052      timeout = null;
1053      if (!immediate) func.apply(context, args);
1054    }, wait);
1055    if (immediate && !timeout) func.apply(context, args);
1056  };
1057};
1058
1059var BrowserDetect = {
1060  init: function() {
1061    this.browser = this.searchString(this.dataBrowser) || "Other";
1062    this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "Unknown";
1063  },
1064  searchString: function(data) {
1065    for (var i = 0; i < data.length; i++) {
1066      var dataString = data[i].string;
1067      this.versionSearchString = data[i].subString;
1068
1069      if (dataString.indexOf(data[i].subString) !== -1) {
1070        return data[i].identity;
1071      }
1072    }
1073  },
1074  searchVersion: function(dataString) {
1075    var index = dataString.indexOf(this.versionSearchString);
1076    if (index === -1) {
1077      return;
1078    }
1079
1080    var rv = dataString.indexOf("rv:");
1081    if (this.versionSearchString === "Trident" && rv !== -1) {
1082      return parseFloat(dataString.substring(rv + 3));
1083    } else {
1084      return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
1085    }
1086  },
1087
1088  dataBrowser: [{
1089      string: navigator.userAgent,
1090      subString: "Chrome",
1091      identity: "Chrome"
1092    },
1093    {
1094      string: navigator.userAgent,
1095      subString: "MSIE",
1096      identity: "Explorer"
1097    },
1098    {
1099      string: navigator.userAgent,
1100      subString: "Trident",
1101      identity: "Explorer"
1102    },
1103    {
1104      string: navigator.userAgent,
1105      subString: "Firefox",
1106      identity: "Firefox"
1107    },
1108    {
1109      string: navigator.userAgent,
1110      subString: "Safari",
1111      identity: "Safari"
1112    },
1113    {
1114      string: navigator.userAgent,
1115      subString: "Opera",
1116      identity: "Opera"
1117    }
1118  ]
1119
1120};
1121
1122var better_browser = '<div class="container"><div class="better-browser row"><div class="col-md-2"></div><div class="col-md-8"><h3>We are sorry but it looks like your Browser doesn\'t support our website Features. In order to get the full experience please download a new version of your favourite browser.</h3></div><div class="col-md-2"></div><br><div class="col-md-4"><a href="https://www.mozilla.org/ro/firefox/new/" class="btn btn-warning">Mozilla</a><br></div><div class="col-md-4"><a href="https://www.google.com/chrome/browser/desktop/index.html" class="btn ">Chrome</a><br></div><div class="col-md-4">
1122<a href="http://windows.microsoft.com/en-us/internet-explorer/ie-11-worldwide-languages" class="btn">Internet Explorer</a><br></div><br><br><h4>Thank you!</h4></div></div>';
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132    //-------------testimonial-6,7,8 carousel-------------
1133    $(".comncarousel").owlCarousel({
1134        items: 1,
1135        loop: true,
1136        dots: true,
1137        autoplay: true,
1138        smartSpeed: 1200,
1139        autoplayTimeout: 3000
1140    });
1141
1142
1143    //*----------carousel-1--------------
1144    $(".carousel1_wrapper").owlCarousel({
1145        items: 6,
1146        loop: true,
1147        dots: true,
1148        margin: 30,
1149        autoplay: true,
1150        smartSpeed: 1200,
1151        autoplayTimeout: 3000,
1152        responsiveClass: true,
1153        responsive: {
1154            0: {
1155                items: 1,
1156            },
1157            480: {
1158                items: 2,
1159            },
1160            768: {
1161                items: 3,
1162            },
1163            992: {
1164                items: 4,
1165            },
1166            1200: {
1167                items: 5,
1168            }
1169        }
1170    });
1171
1172
1173    //*---------carousel-2----------
1174    $(".carousel2_wrapper").owlCarousel({
1175        items: 3,
1176        loop: true,
1177        dots: false,
1178        nav: true,
1179        navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
1180        margin: 30,
1181        autoplay: true,
1182        smartSpeed: 1200,
1183        autoplayTimeout: 3000,
1184        responsiveClass: true,
1185        responsive: {
1186            0: {
1187                items: 1,
1188            },
1189            480: {
1190                items: 2,
1191            },
1192            768: {
1193                items: 3,
1194            }
1195        }
1196    });
1197
1198
1199    //*---------carousel-3--------
1200    $(".carousel3_wrapper").owlCarousel({
1201        items: 3,
1202        loop: true,
1203        dots: true,
1204        margin: 30,
1205        autoplay: true,
1206        smartSpeed: 1200,
1207        autoplayTimeout: 3000,
1208        responsiveClass: true,
1209        responsive: {
1210            0: {
1211                items: 1,
1212            },
1213            768: {
1214                items: 2,
1215
1216            },
1217            992: {
1218                items: 3,
1219            }
1220        }
1221    });
1222
1223
1224    //*----carousel-4--------
1225    $(".carousel4_wrapper").owlCarousel({
1226        items: 3,
1227        loop: true,
1228        dots: false,
1229        margin: 30,
1230        nav: true,
1231        navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
1232        autoplay: false,
1233        smartSpeed: 1200,
1234        autoplayTimeout: 3000,
1235        responsiveClass: true,
1236        responsive: {
1237            0: {
1238                items: 1,
1239            },
1240            768: {
1241                items: 2,
1242
1243            },
1244            992: {
1245                items: 3,
1246            }
1247        }
1248    });
1249
1250
1251    //*---------carousel-5---------
1252    $(".carousel5_wrapper").owlCarousel({
1253        items: 1,
1254        loop: true,
1255        dots: true,
1256        autoplay: true,
1257        nav: true,
1258        navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
1259        smartSpeed: 1200,
1260        autoplayTimeout: 3000
1261    });
1262
1263
1264    //*-------carousel-6--------
1265    $(".carousel6_wrapper").owlCarousel({
1266        items: 1,
1267        loop: true,
1268        dots: true,
1269        autoplay: true,
1270        smartSpeed: 1200,
1271        autoplayTimeout: 3000
1272    });
1273
1274
1275    //*-------carousel-6--------
1276    $(".carousel7_wrapper").owlCarousel({
1277        items: 1,
1278        loop: true,
1279        dots: false,
1280        nav: true,
1281        navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
1282        autoplay: false,
1283        smartSpeed: 1200,
1284        autoplayTimeout: 3000
1285    });
1286
1287
1288    //*----carousel-14--------
1289    $(".carousel8_wrapper").owlCarousel({
1290        items: 5,
1291        loop: true,
1292        dots: false,
1293        margin: 30,
1294        stagePadding: 10,
1295        autoplay: true,
1296        smartSpeed: 1200,
1297        autoplayTimeout: 3000,
1298        responsiveClass: true,
1299        responsive: {
1300            0: {
1301                items: 1,
1302            },
1303            480: {
1304                items: 2,
1305            },
1306            768: {
1307                items: 3,
1308            },
1309            992: {
1310                items: 4,
1311            },
1312            1200: {
1313                items: 5,
1314            }
1315        }
1316    });
vendor: 2 bytes, line 1317
1317

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.