You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
5.8 KiB
177 lines
5.8 KiB
/*********************************************************************
|
|
thread.js
|
|
|
|
Thread JS untils
|
|
Copyright (c) 2014 osTicket
|
|
http://www.osticket.com
|
|
|
|
Released under the GNU General Public License WITHOUT ANY WARRANTY.
|
|
|
|
vim: expandtab sw=4 ts=4 sts=4:
|
|
**********************************************************************/
|
|
|
|
var thread = {
|
|
|
|
options: {
|
|
autoScroll: true,
|
|
showimages: false
|
|
},
|
|
|
|
scrollTo: function (entry) {
|
|
|
|
if (!entry) return;
|
|
|
|
var frame = 0;
|
|
$('html, body').animate({
|
|
scrollTop: entry.offset().top - 50,
|
|
}, {
|
|
duration: 400,
|
|
step: function(now, fx) {
|
|
// Recalc end target every few frames
|
|
if (++frame % 6 == 0)
|
|
fx.end = entry.offset().top - 50;
|
|
}
|
|
});
|
|
},
|
|
|
|
showExternalImage: function(div) {
|
|
var $div = $(div),
|
|
$img = $div.append($('<img>')
|
|
.attr('src', $div.data('src'))
|
|
.attr('alt', $div.attr('alt'))
|
|
.attr('title', $div.attr('title'))
|
|
.attr('style', $div.data('style'))
|
|
);
|
|
if ($div.attr('width'))
|
|
$img.width($div.attr('width'));
|
|
if ($div.attr('height'))
|
|
$img.height($div.attr('height'));
|
|
},
|
|
|
|
externalImages: function() {
|
|
|
|
// Optionally show external images
|
|
$('.thread-entry', this.options.container).each(function(i, te) {
|
|
var extra = $(te).find('.textra'),
|
|
imgs = $(te).find('.non-local-image[data-src]');
|
|
|
|
if (!extra || !imgs.length)
|
|
return;
|
|
|
|
// Add Show Images buttons
|
|
extra.append($('<a>')
|
|
.addClass("white button action-button show-images")
|
|
.css({'font-weight':'normal'})
|
|
.text(' ' + __('Show Images'))
|
|
.click(function(ev) {
|
|
imgs.each(function(i, img) {
|
|
thread.showExternalImage(img);
|
|
$(img).removeClass('non-local-image')
|
|
// Remove placeholder sizing
|
|
.css({'display':'inline-block'})
|
|
.width('auto')
|
|
.height('auto')
|
|
.removeAttr('width')
|
|
.removeAttr('height');
|
|
extra.find('.show-images').hide();
|
|
});
|
|
})
|
|
.prepend($('<i>')
|
|
.addClass('icon-picture')
|
|
)
|
|
);
|
|
|
|
// Show placeholders
|
|
imgs.each(function(i, img) {
|
|
var $img = $(img);
|
|
// Save a copy of the original styling
|
|
$img.data('style', $img.attr('style'));
|
|
$img.removeAttr('style');
|
|
// If the image has a 'height' attribute, use it, otherwise, use
|
|
// 40px
|
|
$img.height(($img.attr('height') || '40') + 'px');
|
|
// Ensure the image placeholder is visible width-wise
|
|
if (!$img.width())
|
|
$img.width(($img.attr('width') || '80') + 'px');
|
|
// TODO: Add a hover-button to show just one image
|
|
});
|
|
});
|
|
},
|
|
|
|
inlineImages: function (entry_id) {
|
|
// TODO: use entry selector or object instead of ID
|
|
var selector = (entry_id == undefined)
|
|
? '.thread-body img[data-cid]'
|
|
: '.thread-body#thread-id-'+entry_id+' img[data-cid]';
|
|
|
|
// Get urls
|
|
if (!(urls=this.options.container.data('imageUrls')))
|
|
return;
|
|
|
|
$(selector, this.options.container).each(function(i, el) {
|
|
var e = $(el),
|
|
cid = e.data('cid').toLowerCase(),
|
|
info = urls[cid];
|
|
if (info && !e.data('wrapped')) {
|
|
// Add a hover effect with the filename
|
|
var timeout, caption = $('<div class="image-hover">')
|
|
.css({'float':e.css('float')});
|
|
e.wrap(caption).parent()
|
|
.append($('<div class="caption">')
|
|
.append($('<a href="'+info.download_url+'" class="dark button pull-right no-pjax"><i class="icon-download-alt"></i></a>')
|
|
.attr('download', info.filename)
|
|
.attr('title', __('Download'))
|
|
.tooltip()
|
|
)
|
|
);
|
|
e.data('wrapped', true);
|
|
}
|
|
});
|
|
},
|
|
|
|
prepImages: function() {
|
|
|
|
// TODO: Check config options
|
|
this.externalImages();
|
|
this.inlineImages();
|
|
},
|
|
|
|
onLoad: function (container, options) {
|
|
|
|
// See if thread container is valid
|
|
$container = $('#'+container);
|
|
if (!$container || !$container.length)
|
|
return;
|
|
|
|
// set options
|
|
this.options.container = $container;
|
|
$.extend(this.options, options);
|
|
|
|
// Prep images
|
|
this.prepImages();
|
|
|
|
// Auto scroll to the last entry if autoScroll is enabled.
|
|
if (this.options.autoScroll === true) {
|
|
// Find the last entry to scroll to.
|
|
var e = $('.thread-entry', $container).filter(':visible').last();
|
|
if (e.length)
|
|
this.scrollTo(e);
|
|
}
|
|
|
|
// Open thread body links in a new tab/window
|
|
// unless referring to thread entry on current page
|
|
$('div.thread-body a', $container).each(function() {
|
|
var str = this.toString();
|
|
if (str.indexOf('#entry-') == -1)
|
|
$(this).attr('target', '_blank');
|
|
});
|
|
|
|
// Open first response option tab if not already active
|
|
if (!document.location.hash)
|
|
$('.actions .tabs li:visible:first:not(.active) a', $container.parent()).trigger('click');
|
|
}
|
|
};
|
|
|
|
// Set thread as JQuery object
|
|
$.thread = thread;
|
|
|