MediaWiki:Common.js: Difference between revisions

From Tardis Wiki, the free Doctor Who reference
No edit summary
(putting in code for archive tool, taken this time from dev, rather than fallout wiki)
Line 14: Line 14:
);
);


/* ######################################################################## */
/* ### ARCHIVE TOOL                                                    ### */
/* ### ---------------------------------------------------------------- ### */
/* ### Description: AJAX-archiving of talk pages via GUI                ### */
/* ### Credit:      User:Dantman (original)                            ### */
/* ###              User:Porter21 (Oasis & Monobook support)            ### */
/* ######################################################################## */
/*
/*
  * Copyright © 2009, Daniel Friesen
  * Copyright © 2009, Daniel Friesen
Line 49: Line 41:
  */
  */
   
   
function archiveTool () {
if (skin == "monaco" || skin == "monobook" || skin == "oasis" || skin == "wikia") {
  // Configuration
  (function($) {
  var config = window.ArchiveToolConfig = $.extend(true, {
      // Configuration
      archiveListTemplate: 'Archives',
      var config = window.ArchiveToolConfig = $.extend(true, {
      archivePageTemplate: 'Archivepage',
        archiveListTemplate: window.archiveListTemplate || 'ArchiveList',
      archiveSubpage: 'Archive',
        archivePageTemplate: window.archivePageTemplate || 'ArchivePage',
      userLang: false,
        archiveSubpage: 'Archive',
      // English
        userLang: true,
      en: {
        // Deutsch
        buttonArchiveTool: "Archive",
        de: {
        buttonArchiveToolTooltip: "Archive this page",
            buttonArchiveTool: "Archivieren",
        buttonSelectAll: "Select all",
            buttonArchiveToolTooltip: "Seite archivieren",
        buttonDeselectAll: "Deselect all",
            buttonSelectAll: "Alle auswählen",
        buttonSaveArchive: "Save archive",
            buttonDeselectAll: "Keine auswählen",
        buttonAbort: "Abort",
            buttonSaveArchive: "Archiv speichern",
        labelLines: "Lines",
            buttonAbort: "Abbrechen",
        labelSections: "Sections",
            labelLines: "Zeilen",
        summaryArchiveFrom: "ArchiveTool: Archiving from",
            labelSections: "Abschnitte",
        summaryArchiveTo: "ArchiveTool: Archiving to"
            summaryArchiveFrom: "ArchiveTool: Archiviert von",
            summaryArchiveTo: "ArchiveTool: Archiviert als"
        },
        // English
        en: {
            buttonArchiveTool: "Archive",
            buttonArchiveToolTooltip: "Archive this page",
            buttonSelectAll: "Select all",
            buttonDeselectAll: "Deselect all",
            buttonSaveArchive: "Save archive",
            buttonAbort: "Abort",
            labelLines: "Lines",
            labelSections: "Sections",
            summaryArchiveFrom: "ArchiveTool: Archiving from",
            summaryArchiveTo: "ArchiveTool: Archiving to"
        }
      }, window.ArchiveToolConfig || {});
      // Function for multi-language support
      function msg(name) {
        if ( config.userLang && wgUserLanguage in config && name in config[wgUserLanguage] )
            return config[wgUserLanguage][name];
        if ( wgContentLanguage in config && name in config[wgContentLanguage] )
            return config[wgContentLanguage][name];
        return config.en[name];
       }
       }
  }, window.ArchiveToolConfig || {});
   
   
  // Function for multi-language support
       if ( wgNamespaceNumber % 2 === 1 && ( wgAction === "view" || wgAction === "purge" ) ) {
  function msg(name) {
         var pageBody, pageControls, pageControlHTML;
       if ( config.userLang && wgUserLanguage in config && name in config[wgUserLanguage] )
         var buttonPrimary = buttonSecondary = ['', ''];
         return config[wgUserLanguage][name];
      if ( wgContentLanguage in config && name in config[wgContentLanguage] )
         return config[wgContentLanguage][name];
      return config.en[name];
  }
   
   
  if (skin != "monaco" && skin != 'monobook' && skin != 'oasis' && skin != 'wikia') {
        importStylesheetPage('ArchiveTool/code.css', 'dev');
      return;
  }
   
   
  if ( wgNamespaceNumber % 2 === 1 && ( wgAction === "view" || wgAction === "purge" ) ) {
        switch(skin) {
      var pageBody, pageControls, pageControlHTML;
            case 'monaco':
      var buttonPrimary = buttonSecondary = ['', ''];
              pageBody = '#bodyContent';
              pageControls = '#page_controls';
              pageControlHTML = '<li id="control_archive"><img src="/skins/common/blank.gif" class="sprite move" /><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
              buttonPrimary = ['<a class="wikia-button">', '</a>'];
              buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
              break;
            case 'monobook':
              pageBody = '#bodyContent';
              pageControls = '#p-cactions > div > ul';
              pageControlHTML = '<li id="control_archive"><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
              buttonPrimary = ['<input type="submit" style="font-weight: bold;" value="', '" />'];
              buttonSecondary = ['<input type="submit" value="', '" />'];
              break;
            case 'oasis':
            case 'wikia':
              pageBody = '#WikiaArticle';
              pageControls = (wgNamespaceNumber == 3) ? '#WikiaUserPagesHeader > ul.wikia-menu-button > li > ul' : '#WikiaPageHeader > ul.wikia-menu-button > li > ul';
              pageControlHTML = '<li id="control_archive"><a id="ca-archive" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
              buttonPrimary = ['<a class="wikia-button">', '</a>'];
              buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
              break;
        }
   
   
      switch(skin) {
        $(function() {
        case 'monaco':
             function api(q, fn) {
             pageBody = '#bodyContent';
              q.format = 'json';
            pageControls = '#page_controls';
              return $.post(wgScriptPath + '/api.php', q, fn, "json");
            pageControlHTML = '<li id="control_archive"><img src="/skins/common/blank.gif" class="sprite move" /><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
             }
            buttonPrimary = ['<a class="wikia-button">', '</a>'];
             function token(page, fn) {
            buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
              api({
            break;
                  action: 'query',
        case 'monobook':
                  query: 'prop',
            pageBody = '#bodyContent';
                  prop: 'info',
             pageControls = '#p-cactions > div > ul';
                  titles: page,
             pageControlHTML = '<li id="control_archive"><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
                  intoken: 'edit'
            buttonPrimary = ['<input type="submit" style="font-weight: bold;" value="', '" />'];
              }, function(q) {
            buttonSecondary = ['<input type="submit" value="', '" />'];
                  for ( var k in q.query.pages )
            break;
                    return fn(q.query.pages[k]);
        case 'oasis':
              });
        case 'wikia':
             }
            pageBody = '#WikiaArticle';
            pageControls = (wgNamespaceNumber == 3) ? '#WikiaUserPagesHeader > ul.wikia-menu-button > li > ul' : '#WikiaPageHeader > ul.wikia-menu-button > li > ul';
            pageControlHTML = '<li id="control_archive"><a id="ca-archive" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
            buttonPrimary = ['<a class="wikia-button">', '</a>'];
            buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
             break;
      }
   
   
      $(function() {
            function startArchiving() {
        function api(q, fn) {
              var c = config.archiveListTemplate.substr(0,1);
            q.format = 'json';
              var archiveListRegex = '['+c.toUpperCase()+c.toLowerCase()+']'+config.archiveListTemplate.substr(1);
            return $.post(wgScriptPath + '/api.php', q, fn, "json");
              var bc = $(pageBody).addClass('archiving').empty();
        }
              $('<img class="ajax" alt="Loading..." />')
        function token(page, fn) {
                  .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
            api({
              api({
              action: 'query',
                  action: 'query',
              query: 'prop',
                  prop: 'revisions',
              prop: 'info',
                  titles: wgPageName,
              titles: page,
                  rvprop: 'timestamp|content'
              intoken: 'edit'
              }, function(q) {
            }, function(q) {
                  bc.empty();
              for ( var k in q.query.pages )
                  var rev = q.query.pages[wgArticleId].revisions[0];
                   return fn(q.query.pages[k]);
                   var time = rev.timestamp;
            });
                  var talkToken, tokenTime;
        }
                  var content = rev['*'];
                  token(wgPageName, function(p) {
                    talkToken = p.edittoken;
                    tokenTime = p.starttimestamp;
                  });
   
   
        function startArchiving() {
                  var lines = content.split('\n');
            var c = config.archiveListTemplate.substr(0,1);
            var archiveListRegex = '['+c.toUpperCase()+c.toLowerCase()+']'+config.archiveListTemplate.substr(1);
            var bc = $(pageBody).addClass('va-archiving').empty();
            $('<img class="ajax" alt="Loading..." />')
              .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
            api({
              action: 'query',
              prop: 'revisions',
              titles: wgPageName,
              rvprop: 'timestamp|content'
            }, function(q) {
              bc.empty();
              var rev = q.query.pages[wgArticleId].revisions[0];
              var time = rev.timestamp;
              var talkToken, tokenTime;
              var content = rev['*'];
              token(wgPageName, function(p) {
                  talkToken = p.edittoken;
                  tokenTime = p.starttimestamp;
              });
   
   
              var lines = content.split('\n');
                  var table = $('<table style="margin: 10px 0;"><thead><tr><th>' + msg('labelLines') + '</th><th title="' + msg('labelSections') + '">{&hellip;}</th></tr></thead></table>').appendTo(bc);
                  var ul = $('<tbody/>').appendTo(table);
   
   
              var table = $('<table style="margin: 10px 0;"><thead><tr><th>' + msg('labelLines') + '</th><th title="' + msg('labelSections') + '">{&hellip;}</th></tr></thead></table>').appendTo(bc);
                  for ( var l = 0; l < lines.length; l++ ) {
              var ul = $('<tbody/>').appendTo(table);
                    var line = lines[l];
                    $('<tr/>').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line))
                        .attr({line:line})
                        .append( $('<td class=line />').text(line).append('&nbsp;') ).appendTo(ul);
                  }
   
   
              for ( var l = 0; l < lines.length; l++ ) {
                  var sections = [];
                  var line = lines[l];
                  var sectionEnd = lines.length-1;
                  $('<tr/>').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line))
                  for ( var l = lines.length-1; l >= 0; l-- ) {
                    .attr({line:line})
                    var line = lines[l];
                    .append( $('<td class=line />').text(line).append('&nbsp;') ).appendTo(ul);
              }
   
   
              var sections = [];
                    if ( /^=.+?=/.test(line) || l === 0 ) {
              var sectionEnd = lines.length-1;
                        var section = { start: l, end: sectionEnd };
              for ( var l = lines.length-1; l >= 0; l-- ) {
                        section.length = section.end - section.start + 1;
                  var line = lines[l];
                        sections.unshift(section);
   
   
                  if ( /^=.+?=/.test(line) || l === 0 ) {
                        sectionEnd = l-1;
                    var section = { start: l, end: sectionEnd };
                     }
                    section.length = section.end - section.start + 1;
                  }
                     sections.unshift(section);
   
   
                     sectionEnd = l-1;
                  var section;
                  while( section = sections.shift() ) {
                    var tr = ul.children().eq(section.start);
                     $('<td class=section />').attr({rowspan: section.length}).appendTo(tr);
                   }
                   }
              }
   
   
              var section;
                  $('<div class="buttons" style="text-align: right;" />').append(
              while( section = sections.shift() ) {
                    $(buttonSecondary[0] + msg('buttonSelectAll') + buttonSecondary[1]).click(function(e) {
                  var tr = ul.children().eq(section.start);
                        e.preventDefault();
                  $('<td class=section />').attr({rowspan: section.length}).appendTo(tr);
                        ul.children('tr').addClass('archive');
              }
                    }), ' ',
                    $(buttonSecondary[0] + msg('buttonDeselectAll') + buttonSecondary[1]).click(function(e) {
                        e.preventDefault();
                        ul.children('tr').removeClass('archive');
                    }), ' ',
                    $(buttonPrimary[0] + msg('buttonSaveArchive') + buttonPrimary[1]).click(function(e) {
                        archive();
                    }), ' ',
                    $(buttonPrimary[0] + msg('buttonAbort') + buttonPrimary[1]).click(function(e) {
                        bc.find('.ajax').remove();
                        location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                    })
                  ).prependTo(bc).clone(true).appendTo(bc);
   
   
              $('<div class="buttons" style="text-align: right;" />').append(
                  var click = false;
                   $(buttonSecondary[0] + msg('buttonSelectAll') + buttonSecondary[1]).click(function(e) {
                  var add;
                   table.mousedown(function(e) {
                     e.preventDefault();
                     e.preventDefault();
                     ul.children('tr').addClass('archive');
                     var $li = $(e.target).closest('tr');
                  }), ' ',
                    if(!$li.length) return;
                  $(buttonSecondary[0] + msg('buttonDeselectAll') + buttonSecondary[1]).click(function(e) {
                    var $section = $(e.target).closest('.section');
                    e.preventDefault();
                    if ( $section.length ) {
                    ul.children('tr').removeClass('archive');
                        var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf();
                  }), ' ',
                        var sadd = slist.filter(function() { return !$(this).hasClass('archive') }).length;
                  $(buttonPrimary[0] + msg('buttonSaveArchive') + buttonPrimary[1]).click(function(e) {
                        slist.toggleClass('archive', !!sadd);
                    archive();
                        return;
                   }), ' ',
                    }
                   $(buttonPrimary[0] + msg('buttonAbort') + buttonPrimary[1]).click(function(e) {
                    click = true;
                     bc.find('.ajax').remove();
                    add = !$li.hasClass('archive');
                     location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                  })
                    $li.toggleClass('archive', !!add);
              ).prependTo(bc).clone(true).appendTo(bc);
                   });
                   table.mouseover(function(e) {
                     if (!click) return;
                     var $li = $(e.target).closest('tr');
                    if(!$li.length) return;
   
   
              var click = false;
                    $li.toggleClass('archive', !!add);
              var add;
                   });
              table.mousedown(function(e) {
                   $('body').mouseup(function(e) {
                  e.preventDefault();
                     click = false;
                  var $li = $(e.target).closest('tr');
                   });
                  if(!$li.length) return;
                   var $section = $(e.target).closest('.section');
                   if ( $section.length ) {
                    var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf();
                    var sadd = slist.filter(function() { return !$(this).hasClass('archive') }).length;
                     slist.toggleClass('archive', !!sadd);
                    return;
                  }
                  click = true;
                   add = !$li.hasClass('archive');
   
   
                   $li.toggleClass('archive', !!add);
                   function archive() {
              });
                    var talkLines = [];
              table.mouseover(function(e) {
                    var archiveLines = [];
                  if (!click) return;
                    ul.children().each(function() {
                  var $li = $(e.target).closest('tr');
                        var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')
                  if(!$li.length) return;
                          ? talkLines : archiveLines;
   
   
                  $li.toggleClass('archive', !!add);
                        arr.push( $(this).attr('line') );
              });
                    });
              $('body').mouseup(function(e) {
                  click = false;
              });
   
   
              function archive() {
                    if ( !(new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(talkLines[0]) )
                  var talkLines = [];
                        talkLines = ['{{'+config.archiveListTemplate+'}}', ''].concat(talkLines);
                  var archiveLines = [];
                     archiveLines = ['{{'+config.archivePageTemplate+'}}', ''].concat(archiveLines);
                  ul.children().each(function() {
                     var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')
                        ? talkLines : archiveLines;
   
   
                     arr.push( $(this).attr('line') );
                     bc.empty();
                  });
                    $('<img class="ajax" alt="Loading..." />')
                        .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
   
   
                  if ( !(new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(talkLines[0]) )
                    //$('<pre/>').text(talkLines.join('\n')).appendTo(bc);
                     talkLines = ['{{'+config.archiveListTemplate+'}}', ''].concat(talkLines);
                     //$('<pre/>').text(archiveLines.join('\n')).appendTo(bc);
                  archiveLines = ['{{'+config.archivePageTemplate+'}}', ''].concat(archiveLines);
                    runArchive(talkLines.join('\n'), archiveLines.join('\n'));
                  }
   
   
                   bc.empty();
                   var archiveTitle;
                  $('<img class="ajax" alt="Loading..." />')
                  function runArchive(talkContent, archiveContent) {
                    .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
                    var archiveNo;
                    function findArchives() {
                        var m = $('<p>Finding archive id: </p>').appendTo(bc);
                        api({
                          action: 'query',
                          list: 'allpages',
                          apnamespace: wgNamespaceNumber,
                          apprefix: wgTitle+'/'+config.archiveSubpage,
                          aplimit: 1,
                          apdir: 'descending'
                        }, function(q) {
                          archiveNo = q.query.allpages.length ?
                              parseInt(q.query.allpages[0].title.substr(wgPageName.length+("/"+config.archiveSubpage).length),10)+1 :
                              1;
                          archiveTitle = wgPageName+'/'+config.archiveSubpage+' '+archiveNo;
                          m.append('done... (using '+archiveNo+')');
   
   
                  //$('<pre/>').text(talkLines.join('\n')).appendTo(bc);
                          saveArchive();
                  //$('<pre/>').text(archiveLines.join('\n')).appendTo(bc);
                        });
                  runArchive(talkLines.join('\n'), archiveLines.join('\n'));
                    }
              }
   
   
              var archiveTitle;
                    function saveArchive() {
              function runArchive(talkContent, archiveContent) {
                        var m = $('<p>Finding token for '+archiveTitle+': </p>').appendTo(bc);
                  var archiveNo;
                        token(archiveTitle, function(p) {
                  function findArchives() {
                          m.append('done...');
                    var m = $('<p>Finding archive id: </p>').appendTo(bc);
                          m = $('<p>Saving archive page: </p>').appendTo(bc);
                    api({
                          api({
                        action: 'query',
                              action: 'edit',
                        list: 'allpages',
                              title: archiveTitle,
                        apnamespace: wgNamespaceNumber,
                              text: archiveContent,
                        apprefix: wgTitle+'/'+config.archiveSubpage,
                              token: p.edittoken,
                        aplimit: 1,
                              summary: "''"+ msg('summaryArchiveFrom') + " [["+wgPageName+"]].''",
                        apdir: 'descending'
                              minor: true,
                    }, function(q) {
                              createonly: true
                        archiveNo = q.query.allpages.length ?
                          }, function(q) {
                          parseInt(q.query.allpages[0].title.substr(wgPageName.length+("/"+config.archiveSubpage).length),10)+1 :
                              if ( q.error && q.error.code === "articleexists" ) {
                          1;
                                m.append('failed...');
                        archiveTitle = wgPageName+'/'+config.archiveSubpage+' '+archiveNo;
                                bc.append("<p>The archive page we tried to create already exists.</p>");
                        m.append('done... (using '+archiveNo+')');
                                return abort();
                              }
                              m.append('done...');
   
   
                        saveArchive();
                              saveTalk();
                    });
                          });
                  }
                        });
                    }
   
   
                  function saveArchive() {
                    function saveTalk() {
                    var m = $('<p>Finding token for '+archiveTitle+': </p>').appendTo(bc);
                        var m = $('<p>Finding token for '+wgPageName+': </p>').appendTo(bc);
                    token(archiveTitle, function(p) {
                         m.append('done...');
                         m.append('done...');
                         m = $('<p>Saving archive page: </p>').appendTo(bc);
                         m = $('<p>Updating talk page: </p>').appendTo(bc);
                         api({
                         api({
                           action: 'edit',
                           action: 'edit',
                           title: archiveTitle,
                           title: wgPageName,
                           text: archiveContent,
                           text: talkContent,
                           token: p.edittoken,
                           token: talkToken,
                           summary: "''"+ msg('summaryArchiveFrom') + " [["+wgPageName+"]].''",
                           summary: "''" + msg('summaryArchiveTo') + " [["+archiveTitle+"]].''",
                           minor: true,
                           minor: true,
                           createonly: true
                           basetimestamp: time,
                          starttimestamp: tokenTime
                         }, function(q) {
                         }, function(q) {
                           if ( q.error && q.error.code === "articleexists" ) {
                           if ( q.edit.result === "Success" ) {
                              m.append('done...');
                              bc.find('.ajax').remove();
                              location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                          } else {
                               m.append('failed...');
                               m.append('failed...');
                               bc.append("<p>The archive page we tried to create already exists.</p>");
                               bc.append("<p>Failed to update talkpage, you may wish to have the archive subpage we just created deleted.</p>");
                               return abort();
                               return abort();
                           }
                           }
                          m.append('done...');
                          saveTalk();
                         });
                         });
                     });
                     }
                  }
   
   
                  function saveTalk() {
                     function abort() {
                    var m = $('<p>Finding token for '+wgPageName+': </p>').appendTo(bc);
                         bc.find('.ajax').remove();
                    m.append('done...');
                         bc.append("<p>Aborting...</p>");
                     m = $('<p>Updating talk page: </p>').appendTo(bc);
                    api({
                        action: 'edit',
                        title: wgPageName,
                        text: talkContent,
                        token: talkToken,
                        summary: "''" + msg('summaryArchiveTo') + " [["+archiveTitle+"]].''",
                        minor: true,
                        basetimestamp: time,
                        starttimestamp: tokenTime
                    }, function(q) {
                         if ( q.edit.result === "Success" ) {
                          m.append('done...');
                          bc.find('.ajax').remove();
                          location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                         } else {
                          m.append('failed...');
                          bc.append("<p>Failed to update talkpage, you may wish to have the archive subpage we just created deleted.</p>");
                          return abort();
                        }
                    });
                  }
   
   
                  function abort() {
                        $("<p>You may want to </p>")
                    bc.find('.ajax').remove();
                          .append( $('<a>refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )
                    bc.append("<p>Aborting...</p>");
                          .append(' and try again.')
                          .appendTo(bc);
                    }
   
   
                     $("<p>You may want to </p>")
                     // start
                        .append( $('<a>refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )
                    findArchives();
                        .append(' and try again.')
                        .appendTo(bc);
                   }
                   }
              });
            }
   
   
                  // start
             $(pageControlHTML)
                  findArchives();
              .click(startArchiving)
              }
              .appendTo(pageControls);
             });
        });
        }
      }
   })(jQuery);
        $(pageControlHTML)
            .click(startArchiving)
            .appendTo(pageControls);
      });
   }
}
}


/*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/
/*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/
Line 422: Line 425:


$(fBox);
$(fBox);
/* ######################################################################## */
/* ### SCRIPT LOADER                                                    ### */
/* ### ---------------------------------------------------------------- ### */
/* ### Description: Loads all the other scripts                        ### */
/* ### Credit:      User:Porter21                                      ### */
/* ######################################################################## */
function vaultScriptLoader () {
  // Always loaded
  addFacebookFanbox();
  addTitleIcons();
  checktimers();
  createCollapseButtons();
  // Only loaded for specific namespaces
  if (wgNamespaceNumber%2 != 0 && wgNamespaceNumber != 501) {
      archiveTool();
      disableArchiveEdit();
  }
  // Only loaded for specific pages
  if (wgPageName == 'The_Vault:Duplicate_files') {
      findDupFiles();
  }
  for (x in ajaxPages) {
      if (wgPageName == ajaxPages[x] && $("#ajaxToggle").length==0) preloadAJAXRL();
  }
}
jQuery(function($) {
  vaultScriptLoader();
});
/* </nowiki> */

Revision as of 11:08, 21 May 2011

/* Any JavaScript here will be loaded for all users on every page load. */
importScriptPage('ShowHide/code.js', 'dev');
importScriptPage('EditIntroButton/code.js', 'dev' );
importScriptPage('AjaxBatchDelete/code.js', 'dev');
importScriptPage('DisableArchiveEdit/code.js', 'dev');
importScriptPage('DupImageList/code.js', 'dev');
// importScriptPage('AdvancedOasisUI/code.js', 'dev'); violates Wikia TOU but is okay for individual users to use
importScriptPage('PurgeButton/code.js', 'dev');
importScriptPage('ShowAdsButton/code.js', 'dev');
importScriptPage('WikiSwitch/code.js', 'dev');

wikiaDomainList = new Array(
	{ id: 'central', domain: 'www.wikia.com', name: 'Central', title: 'Central Wikia', interwiki: 'w:' }
);

/*
 * Copyright © 2009, Daniel Friesen
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the script nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY DANIEL FRIESEN ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL DANIEL FRIESEN BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
if (skin == "monaco" || skin == "monobook" || skin == "oasis" || skin == "wikia") {
   (function($) {
      // Configuration
      var config = window.ArchiveToolConfig = $.extend(true, {
         archiveListTemplate: window.archiveListTemplate || 'ArchiveList',
         archivePageTemplate: window.archivePageTemplate || 'ArchivePage',
         archiveSubpage: 'Archive',
         userLang: true,
         // Deutsch
         de: {
            buttonArchiveTool: "Archivieren",
            buttonArchiveToolTooltip: "Seite archivieren",
            buttonSelectAll: "Alle auswählen",
            buttonDeselectAll: "Keine auswählen",
            buttonSaveArchive: "Archiv speichern",
            buttonAbort: "Abbrechen",
            labelLines: "Zeilen",
            labelSections: "Abschnitte",
            summaryArchiveFrom: "ArchiveTool: Archiviert von",
            summaryArchiveTo: "ArchiveTool: Archiviert als"
         },
         // English
         en: {
            buttonArchiveTool: "Archive",
            buttonArchiveToolTooltip: "Archive this page",
            buttonSelectAll: "Select all",
            buttonDeselectAll: "Deselect all",
            buttonSaveArchive: "Save archive",
            buttonAbort: "Abort",
            labelLines: "Lines",
            labelSections: "Sections",
            summaryArchiveFrom: "ArchiveTool: Archiving from",
            summaryArchiveTo: "ArchiveTool: Archiving to"
         }
      }, window.ArchiveToolConfig || {});
 
      // Function for multi-language support
      function msg(name) {
         if ( config.userLang && wgUserLanguage in config && name in config[wgUserLanguage] )
            return config[wgUserLanguage][name];
         if ( wgContentLanguage in config && name in config[wgContentLanguage] )
            return config[wgContentLanguage][name];
         return config.en[name];
      }
 
      if ( wgNamespaceNumber % 2 === 1 && ( wgAction === "view" || wgAction === "purge" ) ) {
         var pageBody, pageControls, pageControlHTML;
         var buttonPrimary = buttonSecondary = ['', ''];
 
         importStylesheetPage('ArchiveTool/code.css', 'dev');
 
         switch(skin) {
            case 'monaco':
               pageBody = '#bodyContent';
               pageControls = '#page_controls';
               pageControlHTML = '<li id="control_archive"><img src="/skins/common/blank.gif" class="sprite move" /><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
               buttonPrimary = ['<a class="wikia-button">', '</a>'];
               buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
               break;
            case 'monobook':
               pageBody = '#bodyContent';
               pageControls = '#p-cactions > div > ul';
               pageControlHTML = '<li id="control_archive"><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
               buttonPrimary = ['<input type="submit" style="font-weight: bold;" value="', '" />'];
               buttonSecondary = ['<input type="submit" value="', '" />'];
               break;
            case 'oasis':
            case 'wikia':
               pageBody = '#WikiaArticle';
               pageControls = (wgNamespaceNumber == 3) ? '#WikiaUserPagesHeader > ul.wikia-menu-button > li > ul' : '#WikiaPageHeader > ul.wikia-menu-button > li > ul';
               pageControlHTML = '<li id="control_archive"><a id="ca-archive" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
               buttonPrimary = ['<a class="wikia-button">', '</a>'];
               buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
               break;
         }
 
         $(function() {
            function api(q, fn) {
               q.format = 'json';
               return $.post(wgScriptPath + '/api.php', q, fn, "json");
            }
            function token(page, fn) {
               api({
                  action: 'query',
                  query: 'prop',
                  prop: 'info',
                  titles: page,
                  intoken: 'edit'
               }, function(q) {
                  for ( var k in q.query.pages )
                     return fn(q.query.pages[k]);
               });
            }
 
            function startArchiving() {
               var c = config.archiveListTemplate.substr(0,1);
               var archiveListRegex = '['+c.toUpperCase()+c.toLowerCase()+']'+config.archiveListTemplate.substr(1);
               var bc = $(pageBody).addClass('archiving').empty();
               $('<img class="ajax" alt="Loading..." />')
                  .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
               api({
                  action: 'query',
                  prop: 'revisions',
                  titles: wgPageName,
                  rvprop: 'timestamp|content'
               }, function(q) {
                  bc.empty();
                  var rev = q.query.pages[wgArticleId].revisions[0];
                  var time = rev.timestamp;
                  var talkToken, tokenTime;
                  var content = rev['*'];
                  token(wgPageName, function(p) {
                     talkToken = p.edittoken;
                     tokenTime = p.starttimestamp;
                  });
 
                  var lines = content.split('\n');
 
                  var table = $('<table style="margin: 10px 0;"><thead><tr><th>' + msg('labelLines') + '</th><th title="' + msg('labelSections') + '">{&hellip;}</th></tr></thead></table>').appendTo(bc);
                  var ul = $('<tbody/>').appendTo(table);
 
                  for ( var l = 0; l < lines.length; l++ ) {
                     var line = lines[l];
                     $('<tr/>').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line))
                        .attr({line:line})
                        .append( $('<td class=line />').text(line).append('&nbsp;') ).appendTo(ul);
                  }
 
                  var sections = [];
                  var sectionEnd = lines.length-1;
                  for ( var l = lines.length-1; l >= 0; l-- ) {
                     var line = lines[l];
 
                     if ( /^=.+?=/.test(line) || l === 0 ) {
                        var section = { start: l, end: sectionEnd };
                        section.length = section.end - section.start + 1;
                        sections.unshift(section);
 
                        sectionEnd = l-1;
                     }
                  }
 
                  var section;
                  while( section = sections.shift() ) {
                     var tr = ul.children().eq(section.start);
                     $('<td class=section />').attr({rowspan: section.length}).appendTo(tr);
                  }
 
                  $('<div class="buttons" style="text-align: right;" />').append(
                     $(buttonSecondary[0] + msg('buttonSelectAll') + buttonSecondary[1]).click(function(e) {
                        e.preventDefault();
                        ul.children('tr').addClass('archive');
                     }), ' ',
                     $(buttonSecondary[0] + msg('buttonDeselectAll') + buttonSecondary[1]).click(function(e) {
                        e.preventDefault();
                        ul.children('tr').removeClass('archive');
                     }), ' ',
                     $(buttonPrimary[0] + msg('buttonSaveArchive') + buttonPrimary[1]).click(function(e) {
                        archive();
                     }), ' ',
                     $(buttonPrimary[0] + msg('buttonAbort') + buttonPrimary[1]).click(function(e) {
                        bc.find('.ajax').remove();
                        location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                     })
                  ).prependTo(bc).clone(true).appendTo(bc);
 
                  var click = false;
                  var add;
                  table.mousedown(function(e) {
                     e.preventDefault();
                     var $li = $(e.target).closest('tr');
                     if(!$li.length) return;
                     var $section = $(e.target).closest('.section');
                     if ( $section.length ) {
                        var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf();
                        var sadd = slist.filter(function() { return !$(this).hasClass('archive') }).length;
                        slist.toggleClass('archive', !!sadd);
                        return;
                     }
                     click = true;
                     add = !$li.hasClass('archive');
 
                     $li.toggleClass('archive', !!add);
                  });
                  table.mouseover(function(e) {
                     if (!click) return;
                     var $li = $(e.target).closest('tr');
                     if(!$li.length) return;
 
                     $li.toggleClass('archive', !!add);
                  });
                  $('body').mouseup(function(e) {
                     click = false;
                  });
 
                  function archive() {
                     var talkLines = [];
                     var archiveLines = [];
                     ul.children().each(function() {
                        var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')
                           ? talkLines : archiveLines;
 
                        arr.push( $(this).attr('line') );
                     });
 
                     if ( !(new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(talkLines[0]) )
                        talkLines = ['{{'+config.archiveListTemplate+'}}', ''].concat(talkLines);
                     archiveLines = ['{{'+config.archivePageTemplate+'}}', ''].concat(archiveLines);
 
                     bc.empty();
                     $('<img class="ajax" alt="Loading..." />')
                        .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
 
                     //$('<pre/>').text(talkLines.join('\n')).appendTo(bc);
                     //$('<pre/>').text(archiveLines.join('\n')).appendTo(bc);
                     runArchive(talkLines.join('\n'), archiveLines.join('\n'));
                  }
 
                  var archiveTitle;
                  function runArchive(talkContent, archiveContent) {
                     var archiveNo;
                     function findArchives() {
                        var m = $('<p>Finding archive id: </p>').appendTo(bc);
                        api({
                           action: 'query',
                           list: 'allpages',
                           apnamespace: wgNamespaceNumber,
                           apprefix: wgTitle+'/'+config.archiveSubpage,
                           aplimit: 1,
                           apdir: 'descending'
                        }, function(q) {
                           archiveNo = q.query.allpages.length ?
                              parseInt(q.query.allpages[0].title.substr(wgPageName.length+("/"+config.archiveSubpage).length),10)+1 :
                              1;
                           archiveTitle = wgPageName+'/'+config.archiveSubpage+' '+archiveNo;
                           m.append('done... (using '+archiveNo+')');
 
                           saveArchive();
                        });
                     }
 
                     function saveArchive() {
                        var m = $('<p>Finding token for '+archiveTitle+': </p>').appendTo(bc);
                        token(archiveTitle, function(p) {
                           m.append('done...');
                           m = $('<p>Saving archive page: </p>').appendTo(bc);
                           api({
                              action: 'edit',
                              title: archiveTitle,
                              text: archiveContent,
                              token: p.edittoken,
                              summary: "''"+ msg('summaryArchiveFrom') + " [["+wgPageName+"]].''",
                              minor: true,
                              createonly: true
                           }, function(q) {
                              if ( q.error && q.error.code === "articleexists" ) {
                                 m.append('failed...');
                                 bc.append("<p>The archive page we tried to create already exists.</p>");
                                 return abort();
                              }
                              m.append('done...');
 
                              saveTalk();
                           });
                        });
                     }
 
                     function saveTalk() {
                        var m = $('<p>Finding token for '+wgPageName+': </p>').appendTo(bc);
                        m.append('done...');
                        m = $('<p>Updating talk page: </p>').appendTo(bc);
                        api({
                           action: 'edit',
                           title: wgPageName,
                           text: talkContent,
                           token: talkToken,
                           summary: "''" + msg('summaryArchiveTo') + " [["+archiveTitle+"]].''",
                           minor: true,
                           basetimestamp: time,
                           starttimestamp: tokenTime
                        }, function(q) {
                           if ( q.edit.result === "Success" ) {
                              m.append('done...');
                              bc.find('.ajax').remove();
                              location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
                           } else {
                              m.append('failed...');
                              bc.append("<p>Failed to update talkpage, you may wish to have the archive subpage we just created deleted.</p>");
                              return abort();
                           }
                        });
                     }
 
                     function abort() {
                        bc.find('.ajax').remove();
                        bc.append("<p>Aborting...</p>");
 
                        $("<p>You may want to </p>")
                           .append( $('<a>refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )
                           .append(' and try again.')
                           .appendTo(bc);
                     }
 
                     // start
                     findArchives();
                  }
               });
            }
 
            $(pageControlHTML)
               .click(startArchiving)
               .appendTo(pageControls);
         });
      }
   })(jQuery);
}

/*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/

document.write('<script type="text/javascript" src="' 
    + '/index.php?title=MediaWiki:Functions.js&action=raw&ctype=text/javascript"></script>');

function fillPreloads()
{
    var div = document.getElementById("lf-preload");

    if(div == null)
        return;

    div.style.display = 'block';
    var span = document.getElementById('lf-preload-cbox');

    var comboString = "<select id='stdPreloads' onchange='onPreloadChange()'>";
    comboString += "</select>";
    span.innerHTML = comboString;
    
    span = document.getElementById('lf-preload-pagename');
    span.innerHTML = '<input type="text" class="textbox" />';
    span = document.getElementById('lf-preload-button');
    span.innerHTML = '<input type="button" class="button" value="Insert" onclick="doCustomPreload()" />';

    requestComboFill('stdPreloads', "Template:Stdpreloads");
}

function doCustomPreload()
{
    doPreload(document.getElementById('lf-preload-pagename').getElementsByTagName('input')[0].value);
}

function onPreloadChange()
{
    var combo = document.getElementById("stdPreloads");
    var value = combo.options[combo.selectedIndex].value;

    if(value == "")
        return;

    value = "Template:" + value + "/preload";
    value = value.replace(" ", "_");
    doPreload(value);
}

addOnloadHook(fillPreloads);

/* Preload system ends */

/* The following Facebook box builder comes from Improvaganza Wiki.  It's sort of cool, but it may not be something
we keep around.  It creates a little box allowing you to like whatever thing appears after "id="
   below.  At present, it's using the id for Doctor Who on Facebook.  You can see an example of what it 
   does at [[user:CzechOut/Sandbox10]].  Might be an idea to rotate it every once in a while, putting up the id of 
   whatever's the "hottest" thing in the DWU at the moment.
   
   The IDs of some other shows:
   
   Torchwood: 113521238658450
   The Sarah Jane Adventures: 109282012424173
   Doctor Who:  127031120644257
   Big Finish: 109833429043462 */

function fBox() {
	$('#fbox').append('<iframe marginheight="0" marginwidth="0" src="http://www.facebook.com/connect/connect.php?id=127031120644257&amp;connections=10" align="top" frameborder="0" width="300" height="90" scrolling="no" />');
}

$(fBox);