<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://archiv0.vobs.at/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-GalleryDetails.js</id>
	<title>MediaWiki:Gadget-GalleryDetails.js - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://archiv0.vobs.at/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-GalleryDetails.js"/>
	<link rel="alternate" type="text/html" href="https://archiv0.vobs.at/index.php?title=MediaWiki:Gadget-GalleryDetails.js&amp;action=history"/>
	<updated>2026-06-13T07:11:58Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Matura Wiki</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://archiv0.vobs.at/index.php?title=MediaWiki:Gadget-GalleryDetails.js&amp;diff=3349&amp;oldid=prev</id>
		<title>Porod: 1 Version importiert: gallery</title>
		<link rel="alternate" type="text/html" href="https://archiv0.vobs.at/index.php?title=MediaWiki:Gadget-GalleryDetails.js&amp;diff=3349&amp;oldid=prev"/>
		<updated>2015-07-21T11:35:11Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert: gallery&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
   Gallery details - reformat galleries to have one image below the next, and display extended image&lt;br /&gt;
   information next to them. Works also on categories and Special:NewFiles. On Special:NewFiles, it&lt;br /&gt;
   runs automatically unless you define&lt;br /&gt;
&lt;br /&gt;
   var gallery_details_newfiles_run = false;&lt;br /&gt;
&lt;br /&gt;
   in your monobook.js or other skin-specific JS file.&lt;br /&gt;
&lt;br /&gt;
   Original version written by Magnus Manske, with some partial fixes by others.&lt;br /&gt;
   License of original: unknown.&lt;br /&gt;
&lt;br /&gt;
   Complete rewrite January 2009 by User:Lupo. &lt;br /&gt;
   Author: [[User:Lupo]], January 2009&lt;br /&gt;
   License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)&lt;br /&gt;
