Zelda Wiki

Want to contribute to this wiki?
Sign up for an account, and get started!

Come join the Zelda Wiki community Discord server!

READ MORE

Zelda Wiki
Register
Advertisement

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//<nowiki>

//

// --------------------------------------------------------
// Fix not jumping to section after redirect on Chrome, etc.
// --------------------------------------------------------

console.log("|START-------");
console.log("| Fix not jumping to section");
$(document).ready(function() {
  console.log("| Document ready");
  var loc = document.location;
  if (loc.hash!=="" && document.body.scrollTop===0){
  console.log("Do the jump!");
    document.location=loc;
  }
  console.log("|END---------");
});

// --------------------------------------------------------
// Add Special:ExpandTemplate shortcut to Sidebar
// --------------------------------------------------------

console.log("|START-------");
console.log("| Add Special:ExpandTemplate shortcut to Sidebar");

var elExp = document.createElement("li");
elExp.setAttribute("id","t-expandtemplates");

var elExpLink = document.createElement("a");
elExpLink.textContent = "Expand templates";
elExpLink.setAttribute("href", "/Special:ExpandTemplates");
elExpLink.setAttribute("title", "Expand templates and preview wikitext");

elExp.appendChild(elExpLink);

var elSpecialpages = document.getElementById("t-specialpages");
elSpecialpages.parentNode.insertBefore(elExp, elSpecialpages);
console.log("| Done!");
console.log("|END----------");

// --------------------------------------------------------
// External wiki redirect prompt
// Test to make a dialogue box ask whether to redirect when sent to soft redirect pages
// Notes: .firstChild should have worked(?) but didn't?; console.log("| "+elSoftRedirect.children[0]); //An alternative
//        http://stackoverflow.com/questions/18507839/order-of-evaluation-in-if-statement-in-javascript#
//        http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons
//        ... !== ""/*Also fails if not a string; won't convert to string to test*/
//        http://www.sitepoint.com/javascript-vs-jquery-html-collections/
//        Need return value of settimeout https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout#Example
//        Just making sure http://www.webdevelopersnotes.com/tutorials/javascript/global_local_variables_scope_javascript.php3
//        http://stackoverflow.com/questions/1575141/make-div-100-height-of-browser-window
//        Based on: http://rewdy.com/tools-files/leaveNotice/example.html
// TODO:  Move styles to css?
//        Move notes to the talk page perhaps
//        Convert the element creation to jQuery for maintainability?
//        What should be converted to jQuery for compatibility?
// --------------------------------------------------------

console.log("|START-------");
console.log("| External wiki redirect prompt");

/* Get the element with the soft redirect text (null if none/not found) */
var elSoftRedirect = document.getElementById("softredirect");
console.log("| #softredirect: "+elSoftRedirect);

/* Check if softredirect page */
if (elSoftRedirect !== null) {

  /* If soft redirect page */

  console.log("| This is a softredirect");

  //Get the elements that should have the article and wiki names
  var elArticleName = elSoftRedirect.firstElementChild,
      elWikiName    = elSoftRedirect.lastElementChild;
  console.log("| ArticleName element: " + elArticleName);
  console.log("|    WikiName element: " + elWikiName   );

  //If destination article url exists
  if ( elArticleName !== null && elArticleName.hasAttribute("href") ) {

    //Set the article name according to the html inside elArticleName:
    var strArticleName;
    if ( elArticleName.innerHTML !== "" ) {
      strArticleName = elArticleName.innerHTML;
    } else { 
      strArticleName = "an article";
    };

    //Set the wiki name according to the html in elWikiName (no WikiName if target is special page):
    var strWikiName;
    if ( elWikiName !== null && elWikiName.innerHTML !== "" ) {
      strWikiName = elWikiName.innerHTML;
    } else if (false/*<- change this */) {
      /* See if a special page, that is, so WikiName but domain is zeldawiki */
    } else {
      strWikiName = "another Wiki";
    };

    //Set the target URL to the one in elArticleName
    var targetURL = elArticleName.getAttribute("href");
    console.log("| The destination URL: " + targetURL);

    //Display the soft-redirect message box
    ConfirmRedirect(strArticleName, strWikiName, targetURL, 4e3);

  } else {
    /* If somehow there is no URL to go to, do nothing */
    console.log("| Error: No redirect destination URL found");
  };

} else {
  /* If not a soft redirect page, do nothing */
  console.log("| There's no softredirect");
};
console.log("|END---------");

