McGansWebsite/assets/app.js

757 lines
27 KiB
JavaScript
Raw Permalink Normal View History

2023-01-05 12:19:39 +00:00
/**
* Document : app.js
* Author : redstar
* Description: Core script to handle the entire theme and core functions
*
**/
var App = function() {
// IE mode
var isIE8 = false;
var isIE9 = false;
var isIE10 = false;
var resizeHandlers = [];
var assetsPath = '';
var globalImgPath = 'img/';
var globalPluginsPath = 'global/plugins/';
var globalCssPath = 'css/';
/************* Setting for IE ****************/
var handleInit = function() {
isIE8 = !!navigator.userAgent.match(/MSIE 8.0/);
isIE9 = !!navigator.userAgent.match(/MSIE 9.0/);
isIE10 = !!navigator.userAgent.match(/MSIE 10.0/);
if (isIE10) {
$('html').addClass('ie10'); // detect IE10 version
}
if (isIE10 || isIE9 || isIE8) {
$('html').addClass('ie'); // detect IE10 version
}
};
/*************** Change theme color *************/
var handleColorSetting = function() {
$(document).on('click', '.control-sidebar-btn', function () {
jQuery( ".quick-setting" ).toggle( "slide");
});
};
/*************** Change Language *************/
var handleLanguage = function() {
$(document).on('click', '.language-switch .dropdown-menu li a', function () {
$(".language-switch>a").html($(this).html()+'<span class="fa fa-angle-down"></span>');
$(".language-switch>a img").addClass("position-left");
});
};
/*************** Hover Sidemenu *************/
var handleHoverSidemenu = function() {
$(".sidemenu-hover-submenu").parent().parent().css("position","relative");
};
/************* Handle theme layout ****************/
var handleTheme = function() {
var panel = $('.chatpane');
if ($('body').hasClass('page-boxed') === false) {
$('.layout-option', panel).val("fluid");
}
$('.sidebar-option', panel).val("default");
$('.page-header-option', panel).val("fixed");
$('.page-footer-option', panel).val("default");
if ($('.sidebar-pos-option').attr("disabled") === false) {
$('.sidebar-pos-option', panel).val('left');
}
var lastSelectedLayout = '';
var setLayout = function() {
var layoutOption = $('.layout-option', panel).val();
var sidebarOption = $('.sidebar-option', panel).val();
var headerOption = $('.page-header-option', panel).val();
var footerOption = $('.page-footer-option', panel).val();
var sidebarPosOption = $('.sidebar-pos-option', panel).val();
var sidebarStyleOption = $('.sidebar-style-option', panel).val();
var sidebarMenuOption = $('.sidebar-menu-option', panel).val();
var headerTopDropdownStyle = $('.page-header-top-dropdown-style-option', panel).val();
if (sidebarOption == "fixed" && headerOption == "default") {
alert('Default Header with Fixed Sidebar option is not supported. Proceed with Fixed Header with Fixed Sidebar.');
$('.page-header-option', panel).val("fixed");
$('.sidebar-option', panel).val("fixed");
sidebarOption = 'fixed';
headerOption = 'fixed';
}
resetLayout(); // reset layout to default state
if (layoutOption === "boxed") {
$("body").addClass("page-boxed");
// set header
$('.page-header > .page-header-inner').addClass("container");
var cont = $('body > .clearfix').after('<div class="container"></div>');
// set content
$('.page-container').appendTo('body > .container');
// set footer
if (footerOption === 'fixed') {
$('.page-footer').html('<div class="container">' + $('.page-footer').html() + '</div>');
} else {
$('.page-footer').appendTo('body > .container');
}
}
if (lastSelectedLayout != layoutOption) {
//layout changed, run responsive handler:
App.runResizeHandlers();
}
lastSelectedLayout = layoutOption;
/************ header ******************/
if (headerOption === 'fixed') {
$("body").addClass("page-header-fixed");
$(".page-header").removeClass("navbar-static-top").addClass("navbar-fixed-top");
} else {
$("body").removeClass("page-header-fixed");
$(".page-header").removeClass("navbar-fixed-top").addClass("navbar-static-top");
}
/************ sidebar *****************/
if ($('body').hasClass('page-full-width') === false) {
if (sidebarOption === 'fixed') {
$("body").addClass("sidemenu-container-fixed");
$("sidemenu").addClass("sidemenu-fixed");
$("sidemenu").removeClass("page-sidebar-menu-default");
Layout.initFixedSidebarHoverEffect();
} else {
$("body").removeClass("sidemenu-container-fixed");
$("page-sidebar-menu").addClass("page-sidebar-menu-default");
$("page-sidebar-menu").removeClass("sidemenu-default");
$('.sidemenu').unbind('mouseenter').unbind('mouseleave');
}
}
/********* top dropdown style ************/
if (headerTopDropdownStyle === 'dark') {
$(".top-menu > .navbar-nav > li.dropdown").addClass("dropdown-dark");
} else {
$(".top-menu > .navbar-nav > li.dropdown").removeClass("dropdown-dark");
}
/************* footer ****************/
if (footerOption === 'fixed') {
$("body").addClass("page-footer-fixed");
} else {
$("body").removeClass("page-footer-fixed");
}
/*********** sidebar style ***************/
if (sidebarStyleOption === 'light') {
$(".page-sidebar-menu").addClass("page-sidebar-menu-light");
} else {
$(".page-sidebar-menu").removeClass("page-sidebar-menu-light");
}
/********* sidebar menu ***********************/
if (sidebarMenuOption === 'hover') {
if (sidebarOption == 'fixed') {
$('.sidebar-menu-option', panel).val("accordion");
alert("Hover Sidebar Menu is not compatible with Fixed Sidebar Mode. Select Default Sidebar Mode Instead.");
} else {
$(".sidemenu").addClass("sidemenu-hover-submenu");
}
} else {
$(".sidemenu").removeClass("sidemenu-hover-submenu");
}
/**************** sidebar left right position setting **************/
if (sidebarPosOption === 'right') {
$("body").addClass("sidemenu-container-reversed");
$('#frontend-link').tooltip('destroy').tooltip({
placement: 'left'
});
} else {
$("body").removeClass("sidemenu-container-reversed");
$('#frontend-link').tooltip('destroy').tooltip({
placement: 'right'
});
}
Layout.fixContentHeight(); // fix content height
Layout.initFixedSidebar(); // reinitialize fixed sidebar
};
$(document).on('click', '.toggler', panel, function() {
$('.toggler').hide();
$('.toggler-close').show();
$('.chatpane > .theme-options').show();
});
$(document).on('click', '.toggler-close', panel, function() {
$('.toggler').show();
$('.toggler-close').hide();
$('.chatpane > .theme-options').hide();
});
/*************** spinner button ******************/
$(document).on('click', '.spinner button', function() {
var btn = $(this);
var input = btn.closest('.spinner').find('input');
var step = 1;
if (input.attr('step') != undefined) {
step = parseInt(input.attr('step'),10);
}
if (btn.attr('data-dir') == 'up') {
if (input.attr('max') == undefined || parseInt(input.val(),10) < parseInt(input.attr('max'),10)) {
input.val(parseInt(input.val(), 10) + step);
} else {
btn.next("disabled", true);
}
} else {
if (input.attr('min') == undefined || parseInt(input.val(),10) > parseInt(input.attr('min'),10)) {
input.val(parseInt(input.val(), 10) - step);
} else {
btn.prev("disabled", true);
}
}
});
/*************** TO DO **********************/
$(document).on('click', '.todo-check label', function() {
$(this).parents('li').children('.todo-title').toggleClass('line-through');
});
$(document).on('click', '.todo-remove', function() {
$(this).closest("li").remove();
return false;
});
$(document).on('click', '.panel .tools .fa-times', function() {
$(this).parents(".panel").parent().remove();
});
$('.tooltips').tooltip();
// clickable row for email
$(document).on('click', '.clickable-row', function() {
window.document.location = $(this).data("link");
});
/************* collapse button in panel***************8*/
$(document).on('click', '.card .tools .t-collapse', function() {
var el = $(this).parents(".card").children(".card-body");
if ($(this).hasClass("fa-chevron-down")) {
$(this).removeClass("fa-chevron-down").addClass("fa-chevron-up");
el.slideUp(200);
} else {
$(this).removeClass("fa-chevron-up").addClass("fa-chevron-down");
el.slideDown(200);
}
});
/**************** close button in panel *****************/
$(document).on('click', '.card .tools .t-close', function() {
$(this).parents(".card").parent().remove();
});
/****************** refresh button in panel *****************/
$('.box-refresh').on('click', function(br) {
br.preventDefault();
$("<div class='refresh-block'><span class='refresh-loader'><i class='fa fa-spinner fa-spin'></i></span></div>").appendTo($(this).parents('.tools').parents('.card-head').parents('.card'));
setTimeout(function() {
$('.refresh-block').remove();
}, 1000);
});
/***************** set default theme options **************************/
if ($("body").hasClass("page-boxed")) {
$('.layout-option', panel).val("boxed");
}
if ($("body").hasClass("sidemenu-container-fixed")) {
$('.sidebar-option', panel).val("fixed");
}
if ($("body").hasClass("page-header-fixed")) {
$('.page-header-option', panel).val("fixed");
}
if ($("body").hasClass("page-footer-fixed")) {
$('.page-footer-option', panel).val("fixed");
}
if ($("body").hasClass("sidemenu-container-reversed")) {
$('.sidebar-pos-option', panel).val("right");
}
if ($(".page-sidebar-menu").hasClass("page-sidebar-menu-light")) {
$('.sidebar-style-option', panel).val("light");
}
if ($(".page-sidebar-menu").hasClass("page-sidebar-menu-hover-submenu")) {
$('.sidebar-menu-option', panel).val("hover");
}
var sidebarOption = $('.sidebar-option', panel).val();
var headerOption = $('.page-header-option', panel).val();
var footerOption = $('.page-footer-option', panel).val();
var sidebarPosOption = $('.sidebar-pos-option', panel).val();
var sidebarStyleOption = $('.sidebar-style-option', panel).val();
var sidebarMenuOption = $('.sidebar-menu-option', panel).val();
$('.layout-option, .page-header-option, .page-header-top-dropdown-style-option, .sidebar-option, .page-footer-option, .sidebar-pos-option, .sidebar-style-option, .sidebar-menu-option', panel).change(setLayout);
};
/************ Reset theme layout ********************/
var resetLayout = function() {
$("body").
removeClass("page-boxed").
removeClass("page-footer-fixed").
removeClass("sidemenu-container-fixed").
removeClass("page-header-fixed").
removeClass("sidemenu-container-reversed");
$('.page-header > .page-header-inner').removeClass("container");
if ($('.page-container').parent(".container").length === 1) {
$('.page-container').insertAfter('body > .clearfix');
}
if ($('.page-footer > .container').length === 1) {
$('.page-footer').html($('.page-footer > .container').html());
} else if ($('.page-footer').parent(".container").length === 1) {
$('.page-footer').insertAfter('.page-container');
$('.scroll-to-top').insertAfter('.page-footer');
}
$(".top-menu > .navbar-nav > li.dropdown").removeClass("dropdown-dark");
$('body > .container').remove();
};
// runs callback functions set by App.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 Bootstrap switches in setting panel ********/
var handleBootstrapSwitch = function() {
if (!$().bootstrapSwitch) {
return;
}
$('.make-switch').bootstrapSwitch();
};
/*************** 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();
}
if ($().tabdrop) {
$('.tabbable-tabdrop .nav-pills, .tabbable-tabdrop .nav-tabs').tabdrop({
text: '<i class="fa fa-ellipsis-v"></i>&nbsp;<i class="fa fa-angle-down"></i>'
});
}
};
/************* Handles Bootstrap Dropdowns ********************/
var handleDropdowns = function() {
/*
Hold dropdown on click
*/
$('body').on('click', '.dropdown-menu.hold-on-click', function(e) {
e.stopPropagation();
});
};
/************** Handles counterup plugin wrapper ****************/
var handleCounterup = function() {
if (!$().counterUp) {
return;
}
$("[data-counter='counterup']").counterUp({
delay: 10,
time: 1000
});
};
// 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)
$('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'));
}
});
});
}
};
// Handle Select2 Dropdowns
var handleSelect2 = function() {
if ($().select2) {
$.fn.select2.defaults.set("theme", "bootstrap");
$('.select2me').select2({
placeholder: "Select",
width: 'auto',
allowClear: true
});
}
};
// 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 data_offset = parent.attr('data-offset') ? parent.attr('data-offset') : 0;
var offset = parseInt(data_offset,10);
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());
}
});
}
// Handles quick sidebar toggler
var handleQuickSidebarToggler = function() {
// close sidebar using button click
$(document).on('click', '.dropdown-quick-sidebar-toggler a', function(e) {
$('body').toggleClass('chat-sidebar-open');
});
// close sidebar when click outside box
$(document).on('click', '.page-content', function(e) {
if($("body").hasClass("chat-sidebar-open")){
$('body').toggleClass('chat-sidebar-open');
}
});
// close sidebar using esc key
$( document ).on( 'keydown', function ( e ) {
if ( e.keyCode === 27 && $("body").hasClass("chat-sidebar-open")) { // ESC
$('body').toggleClass('chat-sidebar-open');
}
});
};
/********Sidebar slim-menu*********/
var handleslimscroll_menu = function() {
$(".slimscroll-style").slimscroll({
height: $( window ).height() - 90,
position: "right",
size: "5px",
color: "#9ea5ab",
wheelStep: 5
});
$(".small-slimscroll-style").slimscroll({
height: "260px",
position: "right",
size: "5px",
color: "#9ea5ab",
wheelStep: 5
});
};
handleChatScrollbar = function() {
var t = $(".chat-sidebar-chat"),
i = function() {
var i, a = t.find(".chat-sidebar-item"),
e = $(".chat-sidebar-chat-users").attr("data-height");
i = $(".chat-sidebar-chat-users").attr("data-height") - 80 - t.find(".nav-justified > .nav-tabs").outerHeight(), a.attr("data-height", i), a.css("height", e + "px"), a.css("overflow-y", "auto")
};
i(), App.addResizeHandler(i)
};
// Handles quick sidebar settings
var handleQuickSidebarSettings = function() {
var wrapper = $('.chat-sidebar-container');
var initSettingsSlimScroll = function() {
var settingsList = wrapper.find('.chat-sidebar-settings-list');
var settingsListHeight;
settingsListHeight = wrapper.height() - 80 - wrapper.find('.nav-justified > .nav-tabs').outerHeight();
// alerts list
settingsList.attr("data-height", settingsListHeight);
settingsList.css("height", wrapper.height() + "px");
settingsList.css("overflow-y", "auto");
};
initSettingsSlimScroll();
App.addResizeHandler(initSettingsSlimScroll); // reinitialize on window resize
};
//* END:CORE HANDLERS *//
return {
//main function to initiate the theme
init: function() {
//Core handlers
handleInit(); // initialize core variables
handleTheme();
handleOnResize(); // set and handle responsive
handleColorSetting();
handleLanguage();
handleHoverSidemenu();
//UI Component handlers
handleBootstrapSwitch(); // handle bootstrap switch plugin
handleSelect2(); // handle custom Select2 dropdowns
handleDropdowns(); // handle dropdowns
handleTabs(); // handle tabs
handleCounterup(); // handle counterup instances
handleQuickSidebarToggler(); // handles quick sidebar's toggler
handleQuickSidebarSettings(); // handles quick sidebar's setting
handleChatScrollbar();
handleslimscroll_menu();
//Handle group element heights
this.addResizeHandler(handleHeight); // handle auto calculating height on window resize
handleFixInputPlaceholderForIE(); //IE8 & IE9 input placeholder issue fix
},
//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();
},
// wrApper function to scroll(focus) to an element
scrollTo: function(el, offeset) {
var pos = (el && el.length > 0) ? el.offset().top : 0;
if (el) {
if ($('body').hasClass('page-header-fixed')) {
pos = pos - $('.page-header').height();
} else if ($('body').hasClass('page-header-top-fixed')) {
pos = pos - $('.page-header-top').height();
} else if ($('body').hasClass('page-header-menu-fixed')) {
pos = pos - $('.page-header-menu').height();
}
pos = pos + (offeset ? offeset : -1 * el.height());
}
$('html,body').animate({
scrollTop: pos
}, 'slow');
},
// function to scroll to the top
scrollTop: function() {
App.scrollTo();
},
startPageLoading: function(options) {
if (options && options.animate) {
$('.page-spinner-bar').remove();
$('body').append('<div class="page-spinner-bar"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div>');
} else {
$('.page-loading').remove();
$('body').append('<div class="page-loading"><img src="' + this.getGlobalImgPath() + 'loading-spinner-grey.gif"/>&nbsp;&nbsp;<span>' + (options && options.message ? options.message : 'Loading...') + '</span></div>');
}
},
stopPageLoading: function() {
$('.page-loading, .page-spinner-bar').remove();
},
//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;
},
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']
};
},
getUniqueID: function(prefix) {
return 'prefix_' + Math.floor(Math.random() * (new Date()).getTime());
},
// check IE8 mode
isIE8: function() {
return isIE8;
},
// check IE9 mode
isIE9: function() {
return isIE9;
},
getAssetsPath: function() {
return assetsPath;
},
setAssetsPath: function(path) {
assetsPath = path;
},
setGlobalImgPath: function(path) {
globalImgPath = path;
},
getGlobalImgPath: function() {
return assetsPath + globalImgPath;
},
getGlobalCssPath: function() {
return assetsPath + globalCssPath;
},
getResponsiveBreakpoint: 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;
}
};
}();
jQuery(document).ready(function() {
App.init(); // init core componets
$(".chat-sidebar-chat-user-messages").animate({
scrollTop: $(document).height()
}, 1000);
});