ACC SHELL
if ( !!window.SLB && SLB.has_child('View.extend_theme') ) {(function($) {
SLB.View.extend_theme('slb_default', {
/**
* Transition event handlers
*/
'transition': {
/**
* Open event
* @param View.Viewer v Viewer instance
* @param deferred dfr Resolved when transition is complete
* @return promise Resolved when transition is complete
*/
'open': function(v, dfr) {
// Reset layout and overlay state on open
var l = v.get_layout().hide(),
o = v.get_overlay().hide();
// Clean UI
var thm = this;
var d = v.dom_get();
d.find('.slb_content').css({width: '', height: ''}).find(this.get_tag_selector()).hide();
d.find('.slb_details').height(0);
// Show viewer DOM
d.show({'always': function() {
var pos = {'top_base': $(document).scrollTop()};
if ( document.documentElement.clientWidth > thm.get_breakpoint('small') ) {
/* Standard screen */
// Center vertically
pos.top = ( pos.top_base + $(window).height() / 2 ) - ( l.height() / 2 );
if ( pos.top < pos.top_base ) {
pos.top = pos.top_base;
}
} else {
/* Small screen */
// Position at top
pos.top = pos.top_base;
}
// Show overlay
o.fadeIn({'always': function() {
// Position lightbox
l.css(pos);
dfr.resolve();
}});
}});
return dfr.promise();
},
/**
* Close event
* @param View.Viewer v Viewer instance
* @param jQuery.Deferred dfr Deferred instance to be resolved when animation is complete
* @return jQuery.Promise Resolved when transition is complete
*/
'close': function(v, dfr) {
// Viewer elements
var l = v.get_layout(),
c = l.find('.slb_content');
// Reset procedure
var reset = function() {
// Reset state
c.width('').height('');
l.css('opacity', '');
dfr.resolve();
};
if ( v.animation_enabled() && document.documentElement.clientWidth > this.get_breakpoint('small') ) {
/* Standard */
var anims = {
'layout': { opacity: 0, top: $(document).scrollTop() + ( $(window).height() / 2 ) },
'content': { width: 0, height: 0 },
'speed': 'fast'
};
// Shrink & fade out viewer
var pos = l.animate(anims.layout, anims.speed).promise();
var size = c.animate(anims.content, anims.speed).promise();
$.when(pos, size).done(function() {
// Fade out overlay
v.get_overlay().fadeOut({'always': function() {
reset();
}});
});
} else {
l.css('opacity', 0);
reset();
}
return dfr.promise();
},
/**
* Item loading event
* @param View.Viewer v Viewer instance
* @param deferred dfr Resolved when animation is complete
* @return promise Resolved when transition is complete
*/
'load': function(v) {
v.get_layout().find('.slb_loading').show();
if ( document.documentElement.clientWidth > this.get_breakpoint('small') ) {
return v.get_layout().fadeIn().promise();
} else {
return v.get_layout().show().promise();
}
},
/**
* Item unloaded event
* @param View.Viewer v Viewer instance
* @param jQuery.Deferred dfr Deferred instance to be resolved when animation is complete
* @return jQuery.Promise Resolved when transition is complete
*/
'unload': function(v, dfr) {
var l = v.get_layout(),
det = l.find('.slb_details'),
cont = l.find('.slb_content ' + this.get_tag_selector());
var props = {height: 0};
// Hide details
det.css(props);
// Hide content
cont.hide();
// Finish
$.when(det.promise(), cont.promise()).done(function() {
dfr.resolve();
});
return dfr.promise();
},
/**
* Item loading completed event
* @param View.Viewer v Viewer instance
* @param jQuery.Deferred dfr Deferred instance to be resolved when animation is complete
* @return jQuery.Promise Resolved when transition is complete
*/
'complete': function(v, dfr) {
// Elements
var l = v.get_layout(),
loader = l.find('.slb_loading'),
det = l.find('.slb_details'),
det_data = det.find('.slb_data'),
c = l.find('.slb_content'),
c_tag = c.find( this.get_tag_selector() );
// Transition
if ( document.documentElement.clientWidth > this.get_breakpoint('small') ) {
var spd = 'fast';
// Resize viewer to fit item
var dims_item = this.get_item_dimensions();
// Determine details height
det.width(dims_item.width);
var dims_det = {'height': det_data.outerHeight()};
// Reset width
det.width('');
// Determine vertical positioning (centered)
var pos = { 'top_base': $(document).scrollTop() };
// Center vertically
pos.top = pos.top_base + ( $(window).height() / 2 ) - ( ( dims_det.height + dims_item.height ) / 2 );
if ( pos.top < pos.top_base ) {
pos.top = pos.top_base;
}
// Position/Resize viewer
pos = l.animate(pos, spd).promise();
dims_item = c.animate(dims_item, spd).promise();
// Display elements
var thm = this;
$.when(pos, dims_item).done(function() {
// Hide loading indicator
loader.fadeOut(spd, function() {
// Display content
c.find( thm.get_tag_selector('item', 'content') ).fadeIn(function() {
// Show UI
c_tag.show();
// Show details
det.animate({'height': det_data.outerHeight()}, 'slow').promise().done(function() {
det.height('');
dfr.resolve();
});
});
});
});
} else {
loader.hide();
c_tag.show();
det.height('');
dfr.resolve();
}
return dfr.promise();
}
}
});
})(jQuery);
}
ACC SHELL 2018