Files
portal/resources/assets/js/pages.js
T
2021-06-17 20:12:08 +08:00

2036 lines
71 KiB
JavaScript
Vendored
Raw Blame History

This file contains ambiguous Unicode characters
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.
(function($) {
'use strict';
/**
* Pages.
* @constructor
* @property {string} pageScrollElement - Scroll Element in Page.
* @property {object} $body - Cache Body.
*/
var Pages = function() {
this.pageScrollElement = 'html, body';
this.$body = $('body');
this.setUserOS();
this.setUserAgent();
};
/** @function setUserOS
* @description SET User Operating System eg: mac,windows,etc
* @returns {string} - Appends OSName to Pages.$body
*/
Pages.prototype.setUserOS = function() {
var OSName = "";
if (navigator.appVersion.indexOf("Win") != -1) OSName = "windows";
if (navigator.appVersion.indexOf("Mac") != -1) OSName = "mac";
if (navigator.appVersion.indexOf("X11") != -1) OSName = "unix";
if (navigator.appVersion.indexOf("Linux") != -1) OSName = "linux";
this.$body.addClass(OSName);
};
/** @function setUserAgent
* @description SET User Device Name to mobile | desktop
* @returns {string} - Appends Device to Pages.$body
*/
Pages.prototype.setUserAgent = function() {
if (navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i)) {
this.$body.addClass('mobile');
} else {
this.$body.addClass('desktop');
if (navigator.userAgent.match(/MSIE 9.0/)) {
this.$body.addClass('ie9');
}
}
};
/** @function isVisibleXs
* @description Checks if the screen size is XS - Extra Small i.e below W480px
* @returns {$Element} - Appends $('#pg-visible-xs') to Body
*/
Pages.prototype.isVisibleXs = function() {
(!$('#pg-visible-xs').length) && this.$body.append('<div id="pg-visible-xs" class="visible-xs" />');
return $('#pg-visible-xs').is(':visible');
};
/** @function isVisibleSm
* @description Checks if the screen size is SM - Small Screen i.e Above W480px
* @returns {$Element} - Appends $('#pg-visible-sm') to Body
*/
Pages.prototype.isVisibleSm = function() {
(!$('#pg-visible-sm').length) && this.$body.append('<div id="pg-visible-sm" class="visible-sm" />');
return $('#pg-visible-sm').is(':visible');
};
/** @function isVisibleMd
* @description Checks if the screen size is MD - Medium Screen i.e Above W1024px
* @returns {$Element} - Appends $('#pg-visible-md') to Body
*/
Pages.prototype.isVisibleMd = function() {
(!$('#pg-visible-md').length) && this.$body.append('<div id="pg-visible-md" class="visible-md" />');
return $('#pg-visible-md').is(':visible');
};
/** @function isVisibleLg
* @description Checks if the screen size is LG - Large Screen i.e Above W1200px
* @returns {$Element} - Appends $('#pg-visible-lg') to Body
*/
Pages.prototype.isVisibleLg = function() {
(!$('#pg-visible-lg').length) && this.$body.append('<div id="pg-visible-lg" class="visible-lg" />');
return $('#pg-visible-lg').is(':visible');
};
/** @function getUserAgent
* @description Get Current User Agent.
* @returns {string} - mobile | desktop
*/
Pages.prototype.getUserAgent = function() {
return $('body').hasClass('mobile') ? "mobile" : "desktop";
};
/** @function setFullScreen
* @description Make Browser fullscreen.
*/
Pages.prototype.setFullScreen = function(element) {
// Supports most browsers and their versions.
var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullscreen;
if (requestMethod) { // Native full screen.
requestMethod.call(element);
} else if (typeof window.ActiveXObject !== "undefined") { // Older IE.
var wscript = new ActiveXObject("WScript.Shell");
if (wscript !== null) {
wscript.SendKeys("{F11}");
}
}
};
/** @function getColor
* @description Get Color from CSS
* @param {string} color - pages color class eg: primary,master,master-light etc.
* @param {int} opacity
* @returns {rgba}
*/
Pages.prototype.getColor = function(color, opacity) {
opacity = parseFloat(opacity) || 1;
var elem = $('.pg-colors').length ? $('.pg-colors') : $('<div class="pg-colors"></div>').appendTo('body');
var colorElem = elem.find('[data-color="' + color + '"]').length ? elem.find('[data-color="' + color + '"]') : $('<div class="bg-' + color + '" data-color="' + color + '"></div>').appendTo(elem);
var color = colorElem.css('background-color');
var rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
var rgba = "rgba(" + rgb[1] + ", " + rgb[2] + ", " + rgb[3] + ', ' + opacity + ')';
return rgba;
};
/** @function initSidebar
* @description Initialize side bar to open and close
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires ui/sidebar.js
*/
Pages.prototype.initSidebar = function(context) {
$('[data-pages="sidebar"]', context).each(function() {
var $sidebar = $(this);
$sidebar.sidebar($sidebar.data())
})
};
/** @function initDropDown
* @description Initialize Boot-Strap dropdown Menue
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires bootstrap.js
*/
Pages.prototype.initDropDown = function(context) {
// adjust width of each dropdown to match content width
$('.dropdown-default', context).each(function() {
var btn = $(this).find('.dropdown-menu').siblings('.dropdown-toggle');
var offset = 0;
var menuWidth = $(this).find('.dropdown-menu').actual('outerWidth');
if (btn.actual('outerWidth') < menuWidth) {
btn.width(menuWidth - offset);
$(this).find('.dropdown-menu').width(btn.actual('outerWidth'));
} else {
$(this).find('.dropdown-menu').width(btn.actual('outerWidth'));
}
});
};
/** @function initFormGroupDefault
* @description Initialize Pages form group input
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
*/
Pages.prototype.initFormGroupDefault = function(context) {
$('.form-group.form-group-default', context).click(function() {
$(this).find('input').focus();
});
if (!this.initFormGroupDefaultRun) {
$('body').on('focus', '.form-group.form-group-default :input', function() {
$('.form-group.form-group-default').removeClass('focused');
$(this).parents('.form-group').addClass('focused');
});
$('body').on('blur', '.form-group.form-group-default :input', function() {
$(this).parents('.form-group').removeClass('focused');
if ($(this).val()) {
$(this).closest('.form-group').find('label').addClass('fade');
} else {
$(this).closest('.form-group').find('label').removeClass('fade');
}
});
// Only run the above code once.
this.initFormGroupDefaultRun = true;
}
$('.form-group.form-group-default .checkbox, .form-group.form-group-default .radio', context).hover(function() {
$(this).parents('.form-group').addClass('focused');
}, function() {
$(this).parents('.form-group').removeClass('focused');
});
};
/** @function initSlidingTabs
* @description Initialize Bootstrap Custom Sliding Tabs
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires bootstrap.js
*/
Pages.prototype.initSlidingTabs = function(context) {
$('a[data-toggle="tab"]', context).on('show.bs.tab', function(e) {
e = $(e.target).parent().find('a[data-toggle=tab]');
var hrefCurrent = e.data('target');
if(hrefCurrent === undefined){
hrefCurrent = e.attr('href');
}
if (!$(hrefCurrent).is('.slide-left, .slide-right')) return;
$(hrefCurrent).addClass('sliding');
setTimeout(function() {
$(hrefCurrent).removeClass('sliding');
}, 100);
});
};
/** @function reponsiveTabs
* @description Responsive handlers for Bootstrap Tabs
*/
Pages.prototype.reponsiveTabs = function() {
//Dropdown FX
$('[data-init-reponsive-tabs="dropdownfx"]').each(function() {
var drop = $(this);
drop.addClass("hidden-sm-down");
var content = '<select class="cs-select cs-skin-slide full-width" data-init-plugin="cs-select">';
for(var i = 1; i <= drop.children("li").length; i++){
var li = drop.children("li:nth-child("+i+")");
var selected ="";
if(li.children('a').hasClass("active")){
selected="selected";
}
var tabRef = li.children('a').attr('href');
if(tabRef == "#" || ""){
tabRef = li.children('a').attr('data-target')
}
content +='<option value="'+ tabRef+'" '+selected+'>';
content += li.children('a').text();
content += '</option>';
}
content +='</select>';
drop.after(content);
var select = drop.next()[0];
$(select).on('change', function (e) {
var optionSelected = $("option:selected", this);
var valueSelected = this.value;
var tabLink = drop.find('a[data-target="'+valueSelected+'"]');
if(tabLink.length == 0){
tabLink = drop.find('a[data-target="'+valueSelected+'"]')
}
tabLink.tab('show')
});
$(select).wrap('<div class="nav-tab-dropdown cs-wrapper full-width d-md-none d-lg-none"></div>');
new SelectFx(select);
});
};
/** @function initNotificationCenter
* @description Initialize Pages Header Notifcation Dropdown
*/
Pages.prototype.initNotificationCenter = function() {
$('body').on('click', '.notification-list .dropdown-menu', function(event) {
event.stopPropagation();
});
$('body').on('click', '.toggle-more-details', function(event) {
var p = $(this).closest('.heading');
p.closest('.heading').children('.more-details').stop().slideToggle('fast', function() {
p.toggleClass('open');
});
});
};
/** @function initProgressBars
* @description Initialize Pages ProgressBars
*/
Pages.prototype.initProgressBars = function() {
$(window).on('load', function() {
// Hack: FF doesn't play SVG animations set as background-image
$('.progress-bar-indeterminate, .progress-circle-indeterminate, .mapplic-pin').hide().show(0);
});
};
/** @function initInputFile
* @description Initialize File Input for Bootstrap Buttons and Input groups
*/
Pages.prototype.initInputFile = function() {
$(document).on('change', '.btn-file :file', function() {
var input = $(this),
numFiles = input.get(0).files ? input.get(0).files.length : 1,
label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
input.trigger('fileselect', [numFiles, label]);
});
$('.btn-file :file').on('fileselect', function(event, numFiles, label) {
var input = $(this).parents('.input-group').find(':text'),
log = numFiles > 1 ? numFiles + ' files selected' : label;
if( input.length ) {
input.val(log);
} else {
$(this).parent().html(log);
}
});
};
/** @function initHorizontalMenu
* @description Initialize Horizontal Dropdown Menu
*/
Pages.prototype.initHorizontalMenu = function(){
var animationTimer;
var hMenu = $("[data-pages-init='horizontal-menu']");
autoHideLi();
$(document).on('click', '.menu-bar > ul > li', function(){
if($(this).children("ul").length == 0){
return;
}
if($(window).width() < 992) {
var menubar = $('.menu-bar');
var el = $(this);
var li = menubar.find('li');
var sub = $(this).children('ul');
if(el.hasClass("open active")){
el.find('.arrow').removeClass("open active");
sub.slideUp(200, function() {
el.removeClass("open active");
});
}else{
menubar.find('li.open').find('ul').slideUp(200);
menubar.find('li.open').find('a').find('.arrow').removeClass('open active');
menubar.find('li.open').removeClass("open active");
el.find('.arrow').addClass("open active");
sub.slideDown(200, function() {
el.addClass("open active");
});
}
} else {
if($(this).hasClass('opening')){
_hideMenu($(this));
}
else{
_showMenu($(this));
}
}
});
var resizeTimer;
$(window).on('resize', function(e) {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
autoHideLi();
}, 250);
});
$('.content').on('click', function () {
$('.horizontal-menu .bar-inner > ul > li').removeClass('open');
$('.menu-bar > ul > li').removeClass('open opening').children("ul").removeAttr("style");
$("body").find(".ghost-nav-dropdown").remove();
});
$('[data-toggle="horizontal-menu"]').on('click touchstart', function(e) {
e.preventDefault();
$('body').toggleClass('horizontal-menu-open');
if(!$('.horizontal-menu-backdrop').length){
$('.header').append('<div class="horizontal-menu-backdrop"/>');
$('.horizontal-menu-backdrop').fadeToggle('fast');
} else {
$('.horizontal-menu-backdrop').fadeToggle('fast', function(){
$(this).remove();
});
}
$('.menu-bar').toggleClass('open');
});
function autoHideLi(){
var hMenu = $("[data-pages-init='horizontal-menu']");
var extraLiHide = parseInt(hMenu.data("hideExtraLi")) || 0;
if(hMenu.length == 0){
return
}
var hMenuRect = hMenu[0].getBoundingClientRect();
var liTotalWidth = 0;
var liCount = 0;
hMenu.children('ul').children('li.more').remove();
hMenu.children('ul').children('li').each(function( index ) {
$(this).removeAttr("style");
liTotalWidth = liTotalWidth + $(this).outerWidth(true);
liCount++;
});
if($(window).width() < 992) {
return;
}
var possibleLi = parseInt(hMenuRect.width / (liTotalWidth / liCount)) - 1;
possibleLi = possibleLi - extraLiHide;
if(liCount > possibleLi){
var wrapper = createWrapperLI(hMenu);
for(var i = possibleLi; i < liCount; i++){
var currentLi = hMenu.children('ul').children('li').eq(i);
var clone = currentLi.clone();
clone.children("ul").addClass("sub-menu");
wrapper.children("ul").append(clone);
currentLi.hide();
}
}
}
function createWrapperLI(hMenu){
var li =hMenu.children('ul').append("<li class='more'><a href='javascript:;'><span class='title'><i class='fa fa-ellipsis-h'></i></span></a><ul></ul></li>");
li = hMenu.children('ul').children('li.more');
return li;
}
function _hideMenu($el){
var ul = $($el.children("ul")[0]);
var ghost = $("<div class='ghost-nav-dropdown'></div>");
if(ul.length == 0){
return;
}
var rect = ul[0].getBoundingClientRect();
ghost.css({
"width":rect.width+"px",
"height":rect.height+"px",
"z-index":"auto"
});
$el.append(ghost);
var timingSpeed = ul.children("li").css('transition-duration');
timingSpeed = parseInt(parseFloat(timingSpeed) * 1000);
$el.addClass('closing');
window.clearTimeout(animationTimer);
animationTimer = window.setTimeout(function(){
ghost.height(0);
$el.removeClass('open opening closing');
},timingSpeed - 80);
}
function _showMenu($el){
var ul = $($el.children("ul")[0]);
var ghost = $("<div class='ghost-nav-dropdown'></div>");
$el.children(".ghost-nav-dropdown").remove();
$el.addClass('open').siblings().removeClass('open opening');
if(ul.length == 0){
return;
}
var rect = ul[0].getBoundingClientRect();
ghost.css({
"width":rect.width+"px",
"height":"0px"
});
$el.append(ghost);
ghost.height(rect.height);
var timingSpeed = ghost.css('transition-duration');
timingSpeed = parseInt(parseFloat(timingSpeed) * 1000);
window.clearTimeout(animationTimer);
animationTimer = window.setTimeout(function(){
$el.addClass('opening');
ghost.remove()
},timingSpeed);
}
};
/** @function initTooltipPlugin
* @description Initialize Bootstrap tooltip
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires bootstrap.js
*/
Pages.prototype.initTooltipPlugin = function(context) {
$.fn.tooltip && $('[data-toggle="tooltip"]', context).tooltip();
};
/** @function initSelect2Plugin
* @description Initialize select2 dropdown
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires select2.js version 4.0.x
*/
Pages.prototype.initSelect2Plugin = function(context) {
$.fn.select2 && $('[data-init-plugin="select2"]', context).each(function() {
$(this).select2({
minimumResultsForSearch: ($(this).attr('data-disable-search') == 'true' ? -1 : 1)
}).on('select2:open', function() {
$.fn.scrollbar && $('.select2-results__options').scrollbar({
ignoreMobile: false
})
});
});
};
/** @function initScrollBarPlugin
* @description Initialize Global Scroller
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @requires jquery-scrollbar.js
*/
Pages.prototype.initScrollBarPlugin = function(context) {
$.fn.scrollbar && $('.scrollable', context).scrollbar({
ignoreOverlay: false
});
};
/** @function initListView
* @description Initialize iOS like List view plugin
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @example <caption>data-init-list-view="ioslist"</caption>
* @requires jquery-ioslist.js
*/
Pages.prototype.initListView = function(context) {
$.fn.ioslist && $('[data-init-list-view="ioslist"]', context).ioslist();
$.fn.scrollbar && $('.list-view-wrapper', context).scrollbar({
ignoreOverlay: false
});
};
/** @function initSwitcheryPlugin
* @description Initialize iOS like List view plugin
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @example <caption>data-init-plugin="switchery"</caption>
* @requires Switchery.js
*/
Pages.prototype.initSwitcheryPlugin = function(context) {
// Switchery - ios7 switch
window.Switchery && $('[data-init-plugin="switchery"]', context).each(function() {
var el = $(this);
new Switchery(el.get(0), {
color: (el.data("color") != null ? $.Pages.getColor(el.data("color")) : $.Pages.getColor('success')),
size : (el.data("size") != null ? el.data("size") : "default")
});
});
};
/** @function initSelectFxPlugin
* @description Initialize iOS like List view plugin
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
* @example <caption>select[data-init-plugin="cs-select"]</caption>
*/
Pages.prototype.initSelectFxPlugin = function(context) {
window.SelectFx && $('select[data-init-plugin="cs-select"]', context).each(function() {
var el = $(this).get(0);
$(el).wrap('<div class="cs-wrapper"></div>');
new SelectFx(el);
});
};
/** @function initUnveilPlugin
* @description To load retina images to img tag
* @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context.
*/
Pages.prototype.initUnveilPlugin = function(context) {
// lazy load retina images
$.fn.unveil && $("img", context).unveil();
};
/** @function initValidatorPlugin
* @description Inintialize and Overide exsisting jquery-validate methods.
* @requires jquery-validate.js
*/
Pages.prototype.initValidatorPlugin = function() {
/**
* Open the socket.
* @override
*/
$.validator && $.validator.setDefaults({
ignore: "", // validate hidden fields, required for cs-select
showErrors: function(errorMap, errorList) {
var $this = this;
$.each(this.successList, function(index, value) {
var parent = $(this).closest('.form-group-attached');
if (parent.length) return $(value).popover("hide");
});
return $.each(errorList, function(index, value) {
var parent = $(value.element).closest('.form-group-attached');
if (!parent.length) {
return $this.defaultShowErrors();
}
var _popover;
_popover = $(value.element).popover({
trigger: "manual",
placement: "top",
html: true,
container: parent.closest('form'),
content: value.message
});
var parent = $(value.element).closest('.form-group');
parent.addClass('has-error');
$(value.element).popover("show");
});
},
onfocusout: function(element) {
var parent = $(element).closest('.form-group');
if ($(element).valid()) {
parent.removeClass('has-error');
parent.next('.error').remove();
}
},
onkeyup: function(element) {
var parent = $(element).closest('.form-group');
if ($(element).valid()) {
$(element).removeClass('error');
parent.removeClass('has-error');
parent.next('label.error').remove();
parent.find('label.error').remove();
} else {
parent.addClass('has-error');
}
},
errorPlacement: function(error, element) {
var parent = $(element).closest('.form-group');
if (parent.hasClass('form-group-default')) {
parent.addClass('has-error');
error.insertAfter(parent);
} else {
error.insertAfter(element);
}
}
});
};
/** @function setBackgroundImage
* @description load images to div using data API
*/
Pages.prototype.setBackgroundImage = function() {
$('[data-pages-bg-image]').each(function() {
var _elem = $(this);
var defaults = {
pagesBgImage: "",
lazyLoad: 'true',
progressType: '',
progressColor:'',
bgOverlay:'',
bgOverlayClass:'',
overlayOpacity:0,
};
var data = _elem.data();
$.extend( defaults, data );
var url = defaults.pagesBgImage;
var color = defaults.bgOverlay;
var opacity = defaults.overlayOpacity;
var overlay = $('<div class="bg-overlay"></div>');
overlay.addClass(defaults.bgOverlayClass);
overlay.css({
'background-color': color,
'opacity': 1
});
_elem.append(overlay);
var img = new Image();
img.src = url;
img.onload = function(){
_elem.css({
'background-image': 'url(' + url + ')'
});
_elem.children('.bg-overlay').css({'opacity': opacity});
}
})
};
/** @function secondarySidebar
* @description dropdown Toggle and responive toggle for secondary sidebar
*/
Pages.prototype.secondarySidebar =function(){
$('[data-init="secondary-sidebar"]').each(function() {
$(this).on('click', '.main-menu li a', function(e) {
if ($(this).parent().children('.sub-menu') === false) {
return;
}
var el = $(this);
var parent = $(this).parent().parent();
var li = $(this).parent();
var sub = $(this).parent().children('.sub-menu');
if(li.hasClass("open active")){
el.children('.arrow').removeClass("open active");
sub.slideUp(200, function() {
li.removeClass("open active");
});
}else{
parent.children('li.open').children('.sub-menu').slideUp(200);
parent.children('li.open').children('a').children('.arrow').removeClass('open active');
parent.children('li.open').removeClass("open active");
el.children('.arrow').addClass("open active");
sub.slideDown(200, function() {
li.addClass("open active");
});
}
//e.preventDefault();
});
});
$('[data-init="secondary-sidebar-toggle"]').each(function() {
$(this).on("click", function(e) {
var toggleRect = $(this).get(0).getBoundingClientRect();
var menu = $('[data-init="secondary-sidebar"]');
if(menu.hasClass("open")){
menu.removeClass("open");
menu.removeAttr("style");
}
else{
menu.addClass("open");
var menuRect = menu.get(0).getBoundingClientRect();
menu.css({
top : toggleRect.bottom,
'max-height': ($(window).height() - toggleRect.bottom),
left: $(window).width() / 2 - menuRect.width/ 2,
'visibility': 'visible'
});
}
})
});
};
/** @function init
* @description Inintialize all core components.
*/
Pages.prototype.init = function() {
// init layout
this.initSidebar();
this.setBackgroundImage();
this.initDropDown();
this.initFormGroupDefault();
this.initSlidingTabs();
this.initNotificationCenter();
this.initProgressBars();
this.initHorizontalMenu();
// init plugins
this.initTooltipPlugin();
this.initSelect2Plugin();
this.initScrollBarPlugin();
this.initSwitcheryPlugin();
this.initSelectFxPlugin();
this.initUnveilPlugin();
this.initValidatorPlugin();
this.initListView();
this.initInputFile();
this.reponsiveTabs();
this.secondarySidebar();
};
$.Pages = new Pages();
$.Pages.Constructor = Pages;
})(window.jQuery);
(function(window) {
'use strict';
/**
* based on from https://github.com/inuyaksa/jquery.nicescroll/blob/master/jquery.nicescroll.js
*/
function hasParent(e, p) {
if (!e) return false;
var el = e.target || e.srcElement || e || false;
while (el && el != p) {
el = el.parentNode || false;
}
return (el !== false);
}
/**
* extend obj function
*/
function extend(a, b) {
for (var key in b) {
if (b.hasOwnProperty(key)) {
a[key] = b[key];
}
}
return a;
}
/**
* SelectFx function
*/
function SelectFx(el, options) {
this.el = el;
this.options = extend({}, this.options);
extend(this.options, options);
this._init();
}
/**
* Pure-JS alternative to jQuery closest()
*/
function closest(elem, selector) {
var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;
while (elem) {
if (matchesSelector.bind(elem)(selector)) {
return elem;
} else {
elem = elem.parentElement;
}
}
return false;
}
/**
* jQuery offset() in pure JS
*/
function offset(el) {
return {
left: el.getBoundingClientRect().left + window.pageXOffset - el.ownerDocument.documentElement.clientLeft,
top: el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop
}
}
/**
* jQuery after() in pure JS
*/
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
/**
* SelectFx options
*/
SelectFx.prototype.options = {
// if true all the links will open in a new tab.
// if we want to be redirected when we click an option, we need to define a data-link attr on the option of the native select element
newTab: true,
// when opening the select element, the default placeholder (if any) is shown
stickyPlaceholder: true,
// default container is body
container: 'body',
// callback when changing the value
onChange: function(el) {
var event = document.createEvent('HTMLEvents');
event.initEvent('change', true, false);
el.dispatchEvent(event);
}
};
/**
* init function
* initialize and cache some vars
*/
SelectFx.prototype._init = function() {
// check if we are using a placeholder for the native select box
// we assume the placeholder is disabled and selected by default
var selectedOpt = document.querySelector('option[selected]');
this.hasDefaultPlaceholder = selectedOpt && selectedOpt.disabled;
// get selected option (either the first option with attr selected or just the first option)
this.selectedOpt = selectedOpt || this.el.querySelector('option');
// create structure
this._createSelectEl();
// all options
this.selOpts = [].slice.call(this.selEl.querySelectorAll('li[data-option]'));
// total options
this.selOptsCount = this.selOpts.length;
// current index
this.current = this.selOpts.indexOf(this.selEl.querySelector('li.cs-selected')) || -1;
// placeholder elem
this.selPlaceholder = this.selEl.querySelector('span.cs-placeholder');
// init events
this._initEvents();
this.el.onchange = function() {
var index = this.selectedIndex;
var inputText = this.children[index].innerHTML.trim();
}
};
/**
* creates the structure for the select element
*/
SelectFx.prototype._createSelectEl = function() {
var self = this,
options = '',
createOptionHTML = function(el) {
var optclass = '',
classes = '',
link = '';
if (el.selectedOpt && !this.foundSelected && !this.hasDefaultPlaceholder) {
classes += 'cs-selected ';
this.foundSelected = true;
}
// extra classes
if (el.getAttribute('data-class')) {
classes += el.getAttribute('data-class');
}
// link options
if (el.getAttribute('data-link')) {
link = 'data-link=' + el.getAttribute('data-link');
}
if (classes !== '') {
optclass = 'class="' + classes + '" ';
}
return '<li ' + optclass + link + ' data-option data-value="' + el.value + '"><span>' + el.textContent + '</span></li>';
};
[].slice.call(this.el.children).forEach(function(el) {
if (el.disabled) {
return;
}
var tag = el.tagName.toLowerCase();
if (tag === 'option') {
options += createOptionHTML(el);
} else if (tag === 'optgroup') {
options += '<li class="cs-optgroup"><span>' + el.label + '</span><ul>';
[].slice.call(el.children).forEach(function(opt) {
options += createOptionHTML(opt);
});
options += '</ul></li>';
}
});
var opts_el = '<div class="cs-options"><ul>' + options + '</ul></div>';
this.selEl = document.createElement('div');
this.selEl.className = this.el.className;
this.selEl.tabIndex = this.el.tabIndex;
this.selEl.innerHTML = '<span class="cs-placeholder">' + this.selectedOpt.textContent + '</span>' + opts_el;
this.el.parentNode.appendChild(this.selEl);
this.selEl.appendChild(this.el);
// backdrop to support dynamic heights of the dropdown
var backdrop = document.createElement('div');
backdrop.className = 'cs-backdrop';
this.selEl.appendChild(backdrop);
};
/**
* initialize the events
*/
SelectFx.prototype._initEvents = function() {
var self = this;
// open/close select
this.selPlaceholder.addEventListener('click', function() {
self._toggleSelect();
});
// clicking the options
this.selOpts.forEach(function(opt, idx) {
opt.addEventListener('click', function() {
self.current = idx;
self._changeOption();
// close select elem
self._toggleSelect();
});
});
// close the select element if the target it´s not the select element or one of its descendants..
document.addEventListener('click', function(ev) {
var target = ev.target;
if (self._isOpen() && target !== self.selEl && !hasParent(target, self.selEl)) {
self._toggleSelect();
}
});
// keyboard navigation events
this.selEl.addEventListener('keydown', function(ev) {
var keyCode = ev.keyCode || ev.which;
switch (keyCode) {
// up key
case 38:
ev.preventDefault();
self._navigateOpts('prev');
break;
// down key
case 40:
ev.preventDefault();
self._navigateOpts('next');
break;
// space key
case 32:
ev.preventDefault();
if (self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1) {
self._changeOption();
}
self._toggleSelect();
break;
// enter key
case 13:
ev.preventDefault();
if (self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1) {
self._changeOption();
self._toggleSelect();
}
break;
// esc key
case 27:
ev.preventDefault();
if (self._isOpen()) {
self._toggleSelect();
}
break;
}
});
};
/**
* navigate with up/dpwn keys
*/
SelectFx.prototype._navigateOpts = function(dir) {
if (!this._isOpen()) {
this._toggleSelect();
}
var tmpcurrent = typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1 ? this.preSelCurrent : this.current;
if (dir === 'prev' && tmpcurrent > 0 || dir === 'next' && tmpcurrent < this.selOptsCount - 1) {
// save pre selected current - if we click on option, or press enter, or press space this is going to be the index of the current option
this.preSelCurrent = dir === 'next' ? tmpcurrent + 1 : tmpcurrent - 1;
// remove focus class if any..
this._removeFocus();
// add class focus - track which option we are navigating
classie.add(this.selOpts[this.preSelCurrent], 'cs-focus');
}
};
/**
* open/close select
* when opened show the default placeholder if any
*/
SelectFx.prototype._toggleSelect = function() {
var backdrop = this.selEl.querySelector('.cs-backdrop');
var container = document.querySelector(this.options.container);
var mask = container.querySelector('.dropdown-mask');
var csOptions = this.selEl.querySelector('.cs-options');
var csPlaceholder = this.selEl.querySelector('.cs-placeholder');
var csPlaceholderWidth = csPlaceholder.offsetWidth;
var csPlaceholderHeight = csPlaceholder.offsetHeight;
var csOptionsWidth = csOptions.scrollWidth;
if (this._isOpen()) {
if (this.current !== -1) {
// update placeholder text
this.selPlaceholder.textContent = this.selOpts[this.current].textContent;
}
var dummy = this.selEl.data;
var parent = dummy.parentNode;
//parent.appendChild(this.selEl);
insertAfter(this.selEl, dummy);
this.selEl.removeAttribute('style');
parent.removeChild(dummy);
// Hack for FF
// http://stackoverflow.com/questions/12088819/css-transitions-on-new-elements
var x = this.selEl.clientHeight;
// reset backdrop
backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(1,1,1)';
classie.remove(this.selEl, 'cs-active');
mask.style.display = 'none';
csOptions.style.overflowY = 'hidden';
csOptions.style.width = 'auto';
var parentFormGroup = closest(this.selEl, '.form-group');
parentFormGroup && classie.removeClass(parentFormGroup, 'focused');
} else {
if (this.hasDefaultPlaceholder && this.options.stickyPlaceholder) {
// everytime we open we wanna see the default placeholder text
this.selPlaceholder.textContent = this.selectedOpt.textContent;
}
var dummy;
if (this.selEl.parentNode.querySelector('.dropdown-placeholder')) {
dummy = this.selEl.parentNode.querySelector('.dropdown-placeholder');
} else {
dummy = document.createElement('div');
classie.add(dummy, 'dropdown-placeholder');
//this.selEl.parentNode.appendChild(dummy);
insertAfter(dummy, this.selEl);
}
dummy.style.height = csPlaceholderHeight + 'px';
dummy.style.width = this.selEl.offsetWidth + 'px';
this.selEl.data = dummy;
this.selEl.style.position = 'absolute';
var offsetselEl = offset(this.selEl);
this.selEl.style.left = offsetselEl.left + 'px';
this.selEl.style.top = offsetselEl.top + 'px';
container.appendChild(this.selEl);
// decide backdrop's scale factor depending on the content height
var contentHeight = csOptions.offsetHeight;
var originalHeight = csPlaceholder.offsetHeight;
var contentWidth = csOptions.offsetWidth;
var originalWidth = csPlaceholder.offsetWidth;
var scaleV = contentHeight / originalHeight;
var scaleH = (contentWidth > originalWidth) ? contentWidth / originalWidth : 1.05;
//backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(' + scaleH + ', ' + scaleV + ', 1)';
backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(' + 1 + ', ' + scaleV + ', 1)';
if (!mask) {
mask = document.createElement('div');
classie.add(mask, 'dropdown-mask');
container.appendChild(mask);
}
mask.style.display = 'block';
classie.add(this.selEl, 'cs-active');
var resizedWidth = (csPlaceholderWidth < csOptionsWidth) ? csOptionsWidth : csPlaceholderWidth;
this.selEl.style.width = resizedWidth + 'px';
this.selEl.style.height = originalHeight + 'px';
csOptions.style.width = '100%';
setTimeout(function() {
csOptions.style.overflowY = 'auto';
}, 300);
}
};
/**
* change option - the new value is set
*/
SelectFx.prototype._changeOption = function() {
// if pre selected current (if we navigate with the keyboard)...
if (typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1) {
this.current = this.preSelCurrent;
this.preSelCurrent = -1;
}
// current option
var opt = this.selOpts[this.current];
// update current selected value
this.selPlaceholder.textContent = opt.textContent;
// change native select element´s value
this.el.value = opt.getAttribute('data-value');
// remove class cs-selected from old selected option and add it to current selected option
var oldOpt = this.selEl.querySelector('li.cs-selected');
if (oldOpt) {
classie.remove(oldOpt, 'cs-selected');
}
classie.add(opt, 'cs-selected');
// if there´s a link defined
if (opt.getAttribute('data-link')) {
// open in new tab?
if (this.options.newTab) {
window.open(opt.getAttribute('data-link'), '_blank');
} else {
window.location = opt.getAttribute('data-link');
}
}
// callback
this.options.onChange(this.el);
};
/**
* returns true if select element is opened
*/
SelectFx.prototype._isOpen = function(opt) {
return classie.has(this.selEl, 'cs-active');
};
/**
* removes the focus class from the option
*/
SelectFx.prototype._removeFocus = function(opt) {
var focusEl = this.selEl.querySelector('li.cs-focus');
if (focusEl) {
classie.remove(focusEl, 'cs-focus');
}
};
/**
* add to global namespace
*/
window.SelectFx = SelectFx;
})(window);
/* ============================================================
* Pages Circular Progress
* ============================================================ */
(function($) {
'use strict';
// CIRCULAR PROGRESS CLASS DEFINITION
// ======================
var Progress = function(element, options) {
this.$element = $(element);
this.options = $.extend(true, {}, $.fn.circularProgress.defaults, options);
// start adding to to DOM
this.$container = $('<div class="progress-circle"></div>');
this.$element.attr('data-color') && this.$container.addClass('progress-circle-' + this.$element.attr('data-color'));
this.$element.attr('data-thick') && this.$container.addClass('progress-circle-thick');
this.$pie = $('<div class="pie"></div>');
this.$pie.$left = $('<div class="left-side half-circle"></div>');
this.$pie.$right = $('<div class="right-side half-circle"></div>');
this.$pie.append(this.$pie.$left).append(this.$pie.$right);
this.$container.append(this.$pie).append('<div class="shadow"></div>');
this.$element.after(this.$container);
// end DOM adding
this.val = this.$element.val();
var deg = perc2deg(this.val);
if (this.val <= 50) {
this.$pie.$right.css('transform', 'rotate(' + deg + 'deg)');
} else {
this.$pie.css('clip', 'rect(auto, auto, auto, auto)');
this.$pie.$right.css('transform', 'rotate(180deg)');
this.$pie.$left.css('transform', 'rotate(' + deg + 'deg)');
}
};
Progress.VERSION = "1.0.0";
Progress.prototype.value = function(val) {
if (typeof val == 'undefined') return;
var deg = perc2deg(val);
this.$pie.removeAttr('style');
this.$pie.$right.removeAttr('style');
this.$pie.$left.removeAttr('style');
if (val <= 50) {
this.$pie.$right.css('transform', 'rotate(' + deg + 'deg)');
} else {
this.$pie.css('clip', 'rect(auto, auto, auto, auto)');
this.$pie.$right.css('transform', 'rotate(180deg)');
this.$pie.$left.css('transform', 'rotate(' + deg + 'deg)');
}
};
// CIRCULAR PROGRESS PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.filter(':input').each(function() {
var $this = $(this);
var data = $this.data('pg.circularProgress');
var options = typeof option == 'object' && option;
if (!data) $this.data('pg.circularProgress', (data = new Progress(this, options)));
if (typeof option == 'string') data[option]();
else if (options.hasOwnProperty('value')) data.value(options.value);
})
}
var old = $.fn.circularProgress;
$.fn.circularProgress = Plugin;
$.fn.circularProgress.Constructor = Progress;
$.fn.circularProgress.defaults = {
value: 0
};
// CIRCULAR PROGRESS NO CONFLICT
// ====================
$.fn.circularProgress.noConflict = function() {
$.fn.circularProgress = old;
return this;
};
// CIRCULAR PROGRESS DATA API
//===================
$(window).on('load', function() {
$('[data-pages-progress="circle"]').each(function() {
var $progress = $(this);
$progress.circularProgress($progress.data())
})
});
function perc2deg(p) {
return parseInt(p / 100 * 360);
}
// TODO: Add API to change size, stroke width, color
})(window.jQuery);
/* ============================================================
* Pages Notifications
* ============================================================ */
(function($) {
'use strict';
var Notification = function(container, options) {
var self = this;
// Element collection
self.container = $(container); // 'body' recommended
self.notification = $('<div class="pgn push-on-sidebar-open"></div>');
self.options = $.extend(true, {}, $.fn.pgNotification.defaults, options);
if (!self.container.find('.pgn-wrapper[data-position=' + this.options.position + ']').length) {
self.wrapper = $('<div class="pgn-wrapper" data-position="' + this.options.position + '"></div>');
self.container.append(self.wrapper);
} else {
self.wrapper = $('.pgn-wrapper[data-position=' + this.options.position + ']');
}
self.alert = $('<div class="alert"></div>');
self.alert.addClass('alert-' + self.options.type);
if (self.options.style == 'bar') {
new BarNotification();
} else if (self.options.style == 'flip') {
new FlipNotification();
} else if (self.options.style == 'circle') {
new CircleNotification();
} else if (self.options.style == 'simple') {
new SimpleNotification();
} else { // default = 'simple'
new SimpleNotification();
}
// Notification styles
function SimpleNotification() {
self.notification.addClass('pgn-simple');
self.alert.append(self.options.message);
if (self.options.showClose) {
var close = $('<button type="button" class="close" data-dismiss="alert"></button>')
.append('<span aria-hidden="true">&times;</span>')
.append('<span class="sr-only">Close</span>');
self.alert.prepend(close);
}
}
function BarNotification() {
self.notification.addClass('pgn-bar');
self.alert.addClass('alert-' + self.options.type);
var container = $('<div class="container"/>');
container.append('<span>' + self.options.message + '</span>');
if (self.options.showClose) {
var close = $('<button type="button" class="close" data-dismiss="alert"></button>')
.append('<span aria-hidden="true">&times;</span>')
.append('<span class="sr-only">Close</span>');
container.append(close)
}
self.alert.append(container);
}
function CircleNotification() {
self.notification.addClass('pgn-circle');
var table = '<div>';
if (self.options.thumbnail) {
table += '<div class="pgn-thumbnail"><div>' + self.options.thumbnail + '</div></div>';
}
table += '<div class="pgn-message"><div>';
if (self.options.title) {
table += '<p class="bold">' + self.options.title + '</p>';
}
table += '<p>' + self.options.message + '</p></div></div>';
table += '</div>';
if (self.options.showClose) {
table += '<button type="button" class="close" data-dismiss="alert">';
table += '<span aria-hidden="true">&times;</span><span class="sr-only">Close</span>';
table += '</button>';
}
self.alert.append(table);
self.alert.after('<div class="clearfix"></div>');
}
function FlipNotification() {
self.notification.addClass('pgn-flip');
self.alert.append("<span>" + self.options.message + "</span>");
if (self.options.showClose) {
var close = $('<button type="button" class="close" data-dismiss="alert"></button>')
.append('<span aria-hidden="true">&times;</span>')
.append('<span class="sr-only">Close</span>');
self.alert.prepend(close);
}
}
self.notification.append(self.alert);
function alignWrapperToContainer(){
var containerPosition = self.container.position();
var containerHeight = self.container.height();
var containerWidth = self.container.width();
var containerTop = containerPosition.top;
var containerBottom = self.container.parent().height() - (containerTop + containerHeight);
var containerLeft = containerPosition.left;
var containerRight = self.container.parent().width() - (containerLeft + containerWidth);
if(/top/.test(self.options.position)){
self.wrapper.css('top', containerTop)
}
if(/bottom/.test(self.options.position)){
self.wrapper.css('bottom', containerBottom)
}
if(/left/.test(self.options.position)){
self.wrapper.css('left', containerLeft)
}
if(/right/.test(self.options.position)){
self.wrapper.css('right', containerRight)
}
}
if($('body').hasClass('horizontal-menu')){
alignWrapperToContainer();
$(window).on('resize', alignWrapperToContainer)
}
// bind to Bootstrap closed event for alerts
self.alert.on('closed.bs.alert', function() {
self.notification.remove();
self.options.onClosed();
// refresh layout after removal
});
return this; // enable chaining
};
Notification.VERSION = "1.0.0";
Notification.prototype.show = function() {
// TODO: add fadeOut animation on show as option
this.wrapper.prepend(this.notification);
this.options.onShown();
if (this.options.timeout != 0) {
var _this = this;
// settimeout removes scope. use .bind(this)
setTimeout(function() {
this.notification.fadeOut("slow", function() {
$(this).remove();
_this.options.onClosed();
});
}.bind(this), this.options.timeout);
}
};
$.fn.pgNotification = function(options) {
return new Notification(this, options);
};
$.fn.pgNotification.defaults = {
style: 'simple',
message: null,
position: 'top-right',
type: 'info',
showClose: true,
timeout: 4000,
onShown: function() {},
onClosed: function() {}
}
})(window.jQuery);
/* ============================================================
* Pages Cards
* ============================================================ */
(function($) {
'use strict';
// CARDS CLASS DEFINITION
// ======================
var Card = function(element, options) {
this.$element = $(element);
this.options = $.extend(true, {}, $.fn.card.defaults, options);
this.$loader = null;
this.$body = this.$element.find('.card-block');
};
Card.VERSION = "1.0.0";
// Button actions
Card.prototype.collapse = function() {
var icon = this.$element.find('.collapse-icon');
var heading = this.$element.find('.card-header');
this.$body.stop().slideToggle("fast");
if (this.$element.hasClass('card-collapsed')) {
this.$element.removeClass('card-collapsed');
icon.removeClass().addClass('fa-chevron-down');
$.isFunction(this.options.onExpand) && this.options.onExpand(this);
return
}
this.$element.addClass('card-collapsed');
icon.removeClass().addClass('fa-chevron-right');
$.isFunction(this.options.onCollapse) && this.options.onCollapse(this);
};
Card.prototype.close = function() {
this.$element.remove();
$.isFunction(this.options.onClose) && this.options.onClose(this);
};
Card.prototype.error = function(error) {
if (error) {
var _this = this;
this.$element.pgNotification({
style: 'bar',
message: error,
position: 'top',
timeout: 0,
type: 'danger',
onShown: function() {
_this.$loader.find('> div').fadeOut()
},
onClosed: function() {
_this.refresh(false)
}
}).show();
}
};
// CARD PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data('pg.card');
var options = typeof option == 'object' && option;
if (!data) $this.data('pg.card', (data = new Card(this, options)));
if (typeof option == 'string') data[option]();
else if (options.hasOwnProperty('refresh')) data.refresh(options.refresh);
else if (options.hasOwnProperty('error')) data.error(options.error);
})
}
var old = $.fn.card;
$.fn.card = Plugin;
$.fn.card.Constructor = Card;
$.fn.card.defaults = {
progress: 'circle',
progressColor: 'master',
refresh: false,
error: null,
overlayColor: '255,255,255',
overlayOpacity: 0.8,
refreshButton: '[data-toggle="refresh"]',
maximizeButton: '[data-toggle="maximize"]',
collapseButton: '[data-toggle="collapse"]',
closeButton: '[data-toggle="close"]'
// onRefresh: function(portlet) {},
// onCollapse: function(portlet) {},
// onExpand: function(portlet) {},
// onMaximize: function(portlet) {},
// onRestore: function(portlet) {},
// onClose: function(portlet) {}
};
// CARD NO CONFLICT
// ====================
$.fn.card.noConflict = function() {
$.fn.card = old;
return this;
}
})(window.jQuery);
/* ============================================================
* Pages Mobile View
* ============================================================ */
(function($) {
'use strict';
var MobileView = function(element, options) {
var self = this;
self.options = $.extend(true, {}, $.fn.pgMobileViews.defaults, options);
self.element = $(element);
self.element.on('click', function(e) {
e.preventDefault();
var data = self.element.data();
var el = $(data.viewPort);
var toView = data.toggleView;
if (data.toggleView != null) {
el.children().last().children('.view').hide();
$(data.toggleView).show();
}
else{
toView = el.last();
}
el.toggleClass(data.viewAnimation);
self.options.onNavigate(toView, data.viewAnimation);
return false;
});
return this; // enable chaining
};
$.fn.pgMobileViews = function(options) {
return new MobileView(this, options);
};
$.fn.pgMobileViews.defaults = {
//Returns Target View & Animation Type
onNavigate: function(view, animation) {}
};
// MOBILE VIEW DATA API
//===================
$(window).on('load', function() {
$('[data-navigate="view"]').each(function() {
var $mobileView = $(this);
$mobileView.pgMobileViews();
})
});
})(window.jQuery);
/* ============================================================
* Pages Quickview Plugin
* ============================================================ */
(function($) {
'use strict';
// QUICKVIEW CLASS DEFINITION
// ======================
var Quickview = function(element, options) {
this.$element = $(element);
this.options = $.extend(true, {}, $.fn.quickview.defaults, options);
this.bezierEasing = [.05, .74, .27, .99];
var _this = this;
$(this.options.notes).on('click', '.list > ul > li', function(e) {
var note = $(this).find('.note-preview');
var note = $(this).find('.note-preview');
$(_this.options.noteEditor).html(note.html());
$(_this.options.notes).toggleClass('push');
});
$(this.options.notes).on('click', '.list > ul > li .checkbox', function(e) {
e.stopPropagation();
});
$(this.options.notes).on('click', _this.options.backButton, function(e) {
$(_this.options.notes).find('.toolbar > li > a').removeClass('active');
$(_this.options.notes).toggleClass('push');
});
$(this.options.deleteNoteButton).click(function(e) {
e.preventDefault();
$(this).toggleClass('selected');
$(_this.options.notes).find('.list > ul > li .checkbox').fadeToggle("fast");
$(_this.options.deleteNoteConfirmButton).fadeToggle("fast").removeClass('hide');
});
$(this.options.newNoteButton).click(function(e) {
e.preventDefault();
$(_this.options.noteEditor).html('');
});
$(this.options.deleteNoteConfirmButton).click(function() {
var checked = $(_this.options.notes).find('input[type=checkbox]:checked');
checked.each(function() {
$(this).parents('li').remove();
});
});
$(this.options.notes).on('click', '.toolbar > li > a', function(e) {
//e.preventDefault();
var command = $(this).attr('data-action');
document.execCommand(command, false, null);
$(this).toggleClass('active');
});
};
Quickview.VERSION = "1.0.0";
// QUICKVIEW PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data('pg.quickview');
var options = typeof option == 'object' && option;
if (!data) $this.data('pg.quickview', (data = new Quickview(this, options)));
if (typeof option == 'string') data[option]();
})
}
var old = $.fn.quickview;
$.fn.quickview = Plugin;
$.fn.quickview.Constructor = Quickview;
$.fn.quickview.defaults = {
notes: '#note-views',
alerts: '#alerts',
chat: '#chat',
notesList: '.list',
noteEditor: '.quick-note-editor',
deleteNoteButton: '.delete-note-link',
deleteNoteConfirmButton: '.btn-remove-notes',
newNoteButton: '.new-note-link',
backButton: '.close-note-link'
};
// QUICKVIEW NO CONFLICT
// ====================
$.fn.quickview.noConflict = function() {
$.fn.quickview = old;
return this;
};
// QUICKVIEW DATA API
//===================
$(window).on('load', function() {
$('[data-pages="quickview"]').each(function() {
var $quickview = $(this);
$quickview.quickview($quickview.data())
})
});
$(document).on('click.pg.quickview.data-api touchstart', '[data-toggle="quickview"]', function(e) {
var elem = $(this).attr('data-toggle-element');
$(elem).toggleClass('open');
e.preventDefault();
})
})(window.jQuery);
/* ============================================================
* Pages Sidebar
* ============================================================ */
(function($) {
'use strict';
// SIDEBAR CLASS DEFINITION
// ======================
var Sidebar = function(element, options) {
this.$element = $(element);
this.$body = $('body');
this.options = $.extend(true, {}, $.fn.sidebar.defaults, options);
this.bezierEasing = [.05, .74, .27, .99];
this.cssAnimation = true;
this.css3d = true;
this.sideBarWidth = this.$element.width();
this.sideBarWidthCondensed = - this.$element.offset().left;
this.$sidebarMenu = this.$element.find(".sidebar-menu > ul");
this.$pageContainer = $(this.options.pageContainer);
if (!this.$sidebarMenu.length) return;
// apply perfectScrollbar plugin only for desktops
($.Pages.getUserAgent() == 'desktop') && this.$sidebarMenu.scrollbar({
ignoreOverlay: false,
disableBodyScroll :(this.$element.data("disableBodyScroll") == true)? true : false
});
if (!Modernizr.csstransitions)
this.cssAnimation = false;
if (!Modernizr.csstransforms3d)
this.css3d = false;
// Bind events
// Toggle sub menus
// In Angular Binding is done using a pg-sidebar directive
(typeof angular === 'undefined') && $(document).on('click', '.sidebar-menu a', function(e) {
if ($(this).parent().children('.sub-menu') === false) {
return;
}
var el = $(this);
var parent = $(this).parent().parent();
var li = $(this).parent();
var sub = $(this).parent().children('.sub-menu');
if(li.hasClass("open active")){
el.children('.arrow').removeClass("open active");
sub.slideUp(200, function() {
li.removeClass("open active");
});
}else{
parent.children('li.open').children('.sub-menu').slideUp(200);
parent.children('li.open').children('a').children('.arrow').removeClass('open active');
parent.children('li.open').removeClass("open active");
el.children('.arrow').addClass("open active");
sub.slideDown(200, function() {
li.addClass("open active");
});
}
//e.preventDefault();
});
// Toggle sidebar
$('.sidebar-slide-toggle').on('click touchend', function(e) {
e.preventDefault();
$(this).toggleClass('active');
var el = $(this).attr('data-pages-toggle');
if (el != null) {
$(el).toggleClass('show');
}
});
var _this = this;
function sidebarMouseEnter(e) {
var menuOpenCSS = (this.css3d == true ? 'translate3d(' + _this.sideBarWidthCondensed + 'px, 0,0)' : 'translate(' + _this.sideBarWidthCondensed + 'px, 0)');
if ($.Pages.isVisibleSm() || $.Pages.isVisibleXs()) {
return false
}
if ($('.close-sidebar').data('clicked')) {
return;
}
if (_this.$body.hasClass('menu-pin'))
return;
_this.$element.css({
'transform': menuOpenCSS
});
_this.$body.addClass('sidebar-visible');
}
function sidebarMouseLeave(e) {
var menuClosedCSS = (_this.css3d == true ? 'translate3d(0, 0,0)' : 'translate(0, 0)');
if ($.Pages.isVisibleSm() || $.Pages.isVisibleXs()) {
return false
}
if (typeof e != 'undefined') {
var target = $(e.target);
if (target.parent('.page-sidebar').length) {
return;
}
}
if (_this.$body.hasClass('menu-pin'))
return;
if ($('.sidebar-overlay-slide').hasClass('show')) {
$('.sidebar-overlay-slide').removeClass('show');
$("[data-pages-toggle]").removeClass('active')
}
_this.$element.css({
'transform': menuClosedCSS
});
_this.$body.removeClass('sidebar-visible');
}
this.$element.bind('mouseenter mouseleave', sidebarMouseEnter);
this.$pageContainer.bind('mouseover', sidebarMouseLeave);
function toggleMenuPin(){
var width = $(window).width();
if(width < 1200){
if($('body').hasClass('menu-pin')){
$('body').removeClass('menu-pin');
$('body').addClass('menu-unpinned')
}
} else {
if($('body').hasClass('menu-unpinned')){
$('body').addClass('menu-pin')
}
}
}
$(document).bind('ready', toggleMenuPin);
$(window).bind('resize', toggleMenuPin);
};
// Toggle sidebar for mobile view
Sidebar.prototype.toggleSidebar = function(toggle) {
var timer;
var bodyColor = $('body').css('background-color');
$('.page-container').css('background-color', bodyColor);
if (this.$body.hasClass('sidebar-open')) {
this.$body.removeClass('sidebar-open');
timer = setTimeout(function() {
this.$element.removeClass('visible');
}.bind(this), 400);
} else {
clearTimeout(timer);
this.$element.addClass('visible');
setTimeout(function() {
this.$body.addClass('sidebar-open');
}.bind(this), 10);
setTimeout(function(){
// remove background color
$('.page-container').css({'background-color': ''});
},1000);
}
};
Sidebar.prototype.togglePinSidebar = function(toggle) {
if (toggle == 'hide') {
this.$body.removeClass('menu-pin');
} else if (toggle == 'show') {
this.$body.addClass('menu-pin');
} else {
this.$body.toggleClass('menu-pin');
}
};
// SIDEBAR PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data('pg.sidebar');
var options = typeof option == 'object' && option;
if (!data) $this.data('pg.sidebar', (data = new Sidebar(this, options)));
if (typeof option == 'string') data[option]();
})
}
var old = $.fn.sidebar;
$.fn.sidebar = Plugin;
$.fn.sidebar.Constructor = Sidebar;
$.fn.sidebar.defaults = {
pageContainer: '.page-container'
};
// SIDEBAR PROGRESS NO CONFLICT
// ====================
$.fn.sidebar.noConflict = function() {
$.fn.sidebar = old;
return this;
};
// SIDEBAR PROGRESS DATA API
//===================
$(document).on('click.pg.sidebar.data-api', '[data-toggle-pin="sidebar"]', function(e) {
var $this = $(this);
var $target = $('[data-pages="sidebar"]');
$target.data('pg.sidebar').togglePinSidebar();
return false;
});
$(document).on('click.pg.sidebar.data-api touchstart', '[data-toggle="sidebar"]', function(e) {
var $this = $(this);
var $target = $('[data-pages="sidebar"]');
$target.data('pg.sidebar').toggleSidebar();
return false
})
})(window.jQuery);
(function($) {
'use strict';
// Initialize layouts and plugins
(typeof angular === 'undefined') && $.Pages.init();
})(window.jQuery);