/* Show the message box, with links, timeout and fade ~ http://rewdy.com/tools-files/leaveNotice/example.html */
function ConfirmRedirect(Where, Domain, url, timeOut){
  console.log("||-------");
  console.log("|| ConfirmRedirect function ");
  console.log("|| Heading to " + Where + " at/on " + Domain + " at " + url);
  console.log("|| Time before automatically redirects: " + timeOut);

  //Darken the background
  var elDark
  document.body.appendChild(
    elDark = 
      newElem(
        "div",
        "opacity: 0.3; position:fixed; top:0; left:0; width:100%; height:100%; background-color:#000;",
        "msg-dimmer"
      )
  );

  //Add the container
  var elContainer
  document.body.appendChild(
    elContainer = 
      newElem(
        "div",
        "position:fixed; top:20%;/* ? */ top:20vh;/* 20% of viewport*/ left:0px; width:100%;",
        "msg-container"
      )
  );
  //Put the text box (empty) in the container
  var elBox
  elContainer.appendChild(
    elBox = 
      newElem(
        "div",
        "width:460px; margin:0px auto; min-height:100px; background-color:rgb(29, 87, 139); border:5px solid #0B284F; text-align:center; padding:15px;border-radius:10px; -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; -icab-border-radius:10px; -o-border-radius:10px", 
        "msg-box"
      )
  );

  //Add 2 lines of text and a cancel button to the textbox
  elBox.appendChild(
    newElem(
     "p",
     null,
     "msg-l1",
     "The link you clicked will navigate you outside of " + wgSiteName,
     "wikitable"
    )
  );

  var elText2
  elBox.appendChild(
    elText2 = 
      newElem(
        "p",
        null,
        "msg-l2",
        "You will soon be navigated to:",
        "wikitable"
      )
  );
  
  //Set innerHTML text:
  elText2.innerHTML = elText2.innerHTML + '<br><strong>'+document.getElementById("softredirect").innerHTML+'</strong>';

  //If deviating from default text, like altering links you can use the following:
  //Change the newElem text argument to:
  // "You will soon be navigated to "+Where
  //Use instead of the innerHTML text:
  // if (Domain !== "") elText2.textContent = elText2.textContent+" on "+Domain;

  //Add the cancel instructions with cancel button to the textbox
  var elText3
  elBox.appendChild(
    elText3 = 
      newElem(
        "p",
        "line-height: 2.5em;",
        "msg-cancel",
        " or press the ESC key.",
        "wikitable"
      )
  );
  
  //Add the cancel button
  elText3.innerHTML = '<a href="#" class="usermessage" id="link-cancel">Stay here!</a>'+elText3.innerHTML;

  //This navigates to the target page after __ seconds; Stores the timer in goNavigate
  var goNavigate = 
    setTimeout(
      function () {
        elText3.innerHTML = '<em>Loading...</em>';
        window.location.href = url
      },
      timeOut /* param */
    );

  //https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent
  //https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
  //https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key#Example
  //http://stackoverflow.com/questions/3476000/javascript-key-handling-and-browser-compatibility
  ////jQuery is probably better for compatibility and ease in this case... if I understood how to use it here
  ////http://api.jquery.com/keyup/
  // as long as jquery is with zeldawiki, scratchpad jquery will work.
  //$().sadfghj is the usual syntax? (after all, jquery is just abstraction, thus are functions, in javascript?). the () contains #asdf for element asdf, document <-goes straight in not quotes, etc.

  //When cancel is clicked or Esc pressed:
  // Cancels countdown and Esc key monitor, removes the message box
  $('#link-cancel').click(function () {
    beGone();
    $('#msg-dimmer, #msg-container').remove();
  });
  $(document).bind('keyup', function (e) {
    if (e.which == 27) {
      beGone();
      $('#msg-dimmer, #msg-container').remove();
    };
  });
  //When page starts to unload on navigation, remove the countdown and Esc key monitor
  $(window).unload(function () {
    beGone();
  });
}


