/** Core script to handle the entire theme and core functions **/ var App = function() { // IE mode var isRTL = false; var isIE9 = false; var isIE10 = false; var isIE = false; var resizeHandlers = []; // initializes main settings var handleInit = function() { isIE9 = !!navigator.userAgent.match(/MSIE 9.0/); isIE10 = !!navigator.userAgent.match(/MSIE 10.0/); isIE = navigator.userAgent.indexOf("MSIE ") > -1 || navigator.userAgent.indexOf("Trident/") > -1; if (isIE10) { $('html').addClass('ie10'); // detect IE10 version } if (isIE9) { $('html').addClass('ie9'); // detect IE10 version } if (isIE) { $('html').addClass('ie'); // detect IE10 version } }; // runs callback functions set by Jango.addResponsiveHandler(). var _runResizeHandlers = function() { // reinitialize other subscribed elements for (var i = 0; i < resizeHandlers.length; i++) { var each = resizeHandlers[i]; each.call(); } }; // handle group element heights var handleHeight = function() { $('[data-auto-height]').each(function() { var parent = $(this); var items = $('[data-height]', parent); var height = 0; var mode = parent.attr('data-mode'); var offset = parseInt(parent.attr('data-offset') ? parent.attr('data-offset') : 0); items.each(function() { if ($(this).attr('data-height') == "height") { $(this).css('height', ''); } else { $(this).css('min-height', ''); } var height_ = (mode == 'base-height' ? $(this).outerHeight() : $(this).outerHeight(true)); if (height_ > height) { height = height_; } }); height = height + offset; items.each(function() { if ($(this).attr('data-height') == "height") { $(this).css('height', height); } else { $(this).css('min-height', height); } }); if(parent.attr('data-related')) { $(parent.attr('data-related')).css('height', parent.height()); } }); } // handle the layout reinitialization on window resize var handleOnResize = function() { var resize; $(window).resize(function() { if (resize) { clearTimeout(resize); } resize = setTimeout(function() { _runResizeHandlers(); }, 50); // wait 50ms until window resize finishes. }); }; // Handles custom checkboxes & radios using jQuery Uniform plugin var handleCheckboxRadios = function() { // Material design ckeckbox and radio effects $('body').on('click', '.c-checkbox > label, .c-radio > label', function() { var the = $(this); // find the first span which is our circle/bubble var el = $(this).children('span:first-child'); // add the bubble class (we do this so it doesnt show on page load) el.addClass('inc'); // clone it var newone = el.clone(true); // add the cloned version before our original el.before(newone); // remove the original so that it is ready to run on next click $("." + el.attr("class") + ":last", the).remove(); }); }; // Handles Bootstrap Accordions. var handleAccordions = function() { $('body').on('shown.bs.collapse', '.accordion.scrollable', function(e) { Jango.scrollTo($(e.target)); }); }; // Handles Bootstrap Tabs. var handleTabs = function() { //activate tab if tab id provided in the URL if (encodeURI(location.hash)) { var tabid = encodeURI(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'); } }); // fix page scrollbars issue $('body').on('show.bs.modal', '.modal', function() { if ($(this).hasClass("modal-scroll")) { $('body').addClass("modal-open-noscroll"); } }); // fix page scrollbars issue $('body').on('hide.bs.modal', '.modal', function() { $('body').removeClass("modal-open-noscroll"); }); // remove ajax content and remove cache on modal closed $('body').on('hidden.bs.modal', '.modal:not(.modal-cached)', function() { $(this).removeData('bs.modal'); }); }; // Handles Bootstrap Tooltips. var handleTooltips = function() { // global tooltips $('.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(); $(this).closest('.note').hide(); e.preventDefault(); }); $('body').on('click', '[data-close="note"]', function(e) { $(this).closest('.note').hide(); e.preventDefault(); }); $('body').on('click', '[data-remove="note"]', function(e) { $(this).closest('.note').remove(); e.preventDefault(); }); }; // Handle Hower Dropdowns var handleDropdownHover = function() { $('[data-hover="dropdown"]').not('.hover-initialized').each(function() { $(this).dropdownHover(); $(this).addClass('hover-initialized'); }); }; // Handles Bootstrap Popovers // last popep popover var lastPopedPopover; var handlePopovers = function() { $('.popovers').popover(); // close last displayed popover $(document).on('click.bs.popover.data-api', function(e) { if (lastPopedPopover) { lastPopedPopover.popover('hide'); } }); }; // Fix input placeholder issue for IE9 and IE10 var handleFixInputPlaceholderForIE = function() { //fix html5 placeholder attribute for ie9 & ie10 if (isIE9 || isIE10) { // this is html5 placeholder fix for inputs, inputs with placeholder-no-fix class will be skipped(e.g: we need this for password fields) $('input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)').each(function() { var input = $(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')); } }); }); } }; //* END:CORE HANDLERS *// return { //main function to initiate the theme init: function() { //IMPORTANT!!!: Do not modify the core handlers call order. //Core handlers handleHeight(); this.addResizeHandler(handleHeight); // handle auto calculating height on window resize handleInit(); // initialize core variables handleOnResize(); // set and handle responsive //UI Component handlers //handleAnimate(); // handle animate handleCheckboxRadios() // handle checkbox & radios handleAlerts(); //handle closabled alerts handleDropdowns(); // handle dropdowns handleTooltips(); // handle bootstrap tooltips handlePopovers(); // handles bootstrap popovers handleAccordions(); //handles accordions handleModals(); // handle modals // Hacks handleFixInputPlaceholderForIE(); //IE9 & IE10 input placeholder issue fix }, changeLogo: function(filename) { var path = '../assets/jango/img/layout/logos/' + filename + '.png'; $('.c-brand img.c-desktop-logo').attr('src', path); }, //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(); }, // wrJangoer 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()); } $('html,body').animate({ scrollTop: pos }, 'slow'); }, // function to scroll to the top scrollTop: function() { Jango.scrollTo(); }, //public function to initialize the fancybox plugin initFancybox: function() { handleFancybox(); }, //public helper function to get actual input value(used in IE9 and IE8 due to placeholder attribute not supported) getActualVal: function(el) { el = $(el); if (el.val() === el.attr("placeholder")) { return ""; } return el.val(); }, //public function to get a paremeter by name from URL getURLParameter: function(paramName) { var searchString = window.location.search.substring(1), i, val, params = searchString.split("&"); for (i = 0; i < params.length; i++) { val = params[i].split("="); if (val[0] == paramName) { return unescape(val[1]); } } return null; }, // check for device touch support isTouchDevice: function() { try { document.createEvent("TouchEvent"); return true; } catch (e) { return false; } }, // To get the correct viewport width based on http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/ getViewPort: function() { var e = window, a = 'inner'; if (!('innerWidth' in window)) { a = 'client'; e = document.documentElement || document.body; } return { width: e[a + 'Width'], height: e[a + 'Height'] }; }, // generate unique ID getUniqueID: function(prefix) { return 'prefix_' + Math.floor(Math.random() * (new Date()).getTime()); }, // check IE9 mode isIE: function() { return isIE; }, // check IE9 mode isIE9: function() { return isIE9; }, // check IE9 mode isIE10: function() { return isIE10; }, // responsive breakpoints getBreakpoint: function(size) { // bootstrap responsive breakpoints var sizes = { 'xs': 480, // extra small 'sm': 768, // small 'md': 992, // medium 'lg': 1200 // large }; return sizes[size] ? sizes[size] : 0; } }; }();