*/&lt;br /&gt;
if (typeof (GalleryDetails) == 'undefined') { // Guard against double imports&lt;br /&gt;
&lt;br /&gt;
importScript ('MediaWiki:Utilities.js');  // Generally useful operations&lt;br /&gt;
importScript ('MediaWiki:ImageLinks.js'); // Useful img links (Tineye search, del links for admins)&lt;br /&gt;
&lt;br /&gt;
if (typeof (gallery_details_newfiles_run) == 'undefined')&lt;br /&gt;
  var gallery_details_newfiles_run = true;&lt;br /&gt;
&lt;br /&gt;
if (typeof (gallery_details_close_windows) == 'undefined')&lt;br /&gt;
  var gallery_details_close_windows = false;&lt;br /&gt;
&lt;br /&gt;
var gallery_details_good_tags = [&lt;br /&gt;
 &amp;quot;GFDL&amp;quot;,&lt;br /&gt;
 &amp;quot;CC-&amp;quot;,&lt;br /&gt;
 &amp;quot;Cc-&amp;quot;,&lt;br /&gt;
 &amp;quot;PD&amp;quot;,&lt;br /&gt;
 &amp;quot;Pd&amp;quot;,&lt;br /&gt;
 &amp;quot;Public domain&amp;quot;,&lt;br /&gt;
 &amp;quot;Copyrighted free use&amp;quot;,&lt;br /&gt;
 &amp;quot;Attribution&amp;quot;,&lt;br /&gt;
 &amp;quot;Images requiring attribution&amp;quot;,&lt;br /&gt;
 &amp;quot;FAL&amp;quot;,&lt;br /&gt;
 &amp;quot;UK Government images&amp;quot;,&lt;br /&gt;
 &amp;quot;User-created GFDL images&amp;quot;,&lt;br /&gt;
 &amp;quot;Items with OTRS permission confirmed&amp;quot;,&lt;br /&gt;
 &amp;quot;GPL&amp;quot;,&lt;br /&gt;
 &amp;quot;LGPL&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
 &lt;br /&gt;
var gallery_details_action_tags = [&lt;br /&gt;
 &amp;quot;Flickr review needed&amp;quot;,&lt;br /&gt;
 &amp;quot;Flickr images needing&amp;quot;,&lt;br /&gt;
 &amp;quot;Recent unfree Flickr images&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
 &lt;br /&gt;
var gallery_details_bad_tags = [&lt;br /&gt;
 &amp;quot;Copyright violations&amp;quot;,&lt;br /&gt;
 &amp;quot;Images without &amp;quot;,&lt;br /&gt;
 &amp;quot;Media without &amp;quot;,&lt;br /&gt;
 &amp;quot;Media missing &amp;quot;,&lt;br /&gt;
 &amp;quot;Unknown as of &amp;quot;,&lt;br /&gt;
 &amp;quot;Deletion requests&amp;quot;,&lt;br /&gt;
 &amp;quot;Other speedy deletions&amp;quot;,&lt;br /&gt;
 &amp;quot;Possibly unfree&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
var gallery_details_sidebar =&lt;br /&gt;
{ text : 'Gallery details'&lt;br /&gt;
 ,tip  : 'Display info on images'&lt;br /&gt;
}; &lt;br /&gt;
var gallery_details_nom_buttons = [{&lt;br /&gt;
            label:'Deletion\xa0request...',&lt;br /&gt;
            tip: 'Nominate the file for deletion and notify uploader',&lt;br /&gt;
            del:true&lt;br /&gt;
   &lt;br /&gt;
         }, {&lt;br /&gt;
            label: 'Copyvio...',&lt;br /&gt;
            tip: 'Mark as copyvio (prompting for a reason) and notify uploader',&lt;br /&gt;
            tag: '{{copyvio|1=%PARAMETER%}}',&lt;br /&gt;
            talk_tag: '{{subst:copyvionote|1=%FILE%}}',&lt;br /&gt;
            img_summary: 'Marking as possible copyvio because %PARAMETER%',&lt;br /&gt;
            talk_summary: 'Notification of possible copyright violation',&lt;br /&gt;
            prompt_text: &amp;quot;Why is this file a copyright violation?&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
         }, {&lt;br /&gt;
            label: 'No\xa0source',&lt;br /&gt;
            tip  : 'Mark as missing source info and notify uploader',&lt;br /&gt;
            tag: '{{subst:nsd}}',&lt;br /&gt;
            talk_tag: '{{subst:image source|1=%FILE%}}',&lt;br /&gt;
            img_summary: 'File has no source',&lt;br /&gt;
            talk_summary: '%FILE% does not have a source'&lt;br /&gt;
 &lt;br /&gt;
         }, {&lt;br /&gt;
            label: 'No\xa0permission',&lt;br /&gt;
            tip  : 'Mark as missing permission and notify uploader',&lt;br /&gt;
            tag: '{{subst:npd}}',&lt;br /&gt;
            talk_tag: '{{subst:image permission|1=%FILE%}}',&lt;br /&gt;
            img_summary: 'Missing permission',&lt;br /&gt;
            talk_summary: 'Please send permission for %FILE% to [[COM:OTRS|OTRS]]'&lt;br /&gt;
 &lt;br /&gt;
         }, {&lt;br /&gt;
            label: 'No\xa0license',&lt;br /&gt;
            tip  : 'Mark as missing license info and notify uploader',&lt;br /&gt;
            tag: '{{subst:nld}}',&lt;br /&gt;
            talk_tag: '{{subst:image license|1=%FILE%}}',&lt;br /&gt;
            img_summary: 'Missing license',&lt;br /&gt;
            talk_summary: '%FILE% does not have a license'&lt;br /&gt;
 &lt;br /&gt;
         }];&lt;br /&gt;
&lt;br /&gt;
// titleFromLink&lt;br /&gt;
//   Extract a page title from a href of a link node. Works for both types of hrefs:&lt;br /&gt;
//   http://foo.wikipedia.org/w/index.php?title=PageName and also /wiki/PageName&lt;br /&gt;
//&lt;br /&gt;
// Parameters&lt;br /&gt;
//   node    DOM node   The link node from which the page name is to be extracted&lt;br /&gt;
 &lt;br /&gt;
function titleFromLink (node)&lt;br /&gt;
{&lt;br /&gt;
  if (!node || typeof (node.getAttribute) != 'function') return &amp;quot;&amp;quot;;&lt;br /&gt;
  return titleFromHref (node.getAttribute ('href', 2));&lt;br /&gt;
  // The &amp;quot;, 2&amp;quot; is for IE. IE sometimes has problems with encoded UTF-8 characters: using any other&lt;br /&gt;
  // way to get the href, it insists to decode the value, but does do so wrongly. For more info,&lt;br /&gt;
  // see http://commons.wikimedia.org/wiki/MediaWiki_talk:Gadget-HotCat.js/Archive01#Questions&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Localization hook. Check [[MediaWiki:Gadget-GalleryDetails.js/de]] for an example.&lt;br /&gt;
if (mw.config.get('wgUserLanguage') != 'en') importScript ('MediaWiki:Gadget-GalleryDetails.js/' + mw.config.get('wgUserLanguage'));&lt;br /&gt;
&lt;br /&gt;
var GalleryDetailsViewer = function () {};&lt;br /&gt;
GalleryDetailsViewer.prototype =&lt;br /&gt;
{&lt;br /&gt;
  display : function (model) // Redefine this in children&lt;br /&gt;
  {&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  toggle : function (model) // Redefine this in children&lt;br /&gt;
  {&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  // Default implementations&lt;br /&gt;
  &lt;br /&gt;
  check_info : function (info)&lt;br /&gt;
  {&lt;br /&gt;
    if (!info.done)&lt;br /&gt;
      return document.createTextNode ('Request failed.');&lt;br /&gt;
    else if (!info.page || typeof (info.page.missing) != 'undefined')&lt;br /&gt;
      return document.createTextNode ('File not found?!');&lt;br /&gt;
    &lt;br /&gt;
    return null;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  get_exif_data : function (info, keys)&lt;br /&gt;
  {&lt;br /&gt;
    if (!info || !info.page || !info.page.imageinfo) return null;&lt;br /&gt;
    if (!keys) keys = ['Model', 'Make', 'DateTime', 'DateTimeOriginal'];&lt;br /&gt;
&lt;br /&gt;
    function find_metadata (list, keys)&lt;br /&gt;
    {&lt;br /&gt;
      if (!list || list.length == 0) return null;&lt;br /&gt;
      var found = 0;&lt;br /&gt;
      var result = {};&lt;br /&gt;
      var all = !keys || keys.length == 0;&lt;br /&gt;
      for (var i = 0; i &amp;lt; list.length &amp;amp;&amp;amp; (all || found &amp;lt; keys.length); i++) {&lt;br /&gt;
        if (all) {&lt;br /&gt;
          result[list[i].name] = list[i].value;&lt;br /&gt;
          found++;&lt;br /&gt;
        } else {&lt;br /&gt;
          for (var j = 0; j &amp;lt; keys.length; j++) {&lt;br /&gt;
            if (list[i].name == keys[j]) {&lt;br /&gt;
              result[list[i].name] = list[i].value;&lt;br /&gt;
              found++;&lt;br /&gt;
              break;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (found == 0) return null; else return result;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    var imagedata = info.page.imageinfo[0];&lt;br /&gt;
    var result = [];&lt;br /&gt;
    var exif = find_metadata (imagedata.metadata, keys);&lt;br /&gt;
    var span = null;&lt;br /&gt;
    if (exif) {&lt;br /&gt;
      if (exif['Model']) {&lt;br /&gt;
        if (exif['Make'] &amp;amp;&amp;amp; exif['Model'].indexOf (exif['Make']) &amp;gt;= 0) exif['Make'] = null;&lt;br /&gt;
        span = document.createElement ('span');&lt;br /&gt;
        span.appendChild (document.createTextNode ('Camera: '));&lt;br /&gt;
        if (exif['Make']) span.appendChild (document.createTextNode (exif['Make'] + ' '));&lt;br /&gt;
        var a = makeRawLink (&lt;br /&gt;
                    exif['Model']&lt;br /&gt;
                  , 'http://en.wikipedia.org/wiki/' + encodeURI (exif['Model'])&lt;br /&gt;
                );&lt;br /&gt;
        a.className = 'external';&lt;br /&gt;
        a.style.background = 'none';&lt;br /&gt;
        a.style.padding = '0';&lt;br /&gt;
        span.appendChild (a);&lt;br /&gt;
        result[result.length] = span;&lt;br /&gt;
      }&lt;br /&gt;
      var time = exif['DateTime'] || exif['DateTimeOriginal'] || null;&lt;br /&gt;
      if (time) {&lt;br /&gt;
        span = document.createElement ('span');&lt;br /&gt;
        span.appendChild (document.createTextNode ('EXIF time: ' + time));&lt;br /&gt;
        result[result.length] = span;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  create_details_box : function (info)&lt;br /&gt;
  {&lt;br /&gt;
    var page  = info.page;&lt;br /&gt;
    var title = info.name;&lt;br /&gt;
    var imagedata = page.imageinfo[0];&lt;br /&gt;
    var users = info.users;&lt;br /&gt;
    var size = imagedata.size;&lt;br /&gt;
    var width = imagedata.width;&lt;br /&gt;
    var height = imagedata.height;&lt;br /&gt;
    var url = imagedata.url;&lt;br /&gt;
    var comment = imagedata.comment;&lt;br /&gt;
    var timestamp = imagedata.timestamp;&lt;br /&gt;
&lt;br /&gt;
    // Output generation: image info&lt;br /&gt;
    var t = document.createElement ('span');&lt;br /&gt;
    t.appendChild (document.createTextNode (width + &amp;quot;×&amp;quot; + height + &amp;quot;px&amp;quot;));&lt;br /&gt;
    if (width &amp;lt; 600 &amp;amp;&amp;amp; height &amp;lt; 600 &amp;amp;&amp;amp; width &amp;gt; 0 &amp;amp;&amp;amp; height &amp;gt; 0) t.style.color = 'red';&lt;br /&gt;
    var ndiv = document.createElement ('div');&lt;br /&gt;
    ndiv.className = 'gallery_details_box';&lt;br /&gt;
    ndiv.style.border = '3px solid '&lt;br /&gt;
      + (info.status == GalleryDetails.BAD_FILE&lt;br /&gt;
         ? 'red'&lt;br /&gt;
         : (info.status == GalleryDetails.GOOD_FILE ? 'green' : 'yellow')&lt;br /&gt;
        );&lt;br /&gt;
    ndiv.style.margin = &amp;quot;5px&amp;quot;;&lt;br /&gt;
    ndiv.style.padding = &amp;quot;5px&amp;quot;;&lt;br /&gt;
    ndiv.appendChild (this.make_wiki_link (page.title));&lt;br /&gt;
    ndiv.appendChild (document.createTextNode (' ('));&lt;br /&gt;
    ndiv.appendChild (&lt;br /&gt;
      makeRawLink (&lt;br /&gt;
          'edit'&lt;br /&gt;
        , mw.config.get('wgArticlePath').replace ('$1', encodeURI (page.title) + '?action=edit')&lt;br /&gt;
      )&lt;br /&gt;
    );&lt;br /&gt;
    ndiv.appendChild (document.createTextNode (', '));&lt;br /&gt;
    ndiv.appendChild (&lt;br /&gt;
      makeRawLink (&lt;br /&gt;
          'hist'&lt;br /&gt;
        , mw.config.get('wgArticlePath').replace ('$1', encodeURI (page.title) + '?action=history')&lt;br /&gt;
      )&lt;br /&gt;
    );&lt;br /&gt;
    ndiv.appendChild (document.createTextNode (')'));&lt;br /&gt;
    ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
    if (timestamp) {&lt;br /&gt;
      timestamp = timestamp.replace ('T', '\xa0').replace ('Z', '\xa0(UTC)');&lt;br /&gt;
      ndiv.appendChild (document.createTextNode (timestamp));&lt;br /&gt;
      ndiv.appendChild (document.createElement ('br'));      &lt;br /&gt;
    }&lt;br /&gt;
    ndiv.appendChild (t);&lt;br /&gt;
    if (page.imageinfo.length &amp;gt; 1) {&lt;br /&gt;
      t = document.createElement ('b');&lt;br /&gt;
      t.appendChild (document.createTextNode (' (Re-upload)'));&lt;br /&gt;
      ndiv.appendChild (t);&lt;br /&gt;
    }&lt;br /&gt;
    ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
    if (imagedata.metadata) {&lt;br /&gt;
      var exif = this.get_exif_data (info);&lt;br /&gt;
      if (exif &amp;amp;&amp;amp; exif.length &amp;gt; 0) {&lt;br /&gt;
        for (var i = 0; i &amp;lt; exif.length; i++) {&lt;br /&gt;
          ndiv.appendChild (exif[i]);&lt;br /&gt;
          ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    ndiv.appendChild (this.make_wiki_link ('File_talk:' + title));&lt;br /&gt;
    ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
    var user = this.create_user_link (ndiv, users[0]);&lt;br /&gt;
    if ((user == 'Rotatebot' || user == 'FlickreviewR' || user == 'Cropbot' || user == 'Picasa Review Bot') &amp;amp;&amp;amp; users.length &amp;gt; 1) {&lt;br /&gt;
      ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
      t = document.createElement ('b');&lt;br /&gt;
      t.appendChild (document.createTextNode ('Real: '));&lt;br /&gt;
      ndiv.appendChild (t);&lt;br /&gt;
      user = this.create_user_link (ndiv, users[1]);&lt;br /&gt;
    }&lt;br /&gt;
    if (info.categories &amp;amp;&amp;amp; info.categories.length &amp;gt; 0) {&lt;br /&gt;
      ndiv.appendChild (document.createElement ('hr'));            &lt;br /&gt;
      for (var i = 0; i &amp;lt; info.categories.length; i++) {&lt;br /&gt;
        ndiv.appendChild (this.make_wiki_link (info.categories[i]));&lt;br /&gt;
        if (i+1 &amp;lt; info.categories.length) ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    var text = page.revisions;&lt;br /&gt;
    if (text) text = text[0];&lt;br /&gt;
    this.create_action_links (ndiv, page.title, user, text ? text.revid : null, url);&lt;br /&gt;
    return ndiv;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  create_user_link : function (box, usernames)&lt;br /&gt;
  {&lt;br /&gt;
    var user = usernames.user;&lt;br /&gt;
    var proxy = null;&lt;br /&gt;
&lt;br /&gt;
    if (usernames.real) {&lt;br /&gt;
      proxy = user; user = usernames.real;&lt;br /&gt;
    }&lt;br /&gt;
    box.appendChild (this.make_wiki_link ('User:' + user));&lt;br /&gt;
    box.appendChild (document.createTextNode (' ('));&lt;br /&gt;
    box.appendChild (this.make_wiki_link ('User_talk:' + user, 'talk'));&lt;br /&gt;
    box.appendChild (document.createTextNode (', '));&lt;br /&gt;
    box.appendChild (&lt;br /&gt;
      makeRawLink (&lt;br /&gt;
          'logs'&lt;br /&gt;
        , mw.config.get('wgArticlePath').replace ('$1', 'Special:Log') + '?user=' + encodeURIComponent (user)&lt;br /&gt;
      )&lt;br /&gt;
    );&lt;br /&gt;
    box.appendChild (document.createTextNode (')'));&lt;br /&gt;
    if (proxy) {&lt;br /&gt;
      box.appendChild (document.createTextNode (' via\xa0'));&lt;br /&gt;
      box.appendChild (this.make_wiki_link ('User:' + proxy, proxy));&lt;br /&gt;
      box.appendChild (document.createTextNode (' ('));&lt;br /&gt;
      box.appendChild (&lt;br /&gt;
        makeRawLink (&lt;br /&gt;
            'logs'&lt;br /&gt;
          , mw.config.get('wgArticlePath').replace ('$1', 'Special:Log') + '?user='&lt;br /&gt;
            + encodeURIComponent (proxy)&lt;br /&gt;
        )&lt;br /&gt;
      );&lt;br /&gt;
      box.appendChild (document.createTextNode (')'));&lt;br /&gt;
    }&lt;br /&gt;
    return user;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  create_page_box : function (info)&lt;br /&gt;
  {&lt;br /&gt;
    var text = info.page.revisions[0];&lt;br /&gt;
    if (!text) return null;&lt;br /&gt;
    // Output generation: image page text &lt;br /&gt;
    text = text[&amp;quot;*&amp;quot;];&lt;br /&gt;
    if (!text) return document.createTextNode ('\xa0');&lt;br /&gt;
    var ndiv = document.createElement ('div');&lt;br /&gt;
    ndiv.className = 'gallery_details_page_box';&lt;br /&gt;
    ndiv.style.margin = &amp;quot;5px&amp;quot;;&lt;br /&gt;
    ndiv.style.padding = &amp;quot;5px&amp;quot;;&lt;br /&gt;
    ndiv.style.fontSize = &amp;quot;8pt&amp;quot;;&lt;br /&gt;
    ndiv.style.lineHeight = &amp;quot;9pt&amp;quot;;&lt;br /&gt;
    text = text.split('\n');&lt;br /&gt;
    for (var i = 0; i &amp;lt; text.length; i++) {&lt;br /&gt;
      var s = text[i];&lt;br /&gt;
      var url_re = /^(.*?)(https?:\/\/[^ \]\}&amp;quot;\|&amp;lt;]*)(.*)$/; // &amp;quot; Fix syntax coloring&lt;br /&gt;
      while (s.length &amp;gt; 0) {&lt;br /&gt;
        var matches = url_re.exec (s);&lt;br /&gt;
        if (matches &amp;amp;&amp;amp; matches.length &amp;gt; 0) {&lt;br /&gt;
          if (matches[1].length &amp;gt; 0)&lt;br /&gt;
            ndiv.appendChild (document.createTextNode (matches[1]));&lt;br /&gt;
          var a = makeRawLink (matches[2], matches[2]);&lt;br /&gt;
          a.className = 'external';&lt;br /&gt;
          a.style.background = 'none';&lt;br /&gt;
          a.style.padding = '0';&lt;br /&gt;
          ndiv.appendChild (a);&lt;br /&gt;
          s = matches[3];&lt;br /&gt;
        } else {&lt;br /&gt;
          ndiv.appendChild (document.createTextNode (s));&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (i + 1 &amp;lt; text.length) ndiv.appendChild (document.createElement ('br'));&lt;br /&gt;
    }&lt;br /&gt;
    return ndiv;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  create_action_links :  function (ndiv, title, user, rev_id, img_url)&lt;br /&gt;
  {&lt;br /&gt;
    var tools = $('&amp;lt;div style=&amp;quot;font-size: small; background: #DDD;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');&lt;br /&gt;
&lt;br /&gt;
    $.each(gallery_details_nom_buttons, function (k, v) {&lt;br /&gt;
       var link = $('&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;' + v.tip + '&amp;quot;&amp;gt;'+v.label+'&amp;lt;/a&amp;gt;');&lt;br /&gt;
       if (v.del) {&lt;br /&gt;
         link.click(function(event) {&lt;br /&gt;
           event.preventDefault();&lt;br /&gt;
           AjaxQuickDelete.nominateForDeletion(title);&lt;br /&gt;
         });&lt;br /&gt;
       } else {&lt;br /&gt;
         link.click(function(event) {&lt;br /&gt;
           event.preventDefault();&lt;br /&gt;
           AjaxQuickDelete.insertTagOnPage(v.tag, v.img_summary, v.talk_tag, v.talk_summary, v.prompt_text, title);&lt;br /&gt;
         });&lt;br /&gt;
       }&lt;br /&gt;
       if (k&amp;gt;0) tools.append('\xa0| ');&lt;br /&gt;
       tools.append(link);&lt;br /&gt;
    });&lt;br /&gt;
    tools = tools.get(0);&lt;br /&gt;
    &lt;br /&gt;
    var additional_links = ImageLinks.get_links (title, user, rev_id, img_url);&lt;br /&gt;
    // If we have additional links, those from the first group may be added for anyone.&lt;br /&gt;
    if (additional_links &amp;amp;&amp;amp; additional_links.length &amp;gt; 0) {&lt;br /&gt;
      if (additional_links[0] &amp;amp;&amp;amp; additional_links[0].length &amp;gt; 0) {&lt;br /&gt;
        for (var i = 0; i &amp;lt; additional_links[0].length; i++) {&lt;br /&gt;
          tools.appendChild (document.createTextNode ('\xa0| '));&lt;br /&gt;
          tools.appendChild (additional_links[0][i]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (mw.config.get('wgUserGroups').join (' ').indexOf ('sysop') &amp;gt;= 0 &amp;amp;&amp;amp; additional_links.length &amp;gt; 1) {&lt;br /&gt;
        tools.appendChild (document.createElement ('hr'));&lt;br /&gt;
        tools.appendChild (document.createTextNode ('Quick deletions (without user notification)'));&lt;br /&gt;
        tools.appendChild (document.createElement ('br'));&lt;br /&gt;
        for (var i = 1; i &amp;lt; additional_links.length; i++) {&lt;br /&gt;
          if (additional_links[i]) {&lt;br /&gt;
            for (var j = 0; j &amp;lt; additional_links[i].length; j++) {&lt;br /&gt;
              if (j &amp;gt; 0) tools.appendChild (document.createTextNode ('\xa0| '));&lt;br /&gt;
              tools.appendChild (additional_links[i][j]);&lt;br /&gt;
            }&lt;br /&gt;
            if (i+1 &amp;lt; additional_links.length) tools.appendChild (document.createElement ('br'));&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    ndiv.appendChild (tools);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_wiki_link : function (title, text)&lt;br /&gt;
  {&lt;br /&gt;
    if (!text) text = title.replace (/_/g, ' ');&lt;br /&gt;
    var result =&lt;br /&gt;
      makeRawLink (&lt;br /&gt;
          text&lt;br /&gt;
        , mw.config.get('wgArticlePath').replace ('$1', encodeURI (title.replace (/ /g, '_')))&lt;br /&gt;
        , null&lt;br /&gt;
        , text);&lt;br /&gt;
    return result;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var GalleryDetailsTableViewer = function () {};&lt;br /&gt;
&lt;br /&gt;
GalleryDetailsTableViewer.prototype = new GalleryDetailsViewer;&lt;br /&gt;
GalleryDetailsTableViewer.prototype.display =&lt;br /&gt;
  function (model)&lt;br /&gt;
  {&lt;br /&gt;
    // Display the images in the model in a new table, one image per row.&lt;br /&gt;
    this.view = document.createElement ('table');&lt;br /&gt;
    this.view.className = 'gallery_details';&lt;br /&gt;
    this.view.style.display = 'none';&lt;br /&gt;
    model.root.parentNode.insertBefore (this.view, model.root);&lt;br /&gt;
    for (var i = 0; i &amp;lt; model.nof_images; i++) {&lt;br /&gt;
      var existing = model.image_list[i];&lt;br /&gt;
      if (!existing.box.parentNode) continue; // This image is no longer in the table?!&lt;br /&gt;
      var row = this.view.insertRow (-1);&lt;br /&gt;
      var cell = null;&lt;br /&gt;
      if (existing.box.nodeName.toLowerCase () == 'table') {&lt;br /&gt;
        cell = document.createElement ('td');&lt;br /&gt;
        cell.appendChild (existing.box.cloneNode (true));&lt;br /&gt;
        cell.colSpan = &amp;quot;2&amp;quot;;&lt;br /&gt;
        row.appendChild (cell);&lt;br /&gt;
        row = this.view.insertRow (-1);&lt;br /&gt;
      } else if (existing.box.nodeName.toLowerCase () == 'li') { // MW1.17&lt;br /&gt;
        cell = document.createElement('td');&lt;br /&gt;
        var toCopy = existing.box.firstChild;&lt;br /&gt;
        while (toCopy &amp;amp;&amp;amp; toCopy.nodeType != 1) toCopy = toCopy.nextSibling;&lt;br /&gt;
        if (toCopy) {&lt;br /&gt;
          cell.appendChild (toCopy.cloneNode (true));&lt;br /&gt;
          row.appendChild (cell);&lt;br /&gt;
        }&lt;br /&gt;
      } else { // pre MW1.17 gallery; existing.box.parentNode is a table cell&lt;br /&gt;
        cell = existing.box.parentNode.cloneNode (true);&lt;br /&gt;
        row.appendChild (cell);&lt;br /&gt;
      }&lt;br /&gt;
      cell = document.createElement ('td');&lt;br /&gt;
      var details      = this.check_info (existing);&lt;br /&gt;
      var page_content = null;&lt;br /&gt;
      if (!details) {&lt;br /&gt;
        details = this.create_details_box (existing);&lt;br /&gt;
        page_content = this.create_page_box (existing) || document.createTextNode ('No info found.');&lt;br /&gt;
      }&lt;br /&gt;
      if (!page_content) cell.colSpan = &amp;quot;2&amp;quot;;&lt;br /&gt;
      cell.appendChild (details);&lt;br /&gt;
      row.appendChild (cell);&lt;br /&gt;
      if (page_content) {&lt;br /&gt;
        cell = document.createElement ('td');&lt;br /&gt;
        cell.appendChild (page_content);&lt;br /&gt;
        row.appendChild (cell);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.toggle (model);&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
GalleryDetailsTableViewer.prototype.toggle = &lt;br /&gt;
  function (model)&lt;br /&gt;
  {&lt;br /&gt;
    x = model.root.style.display;&lt;br /&gt;
    model.root.style.display = this.view.style.display;&lt;br /&gt;
    this.view.style.display = x;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
var GalleryDetails = function () {this.initialize.apply (this, arguments);};&lt;br /&gt;
&lt;br /&gt;
GalleryDetails.ACTION_NEEDED = 0;&lt;br /&gt;
GalleryDetails.GOOD_FILE     = 1;&lt;br /&gt;
GalleryDetails.BAD_FILE      = 2;&lt;br /&gt;
&lt;br /&gt;
GalleryDetails.prototype =&lt;br /&gt;
{&lt;br /&gt;
  root           : null,&lt;br /&gt;
  image_list     : [],&lt;br /&gt;
  wrapper        : null,&lt;br /&gt;
  nof_images     : 0,&lt;br /&gt;
  handled        : -1,&lt;br /&gt;
  viewer         : null,&lt;br /&gt;
  &lt;br /&gt;
  injectSpinner: function (elementBefore, id) {&lt;br /&gt;
  	// Will be replaced once jQuery.spinner module is loaded&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  removeSpinner: function (id) {&lt;br /&gt;
  	// Will be replaced once jQuery.spinner module is loaded&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  initialize : function (root, id, is_single)&lt;br /&gt;
  {&lt;br /&gt;
    this.is_single  = is_single;&lt;br /&gt;
    this.root       = root;&lt;br /&gt;
    this.wrapper    = document.createElement ('div');&lt;br /&gt;
    this.wrapper.id = id;&lt;br /&gt;
    var spinner_anchor = document.createElement ('span');&lt;br /&gt;
    this.wrapper.appendChild (spinner_anchor);&lt;br /&gt;
    this.root.parentNode.insertBefore (this.wrapper, this.root);&lt;br /&gt;
    &lt;br /&gt;
    var existing = null;&lt;br /&gt;
    if (is_single)&lt;br /&gt;
      existing = window.jQuery(this.root).find('.gallerybox');&lt;br /&gt;
    else&lt;br /&gt;
      existing = window.jQuery(this.root).find('table.searchResultImage');&lt;br /&gt;
    if (!existing  || existing.length == 0) return;&lt;br /&gt;
    // Extract the names&lt;br /&gt;
    this.image_list = new Array ();&lt;br /&gt;
    for (var i = 0; i &amp;lt; existing.length; i++) {&lt;br /&gt;
      var this_title = this.title_from_box (existing[i]);&lt;br /&gt;
      if (this_title &amp;amp;&amp;amp; this_title.length &amp;gt; 0) {&lt;br /&gt;
        this.image_list[this.image_list.length] =&lt;br /&gt;
         {  name       : this_title.replace (/ /g, '_')&lt;br /&gt;
          , box        : existing[i]&lt;br /&gt;
          , done       : false&lt;br /&gt;
          , page       : null&lt;br /&gt;
          , categories : null&lt;br /&gt;
          , status     : GalleryDetails.ACTION_NEEDED&lt;br /&gt;
          , table      : existing[i]&lt;br /&gt;
          , users      : null&lt;br /&gt;
         };&lt;br /&gt;
      } else {&lt;br /&gt;
        var errorbox = window.jQuery(existing[i]).find('table.MediaTransformError');&lt;br /&gt;
        if (errorbox &amp;amp;&amp;amp; errorbox.length &amp;gt; 0) {&lt;br /&gt;
          errorbox[0].style.width = errorbox[0].parentNode.offsetWidth + 'px';&lt;br /&gt;
          errorbox[0].style.height = &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    this.nof_images = this.image_list.length;&lt;br /&gt;
    if (this.nof_images == 0) return;&lt;br /&gt;
    this.handled = 0;&lt;br /&gt;
    // Now start the query (or queries). We limit this to at most 50 filenames per request to avoid&lt;br /&gt;
    // hitting a server limit.&lt;br /&gt;
    var start = 0;&lt;br /&gt;
    var to_do = this.nof_images;&lt;br /&gt;
    this.injectSpinner (spinner_anchor, id);&lt;br /&gt;
    while (to_do &amp;gt; 0) {&lt;br /&gt;
      var chunk = 50;&lt;br /&gt;
      if (chunk &amp;gt; to_do) chunk = to_do;&lt;br /&gt;
      this.make_call (start, chunk);&lt;br /&gt;
      to_do = to_do - chunk;&lt;br /&gt;
      start = start + chunk;&lt;br /&gt;
    }      &lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  make_call : function (from, length)&lt;br /&gt;
  {&lt;br /&gt;
    // Get the filenames of images #from to #(from + length - 1)&lt;br /&gt;
    var titles = &amp;quot;&amp;quot;;&lt;br /&gt;
    for (var idx = from; idx &amp;lt; from + length; idx++) {&lt;br /&gt;
      if (this.image_list[idx].name &amp;amp;&amp;amp; this.image_list[idx].name.length &amp;gt; 0) {&lt;br /&gt;
        titles += (titles.length &amp;gt; 0 ? '|' : &amp;quot;&amp;quot;)&lt;br /&gt;
                  + 'File:' + encodeURIComponent (this.image_list[idx].name);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var this_obj = this;&lt;br /&gt;
    $.ajax({&lt;br /&gt;
      url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php'&lt;br /&gt;
     ,type: 'POST' // Avoid Get-request URL length limits&lt;br /&gt;
     ,data: 'format=json&amp;amp;action=query&amp;amp;prop=imageinfo|categories|revisions&amp;amp;iiprop=timestamp|user|comment|url|size|metadata'&lt;br /&gt;
      + '&amp;amp;rvdir=older&amp;amp;rvprop=ids|content&amp;amp;iilimit=2&amp;amp;cllimit=' + length * 10 + '&amp;amp;titles=' + titles&lt;br /&gt;
     ,dataType: 'json'&lt;br /&gt;
     ,success: function (json) { this_obj.add_info (json, from, length); }&lt;br /&gt;
     ,error: function () { this_obj.done (length); }&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  add_info : function (info, from, length)&lt;br /&gt;
  {&lt;br /&gt;
    if (info) {&lt;br /&gt;
      for (var i = from; i &amp;lt; from + length; i++) {&lt;br /&gt;
        this.image_list[i].done = true;&lt;br /&gt;
        var title = this.image_list[i].name; // No namespace prefix!&lt;br /&gt;
        if (!title || title.length == 0) continue;&lt;br /&gt;
&lt;br /&gt;
        // Search through the results to find this entry&lt;br /&gt;
        var page = null;&lt;br /&gt;
        for (var p in info.query.pages) {&lt;br /&gt;
          // Rm namespace for comparison&lt;br /&gt;
          info.query.pages[p].title = info.query.pages[p].title.replace (/ /g, '_');&lt;br /&gt;
          var colon = info.query.pages[p].title.indexOf (':');&lt;br /&gt;
          if (title == info.query.pages[p].title.substr (colon + 1)) {&lt;br /&gt;
            page = info.query.pages[p]; break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if (page) {&lt;br /&gt;
          this.image_list[i].page = page;&lt;br /&gt;
          // Category check&lt;br /&gt;
          if (typeof (page.missing) == 'undefined') {&lt;br /&gt;
            var catdata = page.categories;&lt;br /&gt;
            var categories = new Array();&lt;br /&gt;
            var goodcat = false;&lt;br /&gt;
            var badcat = false;&lt;br /&gt;
            var actioncat = false;&lt;br /&gt;
        &lt;br /&gt;
            if (catdata) {&lt;br /&gt;
              for (var cidx = 0 ; cidx &amp;lt; catdata.length ; cidx++) { &lt;br /&gt;
                var cat = catdata[cidx].title;&lt;br /&gt;
                goodcat = goodcat || this.cat_match (cat, gallery_details_good_tags);&lt;br /&gt;
                badcat = badcat || this.cat_match (cat, gallery_details_bad_tags);&lt;br /&gt;
                actioncat = actioncat || this.cat_match (cat, gallery_details_action_tags);&lt;br /&gt;
                categories[categories.length] = cat;&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
            if (actioncat) goodcat = false;&lt;br /&gt;
            this.image_list[i].categories = categories;&lt;br /&gt;
            this.image_list[i].status     =&lt;br /&gt;
              (badcat ? GalleryDetails.BAD_FILE&lt;br /&gt;
                      : (goodcat ? GalleryDetails.GOOD_FILE : GalleryDetails.ACTION_NEEDED)&lt;br /&gt;
              );&lt;br /&gt;
            // Try to handle bot uploads&lt;br /&gt;
            if (page.imageinfo &amp;amp;&amp;amp; page.imageinfo.length &amp;gt; 0) {&lt;br /&gt;
              this.image_list[i].users = new Array ();&lt;br /&gt;
              this.image_list[i].users[0] = {user : page.imageinfo[0].user, real : null};&lt;br /&gt;
              if (page.imageinfo.length &amp;gt; 1)&lt;br /&gt;
                this.image_list[i].users[1] = {user : page.imageinfo[1].user, real : null};&lt;br /&gt;
            } else&lt;br /&gt;
              this.image_list[i].page = null;&lt;br /&gt;
            if (   page.imageinfo &amp;amp;&amp;amp; page.imageinfo.length &amp;gt; 0&lt;br /&gt;
                &amp;amp;&amp;amp; page.revisions &amp;amp;&amp;amp; page.revisions.length &amp;gt; 0) {&lt;br /&gt;
              var text = page.revisions[0];&lt;br /&gt;
              if (text) text = text[&amp;quot;*&amp;quot;];&lt;br /&gt;
              if (text) {&lt;br /&gt;
                for (var u = 0; u &amp;lt; this.image_list[i].users.length; u++) {&lt;br /&gt;
                  var match = null; &lt;br /&gt;
                  var user  = this.image_list[i].users[u].user;&lt;br /&gt;
                  if (user.replace (/ /g, '_') == 'Flickr_upload_bot') {&lt;br /&gt;
                    // Check for the bot's upload template&lt;br /&gt;
                    match =&lt;br /&gt;
                      /\{\{User:Flickr upload bot\/upload(\|[^\|\}]*)?\|reviewer=([^\}]*)\}\}/.exec (text);&lt;br /&gt;
                    if (match) match = match[2];&lt;br /&gt;
                  } else if (user == 'File Upload Bot (Magnus Manske)') {&lt;br /&gt;
                    // CommonsHelper&lt;br /&gt;
                    match =&lt;br /&gt;
                      /transferred to Commons by \[\[User:([^\]\|]*)(\|([^\]]*))?\]\] using/.exec (text);&lt;br /&gt;
                    if (!match)&lt;br /&gt;
                      // geograph_org2commons, regex accounts for typo (&amp;quot;transferd&amp;quot;) and its&lt;br /&gt;
                      // possible future correction&lt;br /&gt;
                      match =&lt;br /&gt;
                        /geograph.org.uk\]; transferr?e?d by \[\[User:([^\]\|]*)(\|([^\]]*))?\]\] using/.exec (text);&lt;br /&gt;
                    if (!match &amp;amp;&amp;amp; /(www\.)?flickr\.com\/photos\//.test (text))&lt;br /&gt;
                      // flickr2commons&lt;br /&gt;
                      match = /\* Uploaded by \[\[User:([^\]\|]*)(\|([^\]]*))?\]\]/.exec (text);&lt;br /&gt;
                    if (match) match = match[1];&lt;br /&gt;
                    &lt;br /&gt;
                    function fix_double_encoding (match) {&lt;br /&gt;
                      if (!match) return match;&lt;br /&gt;
                      var utf8 = /[\u00C2-\u00F4][\u0080-\u00BF][\u0080-\u00BF]?[\u0080-\u00BF]?/g;&lt;br /&gt;
                      if (!utf8.test (match)) return match;&lt;br /&gt;
                      // Looks like we have a double encoding. At least it contains character&lt;br /&gt;
                      // sequences that might be legal UTF-8 encodings. Translate them into %-&lt;br /&gt;
                      // syntax and try to decode again.&lt;br /&gt;
                      var temp = &amp;quot;&amp;quot;, curr = 0, m, hex_digit = &amp;quot;0123456789ABCDEF&amp;quot;;&lt;br /&gt;
                      var str = match.replace (/%/g, '%25');&lt;br /&gt;
                      utf8.lastIndex = 0; // Reset regexp to beginning of string&lt;br /&gt;
                      try {&lt;br /&gt;
                        while ((m = utf8.exec (str)) != null) {&lt;br /&gt;
                          temp += str.substring (curr, m.index);&lt;br /&gt;
                          m = m[0];&lt;br /&gt;
                          for (var i = 0; i &amp;lt; m.length; i++) {&lt;br /&gt;
                            temp += '%'&lt;br /&gt;
                                    + hex_digit.charAt (m.charCodeAt (i) / 16)&lt;br /&gt;
                                    + hex_digit.charAt (m.charCodeAt (i) % 16);&lt;br /&gt;
                          }&lt;br /&gt;
                          curr = utf8.lastIndex;&lt;br /&gt;
                        }&lt;br /&gt;
                        if (curr &amp;lt; str.length) temp += str.substring (curr);&lt;br /&gt;
                        temp = decodeURIComponent (temp);&lt;br /&gt;
                        return temp;&lt;br /&gt;
                      } catch (e) {&lt;br /&gt;
                      }&lt;br /&gt;
                      return match;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    match = fix_double_encoding (match);&lt;br /&gt;
                  } else if (user == 'FlickrLickr') {&lt;br /&gt;
                    match = /\n\|reviewer=\s*(.*)\n/.exec (text);&lt;br /&gt;
                    if (match) match = match[1];&lt;br /&gt;
                  }&lt;br /&gt;
                  if (match)&lt;br /&gt;
                    this.image_list[i].users[u].real =&lt;br /&gt;
                      match.replace (/^\s\s*/, &amp;quot;&amp;quot;).replace (/\s\s*$/, &amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } // end loop&lt;br /&gt;
    }&lt;br /&gt;
    this.done (length);&lt;br /&gt;
  },&lt;br /&gt;
    &lt;br /&gt;
  done : function (n)&lt;br /&gt;
  {&lt;br /&gt;
    this.handled += n;&lt;br /&gt;
    if (this.handled &amp;gt;= this.nof_images) {&lt;br /&gt;
      // Done; display it&lt;br /&gt;
      this.removeSpinner (this.wrapper.id);&lt;br /&gt;
      if (this.is_single) {&lt;br /&gt;
        this.viewer = GalleryDetailsLoader.getViewer ();&lt;br /&gt;
        this.viewer.display (this);&lt;br /&gt;
      } else {&lt;br /&gt;
        // Create viewers for each entry, and pass them a faked model&lt;br /&gt;
        this.viewer = new Array ();&lt;br /&gt;
        for (var i = 0; i &amp;lt; this.nof_images; i++) {&lt;br /&gt;
          this.viewer[this.viewer.length] =&lt;br /&gt;
            { view       : GalleryDetailsLoader.getViewer ()&lt;br /&gt;
             ,root       : this.image_list[i].table&lt;br /&gt;
             ,image_list : [this.image_list[i]]&lt;br /&gt;
             ,nof_images : 1&lt;br /&gt;
             ,wrapper    : this.wrapper&lt;br /&gt;
            };&lt;br /&gt;
        }&lt;br /&gt;
        for (var i = 0; i &amp;lt; this.viewer.length; i++)&lt;br /&gt;
          this.viewer[i].view.display (this.viewer[i]);&lt;br /&gt;
      }          &lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  toggle : function ()&lt;br /&gt;
  {&lt;br /&gt;
    if (this.handled &amp;gt;= this.nof_images) {&lt;br /&gt;
      if (this.is_single) {&lt;br /&gt;
        this.viewer.toggle (this);&lt;br /&gt;
      } else {&lt;br /&gt;
        for (var i = 0; i &amp;lt; this.viewer.length; i++)&lt;br /&gt;
          this.viewer[i].view.toggle (this.viewer[i]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  title_from_box : function (box)&lt;br /&gt;
  {&lt;br /&gt;
    var thumblks = window.jQuery(box).find('a.image');&lt;br /&gt;
    if (thumblks &amp;amp;&amp;amp; thumblks.length &amp;gt; 0 &amp;amp;&amp;amp; thumblks[0]) {&lt;br /&gt;
      // Extract the file name (without namespace) from the link&lt;br /&gt;
      var name = titleFromLink (thumblks[0]) || &amp;quot;&amp;quot;;&lt;br /&gt;
      return name.substring (name.indexOf (':') + 1); // Strip namespace&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  cat_match : function (cat, test)&lt;br /&gt;
  {&lt;br /&gt;
    if (!cat) return false;&lt;br /&gt;
    var c = cat.substr (cat.indexOf (':') + 1); // Strip namespace&lt;br /&gt;
    for (var i = 0; i &amp;lt; test.length; i++ ) {&lt;br /&gt;
     if (c.substr (0, test[i].length) == test[i]) return true;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}; // end GalleryDetails&lt;br /&gt;
&lt;br /&gt;
mw.loader.using('jquery.spinner', function () {&lt;br /&gt;
	GalleryDetails.prototype.injectSpinner = function (elementBefore, id) {&lt;br /&gt;
		window.jQuery(elementBefore).injectSpinner(id);&lt;br /&gt;
	};&lt;br /&gt;
	GalleryDetails.prototype.removeSpinner = function (id) {&lt;br /&gt;
		window.jQuery.removeSpinner(id);&lt;br /&gt;
	};&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var GalleryDetailsLoader =&lt;br /&gt;
{&lt;br /&gt;
  initialized : false,&lt;br /&gt;
&lt;br /&gt;
  initialize : function ()&lt;br /&gt;
  {&lt;br /&gt;
    GalleryDetailsLoader.initialized = true;&lt;br /&gt;
    var tables = window.jQuery('.gallery');&lt;br /&gt;
    if (tables.length == 0) {&lt;br /&gt;
      // Check whether we're on Special:Search (or a modified Special:Log) and have image results&lt;br /&gt;
      if (mw.config.get('wgNamespaceNumber') == -1)&lt;br /&gt;
        tables = window.jQuery('table.searchResultImage');&lt;br /&gt;
    }&lt;br /&gt;
    if (tables.length == 0) return; // Nothing here: nothing to do.&lt;br /&gt;
    if (gallery_details_newfiles_run&lt;br /&gt;
        &amp;amp;&amp;amp; mw.config.get('wgNamespaceNumber') == -1 // Special&lt;br /&gt;
        &amp;amp;&amp;amp; mw.config.get('wgCanonicalSpecialPageName') == &amp;quot;Newimages&amp;quot;) {&lt;br /&gt;
      GalleryDetailsLoader.autoStart ();&lt;br /&gt;
    } else {&lt;br /&gt;
      addPortletLink(&lt;br /&gt;
         'p-tb'&lt;br /&gt;
        ,'javascript:GalleryDetailsLoader.load ();'&lt;br /&gt;
        ,gallery_details_sidebar.text&lt;br /&gt;
        ,'t-gallerydetails'&lt;br /&gt;
        ,gallery_details_sidebar.tip&lt;br /&gt;
      );&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  autoStart : function () {&lt;br /&gt;
  	if (typeof window.titleFromHref == 'undefined' || typeof window.ImageLinks == 'undefined') {&lt;br /&gt;
  		// Wait until we have our asynchronously loaded dependencies (importScript above)&lt;br /&gt;
  		window.setTimeout (GalleryDetailsLoader.autoStart, 500); // Half a second&lt;br /&gt;
  		return;&lt;br /&gt;
  	}&lt;br /&gt;
  	GalleryDetailsLoader.load ();&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  loaders : [],&lt;br /&gt;
  &lt;br /&gt;
  load : function ()&lt;br /&gt;
  {&lt;br /&gt;
    if (GalleryDetailsLoader.loaders.length &amp;gt; 0) {&lt;br /&gt;
      for (var i = 0; i &amp;lt; GalleryDetailsLoader.loaders.length; i++) {&lt;br /&gt;
        GalleryDetailsLoader.loaders[i].toggle ();&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      var tables = window.jQuery('.gallery');&lt;br /&gt;
      if (tables.length &amp;gt; 0) {    &lt;br /&gt;
        for (var i = 0; i &amp;lt; tables.length; i++) {&lt;br /&gt;
          GalleryDetailsLoader.loaders[GalleryDetailsLoader.loaders.length] =&lt;br /&gt;
            new GalleryDetails (&lt;br /&gt;
                    tables[i]&lt;br /&gt;
                  , 'gallery_details_wrapper_' + i&lt;br /&gt;
                  , true&lt;br /&gt;
                )&lt;br /&gt;
          ;&lt;br /&gt;
        }&lt;br /&gt;
      } else if (mw.config.get('wgNamespaceNumber') == -1) {&lt;br /&gt;
        tables = window.jQuery('table.searchResultImage');&lt;br /&gt;
        if (tables.length &amp;gt; 0) {&lt;br /&gt;
          var list = tables[0].parentNode;&lt;br /&gt;
          if (list.nodeName.toLowerCase () == 'li')&lt;br /&gt;
            list = list.parentNode;&lt;br /&gt;
          else&lt;br /&gt;
            return;&lt;br /&gt;
          GalleryDetailsLoader.loaders[GalleryDetailsLoader.loaders.length] =&lt;br /&gt;
              new GalleryDetails (&lt;br /&gt;
                      list&lt;br /&gt;
                    , 'gallery_details_wrapper_' + i&lt;br /&gt;
                    , false&lt;br /&gt;
                  )&lt;br /&gt;
          ;&lt;br /&gt;
        }&lt;br /&gt;
      }  &lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  getViewer : function ()&lt;br /&gt;
  {&lt;br /&gt;
    return new GalleryDetailsTableViewer (); &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
$(document).ready(GalleryDetailsLoader.initialize);&lt;br /&gt;
&lt;br /&gt;
} // end if (guard against double imports)&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Porod</name></author>
	</entry>
</feed>