MediaWiki:Gadget-Gallerypreview.js
Σημείωση: μετά την δημοσίευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.
- Firefox / Safari: Κρατήστε πατημένο το Shift κάνοντας ταυτόχρονα κλικ στο κουμπί Ανανέωση ή πιέστε Ctrl-F5 ή Ctrl-R (⌘-R σε Mac)
- Google Chrome: Πιέστε Ctrl-Shift-R (⌘-Shift-R σε Mac)
- Internet Explorer / Edge: Κρατήστε πατημένο το Ctrl κάνοντας ταυτόχρονα κλικ στο κουμπί Ανανέωση, ή πιέστε Ctrl-F5
- Opera: Πιέστε Ctrl-F5.
/*
JavaScript-based gallery preview using query.php
Version 0.2
(c) 2007 by Magnus Manske
Released under GPL
*/
var gp_div, gp_head, gp_status;
var gp_xmlobjects;
var gp_cat_object;
var gp_cat_object2;
var gp_image_xml;
var gp_counter;
var gp_left;
var gp_found;
var gp_found2;
var gp_size = 75;
var gp_maxw;
// Avoid license categories etc.
var gp_avoid_cats = new Array(
'CC-',
'PD-',
'PD ',
'GPL',
'Self',
'GFDL',
'Copyrighted free use',
'Media with locations',
'Deletion',
'Incomplete deletion',
'Flickr review needed',
'Flickr images needing human review',
'User-created GFDL images',
'Images without source',
'Images that should use vector graphics',
'STOP!!!! DO NOT DELETE THIS IMAGE TILL YOU REPLACE IT IN THE WIKIMEDIA LOGO MOSAIC',
'Wikimedia logo mosaic/'
);
// Install onload handler, which will display the link to start the script
if( mw.config.get('wgNamespaceNumber') == 6 && mw.config.get('wgAction') == 'view' ) {
onDOMComplete( this, init_gallery_preview );
/*
if ( window.addEventListener ) {
window.addEventListener( 'load', init_gallery_preview, false );
} else if ( window.attachEvent ) {
window.attachEvent( 'onload', init_gallery_preview );
}
*/
}
// Onload handler
// Adds div section with id "gallerypreview"
function init_gallery_preview() {
gp_maxw = ( gp_size + 10 ) * 3;
file_div = document.getElementById( 'file' );
var dummy = document.createElement( 'div' );
file_div.insertBefore( dummy, file_div.firstChild );
dummy.innerHTML = '<div id="gallerypreview_container" style="border:1px solid #AAAAAA;float:right;max-width:' + gp_maxw + 'px;width:' + gp_maxw + 'px">' +
'<div id="gp_head" style="background-color:#AAAAFF;padding:2px;border:1px solid #AAAAAA;display:block;"><font color="#FFFF99">Loading...</font></div>' +
'<div id="gallerypreview" style="display:block;width:' + gp_maxw + 'px"></div>' +
'<div id="gp_status" style="border:1px solid #AAAAAA;padding:2px;"></div>' +
'</div>';
gp_div = document.getElementById( 'gallerypreview' );
while ( gp_div.firstChild ) {
gp_div.removeChild ( gp_div.firstChild );
}
gp_maxw -= 2;
setTimeout( 'run_gallerypreview()', 10 );
}
// Handler to toggle the listing of hits for a single language/project
function toggle_id( id ) {
var e = document.getElementById( id );
if ( e.style.display == 'none' ) {
e.style.display = 'block';
} else {
e.style.display = 'none';
}
}
// Helper function for toggle_all()
function getElementsByClass( searchClass, node, tag ) {
var classElements = new Array();
if ( node == null ) {
node = document;
}
if ( tag == null ) {
tag = '*';
}
var els = node.getElementsByTagName( tag );
var elsLen = els.length;
var pattern = new RegExp( '(^|\\s)' + searchClass + '(\\s|$)' );
for ( i = 0, j = 0; i < elsLen; i++ ) {
if ( pattern.test( els[i].className ) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
// Handler to toggle the listing of hits for all languages/projects
function toggle_all() {
var newstate = '';
var els = getElementsByClass( 'checkusage_item', checkusage_footer, '*' );
for ( var i = 0; i < els.length; i++ ) {
if ( newstate == '' ) {
if ( els[i].style.display == 'none' ) {
newstate = 'block';
} else {
newstate = 'none';
}
}
els[i].style.display = newstate;
}
}
function gp_check_done() {
for ( var i = 0; i < gp_xmlobjects.length; i++ ) {
if ( gp_xmlobjects[i].running ) {
return;
}
}
for ( var i = 0; i < gp_image_xml.length; i++ ) {
if ( gp_image_xml[i].running ) {
return;
}
}
gp_head.innerHTML = "<a href='#' style='float:right' onClick='toggle_id(\"gallerypreview\");'>Show/hide preview</a>Done.";
}
function get_thumbnail_url( url , width ) {
url = url.replace( '/commons/' , '/commons/thumb/' );
var iname = url.split( '/' ).pop();
url += '/' + width + 'px-' + iname;
gp_check_done();
return url;
}
function gp_image_callback() {
for ( var i = 0; i < gp_image_xml.length; i++ ) {
if ( gp_image_xml[i].readyState == 4 && gp_image_xml[i].running == true ) {
gp_image_xml[i].running = false;
var xml = gp_image_xml[i].responseXML;
var image = xml.getElementsByTagName( 'image' )[0];
var width = image.attributes.getNamedItem( 'width' ).value;
var height = image.attributes.getNamedItem( 'height' ).value;
var nw = gp_size;
var nh = nw / width * height;
var off = ' style="position:relative;overflow:hidden;';
if ( nh < gp_size ) {
nh = gp_size;
nw = nh / height * width;
var xoff = -( nw - gp_size ) / 2;
off += 'left:' + Math.floor( xoff ) + 'px;';
}
if ( nh > gp_size ) {
var yoff = -( nh - gp_size ) / 2;
off += 'top:' + Math.floor( yoff ) + 'px;';
}
off += '" ';
var url = get_thumbnail_url( image.attributes.getNamedItem( 'url' ).value, Math.floor( nw ) );
var target = document.getElementById( gp_image_xml[i].myid );
target.innerHTML = '<div style="overflow:hidden;width:75px;height:75px"><a href="/wiki/' +
gp_image_xml[i].image + '"><img border="0" ' + off + 'src="' + url + '"/></a></div>';
gp_check_done();
}
}
gp_check_done();
}
function gp_add_thumbnail( image ) {
var myid = 'gpid_' + gp_counter;
gp_counter += 1;
var ret = '<td id="' + myid + '" style="overflow:hidden;width:75px;height:75px;font-size:75%;text-align:left;color:white';
if ( image == '' ) {
ret += ';background-color:#BBBBBB">';
ret += 'No other files here';
} else {
ret += '">';
}
ret += '</td>';
if ( image == '' ) {
return ret;
}
var url = '//commons.wikimedia.org/w/query.php?what=imageinfo&format=xml&iiurl&titles=' + image;
var i = gp_image_xml.length;
gp_image_xml.push( new XMLHttpRequest() );
gp_image_xml[i].image = image;
gp_image_xml[i].myid = myid;
gp_image_xml[i].running = true;
gp_image_xml[i].onreadystatechange = gp_image_callback;
gp_image_xml[i].open( 'GET', url, true );
gp_image_xml[i].send( null );
gp_check_done();
return ret;
}
function categorypreview_callback() {
for ( var i = 0; i < gp_xmlobjects.length; i++ ) {
if ( gp_xmlobjects[i].readyState == 4 && gp_xmlobjects[i].running == true ) {
gp_xmlobjects[i].running = false;
var xml = gp_xmlobjects[i].responseXML;
var cat = gp_xmlobjects[i].category;
var ts = gp_xmlobjects[i].timestamp;
var out = '<div id="' + cat + '" style="background-color:#FFFF7E;width:' + gp_maxw + 'px">';
out += '<a href="//commons.wikimedia.org/wiki/Category:' + cat + '"><b>' + cat + '</b></a><br />';
var pages = xml.getElementsByTagName( 'page' );
var before = '00000000000000';
var after = '99999999999999';
var before_image = '';
var after_image = '';
for ( var i = 0; i < pages.length; i++ ) {
var page = pages[i];
var its = page.getElementsByTagName( 'timestamp' )[0].firstChild.nodeValue;
if ( its == '' ) {
continue; // No timestamp here
}
var image = page.getElementsByTagName( 'title' )[0].firstChild.nodeValue;
if ( its < ts && its > before ) {
before = its;
before_image = image;
}
if ( its > ts && its < after ) {
after = its;
after_image = image;
}
}
out += '<table border="0" style="width:100%"><tr>';
out += gp_add_thumbnail( before_image );
out += gp_add_thumbnail( after_image );
out += '<td style="color:#BBBBBB;background-color:white;text-align:center"><b>';
if ( pages.length == 500 ) {
out += '>500';
} else {
out += pages.length;
}
out += '</b><br />files in category</td>';
out += '</tr></table>';
out += '</div>';
gp_div.innerHTML += out;
gp_check_done();
}
}
gp_check_done();
}
function gallerypreview_callback() {
for ( var i = 0; i < gp_xmlobjects.length; i++ ) {
if ( gp_xmlobjects[i].readyState == 4 && gp_xmlobjects[i].running == true ) {
gp_xmlobjects[i].running = false;
var pn = mw.config.get('wgPageName').split( '_' ).join( ' ' );
var xml = gp_xmlobjects[i].responseXML;
var gal = gp_xmlobjects[i].gallery;
var out = '<div id="' + gal + '" style="background-color:#BCED91;width:' + gp_maxw + 'px">';
out += '<a href="//commons.wikimedia.org/wiki/' + gal + '"><b>' + gal + '</b></a><br />';
var pages = xml.getElementsByTagName( 'im' );
var before_image = '';
var after_image = '';
for ( var i = 0; i < pages.length; i++ ) {
var page = pages[i];
var image = page.getAttribute( 'title' );
if ( image > before_image && image < pn ) {
before_image = image;
}
if ( ( after_image == '' || image < after_image ) && image > pn ) {
after_image = image;
}
}
out += '<table border="0" style="width:100%"><tr>';
out += gp_add_thumbnail( before_image );
out += gp_add_thumbnail( after_image );
out += '<td style="color:#BBBBBB;background-color:white;text-align:center"><b>';
if ( pages.length == 500 ) {
out += '>500';
} else {
out += pages.length;
}
out += '</b><br />files in gallery</td>';
out += '</tr></table>';
out += '</div>';
gp_div.innerHTML += out;
gp_check_done();
}
}
gp_check_done();
}
// Prepares a new query and adds it to the list
function add_categorypreview_task( category, timestamp ) {
category = category.split( ':' );
category.shift();
category = category.join( ':' );
if ( timestamp == '' ) {
return; // No timestamp, no point in looking further
}
for ( var i = 0; i < gp_avoid_cats.length; i++ ) {
var s = gp_avoid_cats[i];
if ( category.substr( 0, s.length ) == s ) {
return;
}
}
var url = '//commons.wikimedia.org/w/query.php?what=category&cplimit=500&format=xml&cpextended&cpnamespace=6&cptitle=' + encodeURIComponent( category );
var i = gp_xmlobjects.length;
gp_left = gp_left + 1;
gp_found = true;
gp_xmlobjects.push( new XMLHttpRequest() );
gp_xmlobjects[i].gallery = '';
gp_xmlobjects[i].category = category;
gp_xmlobjects[i].timestamp = timestamp;
gp_xmlobjects[i].onreadystatechange = categorypreview_callback;
gp_xmlobjects[i].running = true;
gp_xmlobjects[i].open( 'GET', url, true );
gp_xmlobjects[i].send( null );
}
// Prepares a new query and adds it to the list
function add_gallerypreview_task( gallery ) {
for ( var i = 0; i < gp_avoid_cats.length; i++ ) {
var s = gp_avoid_cats[i];
if ( gallery.substr( 0, s.length ) == s ) {
return;
}
}
var url = '//commons.wikimedia.org/w/api.php?format=xml&action=query&prop=images&titles=' + encodeURIComponent( gallery );
var i = gp_xmlobjects.length;
gp_left = gp_left + 1;
gp_found2 = true;
gp_xmlobjects.push( new XMLHttpRequest() );
gp_xmlobjects[i].gallery = gallery;
gp_xmlobjects[i].category = '';
gp_xmlobjects[i].onreadystatechange = gallerypreview_callback;
gp_xmlobjects[i].running = true;
gp_xmlobjects[i].open( 'GET', url, true );
gp_xmlobjects[i].send( null );
}
function handle_category_list() {
if ( gp_cat_object.readyState == 4 ) {
var xml = gp_cat_object.responseXML;
var cps = xml.getElementsByTagName( 'cl' );
for ( var i = 0; i < cps.length; i++ ) {
var il = cps[i];
var ns = il.getAttribute( 'ns' );
var ts = il.getAttribute( 'timestamp' );
var cat = il.firstChild.nodeValue;
if ( ns != null && ns != '14' ) {
continue; // Not a category. Strange.
}
add_categorypreview_task( cat, ts );
}
if ( gp_found == false ) {
gp_status.innerHTML += '<div style="color:CD0000">No non-trivial categories found. <a href="//commons.wikimedia.org/wiki/Categories#Categorizing_your_uploads">Please add some</a>.</div>';
}
}
}
function handle_gallery_list() {
if ( gp_cat_object2.readyState == 4 ) {
var xml = gp_cat_object2.responseXML;
var ils = xml.getElementsByTagName( 'il' );
for ( var i = 0; i < ils.length; i++ ) {
var il = ils[i];
var ns = il.getAttribute( 'ns' );
var gallery = il.firstChild.nodeValue;
if ( ns != null && ns != '0' ) {
continue; // Not gallery namespace
}
add_gallerypreview_task( gallery );
}
if ( gp_found2 == false ) {
gp_status.innerHTML += '<div style="color:#CD0000">No galleries found.</div>';
}
}
}
function gp_get_category_list( page ) {
gp_cat_object = new XMLHttpRequest();
var url = '//commons.wikimedia.org/w/query.php?what=categories&clextended&format=xml&titles=' + page;
gp_cat_object.onreadystatechange = handle_category_list;
gp_cat_object.open( 'GET', url, true );
gp_cat_object.send( null );
}
function gp_get_gallery_list( page ) {
gp_cat_object2 = new XMLHttpRequest();
var url = '//commons.wikimedia.org/w/query.php?format=xml&what=imagelinks&titles=' + page;
gp_cat_object2.onreadystatechange = handle_gallery_list;
gp_cat_object2.open( 'GET', url, true );
gp_cat_object2.send( null );
}
// Initializes the run of the script and prepares/starts the queries
function run_gallerypreview() {
gp_head = document.getElementById( 'gp_head' );
gp_status = document.getElementById( 'gp_status' );
gp_counter = 0;
gp_left = 0;
gp_found = false;
gp_found2 = false;
gp_div.style.width = '250px';
gp_div.style.border = '1px solid #AAAAAA';
gp_image_xml = new Array();
// gp_head.innerHTML = '';
gp_xmlobjects = new Array();
gp_get_gallery_list( mw.config.get('wgPageName') );
gp_get_category_list( mw.config.get('wgPageName') );
}
/**
* DOMComplete - Load Event
*
* Author: Diego Perini (diego.perini@gmail.com)
* Updated: 06/08/2006
* Version: 0.99.6-mini
*
* From http://javascript.nwbox.com/DOMComplete-MINI/DOMComplete-MINI.html
*/
function onDOMComplete( w, f ) {
var d = w.document, done = false;
w.$DOMC = f;
wait();
if ( ( /WebKit|KHTML|MSIE/i ).test( navigator.userAgent ) ) {
poll();
}
function load( e ) {
if ( !done ) {
done = true;
stop();
w.$DOMC( e );
}
}
function has( p ) {
return typeof d[p] != 'undefined';
}
function poll() {
if ( d.body !== null && d.getElementsByTagName ) {
if ( has( 'fileSize' ) && typeof d.fileSize != 'unknown' ) {
load( 'fileSize' );
}
if ( has( 'readyState' ) && ( /loaded|complete/ ).test( d.readyState ) ) {
load( 'readyState' );
}
}
if ( !done ) {
setTimeout( poll, 10 );
}
}
function stop() {
if ( typeof d.removeEventListener == 'function' ) {
d.removeEventListener( 'DOMContentLoaded', load, false );
}
}
function wait() {
if ( typeof d.addEventListener == 'function' ) {
d.addEventListener( 'DOMContentLoaded', load, false );
}
var oldonload = w.onload;
w.onload = function( e ) {
if ( typeof oldonload == 'function' ) {
oldonload();
}
load( e || this.event );
};
}
}