modulejs.define('ext/preview', ['_', '$', 'core/settings', 'core/resource', 'core/store'], function (_, $, allsettings, resource, store) {
var settings = _.extend({
enabled: true
}, allsettings['preview']),
template = '
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
',
storekey = 'ext/preview',
currentEntries = [],
currentIdx = 0,
isFullscreen = store.get(storekey) || false,
adjustSize = function () {
var rect = $(window).fracs('viewport'),
$container = $('#pv-content'),
$spinner = $('#pv-spinner'),
margin = isFullscreen ? 0 : 20,
barheight = isFullscreen ? 0 : 31;
$container.css({
width: rect.width - 2 * margin,
height: rect.height - 2 * margin - barheight,
left: margin,
top: margin
});
$spinner.css({
left: rect.width * 0.5,
top: rect.height * 0.5
});
if (isFullscreen) {
$('#pv-overlay').addClass('fullscreen');
$('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview/no-fullscreen'));
} else {
$('#pv-overlay').removeClass('fullscreen');
$('#pv-bar-fullscreen').find('img').attr('src', resource.image('preview/fullscreen'));
}
if (_.isFunction(onAdjustSize)) {
onAdjustSize(1);
}
},
onEnter = function () {
$(window).on('keydown', onKeydown);
$('#pv-content').empty();
$('#pv-overlay').stop(true, true).fadeIn(200);
adjustSize();
},
onExit = function () {
$(window).off('keydown', onKeydown);
$('#pv-overlay').stop(true, true).fadeOut(200);
},
onNext = function () {
if (_.isFunction(onIndexChange)) {
onIndexChange(1);
}
},
onPrevious = function () {
if (_.isFunction(onIndexChange)) {
onIndexChange(-1);
}
},
userAliveTimeoutId = null,
userAlive = function () {
clearTimeout(userAliveTimeoutId);
$('#pv-overlay .hof').stop(true, true).fadeIn(200);
if (isFullscreen) {
userAliveTimeoutId = setTimeout(function () {
$('#pv-overlay .hof').stop(true, true).fadeOut(2000);
}, 2000);
}
},
onFullscreen = function () {
isFullscreen = !isFullscreen;
store.put(storekey, isFullscreen);
userAlive();
adjustSize();
},
onKeydown = function (event) {
var key = event.which,
delay = 300;
if (key === 27) { // esc
event.preventDefault();
event.stopImmediatePropagation();
$('#pv-bar-close, #pv-close-area').addClass('hover');
setTimeout(function () { $('#pv-bar-close, #pv-close-area').removeClass('hover'); }, delay);
onExit();
} else if (key === 8 || key === 37) { // backspace, left
event.preventDefault();
event.stopImmediatePropagation();
$('#pv-bar-prev, #pv-prev-area').addClass('hover');
setTimeout(function () { $('#pv-bar-prev, #pv-prev-area').removeClass('hover'); }, delay);
onPrevious();
} else if (key === 13 || key === 32 || key === 39) { // enter, space, right
event.preventDefault();
event.stopImmediatePropagation();
$('#pv-bar-next, #pv-next-area').addClass('hover');
setTimeout(function () { $('#pv-bar-next, #pv-next-area').removeClass('hover'); }, delay);
onNext();
} else if (key === 70) { // f
event.preventDefault();
event.stopImmediatePropagation();
$('#pv-bar-fullscreen').addClass('hover');
setTimeout(function () { $('#pv-bar-fullscreen').removeClass('hover'); }, delay);
onFullscreen();
}
},
enter = function () {
onEnter();
},
exit = function () {
onExit();
},
setIndex = function (idx, total) {
if (_.isNumber(idx)) {
$('#pv-bar-idx').text('' + idx + (_.isNumber(total) ? '/' + total : '')).show();
} else {
$('#pv-bar-idx').text('').hide();
}
},
setRawLink = function (href) {
if (href) {
$('#pv-bar-raw').find('a').attr('href', href).end().show();
} else {
$('#pv-bar-raw').find('a').attr('href', '#').end().hide();
}
},
setLabels = function (labels) {
$('#pv-buttons .bar-left').remove();
_.each(labels, function (label) {
$('')
.addClass('bar-left bar-label')
.text(label)
.appendTo('#pv-buttons');
});
},
onIndexChange = null,
setOnIndexChange = function (fn) {
onIndexChange = fn;
},
onAdjustSize = null,
setOnAdjustSize = function (fn) {
onAdjustSize = fn;
},
showSpinner = function (show, millis) {
if (!_.isNumber(millis)) {
millis = 400;
}
if (show) {
$('#pv-spinner').stop(true, true).fadeIn(millis);
} else {
$('#pv-spinner').stop(true, true).fadeOut(millis);
}
},
init = function () {
if (!settings.enabled) {
return;
}
$(template).appendTo('body');
$('#pv-spinner').hide();
$('#pv-bar-prev, #pv-prev-area').on('click', onPrevious);
$('#pv-bar-next, #pv-next-area').on('click', onNext);
$('#pv-bar-close, #pv-close-area').on('click', onExit);
$('#pv-bar-fullscreen').on('click', onFullscreen);
$('#pv-overlay')
.on('keydown', onKeydown)
.on('mousemove mousedown', userAlive)
.on('click mousedown mousemove keydown keypress', function (event) {
if (event.type === 'click') {
if (event.target.id === 'pv-overlay' || event.target.id === 'pv-content') {
exit();
}
}
event.stopImmediatePropagation();
});
$(window).on('resize load', adjustSize);
};
init();
return {
enter: enter,
exit: exit,
setIndex: setIndex,
setRawLink: setRawLink,
setLabels: setLabels,
setOnIndexChange: setOnIndexChange,
setOnAdjustSize: setOnAdjustSize,
showSpinner: showSpinner
};
});