/**
|
<b>Content Slider</b>. with custom content and elements based on Bootstrap modals.
|
*/
|
(function($ , undefined) {
|
var $window = $(window);
|
|
function Aside(modal, settings) {
|
var self = this;
|
|
var $modal = $(modal);
|
var placement = 'right', vertical = false;
|
var hasFade = $modal.hasClass('fade');//Bootstrap enables transition only when modal is ".fade"
|
|
var attrib_values = ace.helper.getAttrSettings(modal, $.fn.ace_aside.defaults);
|
this.settings = $.extend({}, $.fn.ace_aside.defaults, settings, attrib_values);
|
|
//if no scroll style specified and modal has dark background, let's make scrollbars 'white'
|
if(this.settings.background && !settings.scroll_style && !attrib_values.scroll_style) {
|
this.settings.scroll_style = 'scroll-white no-track';
|
}
|
|
|
this.container = this.settings.container;
|
if(this.container) {
|
try {
|
if( $(this.container).get(0) == document.body ) this.container = null;
|
} catch(e) {}
|
}
|
if(this.container) {
|
this.settings.backdrop = false;//no backdrop when inside another element?
|
$modal.addClass('aside-contained');
|
}
|
|
|
var dialog = $modal.find('.modal-dialog');
|
var content = $modal.find('.modal-content');
|
var delay = 300;
|
|
this.initiate = function() {
|
modal.className = modal.className.replace(/(\s|^)aside\-(right|top|left|bottom)(\s|$)/ig , '$1$3');
|
|
placement = this.settings.placement;
|
if(placement) placement = $.trim(placement.toLowerCase());
|
if(!placement || !(/right|top|left|bottom/.test(placement))) placement = 'right';
|
|
$modal.attr('data-placement', placement);
|
$modal.addClass('aside-' + placement);
|
|
if( /right|left/.test(placement) ) {
|
vertical = true;
|
$modal.addClass('aside-vc');//vertical
|
}
|
else $modal.addClass('aside-hz');//horizontal
|
|
if( this.settings.fixed ) $modal.addClass('aside-fixed');
|
if( this.settings.background ) $modal.addClass('aside-dark');
|
if( this.settings.offset ) $modal.addClass('navbar-offset');
|
|
if( !this.settings.transition ) $modal.addClass('transition-off');
|
|
$modal.addClass('aside-hidden');
|
|
this.insideContainer();
|
|
/////////////////////////////
|
|
dialog = $modal.find('.modal-dialog');
|
content = $modal.find('.modal-content');
|
|
if(!this.settings.body_scroll) {
|
//don't allow body scroll when modal is open
|
$modal.on('mousewheel.aside DOMMouseScroll.aside touchmove.aside pointermove.aside', function(e) {
|
if( !$.contains(content[0], e.target) ) {
|
e.preventDefault();
|
return false;
|
}
|
})
|
}
|
|
if( this.settings.backdrop == false ) {
|
$modal.addClass('no-backdrop');
|
}
|
}
|
|
|
this.show = function() {
|
if(this.settings.backdrop == false) {
|
try {
|
$modal.data('bs.modal').$backdrop.remove();
|
} catch(e){}
|
}
|
|
if(this.container) $(this.container).addClass('overflow-hidden');
|
else $modal.css('position', 'fixed')
|
|
$modal.removeClass('aside-hidden');
|
}
|
|
this.hide = function() {
|
if(this.container) {
|
this.container.addClass('overflow-hidden');
|
|
if(ace.vars['firefox']) {
|
//firefox needs a bit of forcing re-calculation
|
modal.offsetHeight;
|
}
|
}
|
|
toggleButton();
|
|
if(ace.vars['transition'] && !hasFade) {
|
$modal.one('bsTransitionEnd', function() {
|
$modal.addClass('aside-hidden');
|
$modal.css('position', '');
|
|
if(self.container) self.container.removeClass('overflow-hidden');
|
}).emulateTransitionEnd(delay);
|
}
|
}
|
|
this.shown = function() {
|
toggleButton();
|
$('body').removeClass('modal-open').css('padding-right', '');
|
|
if( this.settings.backdrop == 'invisible' ) {
|
try {
|
$modal.data('bs.modal').$backdrop.css('opacity', 0);
|
} catch(e){}
|
}
|
|
var size = !vertical ? dialog.height() : content.height();
|
if(!ace.vars['touch']) {
|
if(!content.hasClass('ace-scroll')) {
|
content.ace_scroll({
|
size: size,
|
reset: true,
|
mouseWheelLock: true,
|
lockAnyway: !this.settings.body_scroll,
|
styleClass: this.settings.scroll_style,
|
'observeContent': true,
|
'hideOnIdle': !ace.vars['old_ie'],
|
'hideDelay': 1500
|
})
|
}
|
}
|
else {
|
content.addClass('overflow-scroll').css('max-height', size+'px');
|
}
|
|
$window
|
.off('resize.modal.aside')
|
.on('resize.modal.aside', function() {
|
if(!ace.vars['touch']) {
|
content.ace_scroll('disable');//to get correct size when going from small window size to large size
|
var size = !vertical ? dialog.height() : content.height();
|
content
|
.ace_scroll('update', {'size': size})
|
.ace_scroll('enable')
|
.ace_scroll('reset');
|
}
|
else content.css('max-height', (!vertical ? dialog.height() : content.height())+'px');
|
}).triggerHandler('resize.modal.aside');
|
|
|
///////////////////////////////////////////////////////////////////////////
|
if(self.container && ace.vars['transition'] && !hasFade) {
|
$modal.one('bsTransitionEnd', function() {
|
self.container.removeClass('overflow-hidden')
|
}).emulateTransitionEnd(delay);
|
}
|
}
|
|
|
this.hidden = function() {
|
$window.off('.aside')
|
//$modal.off('.aside')
|
//
|
if( !ace.vars['transition'] || hasFade ) {
|
$modal.addClass('aside-hidden');
|
$modal.css('position', '');
|
}
|
}
|
|
|
this.insideContainer = function() {
|
var container = $('.main-container');
|
|
var dialog = $modal.find('.modal-dialog');
|
dialog.css({'right': '', 'left': ''});
|
if( container.hasClass('container') ) {
|
var flag = false;
|
if(vertical == true) {
|
dialog.css( placement, parseInt(($window.width() - container.width()) / 2) );
|
flag = true;
|
}
|
|
//strange firefox issue, not redrawing properly on window resize (zoom in/out)!!!!
|
//--- firefix is still having issue!
|
if(flag && ace.vars['firefox']) {
|
ace.helper.redraw(container[0]);
|
}
|
}
|
}
|
|
this.flip = function() {
|
var flipSides = {right : 'left', left : 'right', top: 'bottom', bottom: 'top'};
|
$modal.removeClass('aside-'+placement).addClass('aside-'+flipSides[placement]);
|
placement = flipSides[placement];
|
}
|
|
var toggleButton = function() {
|
var btn = $modal.find('.aside-trigger');
|
if(btn.length == 0) return;
|
btn.toggleClass('open');
|
|
var icon = btn.find(ace.vars['.icon']);
|
if(icon.length == 0) return;
|
icon.toggleClass(icon.attr('data-icon1') + " " + icon.attr('data-icon2'));
|
}
|
|
|
this.initiate();
|
|
if(this.container) this.container = $(this.container);
|
$modal.appendTo(this.container || 'body');
|
}
|
|
|
$(document)
|
.on('show.bs.modal', '.modal.aside', function(e) {
|
$('.aside.in').modal('hide');//??? hide previous open ones?
|
$(this).ace_aside('show');
|
})
|
.on('hide.bs.modal', '.modal.aside', function(e) {
|
$(this).ace_aside('hide');
|
})
|
.on('shown.bs.modal', '.modal.aside', function(e) {
|
$(this).ace_aside('shown');
|
})
|
.on('hidden.bs.modal', '.modal.aside', function(e) {
|
$(this).ace_aside('hidden');
|
})
|
|
|
|
|
$(window).on('resize.aside_container', function() {
|
$('.modal.aside').ace_aside('insideContainer');
|
});
|
$(document).on('settings.ace.aside', function(e, event_name) {
|
if(event_name == 'main_container_fixed') $('.modal.aside').ace_aside('insideContainer');
|
});
|
|
$.fn.aceAside = $.fn.ace_aside = function (option, value) {
|
var method_call;
|
|
var $set = this.each(function () {
|
var $this = $(this);
|
var data = $this.data('ace_aside');
|
var options = typeof option === 'object' && option;
|
|
if (!data) $this.data('ace_aside', (data = new Aside(this, options)));
|
if (typeof option === 'string' && typeof data[option] === 'function') {
|
if(value instanceof Array) method_call = data[option].apply(data, value);
|
else method_call = data[option](value);
|
}
|
});
|
|
return (method_call === undefined) ? $set : method_call;
|
}
|
|
$.fn.ace_aside.defaults = {
|
fixed: false,
|
background: false,
|
offset: false,
|
body_scroll: false,
|
transition: true,
|
scroll_style: 'scroll-dark no-track',
|
container: null,
|
backdrop: false,
|
placement: 'right'
|
}
|
|
})(window.jQuery);
|