2018-08-29 18:45:12 +08:00

598 lines
27 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Document : app.js
* Author : pixelcave
* Description: Custom scripts and plugin initializations (available to all pages)
*
* Feel free to remove the plugin initilizations from uiInit() if you would like to
* use them only in specific pages. Also, if you remove a js plugin you won't use, make
* sure to remove its initialization from uiInit().
*/
var App = function() {
/* Helper variables - set in uiInit() */
var page, pageContent, header, sidebar, sBrand, sExtraInfo, sidebarAlt, sScroll, sScrollAlt;
/* Initialization UI Code */
var uiInit = function() {
// Set variables - Cache some often used Jquery objects in variables */
page = $('#page-container');
header = $('header');
pageContent = $('#page-content');
sidebar = $('#sidebar');
sBrand = $('#sidebar-brand');
sExtraInfo = $('#sidebar-extra-info');
sScroll = $('#sidebar-scroll');
sidebarAlt = $('#sidebar-alt');
sScrollAlt = $('#sidebar-scroll-alt');
// Color Theme Preview functionality
colorThemePreview();
// Initialize sidebars functionality
handleSidebar('init');
// Sidebar navigation functionality
handleNav();
// Header glass effect on scrolling
if ((header.hasClass('navbar-fixed-top') || header.hasClass('navbar-fixed-bottom'))) {
$(window).on('scroll', function(){
if ($(this).scrollTop() > 50) {
header.addClass('navbar-glass');
} else {
header.removeClass('navbar-glass');
}
});
}
// Resize #page-content to fill empty space if exists
$(window).on('resize orientationchange', function(){ resizePageContent(); }).resize();
// Add the correct copyright year
var yearCopy = $('#year-copy'), d = new Date();
if (d.getFullYear() === 2014) { yearCopy.html('2014'); } else { yearCopy.html('2014-' + d.getFullYear().toString().substr(2,2)); }
// Intialize ripple effect on buttons
rippleEffect($('.btn-effect-ripple'), 'btn-ripple');
// Initialize Tabs
$('[data-toggle="tabs"] a, .enable-tabs a').click(function(e){ e.preventDefault(); $(this).tab('show'); });
// Initialize Tooltips
$('[data-toggle="tooltip"], .enable-tooltip').tooltip({container: 'body', animation: false});
// Initialize Popovers
$('[data-toggle="popover"], .enable-popover').popover({container: 'body', animation: true});
// Initialize Image Lightbox
$('[data-toggle="lightbox-image"]').magnificPopup({type: 'image', image: {titleSrc: 'title'}});
// Initialize image gallery lightbox
$('[data-toggle="lightbox-gallery"]').each(function(){
$(this).magnificPopup({
delegate: 'a',
type: 'image',
gallery: {
enabled: true,
navigateByImgClick: true,
arrowMarkup: '<button type="button" class="mfp-arrow mfp-arrow-%dir%" title="%title%"></button>',
tPrev: 'Previous',
tNext: 'Next',
tCounter: '<span class="mfp-counter">%curr% of %total%</span>'
},
image: {titleSrc: 'title'}
});
});
// Initialize Typeahead - Example with countries
var exampleTypeheadData = ["Afghanistan","Albania","Algeria","American Samoa","Andorra","Angola","Anguilla","Antarctica","Antigua and Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia and Herzegovina","Botswana","Bouvet Island","Brazil","British Indian Ocean Territory","British Virgin Islands","Brunei","Bulgaria","Burkina Faso","Burundi","CΓ΄te d'Ivoire","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central African Republic","Chad","Chile","China","Christmas Island","Cocos (Keeling) Islands","Colombia","Comoros","Congo","Cook Islands","Costa Rica","Croatia","Cuba","Cyprus","Czech Republic","Democratic Republic of the Congo","Denmark","Djibouti","Dominica","Dominican Republic","East Timor","Ecuador","Egypt","El Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Faeroe Islands","Falkland Islands","Fiji","Finland","Former Yugoslav Republic of Macedonia","France","French Guiana","French Polynesia","French Southern Territories","Gabon","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Guadeloupe","Guam","Guatemala","Guinea","Guinea-Bissau","Guyana","Haiti","Heard Island and McDonald Islands","Honduras","Hong Kong","Hungary","Iceland","India","Indonesia","Iran","Iraq","Ireland","Israel","Italy","Jamaica","Japan","Jordan","Kazakhstan","Kenya","Kiribati","Kuwait","Kyrgyzstan","Laos","Latvia","Lebanon","Lesotho","Liberia","Libya","Liechtenstein","Lithuania","Luxembourg","Macau","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall Islands","Martinique","Mauritania","Mauritius","Mayotte","Mexico","Micronesia","Moldova","Monaco","Mongolia","Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauru","Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","Niue","Norfolk Island","North Korea","Northern Marianas","Norway","Oman","Pakistan","Palau","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Pitcairn Islands","Poland","Portugal","Puerto Rico","Qatar","RΓ©union","Romania","Russia","Rwanda","SΓ£o TomΓ© and PrΓ­ncipe","Saint Helena","Saint Kitts and Nevis","Saint Lucia","Saint Pierre and Miquelon","Saint Vincent and the Grenadines","Samoa","San Marino","Saudi Arabia","Senegal","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Georgia and the South Sandwich Islands","South Korea","Spain","Sri Lanka","Sudan","Suriname","Svalbard and Jan Mayen","Swaziland","Sweden","Switzerland","Syria","Taiwan","Tajikistan","Tanzania","Thailand","The Bahamas","The Gambia","Togo","Tokelau","Tonga","Trinidad and Tobago","Tunisia","Turkey","Turkmenistan","Turks and Caicos Islands","Tuvalu","US Virgin Islands","Uganda","Ukraine","United Arab Emirates","United Kingdom","United States","United States Minor Outlying Islands","Uruguay","Uzbekistan","Vanuatu","Vatican City","Venezuela","Vietnam","Wallis and Futuna","Western Sahara","Yemen","Yugoslavia","Zambia","Zimbabwe"];
$('.input-typeahead').typeahead({ source: exampleTypeheadData });
// Initialize Chosen
$('.select-chosen').chosen({width: "100%"});
// Initialize Select2
$('.select-select2').select2();
// Initialize Slider for Bootstrap
$('.input-slider').slider();
// Initialize Tags Input
$('.input-tags').tagsInput({ width: 'auto', height: 'auto'});
// Initialize Timepicker
$('.input-timepicker').timepicker({minuteStep: 1,showSeconds: true,showMeridian: true});
$('.input-timepicker24').timepicker({minuteStep: 1,showSeconds: true,showMeridian: false});
// Initialize Datepicker
$('.input-datepicker, .input-daterange').datepicker({weekStart: 1}).on('changeDate', function(e){ $(this).datepicker('hide'); });
// Initialize Bootstrap Colorpicker
$('.input-colorpicker').colorpicker({format: 'hex'});
$('.input-colorpicker-rgba').colorpicker({format: 'rgba'});
// Easy Pie Chart
$('.pie-chart').easyPieChart({
barColor: $(this).data('bar-color') ? $(this).data('bar-color') : '#777777',
trackColor: $(this).data('track-color') ? $(this).data('track-color') : '#eeeeee',
lineWidth: $(this).data('line-width') ? $(this).data('line-width') : 3,
size: $(this).data('size') ? $(this).data('size') : '80',
animate: 800,
scaleColor: false
});
// Toggles 'open' class on toggle menu
$('.toggle-menu .submenu').on('click', function(){
$(this)
.parent('li')
.toggleClass('open');
});
// Initialize Placeholder (for IE9)
$('input, textarea').placeholder();
};
/* Page Loading functionality */
var pageLoading = function(){
var pageWrapper = $('#page-wrapper');
if (pageWrapper.hasClass('page-loading')) {
if (page.hasClass('enable-cookies')) {
setTimeout(function(){
pageWrapper.removeClass('page-loading');
}, 100);
} else {
pageWrapper.removeClass('page-loading');
}
}
};
/* Sidebar Navigation functionality */
var handleNav = function() {
// Get all vital links
var allLinks = $('.sidebar-nav a', sidebar);
var menuLinks = $('.sidebar-nav-menu', sidebar);
var submenuLinks = $('.sidebar-nav-submenu', sidebar);
// Add ripple effect to all navigation links
allLinks.on('click', function(e){
var link = $(this), ripple, d, x, y;
// Remove .animate class from all ripple elements
sidebar.find('.sidebar-nav-ripple').removeClass('animate');
// If the ripple element doesn't exist in this link, add it
if(link.children('.sidebar-nav-ripple').length === 0) {
link.prepend('<span class="sidebar-nav-ripple"></span>');
}
// Get the ripple element
var ripple = link.children('.sidebar-nav-ripple');
// If the ripple element doesn't have dimensions set them accordingly
if(!ripple.height() && !ripple.width()) {
d = Math.max(link.outerWidth(), link.outerHeight());
ripple.css({height: d, width: d});
}
// Get coordinates for our ripple element
x = e.pageX - link.offset().left - ripple.width()/2;
y = e.pageY - link.offset().top - ripple.height()/2;
// Position the ripple element and add the class .animate to it
ripple.css({top: y + 'px', left: x + 'px'}).addClass('animate');
});
// Primary Accordion functionality
menuLinks.on('click', function(e){
var link = $(this);
var windowW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
// If we are in mini sidebar mode
if (page.hasClass('sidebar-visible-lg-mini') && (windowW > 991)) {
if (link.hasClass('open')) {
link.removeClass('open');
}
else {
$('#sidebar .sidebar-nav-menu.open').removeClass('open');
link.addClass('open');
}
}
else if (!link.parent().hasClass('active')) {
if (link.hasClass('open')) {
link.removeClass('open');
}
else {
$('#sidebar .sidebar-nav-menu.open').removeClass('open');
link.addClass('open');
}
// Resize Page Content
setTimeout(resizePageContent, 50);
}
return false;
});
// Submenu Accordion functionality
submenuLinks.on('click', function(e){
var link = $(this);
if (link.parent().hasClass('active') !== true) {
if (link.hasClass('open')) {
link.removeClass('open');
}
else {
link.closest('ul').find('.sidebar-nav-submenu.open').removeClass('open');
link.addClass('open');
}
// Resize Page Content
setTimeout(resizePageContent, 50);
}
return false;
});
};
/* Ripple effect on click functionality */
var rippleEffect = function(element, cl){
// Add required classes to the element
element.css({
'overflow': 'hidden',
'position': 'relative'
});
// On element click
element.on('click', function(e){
var elem = $(this), ripple, d, x, y;
// If the ripple element doesn't exist in this element, add it..
if(elem.children('.' + cl).length === 0) {
elem.prepend('<span class="' + cl + '"></span>');
}
else { // ..else remove .animate class from ripple element
elem.children('.' + cl).removeClass('animate');
}
// Get the ripple element
var ripple = elem.children('.' + cl);
// If the ripple element doesn't have dimensions set them accordingly
if(!ripple.height() && !ripple.width()) {
d = Math.max(elem.outerWidth(), elem.outerHeight());
ripple.css({height: d, width: d});
}
// Get coordinates for our ripple element
x = e.pageX - elem.offset().left - ripple.width()/2;
y = e.pageY - elem.offset().top - ripple.height()/2;
// Position the ripple element and add the class .animate to it
ripple.css({top: y + 'px', left: x + 'px'}).addClass('animate');
});
};
/* Sidebars Functionality */
var handleSidebar = function(mode){
if (mode === 'init') {
// Init sidebars scrolling functionality
handleSidebar('sidebar-scroll');
handleSidebar('sidebar-alt-scroll');
// Handle main sidebar's scrolling functionality on resize or orientation change
var sScrollTimeout;
$(window).on('resize orientationchange', function(){
clearTimeout(sScrollTimeout);
sScrollTimeout = setTimeout(function(){
handleSidebar('sidebar-scroll');
}, 150);
});
} else {
var windowW = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (mode === 'toggle-sidebar') {
if ( windowW > 991) { // Toggle main sidebar in large screens (> 991px)
if (page.hasClass('sidebar-visible-lg-full')) {
page.removeClass('sidebar-visible-lg-full').addClass('sidebar-visible-lg-mini');
} else if (page.hasClass('sidebar-visible-lg-mini')) {
page.removeClass('sidebar-visible-lg-mini').addClass('sidebar-visible-lg-full');
} else {
page.addClass('sidebar-visible-lg-mini');
}
// Resize Page Content
setTimeout(resizePageContent, 50);
} else { // Toggle main sidebar in small screens (< 992px)
page.toggleClass('sidebar-visible-xs');
if (page.hasClass('sidebar-visible-xs')) {
handleSidebar('close-sidebar-alt');
}
}
// Handle main sidebar scrolling functionality
handleSidebar('sidebar-scroll');
}
else if (mode === 'open-sidebar') {
if ( windowW > 991) { // Open main sidebar in large screens (> 991px)
page.removeClass('sidebar-visible-lg-mini').addClass('sidebar-visible-lg-full');
} else { // Open main sidebar in small screens (< 992px)
page.addClass('sidebar-visible-xs');
handleSidebar('close-sidebar-alt');
}
// Handle main sidebar scrolling functionality
handleSidebar('sidebar-scroll');
// Resize Page Content
setTimeout(resizePageContent, 50);
}
else if (mode === 'close-sidebar') {
if ( windowW > 991) { // Close main sidebar in large screens (> 991px)
page.removeClass('sidebar-visible-lg-full').addClass('sidebar-visible-lg-mini');
} else { // Close main sidebar in small screens (< 992px)
page.removeClass('sidebar-visible-xs');
}
// Handle main sidebar scrolling functionality
handleSidebar('sidebar-scroll');
}
else if (mode === 'toggle-sidebar-alt') {
if ( windowW > 991) { // Toggle alternative sidebar in large screens (> 991px)
page.toggleClass('sidebar-alt-visible-lg');
} else { // Toggle alternative sidebar in small screens (< 992px)
page.toggleClass('sidebar-alt-visible-xs');
if (page.hasClass('sidebar-alt-visible-xs')) {
handleSidebar('close-sidebar');
}
}
}
else if (mode === 'open-sidebar-alt') {
if ( windowW > 991) { // Open alternative sidebar in large screens (> 991px)
page.addClass('sidebar-alt-visible-lg');
} else { // Open alternative sidebar in small screens (< 992px)
page.addClass('sidebar-alt-visible-xs');
handleSidebar('close-sidebar');
}
}
else if (mode === 'close-sidebar-alt') {
if ( windowW > 991) { // Close alternative sidebar in large screens (> 991px)
page.removeClass('sidebar-alt-visible-lg');
} else { // Close alternative sidebar in small screens (< 992px)
page.removeClass('sidebar-alt-visible-xs');
}
}
else if (mode === 'sidebar-scroll') { // Handle main sidebar scrolling
if (page.hasClass('sidebar-visible-lg-mini') && (windowW > 991)) { // Destroy main sidebar scrolling when in mini sidebar mode
if (sScroll.length && sScroll.parent('.slimScrollDiv').length) {
sScroll
.slimScroll({destroy: true});
sScroll
.attr('style', '');
}
}
else if ((header.hasClass('navbar-fixed-top') || header.hasClass('navbar-fixed-bottom'))) {
var sHeight = $(window).height() - ((sBrand.css('display') === 'none' ? 0 : sBrand.outerHeight()) + (sExtraInfo.css('display') === 'none' ? 0 : sExtraInfo.outerHeight()));
if ( windowW < 992) { sHeight = sHeight - 50; }
if (sScroll.length && (!sScroll.parent('.slimScrollDiv').length)) { // If scrolling does not exist init it..
sScroll
.slimScroll({
height: sHeight,
color: '#bbbbbb',
size: '3px',
touchScrollStep: 100,
railVisible: false,
railOpacity: 1
});
}
else { // ..else resize scrolling height
sScroll
.add(sScroll.parent())
.css('height', sHeight);
}
}
}
else if (mode === 'sidebar-alt-scroll') { // Init alternative sidebar scrolling
if (sScrollAlt.length && (!sScrollAlt.parent('.slimScrollDiv').length)) { // If scrolling does not exist init it..
sScrollAlt.slimScroll({
height: sidebarAlt.outerHeight(),
color: '#bbbbbb',
size: '3px',
touchScrollStep: 100,
railVisible: false,
railOpacity: 1
});
// Resize alternative sidebar scrolling height on window resize or orientation change
var sScrollAltTimeout;
$(window).on('resize orientationchange', function(){
clearTimeout(sScrollAltTimeout);
sScrollAltTimeout = setTimeout(function(){
handleSidebar('sidebar-alt-scroll');
}, 150);
});
}
else { // ..else resize scrolling height
sScrollAlt.add(sScrollAlt.parent()).css('height', sidebarAlt.outerHeight());
}
}
}
};
/* Resize #page-content to fill empty space if exists */
var resizePageContent = function() {
var windowH = $(window).height();
var headerH = header.outerHeight();
var sidebarH = sidebar.outerHeight();
if (header.hasClass('navbar-fixed-top') || header.hasClass('navbar-fixed-bottom')) {
pageContent.css('min-height', windowH);
} else if (sidebarH > windowH) {
pageContent.css('min-height', sidebarH - headerH);
} else {
pageContent.css('min-height', windowH - headerH);
}
};
/* Color Theme preview, preview a color theme on a page */
var colorThemePreview = function() {
var colorList = $('.sidebar-themes');
var themeLink = $('#theme-link');
var themeColor = themeLink.length ? themeLink.attr('href') : 'default';
var themeHeader = header.hasClass('navbar-inverse') ? 'navbar-inverse' : 'navbar-default';
var themeSidebar = page.hasClass('sidebar-light') ? 'sidebar-light' : '';
var cookies = page.hasClass('enable-cookies') ? true : false;
var themeColorCke, themeHeaderCke, themeSidebarCke;
// If cookies have been enabled
if (cookies) {
themeColorCke = Cookies.get('optionThemeColor') ? Cookies.get('optionThemeColor') : false;
themeHeaderCke = Cookies.get('optionThemeHeader') ? Cookies.get('optionThemeHeader') : false;
themeSidebarCke = Cookies.get('optionThemeSidebar') ? Cookies.get('optionThemeSidebar') : false;
// Update navbar class
themeHeaderCke ? header.removeClass('navbar-inverse navbar-default').addClass(themeHeaderCke) : false;
// Update sidebar class
themeSidebarCke ? page.removeClass('sidebar-light').addClass(themeSidebarCke) : false;
// Update color theme
if (themeColorCke) {
if (themeColorCke === 'default') {
if (themeLink.length) {
themeLink.remove();
themeLink = $('#theme-link');
}
} else {
if (themeLink.length) {
themeLink.attr('href', themeColorCke);
} else {
$('link[href="css/themes.css"]')
.before('<link id="theme-link" rel="stylesheet" href="' + themeColorCke + '">');
themeLink = $('#theme-link');
}
}
}
themeColor = themeColorCke ? themeColorCke : themeColor;
themeHeader = themeHeaderCke ? themeHeaderCke : themeHeader;
themeSidebar = themeSidebarCke ? themeSidebarCke : themeSidebar;
}
// Set the active color theme link as active
$('a[data-theme="' + themeColor + '"][data-theme-navbar="' + themeHeader + '"][data-theme-sidebar="' + themeSidebar + '"]', colorList)
.parent('li')
.addClass('active');
// When a color theme link is clicked
$('a', colorList).click(function(e){
themeColor = $(this).data('theme');
themeHeader = $(this).data('theme-navbar');
themeSidebar = $(this).data('theme-sidebar');
// Set this color theme link as active
$('li', colorList).removeClass('active');
$(this).parent('li').addClass('active');
// Update navbar class
header.removeClass('navbar-inverse navbar-default').addClass(themeHeader);
// Update sidebar class
page.removeClass('sidebar-light').addClass(themeSidebar);
// Update color theme
if (themeColor === 'default') {
if (themeLink.length) {
themeLink.remove();
themeLink = $('#theme-link');
}
} else {
if (themeLink.length) {
themeLink.attr('href', themeColor);
} else {
$('link[href="css/themes.css"]')
.before('<link id="theme-link" rel="stylesheet" href="' + themeColor + '">');
themeLink = $('#theme-link');
}
}
// If cookies have been enabled, save the new options
if (cookies) {
Cookies.set('optionThemeColor', themeColor, {expires: 7});
Cookies.set('optionThemeHeader', themeHeader, {expires: 7});
Cookies.set('optionThemeSidebar', themeSidebar, {expires: 7});
}
});
};
/* Datatables basic Bootstrap integration (pagination integration included under the Datatables plugin in plugins.js) */
var dtIntegration = function() {
$.extend(true, $.fn.dataTable.defaults, {
"sDom": "<'row'<'col-sm-6 col-xs-5'l><'col-sm-6 col-xs-7'f>r>t<'row'<'col-sm-5 hidden-xs'i><'col-sm-7 col-xs-12 clearfix'p>>",
"sPaginationType": "bootstrap",
"oLanguage": {
"sLengthMenu": "_MENU_",
"sSearch": "<div class=\"input-group\">_INPUT_<span class=\"input-group-addon\"><i class=\"fa fa-search\"></i></span></div>",
"sInfo": "<strong>_START_</strong>-<strong>_END_</strong> of <strong>_TOTAL_</strong>",
"oPaginate": {
"sPrevious": "",
"sNext": ""
}
}
});
$.extend($.fn.dataTableExt.oStdClasses, {
"sWrapper": "dataTables_wrapper form-inline",
"sFilterInput": "form-control",
"sLengthSelect": "form-control"
});
};
/* Print functionality - Hides all sidebars, prints the page and then restores them (To fix an issue with CSS print styles in webkit browsers) */
var handlePrint = function() {
// Store all #page-container classes
var pageCls = page.prop('class');
// Remove all classes from #page-container
page.prop('class', '');
// Print the page
window.print();
// Restore all #page-container classes
page.prop('class', pageCls);
};
return {
init: function() {
uiInit(); // Initialize UI
pageLoading(); // Initialize Page Loading
},
sidebar: function(mode, extra) {
handleSidebar(mode, extra); // Handle sidebars - access functionality from everywhere
},
datatables: function() {
dtIntegration(); // Datatables Bootstrap integration
},
pagePrint: function() {
handlePrint(); // Print functionality
}
};
}();
/* Initialize App when page loads */
$(function(){ App.init(); });