//Create a simple html element
// Use null for empty parameters
function newElem(type, style, id, text, classes){
  var elem = document.createElement(type);
  if (style   !== null){ elem.setAttribute("style",style);   };
  if (id      !== null){ elem.setAttribute("id",id);         };
  if (text    !== null){ elem.textContent = text;            };
  if (classes !== null){ elem.setAttribute("class",classes); };
  return elem;
};

//Cancels countdown and Esc key monitor
function beGone(){
  clearTimeout(goNavigate);
  $(document).unbind('keyup');
}



// --------------------------------------------------------
// Automatic purge cache after new version upload aka reupload
// Notes: Only perform if both this and the prev page were the reupload page then image page 
//        (in simplicity, just test for existence, though could be more efficient to match, then use the reupload page's image name 
//         in the search string for current url)
//        Renavigate won't work + reload gives infinite loop + server purge isn't the issue so pointless 
//          //location = window.location.href;//window.location.reload(true);
//        Something about the way Doin (user at stackoverflow) did it makes the onload/etc. work
//        The file history uses a thumbnail (unless it's a small file) which is updated/generated after reupload(?); if file is
//         small, then it won't create a thumbnail(?)
//        So, only the non-thumb image is stuck in cache(?), so need to refresh that src only, but need to remove both main and 
//         most recent file history src.s also jic
// Relating to Doin's code:
//        http://stackoverflow.com/questions/3535996/jquery-javascript-functione-what-is-e-why-is-it-needed-what-does-it-ac#
//        ////set iframe0.src after addEventListener? Though addEventListener then needs 'firstrun'(?) to not put back src.s early////
//        //Need the "window." ?//http://stackoverflow.com/questions/588040/window-onload-vs-document-onload
//
// nup?:  http://www.satya-weblog.com/2010/04/how-to-delete-cached-file-on-client-side.html
//        http://websistent.com/javascript-reload-image/
//
// Ref: document.referrer     https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer
//      .search( ... )        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search
//      window.location.href  https://developer.mozilla.org/en-US/docs/Web/API/Window/location
//      |                       https://developer.mozilla.org/en-US/docs/Web/API/Location
//      wg stuff              https://www.mediawiki.org/wiki/Manual:Interface/JavaScript
//      RegExp                https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
//      RegExp checker       http://www.regexr.com/
//      Tip: Use mozilla's scratchpad to debug js
//      Works, once you replace the relevant stuff that scratchpad gives error 
//                            http://stackoverflow.com/questions/321865/how-to-clear-or-replace-a-cached-image#22430452
//                            http://stackoverflow.com/questions/1077041/refresh-image-with-a-new-one-at-the-same-url#22429796
//      loop                  http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript
//      var.s !               https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
//      Need the "window." ?  http://stackoverflow.com/questions/588040/window-onload-vs-document-onload
//
// RegExp info: Encase like so / ... / ; the operations typically operate on preceding char; \ to escape; ? ops to 0 or 1 of; 
//              * ops to 0 or more of; . represents most characters; {1,5} ops to 1 ot 5 of; 
//
// TODO: Make url checking better?
//       Probably don't need to check if src exists if thisURL and prevURL are right (though jic, to not break the whole script?)
//       Extra large images create a medium size thumbnail too! is that auto-updated/generated? I suppose I need to reverse-eng the 
//        image url/src in that case?
//       Images of index 1 and 2 are the game image and license image, which usually but may not exist; thus, just loop to temp
//        remove over all images to be safe?
// --------------------------------------------------------

console.log("|-------");
  console.log("To avoid having to reupload, now that the validation definitely works, made a link to replace this user action");
  if (location.href.search(/File=.*\..{1,5}/) != -1){
    document.getElementById("n-mainpage").firstChild.innerHTML = '<a href="http://zeldawiki.org/File:'+location.href.match(/File=.*\..{1,5}(?=&)/)[0].substring(5)+'">CLICK OVER HERE<br>CLICK OVER HERE<br>CLICK OVER HERE<br>CLICK OVER HERE</a>'
  };
