/** Core script to handle the entire theme and core functions **/ var Metronic = function () { // IE mode var isRTL = false; var isIE8 = false; var isIE9 = false; var isIE10 = false; var resizeHandlers = []; var globalImgPath = '../../assets/global/img/'; // theme layout color set var brandColors = { 'blue': '#89C4F4', 'red': '#F3565D', 'green': '#1bbc9b', 'purple': '#9b59b6', 'grey': '#95a5a6', 'yellow': '#F8CB00' }; // initializes main settings var handleInit = function () { if ($('body').css('direction') === 'rtl') { isRTL = true; } isIE8 = !! navigator.userAgent.match(/MSIE 8.0/); isIE9 = !! navigator.userAgent.match(/MSIE 9.0/); isIE10 = !! navigator.userAgent.match(/MSIE 10.0/); if (isIE10) { jQuery('html').addClass('ie10'); // detect IE10 version } if (isIE10 || isIE9 || isIE8) { jQuery('html').addClass('ie'); // detect IE10 version } } // runs callback functions set by Metronic.addResponsiveHandler(). var _runResizeHandlers = function () { // reinitialize other subscribed elements for (var i = 0; i < resizeHandlers.length; i++) { var each = resizeHandlers[i]; each.call(); } } // handle the layout reinitialization on window resize var handleOnResize = function () { var resize; if (isIE8) { var currheight; $(window).resize(function () { if (currheight == document.documentElement.clientHeight) { return; //quite event since only body resized not window. } if (resize) { clearTimeout(resize); } resize = setTimeout(function () { _runResizeHandlers(); }, 50); // wait 50ms until window resize finishes. currheight = document.documentElement.clientHeight; // store last body client height }); } else { $(window).resize(function () { if (resize) { clearTimeout(resize); } resize = setTimeout(function () { _runResizeHandlers(); }, 50); // wait 50ms until window resize finishes. }); } } // Handles portlet tools & actions var handlePortletTools = function () { jQuery('body').on('click', '.portlet > .portlet-title > .tools > a.remove', function (e) { e.preventDefault(); jQuery(this).closest(".portlet").remove(); }); jQuery('body').on('click', '.portlet > .portlet-title > .tools > a.reload', function (e) { e.preventDefault(); var el = jQuery(this).closest(".portlet").children(".portlet-body"); var url = jQuery(this).attr("data-url"); var error = $(this).attr("data-error-display"); if (url) { Metronic.blockUI({target: el, iconOnly: true}); $.ajax({ type: "GET", cache: false, url: url, dataType: "html", success: function(res) { Metronic.unblockUI(el); el.html(res); }, error: function(xhr, ajaxOptions, thrownError) { Metronic.unblockUI(el); var msg = 'Error on reloading the content. Please check your connection and try again.'; if (error == "toastr" && toastr) { toastr.error(msg); } else if (error == "notific8" && $.notific8) { $.notific8('zindex', 11500); $.notific8(msg, {theme: 'ruby', life: 3000}); } else { alert(msg); } } }); } else { // for demo purpose Metronic.blockUI({target: el, iconOnly: true}); window.setTimeout(function () { Metronic.unblockUI(el); }, 1000); } }); // load ajax data on page init $('.portlet .portlet-title a.reload[data-load="true"]').click(); jQuery('body').on('click', '.portlet > .portlet-title > .tools > .collapse, .portlet .portlet-title > .tools > .expand', function (e) { e.preventDefault(); var el = jQuery(this).closest(".portlet").children(".portlet-body"); if (jQuery(this).hasClass("collapse")) { jQuery(this).removeClass("collapse").addClass("expand"); el.slideUp(200); } else { jQuery(this).removeClass("expand").addClass("collapse"); el.slideDown(200); } }); } // Handles custom checkboxes & radios using jQuery Uniform plugin var handleUniform = function () { if (!jQuery().uniform) { return; } var test = $("input[type=checkbox]:not(.toggle, .make-switch), input[type=radio]:not(.toggle, .star, .make-switch)"); if (test.size() > 0) { test.each(function () { if ($(this).parents(".checker").size() == 0) { $(this).show(); $(this).uniform(); } }); } } var handleBootstrapSwitch = function () { if (!jQuery().bootstrapSwitch) { return; } $('.make-switch').bootstrapSwitch(); } // Handles Bootstrap Accordions. var handleAccordions = function () { jQuery('body').on('shown.bs.collapse', '.accordion.scrollable', function (e) { Metronic.scrollTo($(e.target)); }); } // Handles Bootstrap Tabs. var handleTabs = function () { //activate tab if tab id provided in the URL if (location.hash) { var tabid = location.hash.substr(1); $('a[href="#' + tabid + '"]').parents('.tab-pane:hidden').each(function(){ var tabid = $(this).attr("id"); $('a[href="#' + tabid + '"]').click(); }); $('a[href="#' + tabid + '"]').click(); } } // Handles Bootstrap Modals. var handleModals = function () { // fix stackable modal issue: when 2 or more modals opened, closing one of modal will remove .modal-open class. $('body').on('hide.bs.modal', function () { if ($('.modal:visible').size() > 1 && $('html').hasClass('modal-open') == false) { $('html').addClass('modal-open'); } else if ($('.modal:visible').size() <= 1) { $('html').removeClass('modal-open'); } }); $('body').on('show.bs.modal', '.modal', function () { if ($(this).hasClass("modal-scroll")) { $('body').addClass("modal-open-noscroll"); } }); $('body').on('hide.bs.modal', '.modal', function () { $('body').removeClass("modal-open-noscroll"); }); } // Handles Bootstrap Tooltips. var handleTooltips = function () { jQuery('.tooltips').tooltip(); } // Handles Bootstrap Dropdowns var handleDropdowns = function () { /* Hold dropdown on click */ $('body').on('click', '.dropdown-menu.hold-on-click', function (e) { e.stopPropagation(); }); } var handleAlerts = function () { $('body').on('click', '[data-close="alert"]', function(e){ $(this).parent('.alert').hide(); e.preventDefault(); }); } // Handle Hower Dropdowns var handleDropdownHover = function () { $('[data-hover="dropdown"]').dropdownHover(); } // Handles Bootstrap Popovers // last popep popover var lastPopedPopover; var handlePopovers = function () { jQuery('.popovers').popover(); // close last displayed popover $(document).on('click.bs.popover.data-api', function (e) { if (lastPopedPopover) { lastPopedPopover.popover('hide'); } }); } // Handles scrollable contents using jQuery SlimScroll plugin. var handleScrollers = function () { $('.scroller').each(function () { if ($(this).attr("data-initialized")) { return; // exit } var height; if ($(this).attr("data-height")) { height = $(this).attr("data-height"); } else { height = $(this).css('height'); } $(this).slimScroll({ allowPageScroll: true, // allow page scroll when the element scroll is ended size: '7px', color: ($(this).attr("data-handle-color") ? $(this).attr("data-handle-color") : '#bbb'), railColor: ($(this).attr("data-rail-color") ? $(this).attr("data-rail-color") : '#eaeaea'), position: isRTL ? 'left' : 'right', height: height, alwaysVisible: ($(this).attr("data-always-visible") == "1" ? true : false), railVisible: ($(this).attr("data-rail-visible") == "1" ? true : false), disableFadeOut: true }); $(this).attr("data-initialized", true); }); } // Handles Image Preview using jQuery Fancybox plugin var handleFancybox = function () { if (!jQuery.fancybox) { return; } if (jQuery(".fancybox-button").size() > 0) { jQuery(".fancybox-button").fancybox({ groupAttr: 'data-rel', prevEffect: 'none', nextEffect: 'none', closeBtn: true, helpers: { title: { type: 'inside' } } }); } } // Fix input placeholder issue for IE8 and IE9 var handleFixInputPlaceholderForIE = function () { //fix html5 placeholder attribute for ie7 & ie8 if (isIE8 || isIE9) { // ie8 & ie9 // this is html5 placeholder fix for inputs, inputs with placeholder-no-fix class will be skipped(e.g: we need this for password fields) jQuery('input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)').each(function () { var input = jQuery(this); if (input.val() == '' && input.attr("placeholder") != '') { input.addClass("placeholder").val(input.attr('placeholder')); } input.focus(function () { if (input.val() == input.attr('placeholder')) { input.val(''); } }); input.blur(function () { if (input.val() == '' || input.val() == input.attr('placeholder')) { input.val(input.attr('placeholder')); } }); }); } } // Handle Select2 Dropdowns var handleSelect2 = function() { if (jQuery().select2) { $('.select2me').select2({ placeholder: "Select", allowClear: true }); } } //* END:CORE HANDLERS *// return { //main function to initiate the theme init: function () { //IMPORTANT!!!: Do not modify the core handlers call order. //Core handlers handleInit(); // initialize core variables handleOnResize(); // set and handle responsive //UI Component handlers handleUniform(); // hanfle custom radio & checkboxes handleBootstrapSwitch(); // handle bootstrap switch plugin handleScrollers(); // handles slim scrolling contents handleFancybox() // handle fancy box handleSelect2(); // handle custom Select2 dropdowns handlePortletTools(); // handles portlet action bar functionality(refresh, configure, toggle, remove) handleAlerts(); //handle closabled alerts handleDropdowns(); // handle dropdowns handleTabs(); // handle tabs handleTooltips(); // handle bootstrap tooltips handlePopovers(); // handles bootstrap popovers handleAccordions(); //handles accordions handleModals(); // handle modals }, //main function to initiate core javascript after ajax complete initAjax: function () { handleScrollers(); // handles slim scrolling contents handleSelect2(); // handle custom Select2 dropdowns handleDropdowns(); // handle dropdowns handleTooltips(); // handle bootstrap tooltips handlePopovers(); // handles bootstrap popovers handleAccordions(); //handles accordions handleUniform(); // hanfle custom radio & checkboxes handleBootstrapSwitch(); // handle bootstrap switch plugin handleDropdownHover() // handles dropdown hover }, //public function to remember last opened popover that needs to be closed on click setLastPopedPopover: function (el) { lastPopedPopover = el; }, //public function to add callback a function which will be called on window resize addResizeHandler: function (func) { resizeHandlers.push(func); }, //public functon to call _runresizeHandlers runResizeHandlers: function() { _runResizeHandlers(); }, // wrMetronicer function to scroll(focus) to an element scrollTo: function (el, offeset) { var pos = (el && el.size() > 0) ? el.offset().top : 0; if (el) { if ($('body').hasClass('page-header-fixed')) { pos = pos - $('.page-header').height(); } pos = pos + (offeset ? offeset : -1 * el.height()); } jQuery('html,body').animate({ scrollTop: pos }, 'slow'); }, // function to scroll to the top scrollTop: function () { Metronic.scrollTo(); }, // wrMetronicer function to block element(indicate loading) blockUI: function (options) { var options = $.extend(true, {}, options); var html = ''; if (options.iconOnly) { html = '
'; } else if (options.textOnly) { html = ' '; } else { html = ' '; } if (options.target) { // element blocking var el = jQuery(options.target); if (el.height() <= ($(window).height())) { options.cenrerY = true; } el.block({ message: html, baseZ: options.zIndex ? options.zIndex : 1000, centerY: options.cenrerY != undefined ? options.cenrerY : false, css: { top: '10%', border: '0', padding: '0', backgroundColor: 'none' }, overlayCSS: { backgroundColor: options.overlayColor ? options.overlayColor : '#000', opacity: options.boxed ? 0.05 : 0.1, cursor: 'wait' } }); } else { // page blocking $.blockUI({ message: html, baseZ: options.zIndex ? options.zIndex : 1000, css: { border: '0', padding: '0', backgroundColor: 'none' }, overlayCSS: { backgroundColor: options.overlayColor ? options.overlayColor : '#000', opacity: options.boxed ? 0.05 : 0.1, cursor: 'wait' } }); } }, // wrMetronicer function to un-block element(finish loading) unblockUI: function (target) { if (target) { jQuery(target).unblock({ onUnblock: function () { jQuery(target).css('position', ''); jQuery(target).css('zoom', ''); } }); } else { $.unblockUI(); } }, startPageLoading: function(message) { $('.page-loading').remove(); $('body').append('