User:KokoroSenshi/common.js

//

// // Insert iFrame // Notes: Sketchfab //

mw.loader.load( '/index.php?title=User:KokoroSenshi/SketchfabEmbed.js&action=raw&ctype=text/javascript' );

// // Function to add custom links to sidebar // Notes: Can't call the function if loaded with mw.loader.load //

function ModifySidebar( action, section, name, link ) { try { switch ( section ) { case 'languages': var target = 'p-lang'; break; case 'toolbox': var target = 'p-tb'; break; case 'navigation': var target = 'p-navigation'; break; default: var target = 'p-' + section; break; }

if ( action == 'add' ) { var node = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0];

var aNode = document.createElement( 'a' ); var liNode = document.createElement( 'li' );

aNode.appendChild( document.createTextNode( name ) ); aNode.setAttribute( 'href', link ); liNode.appendChild( aNode ); liNode.className = 'plainlinks'; node.appendChild( liNode ); }

if ( action == 'remove' ) { var list = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0];

var listelements = list.getElementsByTagName( 'li' );

for ( var i = 0; i < listelements.length; i++ ) { if (					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||					listelements[i].getElementsByTagName( 'a' )[0].href == link				) {					list.removeChild( listelements[i] ); }			}		}

} catch( e ) { // let's just ignore what's happened return; } }

// // Add custom links to sidebar // Notes: e.g. Special:ExpandTemplates and Special:ReplaceText //

console.log("|START SIDEBAR LINKS-"); ModifySidebar("add", "toolbox", "Expand templates", "/Special:ExpandTemplates" ); ModifySidebar("add", "toolbox", "Replace text", "/Special:ReplaceText" ); console.log("|END  SIDEBAR LINKS-");

// // Replace mw-datatable class with wikitable class // Notes: //

console.log("|START 1-"); $("table.mw-datatable").addClass("TablePager"); console.log("|END 1---");

// // Fix not jumping to section after redirect on Chrome, etc. // Notes: http://stackoverflow.com/questions/10654244/chrome-bug-or-coding-error-anchor-id-links-within-destination-page-not-working#10655578 //       That is, Chrome is checking for anchor/id before it's load ed into the page //         (but only when arrive through redirect, for whatever reason...) //       Need to identify when the browser isn't jumping automatically - can't differentiate from user scrolling themselves, //         so instead for now check if page is Article#section and came from redirect page //

console.log("|START---"); console.log("| Fix not jumping to section");

$(document).ready(function {

console.log("| Document ready"); var loc = document.location, elContentSub;

if (loc.hash!==""      && (elContentSub = document.getElementById("contentSub").firstChild)      && elContentSub.getAttribute("class")==="mw-redirectedfrom"      /* document.body.scrollTop===0 */ ){ console.log("| Do the jump!"); document.location=loc; } else { console.log("| Didn't need to jump?"); };

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 + ' '+document.getElementById("softredirect").innerHTML+' ';

//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 = 'Stay here!'+elText3.innerHTML;

//This navigates to the target page after __ seconds; Stores the timer in goNavigate var goNavigate = setTimeout(     function  {        elText3.innerHTML = ' Loading... ';        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 = 'CLICK OVER HERE CLICK OVER HERE CLICK OVER HERE CLICK OVER HERE' }; 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("||---"); }

//