SHARE
TWEET

js

a guest Jun 4th, 2019 71 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. window.theme = {};
  2.  
  3. // Theme Common Functions
  4. window.theme.fn = {
  5.  
  6.     getOptions: function(opts) {
  7.  
  8.         if (typeof(opts) == 'object') {
  9.  
  10.             return opts;
  11.  
  12.         } else if (typeof(opts) == 'string') {
  13.  
  14.             try {
  15.                 return JSON.parse(opts.replace(/'/g,'"').replace(';',''));
  16.             } catch(e) {
  17.                 return {};
  18.             }
  19.  
  20.         } else {
  21.  
  22.             return {};
  23.  
  24.         }
  25.  
  26.     }
  27.  
  28. };
  29.  
  30. // Navigation
  31. (function($) {
  32.  
  33.     'use strict';
  34.  
  35.     var $items = $( '.nav-main li.nav-parent' );
  36.  
  37.     function expand( $li ) {
  38.         $li.children( 'ul.nav-children' ).slideDown( 'fast', function() {
  39.             $li.addClass( 'nav-expanded' );
  40.             $(this).css( 'display', '' );
  41.             ensureVisible( $li );
  42.         });
  43.     }
  44.  
  45.     function collapse( $li ) {
  46.         $li.children('ul.nav-children' ).slideUp( 'fast', function() {
  47.             $(this).css( 'display', '' );
  48.             $li.removeClass( 'nav-expanded' );
  49.         });
  50.     }
  51.  
  52.     function ensureVisible( $li ) {
  53.         var scroller = $li.offsetParent();
  54.         if ( !scroller.get(0) ) {
  55.             return false;
  56.         }
  57.  
  58.         var top = $li.position().top;
  59.         if ( top < 0 ) {
  60.             scroller.animate({
  61.                 scrollTop: scroller.scrollTop() + top
  62.             }, 'fast');
  63.         }
  64.     }
  65.  
  66.     function buildSidebarNav( anchor, prev, next ) {
  67.         if ( anchor.prop('href') ) {
  68.             var arrowWidth = parseInt(window.getComputedStyle(anchor.get(0), ':after').width, 10) || 0;
  69.             if (ev.offsetX > anchor.get(0).offsetWidth - arrowWidth) {
  70.                 ev.preventDefault();
  71.             }
  72.         }
  73.  
  74.         if ( prev.get( 0 ) !== next.get( 0 ) ) {
  75.             collapse( prev );
  76.             expand( next );
  77.         } else {
  78.             collapse( prev );
  79.         }
  80.     }
  81.  
  82.     $items.find('> a').on('click', function( ev ) {
  83.  
  84.         var $html   = $('html'),
  85.             $window = $(window),
  86.             $anchor = $( this ),
  87.             $prev   = $anchor.closest('ul.nav').find('> li.nav-expanded' ),
  88.             $next   = $anchor.closest('li');
  89.  
  90.         if( !$html.hasClass('sidebar-left-big-icons') ) {
  91.             buildSidebarNav( $anchor, $prev, $next );
  92.         } else if( $html.hasClass('sidebar-left-big-icons') && $window.width() < 768 ) {
  93.             buildSidebarNav( $anchor, $prev, $next );
  94.         }
  95.  
  96.     });
  97.  
  98.  
  99. }).apply(this, [jQuery]);
  100.  
  101. // Skeleton
  102. (function(theme, $) {
  103.  
  104.     'use strict';
  105.  
  106.     theme = theme || {};
  107.  
  108.     var $body       = $( 'body' ),
  109.         $html       = $( 'html' ),
  110.         $window     = $( window ),
  111.         isAndroid   = navigator.userAgent.toLowerCase().indexOf('android') > -1,
  112.         isIpad      = navigator.userAgent.match(/iPad/i) != null;
  113.  
  114.     // mobile devices with fixed has a lot of issues when focus inputs and others...
  115.     if ( typeof $.browser !== 'undefined' && $.browser.mobile && $html.hasClass('fixed') ) {
  116.         $html.removeClass( 'fixed' ).addClass( 'scroll' );
  117.     }
  118.  
  119.     var Skeleton = {
  120.  
  121.         options: {
  122.             sidebars: {
  123.                 menu: '#content-menu',
  124.                 left: '#sidebar-left',
  125.                 right: '#sidebar-right'
  126.             }
  127.         },
  128.  
  129.         customScroll: ( !Modernizr.overflowscrolling && !isAndroid && $.fn.nanoScroller !== 'undefined'),
  130.  
  131.         initialize: function() {
  132.             this
  133.                 .setVars()
  134.                 .build()
  135.                 .events();
  136.         },
  137.  
  138.         setVars: function() {
  139.             this.sidebars = {};
  140.  
  141.             this.sidebars.left = {
  142.                 $el: $( this.options.sidebars.left )
  143.             };
  144.  
  145.             this.sidebars.right = {
  146.                 $el: $( this.options.sidebars.right ),
  147.                 isOpened: $html.hasClass( 'sidebar-right-opened' )
  148.             };
  149.  
  150.             this.sidebars.menu = {
  151.                 $el: $( this.options.sidebars.menu ),
  152.                 isOpened: $html.hasClass( 'inner-menu-opened' )
  153.             };
  154.  
  155.             return this;
  156.         },
  157.  
  158.         build: function() {
  159.  
  160.             if ( typeof $.browser !== 'undefined' && $.browser.mobile ) {
  161.                 $html.addClass( 'mobile-device' );
  162.             } else {
  163.                 $html.addClass( 'no-mobile-device' );
  164.             }
  165.  
  166.             $html.addClass( 'custom-scroll' );
  167.             if ( this.customScroll ) {
  168.                 this.buildSidebarLeft();
  169.                 this.buildContentMenu();
  170.             }
  171.  
  172.             if( isIpad ) {
  173.                 this.fixIpad();
  174.             }
  175.  
  176.             this.buildSidebarRight();
  177.  
  178.             return this;
  179.         },
  180.  
  181.         events: function() {
  182.             if ( this.customScroll ) {
  183.                 this.eventsSidebarLeft();
  184.             }
  185.  
  186.             this.eventsSidebarRight();
  187.             this.eventsContentMenu();
  188.  
  189.             if ( typeof $.browser !== 'undefined' && !this.customScroll && isAndroid ) {
  190.                 this.fixScroll();
  191.             }
  192.  
  193.             return this;
  194.         },
  195.  
  196.         fixScroll: function() {
  197.             var _self = this;
  198.  
  199.             $window
  200.                 .on( 'sidebar-left-opened sidebar-right-toggle', function( e, data ) {
  201.                     _self.preventBodyScrollToggle( data.added );
  202.                 });
  203.  
  204.         },
  205.  
  206.         fixIpad: function() {
  207.             var _self = this;
  208.  
  209.             $('.header, .page-header, .content-body').on('click', function(){
  210.                 $html.removeClass('sidebar-left-opened');
  211.             });
  212.         },
  213.  
  214.         buildSidebarLeft: function() {
  215.  
  216.             var initialPosition = 0;
  217.  
  218.             this.sidebars.left.isOpened = !$html.hasClass( 'sidebar-left-collapsed' ) || $html.hasClass( 'sidebar-left-opened' );
  219.  
  220.             this.sidebars.left.$nano = this.sidebars.left.$el.find( '.nano' );
  221.  
  222.             if (typeof localStorage !== 'undefined') {
  223.                 this.sidebars.left.$nano.on('update', function(e, values) {
  224.                     localStorage.setItem('sidebar-left-position', values.position);
  225.                 });
  226.  
  227.                 if (localStorage.getItem('sidebar-left-position') !== null) {
  228.                     initialPosition = localStorage.getItem('sidebar-left-position');
  229.                     this.sidebars.left.$el.find( '.nano-content').scrollTop(initialPosition);
  230.                 }
  231.             }
  232.  
  233.             this.sidebars.left.$nano.nanoScroller({
  234.                 scrollTop: initialPosition,
  235.                 alwaysVisible: true,
  236.                 preventPageScrolling: $html.hasClass( 'fixed' )
  237.             });
  238.  
  239.             return this;
  240.         },
  241.  
  242.         eventsSidebarLeft: function() {
  243.  
  244.             var _self = this,
  245.                 $nano = this.sidebars.left.$nano;
  246.  
  247.             var open = function() {
  248.                 if ( _self.sidebars.left.isOpened ) {
  249.                     return close();
  250.                 }
  251.  
  252.                 _self.sidebars.left.isOpened = true;
  253.  
  254.                 $html.addClass( 'sidebar-left-opened' );
  255.  
  256.                 $window.trigger( 'sidebar-left-toggle', {
  257.                     added: true,
  258.                     removed: false
  259.                 });
  260.  
  261.                 $html.on( 'click.close-left-sidebar', function(e) {
  262.                     e.stopPropagation();
  263.                     close(e);
  264.                 });
  265.  
  266.  
  267.             };
  268.  
  269.             var close = function(e) {
  270.                 if ( !!e && !!e.target && ($(e.target).closest( '.sidebar-left' ).get(0) || !$(e.target).closest( 'html' ).get(0)) ) {
  271.                     e.preventDefault();
  272.                     return false;
  273.                 } else {
  274.  
  275.                     $html.removeClass( 'sidebar-left-opened' );
  276.                     $html.off( 'click.close-left-sidebar' );
  277.  
  278.                     $window.trigger( 'sidebar-left-toggle', {
  279.                         added: false,
  280.                         removed: true
  281.                     });
  282.  
  283.                     _self.sidebars.left.isOpened = !$html.hasClass( 'sidebar-left-collapsed' );
  284.  
  285.                 }
  286.             };
  287.  
  288.             var updateNanoScroll = function() {
  289.                 if ( $.support.transition ) {
  290.                     $nano.nanoScroller();
  291.                     $nano
  292.                         .one('bsTransitionEnd', updateNanoScroll)
  293.                         .emulateTransitionEnd(150)
  294.                 } else {
  295.                     updateNanoScroll();
  296.                 }
  297.             };
  298.  
  299.             var isToggler = function( element ) {
  300.                 return $(element).data('fire-event') === 'sidebar-left-toggle' || $(element).parents().data('fire-event') === 'sidebar-left-toggle';
  301.             };
  302.  
  303.             this.sidebars.left.$el
  304.                 .on( 'click', function() {
  305.                     updateNanoScroll();
  306.                 })
  307.                 .on('touchend', function(e) {
  308.                     _self.sidebars.left.isOpened = !$html.hasClass( 'sidebar-left-collapsed' ) || $html.hasClass( 'sidebar-left-opened' );
  309.                     if ( !_self.sidebars.left.isOpened && !isToggler(e.target) ) {
  310.                         e.stopPropagation();
  311.                         e.preventDefault();
  312.                         open();
  313.                     }
  314.                 });
  315.  
  316.             $nano
  317.                 .on( 'mouseenter', function() {
  318.                     if ( $html.hasClass( 'sidebar-left-collapsed' ) ) {
  319.                         $nano.nanoScroller();
  320.                     }
  321.                 })
  322.                 .on( 'mouseleave', function() {
  323.                     if ( $html.hasClass( 'sidebar-left-collapsed' ) ) {
  324.                         $nano.nanoScroller();
  325.                     }
  326.                 });
  327.  
  328.             $window.on( 'sidebar-left-toggle', function(e, toggle) {
  329.                 if ( toggle.removed ) {
  330.                     $html.removeClass( 'sidebar-left-opened' );
  331.                     $html.off( 'click.close-left-sidebar' );
  332.                 }
  333.                
  334.                 // Recalculate Owl Carousel sizes
  335.                 $('.owl-carousel').trigger('refresh.owl.carousel');
  336.             });
  337.  
  338.             return this;
  339.         },
  340.  
  341.         buildSidebarRight: function() {
  342.             this.sidebars.right.isOpened = $html.hasClass( 'sidebar-right-opened' );
  343.  
  344.             if ( this.customScroll ) {
  345.                 this.sidebars.right.$nano = this.sidebars.right.$el.find( '.nano' );
  346.  
  347.                 this.sidebars.right.$nano.nanoScroller({
  348.                     alwaysVisible: true,
  349.                     preventPageScrolling: true
  350.                 });
  351.             }
  352.  
  353.             return this;
  354.         },
  355.  
  356.         eventsSidebarRight: function() {
  357.             var _self = this;
  358.  
  359.             var open = function() {
  360.                 if ( _self.sidebars.right.isOpened ) {
  361.                     return close();
  362.                 }
  363.  
  364.                 _self.sidebars.right.isOpened = true;
  365.  
  366.                 $html.addClass( 'sidebar-right-opened' );
  367.  
  368.                 $window.trigger( 'sidebar-right-toggle', {
  369.                     added: true,
  370.                     removed: false
  371.                 });
  372.  
  373.                 $html.on( 'click.close-right-sidebar', function(e) {
  374.                     e.stopPropagation();
  375.                     close(e);
  376.                 });
  377.             };
  378.  
  379.             var close = function(e) {
  380.                 if ( !!e && !!e.target && ($(e.target).closest( '.sidebar-right' ).get(0) || !$(e.target).closest( 'html' ).get(0)) ) {
  381.                     return false;
  382.                 }
  383.  
  384.                 $html.removeClass( 'sidebar-right-opened' );
  385.                 $html.off( 'click.close-right-sidebar' );
  386.  
  387.                 $window.trigger( 'sidebar-right-toggle', {
  388.                     added: false,
  389.                     removed: true
  390.                 });
  391.  
  392.                 _self.sidebars.right.isOpened = false;
  393.             };
  394.  
  395.             var bind = function() {
  396.                 $('[data-open="sidebar-right"]').on('click', function(e) {
  397.                     var $el = $(this);
  398.                     e.stopPropagation();
  399.  
  400.                     if ( $el.is('a') )
  401.                         e.preventDefault();
  402.  
  403.                     open();
  404.                 });
  405.             };
  406.  
  407.             this.sidebars.right.$el.find( '.mobile-close' )
  408.                 .on( 'click', function( e ) {
  409.                     e.preventDefault();
  410.                     $html.trigger( 'click.close-right-sidebar' );
  411.                 });
  412.  
  413.             bind();
  414.  
  415.             return this;
  416.         },
  417.  
  418.         buildContentMenu: function() {
  419.             if ( !$html.hasClass( 'fixed' ) ) {
  420.                 return false;
  421.             }
  422.  
  423.             this.sidebars.menu.$nano = this.sidebars.menu.$el.find( '.nano' );
  424.  
  425.             this.sidebars.menu.$nano.nanoScroller({
  426.                 alwaysVisible: true,
  427.                 preventPageScrolling: true
  428.             });
  429.  
  430.             return this;
  431.         },
  432.  
  433.         eventsContentMenu: function() {
  434.             var _self = this;
  435.  
  436.             var open = function() {
  437.                 if ( _self.sidebars.menu.isOpened ) {
  438.                     return close();
  439.                 }
  440.  
  441.                 _self.sidebars.menu.isOpened = true;
  442.  
  443.                 $html.addClass( 'inner-menu-opened' );
  444.  
  445.                 $window.trigger( 'inner-menu-toggle', {
  446.                     added: true,
  447.                     removed: false
  448.                 });
  449.  
  450.                 $html.on( 'click.close-inner-menu', function(e) {
  451.  
  452.                     close(e);
  453.                 });
  454.  
  455.             };
  456.  
  457.             var close = function(e) {
  458.                 var hasEvent,
  459.                     hasTarget,
  460.                     isCollapseButton,
  461.                     isInsideModal,
  462.                     isInsideInnerMenu,
  463.                     isInsideHTML,
  464.                     $target;
  465.  
  466.                 hasEvent = !!e;
  467.                 hasTarget = hasEvent && !!e.target;
  468.  
  469.                 if ( hasTarget ) {
  470.                     $target = $(e.target);
  471.                 }
  472.  
  473.                 isCollapseButton = hasTarget && !!$target.closest( '.inner-menu-collapse' ).get(0);
  474.                 isInsideModal = hasTarget && !!$target.closest( '.mfp-wrap' ).get(0);
  475.                 isInsideInnerMenu = hasTarget && !!$target.closest( '.inner-menu' ).get(0);
  476.                 isInsideHTML = hasTarget && !!$target.closest( 'html' ).get(0);
  477.  
  478.                 if ( (!isCollapseButton && (isInsideInnerMenu || !isInsideHTML)) || isInsideModal ) {
  479.                     return false;
  480.                 }
  481.  
  482.                 e.stopPropagation();
  483.  
  484.                 $html.removeClass( 'inner-menu-opened' );
  485.                 $html.off( 'click.close-inner-menu' );
  486.  
  487.                 $window.trigger( 'inner-menu-toggle', {
  488.                     added: false,
  489.                     removed: true
  490.                 });
  491.  
  492.                 _self.sidebars.menu.isOpened = false;
  493.             };
  494.  
  495.             var bind = function() {
  496.                 $('[data-open="inner-menu"]').on('click', function(e) {
  497.                     var $el = $(this);
  498.                     e.stopPropagation();
  499.  
  500.                     if ( $el.is('a') )
  501.                         e.preventDefault();
  502.  
  503.                     open();
  504.                 });
  505.             };
  506.  
  507.             bind();
  508.  
  509.             /* Nano Scroll */
  510.             if ( $html.hasClass( 'fixed' ) ) {
  511.                 var $nano = this.sidebars.menu.$nano;
  512.  
  513.                 var updateNanoScroll = function() {
  514.                     if ( $.support.transition ) {
  515.                         $nano.nanoScroller();
  516.                         $nano
  517.                             .one('bsTransitionEnd', updateNanoScroll)
  518.                             .emulateTransitionEnd(150)
  519.                     } else {
  520.                         updateNanoScroll();
  521.                     }
  522.                 };
  523.  
  524.                 this.sidebars.menu.$el
  525.                     .on( 'click', function() {
  526.                         updateNanoScroll();
  527.                     });
  528.             }
  529.  
  530.             return this;
  531.         },
  532.  
  533.         preventBodyScrollToggle: function( shouldPrevent, $el ) {
  534.             setTimeout(function() {
  535.                 if ( shouldPrevent ) {
  536.                     $body
  537.                         .data( 'scrollTop', $body.get(0).scrollTop )
  538.                         .css({
  539.                             position: 'fixed',
  540.                             top: $body.get(0).scrollTop * -1
  541.                         })
  542.                 } else {
  543.                     $body
  544.                         .css({
  545.                             position: '',
  546.                             top: ''
  547.                         })
  548.                         .scrollTop( $body.data( 'scrollTop' ) );
  549.                 }
  550.             }, 150);
  551.         }
  552.  
  553.     };
  554.  
  555.     // expose to scope
  556.     $.extend(theme, {
  557.         Skeleton: Skeleton
  558.     });
  559.  
  560. }).apply(this, [window.theme, jQuery]);
  561.  
  562. /* Browser Selector */
  563. (function($) {
  564.     $.extend({
  565.  
  566.         browserSelector: function() {
  567.  
  568.             // jQuery.browser.mobile (http://detectmobilebrowser.com/)
  569.             (function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);
  570.  
  571.             // Touch
  572.             var hasTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
  573.  
  574.             var u = navigator.userAgent,
  575.                 ua = u.toLowerCase(),
  576.                 is = function (t) {
  577.                     return ua.indexOf(t) > -1;
  578.                 },
  579.                 g = 'gecko',
  580.                 w = 'webkit',
  581.                 s = 'safari',
  582.                 o = 'opera',
  583.                 h = document.documentElement,
  584.                 b = [(!(/opera|webtv/i.test(ua)) && /msie\s(\d)/.test(ua)) ? ('ie ie' + parseFloat(navigator.appVersion.split("MSIE")[1])) : is('firefox/2') ? g + ' ff2' : is('firefox/3.5') ? g + ' ff3 ff3_5' : is('firefox/3') ? g + ' ff3' : is('gecko/') ? g : is('opera') ? o + (/version\/(\d+)/.test(ua) ? ' ' + o + RegExp.jQuery1 : (/opera(\s|\/)(\d+)/.test(ua) ? ' ' + o + RegExp.jQuery2 : '')) : is('konqueror') ? 'konqueror' : is('chrome') ? w + ' chrome' : is('iron') ? w + ' iron' : is('applewebkit/') ? w + ' ' + s + (/version\/(\d+)/.test(ua) ? ' ' + s + RegExp.jQuery1 : '') : is('mozilla/') ? g : '', is('j2me') ? 'mobile' : is('iphone') ? 'iphone' : is('ipod') ? 'ipod' : is('mac') ? 'mac' : is('darwin') ? 'mac' : is('webtv') ? 'webtv' : is('win') ? 'win' : is('freebsd') ? 'freebsd' : (is('x11') || is('linux')) ? 'linux' : '', 'js'];
  585.  
  586.             c = b.join(' ');
  587.  
  588.             if ($.browser.mobile) {
  589.                 c += ' mobile';
  590.             }
  591.  
  592.             if (hasTouch) {
  593.                 c += ' touch';
  594.             }
  595.  
  596.             h.className += ' ' + c;
  597.  
  598.             // IE11 Detect
  599.             var isIE11 = !(window.ActiveXObject) && "ActiveXObject" in window;
  600.  
  601.             if (isIE11) {
  602.                 $('html').removeClass('gecko').addClass('ie ie11');
  603.                 return;
  604.             }
  605.  
  606.             // Dark and Boxed Compatibility
  607.             if($('body').hasClass('dark')) {
  608.                 $('html').addClass('dark');
  609.             }
  610.  
  611.             if($('body').hasClass('boxed')) {
  612.                 $('html').addClass('boxed');
  613.             }
  614.  
  615.         }
  616.  
  617.     });
  618.  
  619.     $.browserSelector();
  620.  
  621. })(jQuery);
  622.  
  623. // Base
  624. (function(theme, $) {
  625.  
  626.     'use strict';
  627.  
  628.     theme = theme || {};
  629.  
  630.     theme.Skeleton.initialize();
  631.  
  632. }).apply(this, [window.theme, jQuery]);
  633.  
  634.  
  635. // Header Menu Nav
  636. (function(theme, $) {
  637.  
  638.     'use strict';
  639.  
  640.     theme = theme || {};
  641.  
  642.     var initialized = false;
  643.  
  644.     $.extend(theme, {
  645.  
  646.         Nav: {
  647.  
  648.             defaults: {
  649.                 wrapper: $('#mainNav'),
  650.                 scrollDelay: 600,
  651.                 scrollAnimation: 'easeOutQuad'
  652.             },
  653.  
  654.             initialize: function($wrapper, opts) {
  655.                 if (initialized) {
  656.                     return this;
  657.                 }
  658.  
  659.                 initialized = true;
  660.                 this.$wrapper = ($wrapper || this.defaults.wrapper);
  661.  
  662.                 this
  663.                     .setOptions(opts)
  664.                     .build()
  665.                     .events();
  666.  
  667.                 return this;
  668.             },
  669.  
  670.             setOptions: function(opts) {
  671.                 // this.options = $.extend(true, {}, this.defaults, opts, theme.fn.getOptions(this.$wrapper.data('plugin-options')));
  672.  
  673.                 return this;
  674.             },
  675.  
  676.             build: function() {
  677.                 var self = this,
  678.                     $html = $('html'),
  679.                     $header = $('.header'),
  680.                     thumbInfoPreview;
  681.  
  682.                 // Add Arrows
  683.                 $header.find('.dropdown-toggle:not(.notification-icon), .dropdown-submenu > a').append($('<i />').addClass('fa fa-caret-down'));
  684.  
  685.                 // Preview Thumbs
  686.                 self.$wrapper.find('a[data-thumb-preview]').each(function() {
  687.                     thumbInfoPreview = $('<span />').addClass('thumb-info thumb-info-preview')
  688.                                             .append($('<span />').addClass('thumb-info-wrapper')
  689.                                                 .append($('<span />').addClass('thumb-info-image').css('background-image', 'url(' + $(this).data('thumb-preview') + ')')
  690.                                            )
  691.                                        );
  692.  
  693.                     $(this).append(thumbInfoPreview);
  694.                 });
  695.  
  696.                 // Side Header Right (Reverse Dropdown)
  697.                 if($html.hasClass('side-header-right')) {
  698.                     $header.find('.dropdown').addClass('dropdown-reverse');
  699.                 }
  700.  
  701.                 return this;
  702.             },
  703.  
  704.             events: function() {
  705.                 var self = this,
  706.                     $header = $('.header'),
  707.                     $window = $(window);
  708.  
  709.                 $header.find('a[href="#"]').on('click', function(e) {
  710.                     e.preventDefault();
  711.                 });
  712.  
  713.                 // Mobile Arrows
  714.                 $header.find('.dropdown-toggle[href="#"], .dropdown-submenu a[href="#"], .dropdown-toggle[href!="#"] .fa-caret-down, .dropdown-submenu a[href!="#"] .fa-caret-down').on('click', function(e) {
  715.                     e.preventDefault();
  716.                     if ($window.width() < 992) {
  717.                         $(this).closest('li').toggleClass('opened');
  718.                     }
  719.                 });
  720.  
  721.                 // Touch Devices with normal resolutions
  722.                 if('ontouchstart' in document.documentElement) {
  723.                     $header.find('.dropdown-toggle:not([href="#"]), .dropdown-submenu > a:not([href="#"])')
  724.                         .on('touchstart click', function(e) {
  725.                             if($window.width() > 991) {
  726.  
  727.                                 e.stopPropagation();
  728.                                 e.preventDefault();
  729.  
  730.                                 if(e.handled !== true) {
  731.  
  732.                                     var li = $(this).closest('li');
  733.  
  734.                                     if(li.hasClass('tapped')) {
  735.                                         location.href = $(this).attr('href');
  736.                                     }
  737.  
  738.                                     li.addClass('tapped');
  739.  
  740.                                     e.handled = true;
  741.                                 } else {
  742.                                     return false;
  743.                                 }
  744.  
  745.                                 return false;
  746.  
  747.                             }
  748.                         })
  749.                         .on('blur', function(e) {
  750.                             $(this).closest('li').removeClass('tapped');
  751.                         });
  752.  
  753.                 }
  754.  
  755.                 // Collapse Nav
  756.                 $header.find('[data-collapse-nav]').on('click', function(e) {
  757.                     $(this).parents('.collapse').removeClass('in');
  758.                 });
  759.  
  760.                 // Anchors Position
  761.                 $('[data-hash]').each(function() {
  762.  
  763.                     var target = $(this).attr('href'),
  764.                         offset = ($(this).is("[data-hash-offset]") ? $(this).data('hash-offset') : 0);
  765.  
  766.                     if($(target).get(0)) {
  767.                         $(this).on('click', function(e) {
  768.                             e.preventDefault();
  769.  
  770.                             // Close Collapse if Opened
  771.                             $(this).parents('.collapse.in').removeClass('in');
  772.  
  773.                             self.scrollToTarget(target, offset);
  774.  
  775.                             return;
  776.                         });
  777.                     }
  778.  
  779.                 });
  780.  
  781.                 return this;
  782.             },
  783.  
  784.             scrollToTarget: function(target, offset) {
  785.                 var self = this;
  786.  
  787.                 $('body').addClass('scrolling');
  788.  
  789.                 $('html, body').animate({
  790.                     scrollTop: $(target).offset().top - offset
  791.                 }, self.options.scrollDelay, self.options.scrollAnimation, function() {
  792.                     $('body').removeClass('scrolling');
  793.                 });
  794.  
  795.                 return this;
  796.  
  797.             }
  798.  
  799.         }
  800.  
  801.     });
  802.  
  803. }).apply(this, [window.theme, jQuery]);
  804.  
  805. // Scroll to Top
  806. (function(theme, $) {
  807.  
  808.     theme = theme || {};
  809.  
  810.     $.extend(theme, {
  811.  
  812.         PluginScrollToTop: {
  813.  
  814.             defaults: {
  815.                 wrapper: $('body'),
  816.                 offset: 150,
  817.                 buttonClass: 'scroll-to-top',
  818.                 iconClass: 'fa fa-chevron-up',
  819.                 delay: 500,
  820.                 visibleMobile: false,
  821.                 label: false
  822.             },
  823.  
  824.             initialize: function(opts) {
  825.                 initialized = true;
  826.  
  827.                 this
  828.                     .setOptions(opts)
  829.                     .build()
  830.                     .events();
  831.  
  832.                 return this;
  833.             },
  834.  
  835.             setOptions: function(opts) {
  836.                 this.options = $.extend(true, {}, this.defaults, opts);
  837.  
  838.                 return this;
  839.             },
  840.  
  841.             build: function() {
  842.                 var self = this,
  843.                     $el;
  844.  
  845.                 // Base HTML Markup
  846.                 $el = $('<a />')
  847.                     .addClass(self.options.buttonClass)
  848.                     .attr({
  849.                         'href': '#',
  850.                     })
  851.                     .append(
  852.                         $('<i />')
  853.                         .addClass(self.options.iconClass)
  854.                 );
  855.  
  856.                 // Visible Mobile
  857.                 if (!self.options.visibleMobile) {
  858.                     $el.addClass('hidden-mobile');
  859.                 }
  860.  
  861.                 // Label
  862.                 if (self.options.label) {
  863.                     $el.append(
  864.                         $('<span />').html(self.options.label)
  865.                     );
  866.                 }
  867.  
  868.                 this.options.wrapper.append($el);
  869.  
  870.                 this.$el = $el;
  871.  
  872.                 return this;
  873.             },
  874.  
  875.             events: function() {
  876.                 var self = this,
  877.                     _isScrolling = false;
  878.  
  879.                 // Click Element Action
  880.                 self.$el.on('click', function(e) {
  881.                     e.preventDefault();
  882.                     $('body, html').animate({
  883.                         scrollTop: 0
  884.                     }, self.options.delay);
  885.                     return false;
  886.                 });
  887.  
  888.                 // Show/Hide Button on Window Scroll event.
  889.                 $(window).scroll(function() {
  890.  
  891.                     if (!_isScrolling) {
  892.  
  893.                         _isScrolling = true;
  894.  
  895.                         if ($(window).scrollTop() > self.options.offset) {
  896.  
  897.                             self.$el.stop(true, true).addClass('visible');
  898.                             _isScrolling = false;
  899.  
  900.                         } else {
  901.  
  902.                             self.$el.stop(true, true).removeClass('visible');
  903.                             _isScrolling = false;
  904.  
  905.                         }
  906.  
  907.                     }
  908.  
  909.                 });
  910.  
  911.                 return this;
  912.             }
  913.  
  914.         }
  915.  
  916.     });
  917.  
  918. }).apply(this, [window.theme, jQuery]);
  919.  
  920. // Toggle
  921. (function(theme, $) {
  922.  
  923.     theme = theme || {};
  924.  
  925.     var instanceName = '__toggle';
  926.  
  927.     var PluginToggle = function($el, opts) {
  928.         return this.initialize($el, opts);
  929.     };
  930.  
  931.     PluginToggle.defaults = {
  932.         duration: 350,
  933.         isAccordion: false,
  934.         addIcons: true
  935.     };
  936.  
  937.     PluginToggle.prototype = {
  938.         initialize: function($el, opts) {
  939.             if ( $el.data( instanceName ) ) {
  940.                 return this;
  941.             }
  942.  
  943.             this.$el = $el;
  944.  
  945.             this
  946.                 .setData()
  947.                 .setOptions(opts)
  948.                 .build();
  949.  
  950.             return this;
  951.         },
  952.  
  953.         setData: function() {
  954.             this.$el.data(instanceName, this);
  955.  
  956.             return this;
  957.         },
  958.  
  959.         setOptions: function(opts) {
  960.             this.options = $.extend(true, {}, PluginToggle.defaults, opts, {
  961.                 wrapper: this.$el
  962.             });
  963.  
  964.             return this;
  965.         },
  966.  
  967.         build: function() {
  968.             var self = this,
  969.                 $wrapper = this.options.wrapper,
  970.                 $items = $wrapper.find('.toggle'),
  971.                 $el = null;
  972.  
  973.             $items.each(function() {
  974.                 $el = $(this);
  975.  
  976.                 if(self.options.addIcons) {
  977.                     $el.find('> label').prepend(
  978.                         $('<i />').addClass('fa fa-plus'),
  979.                         $('<i />').addClass('fa fa-minus')
  980.                     );
  981.                 }
  982.  
  983.                 if($el.hasClass('active')) {
  984.                     $el.find('> p').addClass('preview-active');
  985.                     $el.find('> .toggle-content').slideDown(self.options.duration);
  986.                 }
  987.  
  988.                 self.events($el);
  989.             });
  990.  
  991.             if(self.options.isAccordion) {
  992.                 self.options.duration = self.options.duration/2;
  993.             }
  994.  
  995.             return this;
  996.         },
  997.  
  998.         events: function($el) {
  999.             var self = this,
  1000.                 previewParCurrentHeight = 0,
  1001.                 previewParAnimateHeight = 0,
  1002.                 toggleContent = null;
  1003.  
  1004.             $el.find('> label').click(function(e) {
  1005.  
  1006.                 var $this = $(this),
  1007.                     parentSection = $this.parent(),
  1008.                     parentWrapper = $this.parents('.toggle'),
  1009.                     previewPar = null,
  1010.                     closeElement = null;
  1011.  
  1012.                 if(self.options.isAccordion && typeof(e.originalEvent) != 'undefined') {
  1013.                     closeElement = parentWrapper.find('.toggle.active > label');
  1014.  
  1015.                     if(closeElement[0] == $this[0]) {
  1016.                         return;
  1017.                     }
  1018.                 }
  1019.  
  1020.                 parentSection.toggleClass('active');
  1021.  
  1022.                 // Preview Paragraph
  1023.                 if(parentSection.find('> p').get(0)) {
  1024.  
  1025.                     previewPar = parentSection.find('> p');
  1026.                     previewParCurrentHeight = previewPar.css('height');
  1027.                     previewPar.css('height', 'auto');
  1028.                     previewParAnimateHeight = previewPar.css('height');
  1029.                     previewPar.css('height', previewParCurrentHeight);
  1030.  
  1031.                 }
  1032.  
  1033.                 // Content
  1034.                 toggleContent = parentSection.find('> .toggle-content');
  1035.  
  1036.                 if(parentSection.hasClass('active')) {
  1037.  
  1038.                     $(previewPar).animate({
  1039.                         height: previewParAnimateHeight
  1040.                     }, self.options.duration, function() {
  1041.                         $(this).addClass('preview-active');
  1042.                     });
  1043.  
  1044.                     toggleContent.slideDown(self.options.duration, function() {
  1045.                         if(closeElement) {
  1046.                             closeElement.trigger('click');
  1047.                         }
  1048.                     });
  1049.  
  1050.                 } else {
  1051.  
  1052.                     $(previewPar).animate({
  1053.                         height: 0
  1054.                     }, self.options.duration, function() {
  1055.                         $(this).removeClass('preview-active');
  1056.                     });
  1057.  
  1058.                     toggleContent.slideUp(self.options.duration);
  1059.  
  1060.                 }
  1061.  
  1062.             });
  1063.         }
  1064.     };
  1065.  
  1066.     // expose to scope
  1067.     $.extend(theme, {
  1068.         PluginToggle: PluginToggle
  1069.     });
  1070.  
  1071.     // jquery plugin
  1072.     $.fn.themePluginToggle = function(opts) {
  1073.         return this.map(function() {
  1074.             var $this = $(this);
  1075.  
  1076.             if ($this.data(instanceName)) {
  1077.                 return $this.data(instanceName);
  1078.             } else {
  1079.                 return new PluginToggle($this, opts);
  1080.             }
  1081.  
  1082.         });
  1083.     }
  1084.  
  1085. }).apply(this, [window.theme, jQuery]);
  1086.  
  1087. // Colorpicker
  1088. (function(theme, $) {
  1089.  
  1090.     theme = theme || {};
  1091.  
  1092.     var instanceName = '__colorpicker';
  1093.  
  1094.     var PluginColorPicker = function($el, opts) {
  1095.         return this.initialize($el, opts);
  1096.     };
  1097.  
  1098.     PluginColorPicker.defaults = {
  1099.     };
  1100.  
  1101.     PluginColorPicker.prototype = {
  1102.         initialize: function($el, opts) {
  1103.             if ( $el.data( instanceName ) ) {
  1104.                 return this;
  1105.             }
  1106.  
  1107.             this.$el = $el;
  1108.  
  1109.             this
  1110.                 .setData()
  1111.                 .setOptions(opts)
  1112.                 .build();
  1113.  
  1114.             return this;
  1115.         },
  1116.  
  1117.         setData: function() {
  1118.             this.$el.data(instanceName, this);
  1119.  
  1120.             return this;
  1121.         },
  1122.  
  1123.         setOptions: function(opts) {
  1124.             this.options = $.extend( true, {}, PluginColorPicker.defaults, opts );
  1125.  
  1126.             return this;
  1127.         },
  1128.  
  1129.         build: function() {
  1130.             this.$el.colorpicker( this.options );
  1131.  
  1132.             return this;
  1133.         }
  1134.     };
  1135.  
  1136.     // expose to scope
  1137.     $.extend(theme, {
  1138.         PluginColorPicker: PluginColorPicker
  1139.     });
  1140.  
  1141.     // jquery plugin
  1142.     $.fn.themePluginColorPicker = function(opts) {
  1143.         return this.each(function() {
  1144.             var $this = $(this);
  1145.  
  1146.             if ($this.data(instanceName)) {
  1147.                 return $this.data(instanceName);
  1148.             } else {
  1149.                 return new PluginColorPicker($this, opts);
  1150.             }
  1151.  
  1152.         });
  1153.     }
  1154.  
  1155. }).apply(this, [window.theme, jQuery]);
  1156.  
  1157. // SummerNote
  1158. (function(theme, $) {
  1159.  
  1160.     theme = theme || {};
  1161.  
  1162.     var instanceName = '__summernote';
  1163.  
  1164.     var PluginSummerNote = function($el, opts) {
  1165.         return this.initialize($el, opts);
  1166.     };
  1167.  
  1168.     PluginSummerNote.defaults = {
  1169.         onfocus: function() {
  1170.             $( this ).closest( '.note-editor' ).addClass( 'active' );
  1171.         },
  1172.         onblur: function() {
  1173.             $( this ).closest( '.note-editor' ).removeClass( 'active' );
  1174.         }
  1175.     };
  1176.  
  1177.     PluginSummerNote.prototype = {
  1178.         initialize: function($el, opts) {
  1179.             if ( $el.data( instanceName ) ) {
  1180.                 return this;
  1181.             }
  1182.  
  1183.             this.$el = $el;
  1184.  
  1185.             this
  1186.                 .setData()
  1187.                 .setOptions(opts)
  1188.                 .build();
  1189.  
  1190.             return this;
  1191.         },
  1192.  
  1193.         setData: function() {
  1194.             this.$el.data(instanceName, this);
  1195.  
  1196.             return this;
  1197.         },
  1198.  
  1199.         setOptions: function(opts) {
  1200.             this.options = $.extend( true, {}, PluginSummerNote.defaults, opts );
  1201.  
  1202.             return this;
  1203.         },
  1204.  
  1205.         build: function() {
  1206.             this.$el.summernote( this.options );
  1207.  
  1208.             return this;
  1209.         }
  1210.     };
  1211.  
  1212.     // expose to scope
  1213.     $.extend(theme, {
  1214.         PluginSummerNote: PluginSummerNote
  1215.     });
  1216.  
  1217.     // jquery plugin
  1218.     $.fn.themePluginSummerNote = function(opts) {
  1219.         return this.each(function() {
  1220.             var $this = $(this);
  1221.  
  1222.             if ($this.data(instanceName)) {
  1223.                 return $this.data(instanceName);
  1224.             } else {
  1225.                 return new PluginSummerNote($this, opts);
  1226.             }
  1227.  
  1228.         });
  1229.     }
  1230.  
  1231. }).apply(this, [window.theme, jQuery]);
  1232.  
  1233. // TextArea AutoSize
  1234. (function(theme, $) {
  1235.  
  1236.     theme = theme || {};
  1237.  
  1238.     var initialized = false;
  1239.     var instanceName = '__textareaAutosize';
  1240.  
  1241.     var PluginTextAreaAutoSize = function($el, opts) {
  1242.         return this.initialize($el, opts);
  1243.     };
  1244.  
  1245.     PluginTextAreaAutoSize.defaults = {
  1246.     };
  1247.  
  1248.     PluginTextAreaAutoSize.prototype = {
  1249.         initialize: function($el, opts) {
  1250.             if (initialized) {
  1251.                 return this;
  1252.             }
  1253.  
  1254.             this.$el = $el;
  1255.  
  1256.             this
  1257.                 .setData()
  1258.                 .setOptions(opts)
  1259.                 .build();
  1260.  
  1261.             return this;
  1262.         },
  1263.  
  1264.         setData: function() {
  1265.             this.$el.data(instanceName, this);
  1266.  
  1267.             return this;
  1268.         },
  1269.  
  1270.         setOptions: function(opts) {
  1271.             this.options = $.extend( true, {}, PluginTextAreaAutoSize.defaults, opts );
  1272.  
  1273.             return this;
  1274.         },
  1275.  
  1276.         build: function() {
  1277.  
  1278.             autosize($(this.$el));
  1279.  
  1280.             return this;
  1281.         }
  1282.     };
  1283.  
  1284.     // expose to scope
  1285.     $.extend(theme, {
  1286.         PluginTextAreaAutoSize: PluginTextAreaAutoSize
  1287.     });
  1288.  
  1289.     // jquery plugin
  1290.     $.fn.themePluginTextAreaAutoSize = function(opts) {
  1291.         return this.each(function() {
  1292.             var $this = $(this);
  1293.  
  1294.             if ($this.data(instanceName)) {
  1295.                 return $this.data(instanceName);
  1296.             } else {
  1297.                 return new PluginTextAreaAutoSize($this, opts);
  1298.             }
  1299.  
  1300.         });
  1301.     }
  1302.  
  1303. }).apply(this, [window.theme, jQuery]);
  1304.  
  1305. // Animate
  1306. (function(theme, $) {
  1307.  
  1308.     theme = theme || {};
  1309.  
  1310.     var instanceName = '__animate';
  1311.  
  1312.     var PluginAnimate = function($el, opts) {
  1313.         return this.initialize($el, opts);
  1314.     };
  1315.  
  1316.     PluginAnimate.defaults = {
  1317.         accX: 0,
  1318.         accY: -150,
  1319.         delay: 1
  1320.     };
  1321.  
  1322.     PluginAnimate.prototype = {
  1323.         initialize: function($el, opts) {
  1324.             if ( $el.data( instanceName ) ) {
  1325.                 return this;
  1326.             }
  1327.  
  1328.             this.$el = $el;
  1329.  
  1330.             this
  1331.                 .setData()
  1332.                 .setOptions(opts)
  1333.                 .build();
  1334.  
  1335.             return this;
  1336.         },
  1337.  
  1338.         setData: function() {
  1339.             this.$el.data(instanceName, this);
  1340.  
  1341.             return this;
  1342.         },
  1343.  
  1344.         setOptions: function(opts) {
  1345.             this.options = $.extend(true, {}, PluginAnimate.defaults, opts, {
  1346.                 wrapper: this.$el
  1347.             });
  1348.  
  1349.             return this;
  1350.         },
  1351.  
  1352.         build: function() {
  1353.             var self = this,
  1354.                 $el = this.options.wrapper,
  1355.                 delay = 0;
  1356.  
  1357.             $el.addClass('appear-animation');
  1358.  
  1359.             if(!$('html').hasClass('no-csstransitions') && $(window).width() > 767) {
  1360.  
  1361.                 $el.appear(function() {
  1362.  
  1363.                     delay = ($el.attr('data-appear-animation-delay') ? $el.attr('data-appear-animation-delay') : self.options.delay);
  1364.  
  1365.                     if(delay > 1) {
  1366.                         $el.css('animation-delay', delay + 'ms');
  1367.                     }
  1368.  
  1369.                     $el.addClass($el.attr('data-appear-animation'));
  1370.  
  1371.                     setTimeout(function() {
  1372.                         $el.addClass('appear-animation-visible');
  1373.                     }, delay);
  1374.  
  1375.                 }, {accX: self.options.accX, accY: self.options.accY});
  1376.  
  1377.             } else {
  1378.  
  1379.                 $el.addClass('appear-animation-visible');
  1380.  
  1381.             }
  1382.  
  1383.             return this;
  1384.         }
  1385.     };
  1386.  
  1387.     // expose to scope
  1388.     $.extend(theme, {
  1389.         PluginAnimate: PluginAnimate
  1390.     });
  1391.  
  1392.     // jquery plugin
  1393.     $.fn.themePluginAnimate = function(opts) {
  1394.         return this.map(function() {
  1395.             var $this = $(this);
  1396.  
  1397.             if ($this.data(instanceName)) {
  1398.                 return $this.data(instanceName);
  1399.             } else {
  1400.                 return new PluginAnimate($this, opts);
  1401.             }
  1402.  
  1403.         });
  1404.     };
  1405.  
  1406. }).apply(this, [window.theme, jQuery]);
  1407.  
  1408. // Lightbox
  1409. (function(theme, $) {
  1410.  
  1411.     theme = theme || {};
  1412.  
  1413.     var instanceName = '__lightbox';
  1414.  
  1415.     var PluginLightbox = function($el, opts) {
  1416.         return this.initialize($el, opts);
  1417.     };
  1418.  
  1419.     PluginLightbox.defaults = {
  1420.         tClose: 'Close (Esc)', // Alt text on close button
  1421.         tLoading: 'Loading...', // Text that is displayed during loading. Can contain %curr% and %total% keys
  1422.         gallery: {
  1423.             tPrev: 'Previous (Left arrow key)', // Alt text on left arrow
  1424.             tNext: 'Next (Right arrow key)', // Alt text on right arrow
  1425.             tCounter: '%curr% of %total%' // Markup for "1 of 7" counter
  1426.         },
  1427.         image: {
  1428.             tError: '<a href="%url%">The image</a> could not be loaded.' // Error message when image could not be loaded
  1429.         },
  1430.         ajax: {
  1431.             tError: '<a href="%url%">The content</a> could not be loaded.' // Error message when ajax request failed
  1432.         }
  1433.     };
  1434.  
  1435.     PluginLightbox.prototype = {
  1436.         initialize: function($el, opts) {
  1437.             if ( $el.data( instanceName ) ) {
  1438.                 return this;
  1439.             }
  1440.  
  1441.             this.$el = $el;
  1442.  
  1443.             this
  1444.                 .setData()
  1445.                 .setOptions(opts)
  1446.                 .build();
  1447.  
  1448.             return this;
  1449.         },
  1450.  
  1451.         setData: function() {
  1452.             this.$el.data(instanceName, this);
  1453.  
  1454.             return this;
  1455.         },
  1456.  
  1457.         setOptions: function(opts) {
  1458.             this.options = $.extend(true, {}, PluginLightbox.defaults, opts, {
  1459.                 wrapper: this.$el
  1460.             });
  1461.  
  1462.             return this;
  1463.         },
  1464.  
  1465.         build: function() {
  1466.             this.options.wrapper.magnificPopup(this.options);
  1467.  
  1468.             return this;
  1469.         }
  1470.     };
  1471.  
  1472.     // expose to scope
  1473.     $.extend(theme, {
  1474.         PluginLightbox: PluginLightbox
  1475.     });
  1476.  
  1477.     // jquery plugin
  1478.     $.fn.themePluginLightbox = function(opts) {
  1479.         return this.each(function() {
  1480.             var $this = $(this);
  1481.  
  1482.             if ($this.data(instanceName)) {
  1483.                 return $this.data(instanceName);
  1484.             } else {
  1485.                 return new PluginLightbox($this, opts);
  1486.             }
  1487.  
  1488.         });
  1489.     }
  1490.  
  1491. }).apply(this, [window.theme, jQuery]);
  1492.  
  1493.  
  1494. /* Init */
  1495. // Tooltip
  1496. (function($) {
  1497.  
  1498.     'use strict';
  1499.  
  1500.     if ( $.isFunction( $.fn['tooltip'] ) ) {
  1501.         $( '[data-toggle=tooltip],[rel=tooltip]' ).tooltip({ container: 'body' });
  1502.     }
  1503.  
  1504. }).apply(this, [jQuery]);
  1505.  
  1506. // Header Menu Nav
  1507. (function(theme, $) {
  1508.  
  1509.     'use strict';
  1510.    
  1511.     if (typeof theme.Nav !== 'undefined') {
  1512.         theme.Nav.initialize();
  1513.     }
  1514.    
  1515. }).apply(this, [window.theme, jQuery]);
  1516.  
  1517. // Scroll to Top
  1518. (function(theme, $) {
  1519.     // Scroll to Top Button.
  1520.     if (typeof theme.PluginScrollToTop !== 'undefined') {
  1521.         theme.PluginScrollToTop.initialize();
  1522.     }
  1523. }).apply(this, [window.theme, jQuery]);
  1524.  
  1525. // Sidebar Widgets
  1526. (function($) {
  1527.  
  1528.     'use strict';
  1529.  
  1530.     function expand( content ) {
  1531.         content.children( '.widget-content' ).slideDown( 'fast', function() {
  1532.             $(this).css( 'display', '' );
  1533.             content.removeClass( 'widget-collapsed' );
  1534.  
  1535.             $(window).trigger('widget.collapsed');
  1536.         });
  1537.     }
  1538.  
  1539.     function collapse( content ) {
  1540.         content.children('.widget-content' ).slideUp( 'fast', function() {
  1541.             content.addClass( 'widget-collapsed' );
  1542.             $(this).css( 'display', '' );
  1543.  
  1544.             $(window).trigger('widget.expanded');
  1545.         });
  1546.     }
  1547.  
  1548.     var $widgets = $( '.sidebar-widget' );
  1549.  
  1550.     $widgets.each( function() {
  1551.  
  1552.         var $widget = $( this ),
  1553.             $toggler = $widget.find( '.widget-toggle' );
  1554.  
  1555.         $toggler.on('click.widget-toggler', function() {
  1556.             $widget.hasClass('widget-collapsed') ? expand($widget) : collapse($widget);
  1557.         });
  1558.     });
  1559.  
  1560. }).apply(this, [jQuery]);
  1561.  
  1562. // Colorpicker
  1563. (function($) {
  1564.  
  1565.     'use strict';
  1566.  
  1567.     if ( $.isFunction($.fn[ 'colorpicker' ]) ) {
  1568.  
  1569.         $(function() {
  1570.             $('[data-plugin-colorpicker]').each(function() {
  1571.                 var $this = $( this ),
  1572.                     opts = {};
  1573.  
  1574.                 var pluginOptions = $this.data('plugin-options');
  1575.                 if (pluginOptions)
  1576.                     opts = pluginOptions;
  1577.  
  1578.                 $this.themePluginColorPicker(opts);
  1579.             });
  1580.         });
  1581.  
  1582.     }
  1583.  
  1584. }).apply(this, [jQuery]);
  1585.  
  1586. (function($) {
  1587.  
  1588.     'use strict';
  1589.  
  1590.     if ( $.isFunction( $.fn[ 'placeholder' ]) ) {
  1591.  
  1592.         $('input[placeholder]').placeholder();
  1593.  
  1594.     }
  1595.  
  1596. }).apply(this, [jQuery]);
  1597.  
  1598. // SummerNote
  1599. (function($) {
  1600.  
  1601.     'use strict';
  1602.  
  1603.     if ( $.isFunction($.fn[ 'summernote' ]) ) {
  1604.  
  1605.         $(function() {
  1606.             $('[data-plugin-summernote]').each(function() {
  1607.                 var $this = $( this ),
  1608.                     opts = {};
  1609.  
  1610.                 var pluginOptions = $this.data('plugin-options');
  1611.                 if (pluginOptions)
  1612.                     opts = pluginOptions;
  1613.  
  1614.                 $this.themePluginSummerNote(opts);
  1615.             });
  1616.         });
  1617.  
  1618.     }
  1619.  
  1620. }).apply(this, [jQuery]);
  1621.  
  1622. // TextArea AutoSize
  1623. (function($) {
  1624.  
  1625.     'use strict';
  1626.  
  1627.     if ( typeof autosize === 'function' ) {
  1628.  
  1629.         $(function() {
  1630.             $('[data-plugin-textarea-autosize]').each(function() {
  1631.                 var $this = $( this ),
  1632.                     opts = {};
  1633.  
  1634.                 var pluginOptions = $this.data('plugin-options');
  1635.                 if (pluginOptions)
  1636.                     opts = pluginOptions;
  1637.  
  1638.                 $this.themePluginTextAreaAutoSize(opts);
  1639.             });
  1640.         });
  1641.  
  1642.     }
  1643.  
  1644. }).apply(this, [jQuery]);
  1645.  
  1646. // Animate
  1647. (function($) {
  1648.  
  1649.     'use strict';
  1650.  
  1651.     if ( $.isFunction($.fn[ 'appear' ]) ) {
  1652.  
  1653.         $(function() {
  1654.             $('[data-plugin-animate], [data-appear-animation]').each(function() {
  1655.                 var $this = $( this ),
  1656.                     opts = {};
  1657.  
  1658.                 var pluginOptions = $this.data('plugin-options');
  1659.                 if (pluginOptions)
  1660.                     opts = pluginOptions;
  1661.  
  1662.                 $this.themePluginAnimate(opts);
  1663.             });
  1664.         });
  1665.  
  1666.     }
  1667.  
  1668. }).apply(this, [jQuery]);
  1669.  
  1670. // Lightbox
  1671. (function($) {
  1672.  
  1673.     'use strict';
  1674.  
  1675.     if ( $.isFunction($.fn[ 'magnificPopup' ]) ) {
  1676.  
  1677.         $(function() {
  1678.             $('[data-plugin-lightbox], .lightbox:not(.manual)').each(function() {
  1679.                 var $this = $( this ),
  1680.                     opts = {};
  1681.  
  1682.                 var pluginOptions = $this.data('plugin-options');
  1683.                 if (pluginOptions)
  1684.                     opts = pluginOptions;
  1685.  
  1686.                 $this.themePluginLightbox(opts);
  1687.             });
  1688.         });
  1689.  
  1690.     }
  1691.  
  1692. }).apply(this, [jQuery]);
  1693.  
  1694. // Scrollable
  1695. (function($) {
  1696.  
  1697.     'use strict';
  1698.  
  1699.     if ( $.isFunction($.fn[ 'nanoScroller' ]) ) {
  1700.  
  1701.         $(function() {
  1702.             $('[data-plugin-scrollable]').each(function() {
  1703.                 var $this = $( this ),
  1704.                     opts = {};
  1705.  
  1706.                 var pluginOptions = $this.data('plugin-options');
  1707.                 if (pluginOptions) {
  1708.                     opts = pluginOptions;
  1709.                 }
  1710.  
  1711.                 $this.themePluginScrollable(opts);
  1712.             });
  1713.         });
  1714.  
  1715.     }
  1716.  
  1717. }).apply(this, [jQuery]);
  1718.  
  1719. // Toggle
  1720. (function($) {
  1721.  
  1722.     'use strict';
  1723.  
  1724.     $(function() {
  1725.         $('[data-plugin-toggle]').each(function() {
  1726.             var $this = $( this ),
  1727.                 opts = {};
  1728.  
  1729.             var pluginOptions = $this.data('plugin-options');
  1730.             if (pluginOptions)
  1731.                 opts = pluginOptions;
  1732.  
  1733.             $this.themePluginToggle(opts);
  1734.         });
  1735.     });
  1736.  
  1737. }).apply(this, [jQuery]);
  1738.  
  1739. /* Custom */
  1740. //Galería -> Sender > Imgs
  1741. (function($) {
  1742.  
  1743.     'use strict';
  1744.  
  1745.     /*
  1746.     Gallery
  1747.     */
  1748.     if ( $.isFunction($.fn[ 'magnificPopup' ]) ) {
  1749.         $('.popup-gallery').magnificPopup({
  1750.             delegate: 'a',
  1751.             type: 'image',
  1752.             tLoading: 'Cargando imagen...',
  1753.             mainClass: 'mfp-img-mobile',
  1754.             gallery: {
  1755.                 enabled: true,
  1756.                 navigateByImgClick: true,
  1757.                 preload: [0,1] // Will preload 0 - before current, and 1 after the current image
  1758.             },
  1759.             image: {
  1760.                 tError: 'Error al cargar la imagen'
  1761.             }
  1762.         });
  1763.     }
  1764.  
  1765.     /* Sender -> cargador de parámetros de categorías al modificar */
  1766.     $(document).on('change','#app_sender_category', function(){
  1767.         $.ajax({
  1768.             url : '/category_ajax',
  1769.             type: 'POST',
  1770.             data: { id: $(this).val()},
  1771.             dataType: "json",
  1772.             success: function(response) {
  1773.                 $('#app_sender_tensionAlarm').attr('value', response.tension);
  1774.                 $('#app_sender_power1Alarm').attr('value', response.power1);
  1775.                 $('#app_sender_power2Alarm').attr('value', response.power2);
  1776.                 $('#app_sender_nolightAlarm').attr('value', response.nolight);
  1777.                 $('#app_sender_notransmitAlarm').attr('value', response.notransmit);
  1778.             },
  1779.             error: function(response) {
  1780.                 console.info('ERROR!');
  1781.                 console.info(response);
  1782.             }
  1783.         });
  1784.     });
  1785.  
  1786.     /* Página de Mantenimiento -> Carga la ip  */
  1787.     $(document).on('click','#load_my_ip', function() {
  1788.         if ($('#app_maintenance_ips').val() === '') {
  1789.             $('#app_maintenance_ips').val($('#load_my_ip').data('ip'));
  1790.         }
  1791.         else {
  1792.             $('#app_maintenance_ips').attr('value', $('#app_maintenance_ips').val() + ',' + $('#load_my_ip').data('ip'));
  1793.         }
  1794.        
  1795.     });
  1796.  
  1797.     //===============>GEOLOCALIZACIÓN
  1798.     $(document).on('click','#btn-get-geo', function() {
  1799.         if (navigator.geolocation) {
  1800.             navigator.geolocation.getCurrentPosition(showPosition, showError);
  1801.         }
  1802.         else {
  1803.             alert('Geolocalización no disponible en este dispositivo.');
  1804.         }
  1805.     });
  1806.  
  1807.     function showPosition(position) {
  1808.         console.info(position.coords.latitude);
  1809.         console.info(position.coords.longitude);
  1810.  
  1811.         $.ajax({
  1812.             url : '/sender_ajax',
  1813.             type: 'POST',
  1814.             data: {
  1815.                 id: $('#btn-get-geo').data('id'),
  1816.                 latitude: position.coords.latitude,
  1817.                 longitude: position.coords.longitude
  1818.             },
  1819.             dataType: 'json',
  1820.             success: function(response) {
  1821.                 window.location.replace(response.redirectToRoute)
  1822.             },
  1823.             error: function(response) {
  1824.                 console.info('ERROR!');
  1825.                 console.info(response);
  1826.                 alert('Error! Contacta con Soporte Técnico.');
  1827.             }
  1828.         });
  1829.     }
  1830.  
  1831.     function showError(error) {
  1832.         switch(error.code) {
  1833.             case error.PERMISSION_DENIED:
  1834.                 alert('Imposible Geolocalizar el Emisor. Motivo: El usuario ha bloqueado la geolocalización. Para poder geolocalizar el Emisor es necesario que concedas permisos.');
  1835.                 break;
  1836.             case error.POSITION_UNAVAILABLE:
  1837.                 alert('Imposible Geolocalizar el Emisor. Motivo: La información osbre la localización no está disponible.');
  1838.                 break;
  1839.             case error.TIMEOUT:
  1840.                 alert('Imposible Geolocalizar el Emisor. Motivo: Tiempo de petición agotado.');
  1841.                 break;
  1842.             case error.UNKNOWN_ERROR:
  1843.                 alert('Imposible Geolocalizar el Emisor. Motivo: Error desconocido. Contacta con Soporte Técnico.');
  1844.                 break;
  1845.           }
  1846.     }
  1847. }).apply(this, [jQuery]);
  1848.  
  1849.     /* Inicializa el mapa de los dsb's */
  1850.     function initMap() {
  1851.  
  1852.         if (data.positions != 'undefinied') {
  1853.  
  1854.             var positions = data.positions;
  1855.  
  1856.             var map = new google.maps.Map(document.getElementById('map'), {
  1857.                 center: new google.maps.LatLng('40.428567', '-3.707541'),
  1858.                 zoom: 6,
  1859.                 mapTypeId: google.maps.MapTypeId.ROADMAP
  1860.             });
  1861.  
  1862.             var markers = [];
  1863.  
  1864.             positions.forEach(function(positions) {
  1865.                 marker = new google.maps.Marker({
  1866.                     map: map,
  1867.                     title: positions.name,
  1868.                     position: new google.maps.LatLng(positions.latitude, positions.longitude),
  1869.                     url: '/sender/'+positions.id
  1870.                 });
  1871.                 markers.push(marker);
  1872.  
  1873.                 google.maps.event.addListener(marker, 'click', function() {
  1874.                     window.location.href = this.url;
  1875.                 });
  1876.             });
  1877.  
  1878.  
  1879.  
  1880.             var markerCluster = new MarkerClusterer(map, markers,
  1881.                 {imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'});
  1882.         }
  1883.     }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top