console.log("| Purge image cache after reupload - START");
//Get previous page URL (then later test if is a reupload page)
prevURL = document.referrer; //Get previous url
//It's possible for prevURL to be empty if not navigated through links, e.g. address bar/back-button, etc. so check this first(?):
if (prevURL != "") {
  console.log("| The previous URL is: "+prevURL);
  var prevRE = /https?:\/\/zeldawiki\.org\/index\.php\?title=Special:Upload&wpDestFile=.*\..{1,5}&wpForReUpload=1.*/; //RegExp
  //Test if prevURL is a reupload page:
  if (prevURL.search(prevRE) != -1){
    //If prevURL is a reupload page
    console.log("| The previous URL was a reuploading page");
    //Get current URL + test if the image page that would follow after upload
    var thisURL = window.location.href; //Get current url
    console.log("| This URL is: "+thisURL);
    var thisRE = /https?:\/\/zeldawiki.org\/File:.*\..{1,5}/; //RegExp
    //Test if thisURL is an image page:
    if (thisURL.search(thisRE) != -1) {
      console.log("| This url is an image page");
      console.log("| Time to refresh image cache:");
      purgeImgCache();
    } else { console.log("| This url isn't an image page - END"); };
  } else { console.log("| Previous url isn't (a) reupload page - END"); };
  console.log("|-------");
} else { console.log("| No previous url - END");console.log("|-------"); };

function purgeImgCache(){
  console.log("||-------");
  console.log("|| Start Img cache purge, may not work in all situations");

  //Find the imgs and their src.s
  var elBodyText = document.getElementById("mw-content-text"); //main body element that hold the actual page content
  console.log("|| "+elBodyText);
  var arrayImgEl = elBodyText.getElementsByTagName("img"); //Array of all img elements in the main body
  console.log("|| "+arrayImgEl); 
  //Test if first img (main image/medium-thumbnail) has src then store it
  if ( arrayImgEl[0].hasAttribute("src") ){
    var source0 = arrayImgEl[0].getAttribute("src"); //arrayImgEl[0].src retrieves full url instead btw
  };
  //Test if first img (first image/small(?)-thumbnail in File History) has src then store it
  if ( arrayImgEl[3].hasAttribute("src") ){
    var source3 = arrayImgEl[3].getAttribute("src"); //arrayImgEl[3].src retrieves full url instead btw
  };

  //Blank or remove the src.s to avoid issues when refreshing
  arrayImgEl[0].setAttribute("src","");
  arrayImgEl[3].setAttribute("src","");
  console.log("|| http://zeldawiki.org"+source0);
  
  //Create iframe, add it to the page, add the src.s
  var step = 0, iframe0 = window.document.createElement("iframe");//Need the "window." ?//http://stackoverflow.com/questions/588040/window-onload-vs-document-onload
  iframe0.style.display = "none"; //So it takes up no space
  window.parent.document.body.appendChild(iframe0);///document.body.appendChild(iframe0); //?

  console.log("|| "+iframe0.contentWindow); //Should be about:blank, not null?

  //Wait for load (only Doin's way works??)
  iframe0.addEventListener("load" ,refreshOrDone,false);
  iframe0.addEventListener("error",refreshOrDone,false);
  iframe0.src = source0; //"http://zeldawiki.org"+
  function refreshOrDone(){
    if (!step)  // "initial load just completed.  Note that it doesn't actually matter if this load succeeded or not!"
    {
      step = 2; iframe0.contentWindow.location.reload(true); // "initiate forced-reload"
    }
    else if (step===2)   // "forced re-load is done"
    {
      arrayImgEl[0].setAttribute("src",source0);
      arrayImgEl[3].setAttribute("src",source3);
      console.log("|| loaded?");
      if (iframe0.parentNode) iframe0.parentNode.removeChild(iframe0);
    };
  }
  //console.log("||-------");
}

//</nowiki>
Advertisement