מדיה ויקי: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'); }