מדיה ויקי:SlideShow.js
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
// סקריפט המשמש את תבנית המצגת
// Written by [[he:User:קובי כרמל]]
// version 3.3
'use strict';
if(!window.SS_DEBUG) {
var SlideShow = function(object, fullScreen){
var self = this;
this.buttons = {
options: {
html: true,
delayIn: 500,
fade: true,
delayOut: 0
},
attr: {
'zoomin': self.local.showFullScreen,
'seek-end': self.local.firstImage,
'seek-next': self.local.prevImage,
'triangle-1-w': self.local.play,
'seek-prev': self.local.nextImage,
'seek-start': self.local.lastImage,
'help': self.local.help
},
create: function(){
var toolbar = object.find('.gallery-slideshow-toolbar');
for(var b in self.buttons.attr) {
if(b == 'zoomin' && fullScreen)
continue;
var className = 'ui-icon-' + b,
button = $('<button>', {'class': className})
.button({label: self.buttons.attr[b], text: false, icons: {primary: className}})
.tipsy(self.buttons.options)
.click(function(e){
self.animate($(this), e.isTrigger);
});
toolbar.append(button);
}
toolbar.children().css({width: 25, height: 25});
}
};
this.height = 0; // computed height
this.length = 0; // Amount of images
this.object = object;
this.theight = 0; // the greatest height of images title
this.addBullets = function(){
var options = self.buttons.options,
bullets = object.find('.slideshow-bullets');
self.links.each(function(){
options.fallback = $(this).data('title');
bullets
.append($('<span>', {'class': 'ui-icon ui-icon-radio-off'})
.tipsy(options)
.click(function(){
self.animate($(this).index());
})
)
})
};
this.addImages = function(res){
var pages = res.query.pages;
self.links.each(function(){
var info,
title = self.decodeLink($(this)),
isFirst = !self.length;
for(var i in pages)
if(pages[i].title == title) {
info = pages[i].imageinfo[0];
break;
}
var height = info.thumbheight,
src = info.thumburl;
$(this).children()
.attr('src', src)
.width(info.thumbwidth)
.height(height)
.wrap($('<div>', {'class': 'img-wrapper'})
.css('right', isFirst ? 0 : self.imageWidth)
);
if(!$(this).index()) {
$(this).addClass('active');
object.find('.slideshow-title').css('display', 'block'); // IE to hell
object.find('.slideshow-files').css('opacity', 1).show();
object.find('.slideshow-preview, #slideshow-loading').hide();
}
if(self.height < height)
self.height = height;
self.length++;
});
self.addBullets();
self.showNavigator();
if (!fullScreen) {
if ($.client.profile().name == 'msie')
setTimeout(self.computeHeight, 500);
else
self.computeHeight();
}
};
this.addTitles = function(){
var title,
htmlTitle,
theight,
rows = object.find('.slideshow-preprocessing p').html().split(self.local.file + ':');
object.find('.slideshow-title').hide();
for(var i = 0; i < rows.length; i++) {
if(!$.trim(rows[i])) {
rows.splice(i, 1);
i--;
continue;
}
title = rows[i].split('#');
if(title[2])
for(var m = 2; m < title.length; m++)
title[1] += '#' + title[m];
htmlTitle = title[1] || '';
self.links.eq(i).data({title: htmlTitle});
theight = object.find('.theight-calculator').html(htmlTitle).height();
if(self.theight < theight)
self.theight = theight;
}
};
this.animate = function(button, trigger){
var bullet = typeof button == 'number',
slider = object.find('.slideshow-files'),
active = slider.children('a.active'),
index = bullet ? button : self.getActive();
if(!bullet) {
var method, className = function(){
var cls = button.attr('class').split(' ');
for(var n in cls)
if(cls[n].match(/ui-icon-/))
return cls[n].replace('ui-icon-', '');
}.call();
switch(className) {
case 'zoomin':
return self.fullScreen();
case 'seek-end':
if(index) method = 'prev';
index = 0;
break;
case 'seek-next':
if(index) method = 'prev';
index--;
break;
case 'seek-prev':
if(index < self.length - 1) method = 'next';
else self.stop();
index++;
break;
case 'seek-start':
if(index < self.length) method = 'next';
index = self.length - 1;
break;
case 'triangle-1-w':
return self.play();
case 'stop':
return self.stop();
case 'help':
return window.open(location.protocol + '//' + location.hostname + '/wiki/' + self.local.helpPage, '_blank');
}
button.blur();
}
if(!trigger) self.stop();
var toImage = slider.find('a').eq(index),
zIndex = eval(object.find('.active').children().css('z-index')),
newImage = toImage.children(),
oldImage = active.children(),
animComplete = function(){
newImage.css('zIndex', zIndex + 1);
active.removeClass('active').children().css({right: self.imageWidth, marginTop: 0});
toImage.addClass('active').children().css('right', 0);
object.find('.slideshow-title').html(toImage.find('img').data('title'));
self.showNavigator();
};
var effects = {};
effects[self.local.verSliding] = {
prev: {
old: {
animate: {right: self.imageWidth}
},
toNew: {
css: {right: 0}
}
},
next: {
toNew: {
css: {zIndex: zIndex + 1},
animate: {right: 0}
}
}
};
effects[self.local.horizSliding] = {
prev: {
toNew: {
css: {marginTop: -self.imageHeight, zIndex: zIndex + 1, right: 0},
animate: {marginTop: 0}
}
},
next: {
old: {
css: {zIndex: zIndex + 1},
animate: {marginTop: -self.imageHeight}
},
toNew: {
css: {right: 0}
}
}
};
effects[self.local.fading] = {
next: {
toNew: {
css: {zIndex: zIndex + 1, opacity: 0, right: 0},
animate: {opacity: 1}
}
}
};
if(bullet) {
var oldIndex = self.getActive();
if(oldIndex == index)
return;
method = index > oldIndex ? 'next' : 'prev';
}
if(method) {
var effect;
if(effects[self.currentEffect])
effect = effects[self.currentEffect][method];
else
effect = effects[self.local.verSliding][method];
if(!effect) effect = effects[self.currentEffect][method == 'next' ? 'prev' : 'next'];
if(effect.toNew) {
if(effect.toNew.css) newImage.css(effect.toNew.css);
if(effect.toNew.animate) newImage.animate(effect.toNew.animate, self.duration, animComplete);
}
if(effect.old) {
if(effect.old.css) oldImage.css(effect.old.css);
if(effect.old.animate) oldImage.animate(effect.old.animate, self.duration, animComplete);
}
}
};
this.computeHeight = function(){
var theight = self.theight,
heightDiff = theight - 57,
caption = object.find('.slideshow-caption'),
capHeight = caption.text() ? caption.show().height() : 0,
bullHeight = object.find('.slideshow-bullets').height(),
height = self.height + heightDiff + bullHeight + capHeight;
object
.height(height + 120)
.find('.slideshow-wrapper')
.height(height + 65)
.find('.slideshow-files')
.height(self.height + 2)
.nextAll('.slideshow-title')
.height(theight);
};
this.construct = function(){
var imageBox = object.find('.slideshow-files');
self.requires = imageBox.html();
self.links = imageBox.find(' .gallerybox > div > .thumb a.image');
imageBox.html(self.links);
self.addTitles();
if(fullScreen)
imageBox.after($('<div>', {id: 'slideshow-loading'}).text(self.local.loading + '...'));
self.getSource();
};
this.decodeLink = function(elem){
return self.local.file + ':' + decodeURIComponent(elem.attr('href').split(':')[1].replace(/_/g, ' '));
};
this.fullScreen = function(){
var content = object.clone(),
toolbar = object.find('.gallery-slideshow-toolbar').clone().empty(),
option = {
imageWidth: 600,
imageHeight: 400
};
for(var o in option) {
if(!content.find('.' + o).length)
content.find('.slideshow-custom').append($('<div>').addClass(o));
content.find('.' + o).text(option[o]);
}
content.find('.gallery-slideshow-toolbar, .slideshow-navigator').remove();
content.find('.slideshow-bullets').empty();
content.find('.slideshow-files')
.css('opacity', 0)
.height(option.imageHeight)
.html(self.requires);
content.find('.slideshow-title').height(30);
content.css({
width: option.imageWidth,
height: option.imageHeight + 55
});
$('#ssDialog').remove();
var options = {
bgiframe: true,
draggable: false,
resizable: false,
width: option.imageWidth + 30,
height: option.imageHeight + 110,
modal: true
};
var $dialog = $('<div>', {id: 'ssDialog'});
$dialog
.css({
display: 'none',
overflow: 'visible'
})
.append(content);
$('body').append($dialog);
$dialog.dialog(options);
if ($.client.profile().name == 'msie') // for the cursed IE
$('html').scrollTop($('#ssDialog').offset().top - 120);
toolbar.css({
textAlign: 'center',
border: 'none'
});
var uiDialog = $dialog.parent();
uiDialog.find('.ui-dialog-title').replaceWith(toolbar);
var fs = new SlideShow(uiDialog, true);
fs.run();
};
this.getActive = function(){
return object.find('a.active').index();
};
this.getSource = function(){
var titles = [],
param = {
action: 'query',
format: 'json',
prop: 'imageinfo',
iiprop: 'url',
iiurlwidth: self.imageWidth,
iiurlheight: self.imageHeight
};
self.links.each(function(){
titles.push(self.decodeLink($(this)));
});
param.titles = titles.join('|');
$.getJSON('/w/api.php', param, function(res){
self.addImages(res);
})
};
this.play = function(){
clearInterval(self.timer);
object.find('.ui-icon-triangle-1-w').toggleClass('ui-icon-triangle-1-w ui-icon-stop')
.filter('button')
.attr('original-title', self.local.stop);
self.timer = setInterval(function(){
object.find('button.ui-icon-seek-prev').click();
}, self.delay);
};
this.setOptions = function(){
var options = {
currentEffect: object.find('.currentEffect').text() || self.local.verSliding,
imageHeight: parseInt(object.find('.imageHeight').text()) || 265,
imageWidth: parseInt(object.find('.imageWidth').text()) || 220,
duration: parseInt(object.find('.duration').text()) || 600,
delay: parseInt(object.find('.delay').text()) || 3000
};
for(var o in options)
self[o] = options[o];
};
this.showNavigator = function(){
var index = self.getActive(),
text = self.local.imageOf.replace('$1', index + 1).replace('$2', self.length);
object.find('.slideshow-navigator').text(text);
object.find('.slideshow-title').html(self.links.eq(index).data('title'));
object.find('.slideshow-bullets span')
.eq(index)
.toggleClass('ui-icon-radio-off ui-icon-bullet')
.siblings('.ui-icon-bullet')
.toggleClass('ui-icon-radio-off ui-icon-bullet');
};
this.run = function(){
self.setOptions();
self.construct();
self.buttons.create();
};
this.stop = function(){
clearInterval(self.timer);
object.find('.ui-icon-stop')
.toggleClass('ui-icon-triangle-1-w ui-icon-stop')
.filter('button')
.attr('original-title', self.local.play)
.blur();
}
};
SlideShow.prototype.local = {
direction: 'rtl',
showFullScreen: 'צפיה בתמונות מוגדלות',
firstImage: 'לתמונה הראשונה',
prevImage: 'לתמונה הקודמת',
play: 'הפעלת המצגת',
nextImage: 'לתמונה הבאה',
lastImage: 'לתמונה האחרונה',
help: 'עזרה',
file: 'קובץ',
helpPage: 'עזרה:מצגת תמונות',
horizSliding: 'החלקה אנכית',
verSliding: 'החלקה אופקית',
fading: 'עמעום',
loading: 'טוען תמונות',
stop: 'סיום מצגת',
imageOf: 'תמונה $1 מתוך $2'
};
$(function(){
if ( $('.gallery-slideshow').length === 0 ) return;
mw.loader.using(['jquery.ui', 'jquery.tipsy'], function(){
$('.gallery-slideshow')
.each(function(){
var slide = new SlideShow($(this));
slide.run();
})
.on('click', function(){
$('.gallery-slideshow.selected').removeClass('selected');
$(this).addClass('selected');
});
$(document).keydown(function(event){
var code = event.keyCode,
$dialog = $('#ssDialog'),
$elem = $dialog.is(':visible') ? $dialog.prev() : $('.gallery-slideshow.selected'); // is full screen?
if((code != 37 && code != 39) || !mw.config.get('wgIsArticle') || !$elem.length)
return;
if(code == 37)
$elem.find('button.ui-icon-seek-prev').click();
else
$elem.find('button.ui-icon-seek-next').click();
return false;
})
})
});
importStylesheet('Mediawiki:SlideShow.css');
}