Adventure Time Wiki
Advertisement
Adventure Time Wiki

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.
/**
*
* Description:
* Updates file links in use on the wiki when image is renamed.
*
* @Author Foodbandlt
* @Author Jr Mime
* Last updated 29 September, 2015
**/

// Options processing
	
if (typeof LIR === "undefined"){

	LIR = {
		/**************************************
		// Multilingual support (sorry about the amount of messages...)
		**************************************/
		supportedLanguages: ["en", "be", "de", "fr", "it", "pl", "ru", "uk"],

		/* 
			To insert new languages, add the language code to the supportedLanguages array above and 
			make a sub-page of FileUsageAuto-update with the name of your language code
			example: FileUsageAuto-update/en.js
		*/
		
		i18n: {
			// Compatibility with how Wikia handles non-English wikis... ugh
			en: {
				fileNamespace: 'File',
				imageNamespace: 'Image',
				videoNamespace: 'Video',
			}
		},
		// Wiki's selected language
		lang: '',
		// User's selected language
		userLang: '',
		wg: mw.config.get([
			'wgScriptPath'
		]),
		
		ERRORS: [],
		
		/**************************************
		// Object instance-related functions
		**************************************/
	
		constructInstance: function(button){
			this.started = false;
			
			this.buttonId = button;
			
			this.method = '',
			
			this.updateStatus = function(gifDisplay, message){
				if ($("#queueStatus-" + this.buttonId).length == 0  && $("#liveLoader-" + this.buttonId).length == 0) return false;
			
				if (typeof gifDisplay === "string"){
					message = gifDisplay;
				}else if (typeof gifDisplay === "boolean"){
					if (gifDisplay == false){
						displayValue = "none";
					}else{
						displayValue = "inline-block";
					}
					if ($("#liveLoader-" + this.buttonId).length > 0){
						$("#liveLoader-" + this.buttonId).css("display", displayValue);
					}
				}else{
					return false;
				}
				
				if (typeof message === "string" && $("#queueStatus-" + this.buttonId).length > 0){
					$("#queueStatus-" + this.buttonId).html(" " + message);
				}
				return true;
			};
			
			this.start = function(type, oldName, newName, reason, callback){
				LIR.rand = Math.floor( Math.random()*1000 );
				/*Variable used for closure to access the instance of the object*/
				var objectInst = this;
				
				if (!Storage){
					return false;
				}
				
				/* Checks if function has already started */
				if ((this.started == true || LIR.started == true) && typeof this.queuePosition === "undefined"){
					return false;
				}
				
				/* Treat manual additions like multi because I'm lazy */
				if (type == "manual"){
					type = "multi";
					this.method = "manual";
					
					this.updateStatus(true, LIR.userLang.processing);
				}
				
				/* Checks whether renaming single image or adding to queue */
				if (typeof(type) !== "undefined"){
					if (type == "single"){
						this.started = true;
						this.updateStatus(true, LIR.userLang.processing);
						this.type = "single";
					}else if (type == "multi"){
						this.started = true;
						
						if (typeof this.queuePosition === "undefined"){
							this.queuePosition = ++localStorage.LIRQueuedUpdates;
							this.updateStatus(true);
						}
						
						if (this.queuePosition != localStorage.LIRQueuedUpdatesPos){
							this.updateStatus( LIR.userLang.waitList[0] + " " + ((this.queuePosition - localStorage.LIRQueuedUpdatesPos)) + " " + LIR.userLang.waitList[1] );
							setTimeout(function(){
								objectInst.start(type, oldName, newName, reason, callback)
							}, 
							500);
							return false;
						}
						
						this.updateStatus(LIR.userLang.processing);
						this.type = "multi";
					}else{
						if (console) console.log("Incorrect type specified");
						return false;
					}
				}else{
					this.started = true;
					this.updateStatus(true, LIR.userLang.processing);
					this.type = "single";
				}
				
				/* Retrieves queue, or resets variables if doesn't exist */
				if (typeof (localStorage[wgUserName + "_LIRQueueData"]) !== "undefined"){
					this.queueData = JSON.parse(localStorage[wgUserName + "_LIRQueueData"]);
				}else{
					this.queueData = [];
				}

				/* Sets variables used by the function */
				if (typeof oldName != "undefined" && typeof newName != "undefined"){
					if (oldName == "" || newName == ""){
						this.updateStatus(false, LIR.userLang.fileNameBlank);
						this.started = false;
						localStorage.LIRQueuedUpdatesPos++;
						delete this.queuePosition;
						return false;
					}
					var oldImageName = oldName,
						newImageName = newName;
						if (typeof reason == "undefined") var reason = "";
				}else{
					var oldImageName = $('input[name="wpOldTitle"]').val().slice(LIR.lang.fileNamespace.length + 1),
						newImageName = $("#wpNewTitleMain").val(),
						reason = $("#wpReason").val();
				}
				
				if ( $("#wpLeaveRedirect").length != 0 ){
					var leaveRedirect = $("#wpLeaveRedirect").is(":checked");
				}else{
					var leaveRedirect = false;
				}
				
				this.pageKey = [];
				
				/* Checks if old or new file name is currently part of the queue */
				for (i=0; i<this.queueData.length; i++){
					if (this.queueData[i].newImage == oldImageName || 
						this.queueData[i].newImage == newImageName || 
						this.queueData[i].oldImage == oldImageName || 
						this.queueData[i].oldImage == newImageName){
						
						this.started = false;
						if (typeof this.queuePosition !== "undefined"){
							localStorage.LIRQueuedUpdatesPos++;
							delete this.queuePosition;
						}
						
						if (this.queueData[i].oldImage == oldImageName || this.queueData[i].newImage == oldImageName){
							var errorMessage = 'alreadyInQueue';
						}else{
							var errorMessage = 'nameInUse';
						}
						
						this.updateStatus(false, LIR.userLang[errorMessage]);
						if (typeof(callback) === "function"){
							callback(false, errorMessage);
						}
						return false;
					}
				}
				var isVideo = true;
				for (var ext in wgFileExtensions){
					if (oldImageName.indexOf("." + wgFileExtensions[ext]) != -1){
						isVideo = false;
						break;
					}
				}
				
				/* Checks if destination file name is the same as file being renamed (since Wikia's server-sided code usually validates this) */
				var oldExt = oldImageName.slice(oldImageName.lastIndexOf(".")).toLowerCase();
				var newExt = newImageName.slice(newImageName.lastIndexOf(".")).toLowerCase();
				
				if (oldExt != newExt && 
					!((oldExt == ".jpeg" || oldExt == ".jpg") && (newExt == ".jpeg" || newExt == ".jpg")) && // Same MIME type bugfix
					this.method != "manual" && 
					!isVideo){
					
					this.started = false;
					if (typeof this.queuePosition !== "undefined"){
						localStorage.LIRQueuedUpdatesPos++;
						delete this.queuePosition;
					}
					this.updateStatus(false, LIR.userLang.invalidExtension);
					if (typeof(callback) === "function"){
						callback(false, "invalidExtension");
					}
					return false;
				}
				
				if (localStorage[wgUserName + "_LIRNamespaceSelection"] == false){
					var namespaceSelection = "&blnamespace=0";
				}else{
					var namespaceSelection = "";
				}
				

				/* Check if destination file name is in use */
				$.getJSON(LIR.wg.wgScriptPath + "/api.php?action=query&prop=revisions&rvprop=content&titles=" + LIR.lang.fileNamespace + ":"+encodeURIComponent(newImageName.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27")+"&format=json&v=" + LIR.rand, function(result){
					if (typeof result.query.pages[-1] !== "undefined" || objectInst.method == "manual"){
						/* If not, then get file usage for image */
						$.getJSON(LIR.wg.wgScriptPath + "/api.php?action=query&list=imageusage&iutitle=" + LIR.lang.fileNamespace + ":"+encodeURIComponent(oldImageName.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27")+"&iulimit=20&format=json&v=" + LIR.rand, function(result){
							var imageUsage = result.query.imageusage;
							
							$.getJSON(LIR.wg.wgScriptPath + "/api.php?action=query" + namespaceSelection + "&list=backlinks&bltitle=" + LIR.lang.fileNamespace + ":" + encodeURIComponent(oldImageName.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "&format=json&v=" + LIR.rand, function(result){
								var imageLinks = result.query.backlinks;
								var totalImageUsage = imageUsage.concat(imageLinks);
								
								if (console) console.log("Image usage successfully retrieved");
								if (totalImageUsage.length > 0){
								
									/* Resets queue-related variables if only renaming and replacing a single image */
									if (objectInst.type == "single"){
										
										objectInst.queueData = [];
										objectInst.queueDataList = [];
										objectInst.pageKey = [];
										
										for (var currentPage = 0; currentPage < totalImageUsage.length; currentPage++){
											var title = totalImageUsage[currentPage].title;
											/* Temporary until Wikia fixes issue with editing blog comments through the API */
											if (title.search( new RegExp(LIR.lang.userBlogCommentNamespace, "i") ) != -1){
												var LIRBlogComment = true;
											}
										}
										
										objectInst.queueDataList.push({
											oldImage: oldImageName,
											newImage: newImageName,
											reason: reason,
											move: true,
											noRedirect: !leaveRedirect
										});
										
									}else{
										objectInst.queueData.push({
											oldImage: oldImageName,
											newImage: newImageName,
											reason: reason,
											move: (objectInst.method == "manual" ? false : true),
											noRedirect: !leaveRedirect
										});
											
										for (var currentPage = 0; currentPage < totalImageUsage.length; currentPage++){
											var title = totalImageUsage[currentPage].title;
											/* Temporary until Wikia fixes issue with editing blog comments through the API */
											if (title.search( new RegExp(LIR.lang.userBlogCommentNamespace, "i") ) != -1){
												var LIRBlogComment = true;
											}
										}
									}
									
									/* Stores queue if renaming multiple images, or updates file usage if only renaming one */
									if (objectInst.type == "multi"){
										objectInst.storeQueue();
										objectInst.started = false;
										localStorage.LIRQueuedUpdatesPos++;
										
										objectInst.updateStatus(false, LIR.userLang.successful);
										
										if (wgCanonicalSpecialPageName == "Movepage" && 
											(wgPageName.indexOf(LIR.lang.fileNamespace + ":") != -1 || 
											wgPageName.indexOf(LIR.i18n.en.fileNamespace + ":") != -1 ||
											wgPageName.indexOf(LIR.lang.imageNamespace + ":") != -1 ||
											wgPageName.indexOf(LIR.i18n.en.imageNamespace + ":") != -1 ||
											wgPageName.indexOf(LIR.lang.videoNamespace + ":") != -1 ||
											wgPageName.indexOf(LIR.i18n.en.videoNamespace + ":") != -1)
										){
											window.location = LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(oldImageName.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27");
										}else{
											if (typeof callback == "function")
												callback(true);
										}
									}else{
										/* This may seem odd, but because I use LIR.processQueue() for both single and multiple image 
											updating, it requires this.started to be false to start */
										objectInst.started = false;
										LIR.processQueue(function(){
											window.location = LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(newImageName.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27");
										});
									}
									

								}else{
									/* Else, prompt to use normal renaming, since this is kind of pointless otherwise */
									objectInst.started = false;
									if (typeof objectInst.queuePosition !== "undefined"){
										localStorage.LIRQueuedUpdatesPos++;
										delete objectInst.queuePosition;
									}
									objectInst.updateStatus(false, LIR.userLang.fileNotUsed);
									if (typeof(callback) === "function"){
										callback(false, "fileNotUsed");
									}
								}
							});
						});
					}else{
						objectInst.started = false;
						if (typeof objectInst.queuePosition !== "undefined"){
							localStorage.LIRQueuedUpdatesPos++;
							delete objectInst.queuePosition;
						}
						objectInst.updateStatus(false, LIR.userLang.destInUse);
						if (typeof(callback) === "function"){
							callback(false, "destInUse");
						}
					}
				});
				
			};
			
			this.storeQueue = function(){
				/* Standalone function to store the queue in window.localStorage
					uses wgUserName as a variable key so multi-user computers on the same wiki don't get each other's queue */
				localStorage[wgUserName + "_LIRQueueData"] = JSON.stringify(this.queueData);
			};
		},
		
		instances: [],


		/**************************************
		// Processing-related functions
		**************************************/

		started: false,
		
		delay: 1000,
		
		updateProgress: function(show, progress){
			if (typeof progress == "undefined" && typeof show == "boolean")
				progress = 0;
				
			if (typeof show == "boolean"){
				if (LIR.instances[0].type == "multi"){
					if (show)
						$(".modalToolbar").prepend("<div id='LIRQueueProgress' style='float: left; width: 200px; border: 2px solid black; height: 17px;'><div id='LIRProgressInd' style='width: 0%; height: 100%; float: left; background-color: green;'></div></div>");
					else
						$("#LIRQueueProgress").remove();
				}
			}
			
			if (typeof progress == "number"){
				$("#LIRProgressInd").css("width", ((progress * 100) + "%"));
				return;
			}
				
			if (typeof show == "number")
				$("#LIRProgressInd").css("width", ((show * 100) + "%"));
		},
		
		getUsage: function(index, callback){
			if (localStorage[wgUserName + "_LIRNamespaceSelection"] == false){
				var namespaceSelection = "&blnamespace=0";
			}else{
				var namespaceSelection = "";
			}

			$.getJSON(LIR.wg.wgScriptPath + "/api.php?action=query&list=imageusage&iutitle=" + LIR.lang.fileNamespace + ":"+encodeURIComponent(LIR.queueDataList[index].oldImage.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27")+"&iulimit=5000&format=json&v=" + LIR.rand, function(result){
				var imageUsage = result.query.imageusage;

				$.getJSON(LIR.wg.wgScriptPath + "/api.php?action=query" + namespaceSelection + "&bllimit=5000&list=backlinks&bltitle=" + LIR.lang.fileNamespace + ":" + encodeURIComponent(LIR.queueDataList[index].oldImage.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "&format=json&v=" + LIR.rand, function(result){
					var imageLinks = result.query.backlinks;
					var totalImageUsage = imageUsage.concat(imageLinks);

					if (console) console.log("Image usage successfully retrieved");

					/* Adds pages image is used on to window.LIR.pageKey to help keep track of pages in window.LIR.pageData later on */
					for (var currentPage = 0; currentPage < totalImageUsage.length; currentPage++){
						var title = totalImageUsage[currentPage].title;

						if (LIR.pageKey.indexOf(title) == -1){
							LIR.pageKey[LIR.pageKey.length] = title;
						}

						for (i = 0; i <= LIR.queueData.length; i++){
							if (i == LIR.queueData.length){
								LIR.queueData[LIR.queueData.length] = {
									oldImage: LIR.queueDataList[index].oldImage,
									newImage: LIR.queueDataList[index].newImage,
									title: title,
									move: LIR.queueDataList[index].move
								};
								break;
							}else if (LIR.queueData[i].title == title && 
								LIR.queueData[i].oldImage == LIR.queueDataList[index].oldImage && 
								LIR.queueData[i].newImage == LIR.queueDataList[index].newImage){
								break;
							}
						}
					}

					if (typeof(callback) === "function"){
						callback();
					}
				});
			});
		},
		
		processQueue: function(callback){
			if (localStorage.LIRQueuedUpdates < localStorage.LIRQueuedUpdatesPos && localStorage.LIRQueuedUpdates != 0){
				localStorage.LIRQueuedUpdates = 0;
				localStorage.LIRQueuedUpdatesPos = 1;
			}

			/* Check if operation already started */
			if (LIR.started == true){
				return false;
			}

			/* this.type is already set if processing single update */
			if (typeof(LIR.instances[0].type) === "undefined"){
				LIR.instances[0].type = "multi";
			}

			/* Variable redeclaration */
			LIR.started = true;
			LIR.requestCompleted  = [];
			LIR.pageData = [];

			/* Queue retrieval, returns false if no queue */
			if ( (LIR.instances[0].type == "multi" && localStorage.LIRQueuedUpdates == 0) || LIR.instances[0].type == "single"){
				if (typeof (localStorage[wgUserName + "_LIRQueueData"]) !== "undefined" || LIR.instances[0].type == "single"){
					if (LIR.instances[0].type == "multi"){
						LIR.queueDataList = JSON.parse(localStorage[wgUserName + "_LIRQueueData"]);
						LIR.updateProgress(true);
						if (console) console.log("Queue retrieved successfully.");
					}else{
						LIR.queueDataList = LIR.instances[0].queueDataList;
					}

					LIR.usageRequested = 0;
					LIR.usageProgress = 0;
					LIR.moveRequested = LIR.queueDataList.length;
					LIR.moveProgress = 0;
					LIR.queueData = [];
					LIR.pageKey = [];
					LIR.timer = 0;

					for (var index in LIR.queueDataList){
						if (LIR.queueDataList[index].move == true){
							LIR.moveFile(index, function(index){
								LIR.updateProgress( ((++LIR.moveProgress) / LIR.moveRequested) / 2 );
								LIR.usageRequested++;
								LIR.getUsage(index, function(){
									LIR.usageProgress++;
									if (LIR.moveProgress == LIR.moveRequested && LIR.usageProgress == LIR.usageRequested){
										LIR.processPageContent(callback);
									}
								});
							},
							function(callback){
								LIR.updateProgress( ((++LIR.moveProgress) / LIR.moveRequested) / 2 );

								if (LIR.moveProgress == LIR.moveRequested && LIR.usageProgress == LIR.usageRequested){
									LIR.processPageContent(callback);
								}
							});
						}else{
							LIR.updateProgress( ((++LIR.moveProgress) / LIR.moveRequested) / 2 );
							LIR.usageRequested++;
							LIR.getUsage(index, function(){
								LIR.usageProgress++;
								if (LIR.moveProgress == LIR.moveRequested && LIR.usageProgress == LIR.usageRequested){
									LIR.processPageContent(callback);
								}
							});
						}
					}
				}else{
					if (console) console.log("Queue does not exist or was unable to be retrieved.");
					LIR.started = false;
					return false;
				}


			}else if (LIR.instances[0].type == "multi" && localStorage.LIRQueuedUpdates != 0){
				if (console) console.log("Pages are still being added to the queue.");
				alert(LIR.userLang.pagesWaiting);
				LIR.started = false;
				return false;
			}else if (LIR.instances[0].type == "single"){
				LIR.processPageContent(callback);
			}
		},
		
		lowerUpperReg: function(input){
			return "[" + input.substr(0,1).toUpperCase() + input.substr(0,1).toLowerCase() + "]" + input.substr(1);
		},

		processPageContent: function(callback) {
			if (console) console.log("Begin queue execution");

			/* Sets progress checking variables */
			for (i = 0; i<LIR.pageKey.length; i++){
				LIR.requestCompleted[i] = false;
			}
			var pageDataRetrieved = 0;

			if (console) console.log("Getting page contents");


			for (var j = 0; j < (Math.floor(LIR.pageKey.length/500)+1); j++){
				var tempArray = [];

				for (var k = (j * 500); k < (j * 500) + 500; k++){
					if (k == LIR.pageKey.length){
						break;
					}

					tempArray.push( LIR.pageKey[k] );
				}
				
			/* Calls API for page contents */
				$.post(
					LIR.wg.wgScriptPath + "/api.php",
					{
						action: "query",
						prop: "revisions",
						rvprop: "content",
						titles: tempArray.join("|"),
						format: "json"
					},
					function(result){
						/* Saves page contents for each page in LIR.pageData */
						for (var i in result.query.pages){
							var keyNum = LIR.pageKey.indexOf(result.query.pages[i].title);
							LIR.pageData[keyNum] = {
								title: LIR.pageKey[keyNum],
								content: result.query.pages[i].revisions[0]["*"],
								changed: false
							};
							pageDataRetrieved++;
						}

						if (pageDataRetrieved == LIR.pageKey.length){
							if (console) console.log("Page contents retrieved and saved");
							LIR.log(LIR.userLang.contentsRetrieved);

							if (console) console.log("Begin processing page content.");

							/* Replacing image name on each page */
							for (i=0; i<LIR.queueData.length; i++){
								var pageKey = LIR.pageKey.indexOf(LIR.queueData[i].title);
								var escapedName0 = window.LIR.queueData[i].oldImage.replace(/\*/g, "\\*").replace(/\?/g, "\\?").replace(/\./g, "\\.").replace(/( |_)/g, "[ _]*?").replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/\+/g, "\\+");

								if ( escapedName0.substr(0,1).match(/[A-z]/i) ){
									var escapedName = LIR.lowerUpperReg(escapedName0);
								}else{
									var escapedName = escapedName0;
								}

								var pageReplacement = new RegExp("(\\n[ ]*?|\\[?:?(" + LIR.lowerUpperReg(LIR.lang.fileNamespace) + "|" + LIR.lowerUpperReg(LIR.lang.imageNamespace) + "|" + LIR.lowerUpperReg(LIR.lang.videoNamespace) + "|" + LIR.lowerUpperReg(LIR.i18n.en.fileNamespace) + "|" + LIR.lowerUpperReg(LIR.i18n.en.imageNamespace) + "|" + LIR.lowerUpperReg(LIR.i18n.en.videoNamespace) + "):[ ]*?|=[ ]*?|\\|)" + 
									escapedName + 
									"([ ]*?\\n|[ ]*?\\||[ ]*?\\]|[ ]*?\\}|[ ]*?;)", "g");
								var replacementReg = new RegExp(escapedName, "g");
								var regExec;

								if (LIR.pageData[pageKey].content.search(pageReplacement) != -1){
									LIR.pageData[pageKey].changed = true;
									if (console) console.log("\""+LIR.queueData[i].oldImage+"\" replaced on page \""+LIR.queueData[i].title+"\"");

									while ((regExec = pageReplacement.exec(LIR.pageData[pageKey].content)) != null){
										if (LIR.queueData[i].newImage == "" && LIR.queueData[i].move == false){ // Removing links/usages
											if (regExec[1].search(/\n/g) != -1 || regExec[3].search(/\n/g) != -1 || regExec[1].search(/=/g) != -1){//If surrounded by newlines or equals, we need to keep them to prevent things from breaking
												LIR.pageData[pageKey].content = LIR.pageData[pageKey].content.replace(regExec[0], regExec[0].replace(replacementReg, "<nowiki>" + LIR.queueData[i].oldImage + "</nowiki>"));
												pageReplacement.lastIndex += "<nowiki></nowiki>".length;
											}else{
												LIR.pageData[pageKey].content = LIR.pageData[pageKey].content.replace(regExec[0], "<nowiki>" + regExec[0] + "</nowiki>");
												pageReplacement.lastIndex += "<nowiki></nowiki>".length;
											}
										}else{ // Everything else
											LIR.pageData[pageKey].content = LIR.pageData[pageKey].content.replace(regExec[0], regExec[0].replace(replacementReg, LIR.queueData[i].newImage));
											pageReplacement.lastIndex += (regExec[0].replace(replacementReg, LIR.queueData[i].newImage).length - regExec[0].length) - (regExec[3].length);
										}
									}
								}else{
									if (LIR.instances[0].type == "multi"){
										LIR.failedLog(LIR.queueData[i].oldImage, LIR.queueData[i].newImage, LIR.queueData[i].title);
									}else{
										alert(
											LIR.userLang.unableToFind[0] + 
											' "' + LIR.queueData[i].oldImage + '" ' +
											LIR.userLang.unableToFind[1] +
											' "' + LIR.queueData[i].title + '"; ' + 
											LIR.userLang.unableToFind[2]
										);
									}
								}
							}

							LIR.log(LIR.userLang.submittingContent);
							if (console) console.log("Begin submitting pages");

							var l = 0;
							
							if (LIR.instances[0].type == "multi")
								LIR.queueProgress = 0;

							var throttle = setInterval(function(){
								if (LIR.pageData[l].changed == true){
									LIR.submitChangedPages(l, callback);
								}else{
									LIR.requestCompleted[l] = true;
								}

								l++;

								if (l == LIR.pageData.length){
									clearInterval(throttle);
								}
							}, (LIRoptions.delay || LIR.delay));
						}else if (k == LIR.pageKey.length && pageDataRetrieved != LIR.pageKey.length){
							if(console) console.log("There was a problem retrieving one or more pages. Retrieved " + LIR.pageData.length + " of " + LIR.pageKey.length + " pages");  
						}
					},
					"json"
				);
			}
		},

		submitChangedPages: function(pageKey, callback) {

			$.ajax({
				url: LIR.wg.wgScriptPath + "/api.php",
				type: "POST",
				async: true,
				data: {
					action: "edit",
					title: LIR.pageData[pageKey].title,
					summary: (LIRoptions.editSummary || LIR.lang.editSummary),
					text: LIR.pageData[pageKey].content,
					minor: true,
					nocreate: true,
					redirect: false,
					bot: true,
					token: mediaWiki.user.tokens.get("editToken"),
					format: "json"
				},
				contentType: "application/x-www-form-urlencoded",
				error: function(){
					LIR.requestCompleted[pageKey] = true;
					alert("Unable to publish page \""+LIR.pageKey[pageKey]+"\".  Please rename images on that page manually.");
					if (LIR.requestCompleted.indexOf(false) == -1){
						delete localStorage[wgUserName + "_LIRQueueData"];
						LIR.started = false;

						if (typeof(callback) === "function"){
							callback();
						}
					}	
				},
				success: function(result){
					LIR.requestCompleted[pageKey] = true;
					if (console) console.log("Posted page \""+LIR.pageKey[pageKey]+"\"");
					if (LIR.instances[0].type == "multi"){
						LIR.updateProgress( ( ((++LIR.queueProgress) / LIR.pageKey.length) / 2) + 0.5);
						//LIR.userLang.blogComment
						if (typeof result.error !== "undefined"){
							if ( LIR.pageData[pageKey].title.search(new RegExp(LIR.lang.userBlogCommentNamespace, "i")) != -1){
								LIR.failedLogCustom(LIR.userLang.blogComment + 
									' → <a target="_blank" href="' + LIR.wg.wgScriptPath + '/wiki/' + 
										encodeURIComponent(LIR.pageData[pageKey].title.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + '">' +
										LIR.pageData[pageKey].title + 
									'</a>'
								);
							}else{
								LIR.failedLogCustom(
									LIR.userLang.unableToSubmit[0] + 
									' "' + LIR.pageData[pageKey].title + '" ' +
									LIR.userLang.unableToSubmit[1] +
									' "' + result.error.code + '; ' + result.error.info + '" . ' + 
									LIR.userLang.unableToSubmit[2]
								);
							}
							
							for (var i in LIR.queueData){
								if (LIR.queueData[i].title === LIR.pageData[pageKey].title){
									LIR.failedLog(LIR.queueData[i].oldImage, LIR.queueData[i].newImage, LIR.queueData[i].title);
								}
							}
						}
					}else{
						if (typeof result.error !== "undefined"){
							if ( LIR.pageData[pageKey].title.search(new RegExp(LIR.lang.userBlogCommentNamespace, "i")) != -1){
								alert(LIR.userLang.blogComment + 
									' → ' + 
										LIR.lang.fileNamespace + ':' + LIR.pageData[pageKey].title 
								);
							}else{
								alert(LIR.userLang.unableToSubmit[0] + 
									' "' + LIR.pageData[pageKey].title + '" ' +
									LIR.userLang.unableToSubmit[1] +
									'"' + result.error.code + '". ' +
									LIR.userLang.unableToSubmit[2]
								);
							}
						}
					}


					if (LIR.requestCompleted.indexOf(false) == -1){
						if (LIR.instances[0].type == "multi"){
							/* Cleans up localStorage variables */
							delete localStorage[wgUserName + "_LIRQueueData"];
							LIR.started = false;
							LIR.updateProgress(false);
						}
						/* Call callback if exists */
						if (typeof(callback) === "function"){
							callback();
						}
					}
				}					
			});
		},

		moveFile: function(index, callback, failure) {
			var data = {
				action: "move",
				from: LIR.lang.fileNamespace + ":" + LIR.queueDataList[index].oldImage,
				to: LIR.lang.fileNamespace + ":" + LIR.queueDataList[index].newImage,
				reason: LIR.queueDataList[index].reason,
				movetalk: true,
				ignorewarnings: true,
				token: mediaWiki.user.tokens.get("editToken"),
				format: "json"
			};
			
			if ( LIR.queueDataList[index].noRedirect ){
				data = $.extend(data, {noredirect: true});
			}
			setTimeout(function(){
				$.ajax({
					url: LIR.wg.wgScriptPath + "/api.php",
					type: "POST",
					async: true,
					data: data,
					contentType: "application/x-www-form-urlencoded",
					error: function(){
						alert("Unable to move file \"" + LIR.queueDataList[index].oldImage + "\" to \"" + LIR.queueDataList[index].newImage + "\".");
					},
					success: function(result){
						if (typeof result.error === "undefined" || LIR.queueDataList[index].move == false){
							if (console) console.log("Moved file \"" + LIR.queueDataList[index].oldImage + "\"");

							/* Call callback if exists */
							if (typeof(callback) === "function"){
								callback(index);
							}
						}else if (result.error.code == "articleexists" || result.error.code == "invalidtitle"){
							var promptResponse = prompt(
								LIR.userLang.unableToMove[0] + 
								' "' + LIR.queueDataList[index].oldImage + '" ' + 
								LIR.userLang.unableToMove[1] + 
								' "' + LIR.queueDataList[index].newImage + '" ' + 
								LIR.userLang.unableToMove[2] + 
								' "' + result.error.code + '" . \n' + 
								LIR.userLang.unableToMoveChoose
							);

							if (promptResponse != null && promptResponse != ""){
								LIR.queueDataList[index].newImage = promptResponse;
								LIR.moveFile(index, callback, failure);
							}else{
								if (LIR.instances[0].type == "multi"){
									LIR.failedLogCustom('"' + LIR.queueDataList[index].oldImage + '" ' + LIR.userLang.unableToMoveFail);

									if (LIR.queueDataList.length == 1){
										delete localStorage[wgUserName + "_LIRQueueData"];
										LIR.started = false;
										LIR.log( LIR.userLang.queueComplete );
										LIR.updateQueueListing();
									}else{
										delete LIR.queueDataList[index];

										failure();
									}
								}else{
									LIR.started = false;
									LIR.instances[0].updateStatus(false, 
										LIR.userLang.unableToMove[0] + 
										' "' + LIR.queueDataList[index].oldImage + '" ' + 
										LIR.userLang.unableToMove[1] + 
										' "' + LIR.queueDataList[index].newImage + '" ' + 
										LIR.userLang.unableToMove[2] + 
										' "' + result.error.code + '" .'
									);
								}
							}
						}else{
							LIR.failedLogCustom(
								LIR.userLang.unableToMove[0] + 
								' "' + LIR.queueDataList[index].oldImage + '" ' + 
								LIR.userLang.unableToMove[1] + 
								' "' + LIR.queueDataList[index].newImage + '" ' + 
								LIR.userLang.unableToMove[2] + 
								' "' + result.error.code + '; ' + result.error.info + '" . ' + 
								'"' + LIR.queueDataList[index].oldImage + '" ' + LIR.userLang.unableToMoveFail
							);
							LIR.ERRORS.push(result);

							if (LIR.queueDataList.length == 1){
								delete localStorage[wgUserName + "_LIRQueueData"];
								LIR.started = false;
								LIR.log(LIR.userLang.queueComplete);
								LIR.updateQueueListing();
							}else{
								delete LIR.queueDataList[index];

								failure();
							}
						}
					}
				});
			}, (LIR.timer++) * (LIRoptions.delay || LIR.delay));
		},

		removeFromQueue: function(queueOldName, callback){
			LIR.instances[0].queueData = JSON.parse(localStorage[wgUserName + "_LIRQueueData"]);
			
			for (var i in LIR.instances[0].queueData){
				if (queueOldName.match(new RegExp(LIR.instances[0].queueData[i].oldImage.replace(/\*/g, "\\*").replace(/\?/g, "\\?").replace(/\./g, "\\.").replace(/( |_)/g, "[ _]*?").replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/\+/g, "\\+"), "gi") ) != null){
					LIR.instances[0].queueData.splice(i, 1);
					break;
				}
			}

			if (LIR.instances[0].queueData.length > 0){
				LIR.instances[0].storeQueue();
			}else{
				delete localStorage[wgUserName + "_LIRQueueData"];
			}
			
			if (typeof(callback) === "function"){
				callback();
			}
		},

		/**************************************
		// Modal-related functions
		**************************************/

		log: function(message){
			if (typeof LIR.logMessages === "undefined"){
				LIR.logMessages = "";
			}

			LIR.logMessages = LIR.logMessages + "<div style='font-weight: bold'>" + message + "</div>";

			if ($("#LIRLog").length > 0){
				$("#LIRLog").html(LIR.logMessages);
				$("#LIRLog").scrollTop(100000000);
				$("#LIRLog div:odd").css("background-color", "grey");
			}
		},

		failedLog: function(oldI, newI, page){
			LIR.failedLogCustom("<a target='_blank' href='" + LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(oldI.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "'>" + oldI + "</a> → <a target='_blank' href='" + LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(newI.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "'>" + newI + "</a> on <a target='_blank' href='" + LIR.wg.wgScriptPath + "/wiki/" + encodeURIComponent(page.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "'>" + page + "</a>");
		},
		
		failedLogCustom: function(text){
			if (typeof(LIR.logFailed) === "undefined"){
				LIR.logFailed = "";
			}
			LIR.logFailed += "<div>" + text + "</div>";
			LIR.updateFailedListing();
		},
		
		updateFailedListing: function() {
			if ($("#LIRFailedLog").length > 0 && typeof LIR.logFailed != "undefined"){
				$("#LIRFailedLog").html(LIR.logFailed);
				$("#LIRFailedLog div:odd").css("background-color", "red");
			}
		},

		updateQueueListing: function(callback){
			if (typeof (localStorage[wgUserName + "_LIRQueueData"]) !== "undefined"){
				LIR.queueData = JSON.parse(localStorage[wgUserName + "_LIRQueueData"]);
			}else{
				$("#LIRQueue").html("<div>" + LIR.userLang.nothingInQueue + "</div>");
				$("#LIRQueueLengthBox").html("0");
				LIR.log( LIR.userLang.queueUpdate );
				return false;
			}

			var LIRCurrentQueueData = LIR.queueData;
			var queueToAdd = "";

			for (i = 0; i<LIRCurrentQueueData.length; i++){
				queueToAdd += "<div style='position:relative; padding-left: 20px; " + (!LIRCurrentQueueData[i].move && LIRCurrentQueueData[i].newImage != "" ? 'background-color: lightyellow !important;' : '') + (!LIRCurrentQueueData[i].move && LIRCurrentQueueData[i].newImage == "" ? 'background-color: #ffbfbf !important;' : '') + "'><div class='LIRDeleteButton' title='" + LIR.userLang.removeFromQueue + "' style='cursor: pointer; width: 15px; height: 15px; position: absolute; left: 3px; top: 2px;'><img width='15' height='15' src='https://upload.wikimedia.org/wikipedia/commons/b/ba/Red_x.svg' /></div><a class='LIROldName' target='_blank' href='" + LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(LIRCurrentQueueData[i].oldImage.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "'>" + LIRCurrentQueueData[i].oldImage + "</a> → "+ (!LIRCurrentQueueData[i].move && LIRCurrentQueueData[i].newImage == "" ? "(Removing)" : "<a class='LIRNewName' target='_blank' href='" + LIR.wg.wgScriptPath + "/wiki/" + LIR.lang.fileNamespace + ":" + encodeURIComponent(LIRCurrentQueueData[i].newImage.replace(/ /g, "_")).replace(/"/g, "%22").replace(/'/g, "%27") + "'>" + LIRCurrentQueueData[i].newImage + "</a>") + "</div>";
			}

			$("#LIRQueue").html(queueToAdd);
			$("#LIRQueueLengthBox").html(LIR.queueData.length);
			$("#LIRQueue > div:odd").css("background-color", "lightgrey");
			LIR.log( LIR.userLang.queueUpdate );
			
			
		},

		updateNamespaceSelection: function(){
			if ($("#LIRNamespaceToggleCheck").is(":checked")){
				localStorage[wgUserName + "_LIRNamespaceSelection"] = "checked";
			}else{
				localStorage[wgUserName + "_LIRNamespaceSelection"] = "";
			}
		},

		showQueueModal: function(){
			$.showCustomModal( 
				LIR.userLang.queueModalTitle, 
				'<div id="LIRContainer" style="width: 100%;">' + 
				'<div id="LIRQueue" style="overflow-y: scroll; width: 590px; height: 300px; float: left; border: 1px solid black; font-weight: bold; background-color: #FFFFFF;"></div>'+
				'<div id="LIRLog" style="overflow-y: scroll; height: 300px; width: 200px; float: right; background-color: lightgrey; border: 1px solid black;"></div>'+
				'<div id="LIRQueueLength" style="float: left;margin: 5px 15px 0px 0px; font-weight: bold;">' + LIR.userLang.filesInQueue + ': <span id="LIRQueueLengthBox"></span></div>'+
				'<div id="LIRNamespaceToggle" style="float: left; margin: 5px 5px 0px 0px;"><label><input type="checkbox" id="LIRNamespaceToggleCheck" onchange="LIR.updateNamespaceSelection()" ' + localStorage[wgUserName + "_LIRNamespaceSelection"] + '>' + 
					LIR.userLang.namespaceCheckbox + 
				'</label></div>'+
				'<span id="liveLoader-0" style="display: none; float: right;margin-top: 7px;"><img src="https://images.wikia.nocookie.net/common/skins/common/progress-wheel.gif"></span>'+
				'<div style="clear: both"></div> <div id="LIRFailedLog" style="width: 798px; margin: 5px auto 0px auto; background-color: #ffbfbf; height: 150px; border: 1px solid black; font-weight: bold; overflow-y: scroll;">' + 
					LIR.userLang.failedDescription + 
				'</div> </div>', 
				{
					id: "queueModal",
					width: 800,
					buttons: [
						{
							id: "close",
							message: LIR.userLang.queueModalClose,
							handler: function () {
								$("#queueModal .close").click();
							}
						},
						{
							id: "openManualModal",
							message: LIR.userLang.queueModalManual,
							handler: function () {
								if (LIR.started){ return false;}
								LIR.showManualModal();
							}
						},
						{
							id: "resetCounter",
							message: LIR.userLang.queueModalReset,
							handler: function () {
								if (LIR.started || LIR.instances[0].started){ return false;}
								if (confirm(
									LIR.userLang.queueModalWaitConfirm[0] + "\n\n" + 
									LIR.userLang.queueModalWaitConfirm[1] + 
									" " +(localStorage.LIRQueuedUpdates - localStorage.LIRQueuedUpdatesPos + 1) + " " +
									LIR.userLang.queueModalWaitConfirm[2] + "\n\n" + 
									LIR.userLang.queueModalWaitConfirm[3]
									)){
									
									localStorage.LIRQueuedUpdates = 0;
									localStorage.LIRQueuedUpdatesPos = 1;
									LIR.log(LIR.userLang.waitCleared);
								}
							}
						},
						{
							id: "updateButton",
							message: LIR.userLang.queueModalUpdate,
							handler: function(){
								LIR.updateQueueListing();
							}
						},
						{
							id: "executeButton",
							message: LIR.userLang.queueModalExecute,
							defaultButton: true,
							handler: function(){
								if (typeof localStorage[wgUserName + "_LIRQueueData"] !== "undefined"){
									LIR.log( LIR.userLang.queueStarted );
									LIR.instances[0].updateStatus(true);
									LIR.processQueue(function(){
										LIR.log( LIR.userLang.queueComplete );
										LIR.instances[0].updateStatus(false);
										LIR.updateQueueListing();
									});
								}else{
									LIR.log(LIR.userLang.noQueueExists);
								}
							}
						}
					],
					callback: function(){
						$(".blackout, #queueModal .close").off("click").click(function(){
							if ((LIR.started == false || typeof(LIR.started) === "undefined")){
								delete LIRCurrentQueueData;
								$(document).off("click", ".LIRDeleteButton");
								$("#queueModal").remove();
								$(".blackout").fadeOut(function(){
									$(this).remove();
								});
							}
						});
						
						$(document).on("click", ".LIRDeleteButton", function(){
							LIR.removeFromQueue($(this).parent().find("a.LIROldName").html(), function(){
								LIR.log(LIR.userLang.itemRemoved);
								LIR.updateQueueListing();
							});
						});

						LIR.updateQueueListing();
						LIR.updateFailedListing();
					}
				}
			);
		},
	
		addToQueueButton: function(buttonId) {
			if ( $("#fuau-button-" + buttonId).attr("data-fuau-from") != "undefined" && $("#fuau-button-" + buttonId).attr("data-fuau-from") != ""){
				if ( $("#fuau-button-" + buttonId).attr("data-fuau-to") != "undefined" && $("#fuau-button-" + buttonId).attr("data-fuau-to") != ""){
					$("#fuau-button-" + buttonId).css("display", "none");
				
					LIR.instances[buttonId].start("multi", decodeURIComponent( $("#fuau-button-" + buttonId).attr("data-fuau-from") ), decodeURIComponent( $("#fuau-button-" + buttonId).attr("data-fuau-to").replace(/_/g, " ") ), LIR.userLang.using + " [[w:c:dev:FileUsageAuto-update#Other_features|FileUsageAuto-update]].", function(successful, error){
						if (successful){
							LIR.instances[buttonId].updateStatus(false, LIR.userLang.successful);
						}
						
						if (typeof error != "undefined"){
							switch (error){
								case "nameInUse":
								case "invalidExtension":
								case "destInUse":
									$("#fuau-button-" + buttonId).css("display", "inline-block");
									LIR.showFuauModal( $("#fuau-button-" + buttonId), buttonId, error );
									break;
							}
						}
					});
				}else{
					LIR.showFuauModal( $("#fuau-button-" + buttonId), buttonId, "toUndef");
				}
			}else{
				LIR.instances[buttonId].updateStatus(false, LIR.userLang.varsUndef);
			}
		},
		
		showFuauModal: function(buttonObj, Id, message){
			$.showCustomModal(
				LIR.userLang.queueAddition,
				'<fieldset><span> ' + LIR.userLang[message] + '  ' + LIR.userLang.tryDiffName + ' </span><br><span style="font-weight:bold">' + LIR.userLang.oldFileName + ':</span><br>' + LIR.lang.fileNamespace + ':<input disabled id="modalOldName" type="text" style="width:400px" value="' + decodeURIComponent( buttonObj.attr("data-fuau-from") ).replace(/_/g, " ") + '" /><br><span style="font-weight:bold">' + LIR.userLang.newFileName + ':</span><br>' + LIR.lang.fileNamespace + ':<input id="modalNewName" type="text" style="width:400px" value="' + (typeof buttonObj.attr("data-fuau-to") != "undefined" ? decodeURIComponent( buttonObj.attr("data-fuau-to") ).replace(/_/g, " ") : "") + '" /><br><input id="modalId" type="text" value="' + Id + '" style="display: none;" /></fieldset>',
				{
					id: "fuauModal",
					width: 650,
					buttons: [
						{
							id: "cancel",
							message: LIR.userLang.queueModalClose,
							handler: function(){
								$(".close").click();
							}
						},
						{
							id: "submit",
							defaultButton: true,
							message: LIR.userLang.addToQueue,
							handler: function(){
								var Id = $("#modalId").val();
								if ( $("#modalNewName").val() != "" ){
									$("#fuau-button-" + Id).attr( "data-fuau-to", encodeURIComponent( $("#modalNewName").val() ).replace(/'/g, "%27") );
									$(".close").click();
									LIR.addToQueueButton(Id);
								}
							}
						}
					],
					callback: function(){
						$(".blackout, .close").off("click").click(function(){
								$("#fuauModal").remove();
								$(".blackout").fadeOut(function(){
									$(this).remove();
								});
						});
					}
				}
			);
		},
		
		showManualModal: function(){
			$.showCustomModal(
				LIR.userLang.queueAddition,
				'<fieldset><span>' + LIR.userLang.manualModalDescription + '</span><br><br><span style="font-weight:bold">' + LIR.userLang.oldFileName + ':</span><br> ' + LIR.lang.fileNamespace + ':<input id="modalOldName" type="text" style="width:400px" /><br><span style="font-weight:bold">' + LIR.userLang.newFileName + ':</span><br>' + LIR.lang.fileNamespace + ':<input id="modalNewName" type="text" style="width:400px" /><br><span id="liveLoader-0" style="display:none"><img src="https://images.wikia.nocookie.net/common/skins/common/progress-wheel.gif" /></span><span id="queueStatus-0" style="font-weight: bold"></span></fieldset>',
				{
					id: "manualModal",
					width: 650,
					buttons: [
						{
							id: "cancel",
							message: LIR.userLang.queueModalClose,
							handler: function(){
								$("#manualModal .close").click();
							}
						},
						{
							id: "submit",
							defaultButton: true,
							message: LIR.userLang.addToQueue,
							handler: function(){
								if (LIR.instances[0].started){ return false; }
								LIR.instances[0].start("manual", $("#modalOldName").val(), $("#modalNewName").val(), "", function(res){
									if (res){
										delete LIR.instances[0].queuePosition;
										$("#modalOldName, #modalNewName").val('');
										$("#modalOldName").focus();
										LIR.updateQueueListing();
									}
								});
							}
						}
					],
					callback: function(){
						$(".blackout, #manualModal .close").off("click").click(function(){
							if (!LIR.instances[0].started){
								$("#manualModal").remove();
								$(".blackout").fadeOut(function(){
									$(this).remove();
								});
							}
						});
						
						$("#modalOldName, #modalNewName").on("keypress", function(e){
							if (e.which == 13){
								$("#manualModal #submit").click();
							}
						})
					}
				}
			);
		},
		
		initialize: function(){
			if (typeof LIR.supportedLanguages.indexOf(mediaWiki.config.get('wgContentLanguage')) == -1){
				if (mw.config.get('wgAction') == 'view' && (mw.config.get('wgCanonicalNamespace') == "File" || mw.config.get('wgCanonicalNamespace') == "Image" || mw.config.get('wgCanonicalNamespace') == "Video") ) {
					$('.page-header__contribution-buttons .wds-list').append(
						$('<li/>').append(
							$('<a/>', {
								'href': 'https://dev.fandom.com/wiki/Talk:FileUsageAuto-update',
								'title': 'Request/provide translations',
								'html': 'Queue lang not supported'
							})
						)
					);
				}else if (wgCanonicalSpecialPageName == "Movepage" && 
					(wgPageName.indexOf(LIR.i18n.en.fileNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.i18n.en.imageNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.lang.imageNamespace + ":") != -1 ||
					wgPageName.indexOf(wgFormattedNamespaces[6] + ":") != -1)
				){
					$('td.mw-submit').append("<br /><br /><div style='width: 850px; white-space: normal; font-weight: bold;'>FileUsageAuto-update language not supported</div>");
				}
			}else{
				if (LIR.supportedLanguages.indexOf(mediaWiki.config.get('wgUserLanguage')) == -1){
					var userLang = "en";
				}else{
					var userLang = mediaWiki.config.get('wgUserLanguage');
				}
				
				if (typeof localStorage.LIRQueuedUpdates === "undefined"){
					localStorage.LIRQueuedUpdates = 0;
					localStorage.LIRQueuedUpdatesPos = 1;
				}
				
				if (typeof LIRoptions === "undefined")
					LIRoptions = {};
				
				if (typeof localStorage[wgUserName + "_LIRNamespaceSelection"] === "undefined"){
					localStorage[wgUserName + "_LIRNamespaceSelection"] = "";
				}
				 
				 /* Get language pack! */
				$.ajax({
					url: "https://dev.fandom.com/wiki/MediaWiki:FileUsageAuto-update/" + mediaWiki.config.get('wgContentLanguage') + ".js?action=raw&ctype=text/javascript",
					dataType: "script",
					cache: true,
					success: function(){
						if (console) console.log('FileUsageAuto-update: Loaded language pack ' + mediaWiki.config.get('wgContentLanguage'));
						LIR.lang = LIR.i18n[mediaWiki.config.get('wgContentLanguage')];
						
						if (userLang != mediaWiki.config.get('wgContentLanguage')){
							$.ajax({
								url: "https://dev.fandom.com/wiki/MediaWiki:FileUsageAuto-update/" + userLang + ".js?action=raw&ctype=text/javascript",
								dataType: "script",
								cache: true,
								success: function(){
									if (console) console.log('FileUsageAuto-update: Loaded secondary language pack ' + userLang);
									LIR.userLang = LIR.i18n[userLang];
									LIR.makeUI();
								}
							});
						}else{
							LIR.userLang = LIR.lang;
							LIR.makeUI();
						}
					}
				});
			}
		},
		
		makeUI: function(){
			/* Actions performed on page load to add script elements */
			if (wgCanonicalSpecialPageName == "Movepage" && 
					(wgPageName.indexOf(LIR.lang.fileNamespace + ":") != -1 || 
					wgPageName.indexOf(LIR.i18n.en.fileNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.lang.imageNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.i18n.en.imageNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.lang.videoNamespace + ":") != -1 ||
					wgPageName.indexOf(LIR.i18n.en.videoNamespace + ":") != -1) && 
				Storage){
				/* File move page */
				LIR.instances[0] = new LIR.constructInstance(0);
				// Buttons
				LIR.appendButtonText = "<a style='margin-left: 20px;' class='wikia-button' onclick='LIR.instances[0].start(\"single\")'>" + (LIRoptions.singleButtonText || LIR.userLang.singleButtonText) + "</a>" + 
					"<a style='margin-left: 20px;' class='wikia-button' onclick='LIR.instances[0].start(\"multi\")'>" + (LIRoptions.queueButtonText || LIR.userLang.queueButtonText) + "</a>";
				// Loading icon and message / instructions
				LIR.appendButtonText += "<span id='liveLoader-0' style='display:none'><img src='https://images.wikia.nocookie.net/common/skins/common/progress-wheel.gif' /></span>" + 
					"<span id='queueStatus-0' style='font-weight: bold'></span>" + 
					// "<div id='LIRFailedLog' style='margin: 5px 0px; background-color: #ffbfbf; height: 150px; border: 1px solid black; font-weight: bold; overflow: scroll;'>" + 
						// LIR.userLang.failedDescription + "</div>" + 
					"<br /><div style='width: 850px; white-space: normal;'>" + LIR.userLang.movePageDescription[0] + " <b>\""+
						(LIRoptions.singleButtonText || LIR.userLang.singleButtonText)+"\"</b> " + LIR.userLang.movePageDescription[1] + 
						" <b>\""+(LIRoptions.queueButtonText || LIR.userLang.queueButtonText)+"\"</b> " + LIR.userLang.movePageDescription[2] + "</div>";
				// Optional bottom message
				if (LIRoptions.bottomMessage){
					LIR.appendButtonText += ('<br /><div style="font-weight: bold; width: 850px; white-space: normal;">' + LIRoptions.bottomMessage + '</div>');
				}
				
				LIR.appendButtonText += ('<br /><div style="font-weight: bold; width: 850px; white-space: normal;">' + LIR.userLang.movePageInfo[0] + ' 29th of September, 2015.  ' + LIR.userLang.movePageInfo[1] + '</div>');
				
				$('td.mw-submit').append(LIR.appendButtonText);
				$('#mw-movepage-table tr:eq(4)').after('<tr><td></td><td class="mw-input"><label><input type="checkbox" id="LIRNamespaceToggleCheck" onchange="LIR.updateNamespaceSelection()" ' + localStorage[wgUserName + "_LIRNamespaceSelection"] + '>&nbsp;' + LIR.userLang.namespaceCheckbox + ' <span style="font-size: 9px;">' + LIR.userLang.movePageNamespaceSelect[0] + ' ' + (LIRoptions.singleButtonText || LIR.userLang.singleButtonText) + ' ' + LIR.userLang.movePageNamespaceSelect[1] + '</span></label></td></tr>');
			}else if ((mw.config.get('wgCanonicalNamespace') == "File" || mw.config.get('wgCanonicalNamespace') == "Image" || mw.config.get('wgCanonicalNamespace') == "Video") && Storage){
				/* File page */
				LIR.instances[0] = new LIR.constructInstance(0);
					$(".page-header__contribution-buttons .wds-list").append("<li><a onclick='LIR.showQueueModal()'>" + LIR.userLang.queue + "</a></li>");
				
				if (typeof localStorage[wgUserName + "_LIRQueueData"] !== "undefined"){
					LIR.instances[0].queueData = JSON.parse(localStorage[wgUserName + "_LIRQueueData"]);
				
				
					for (var i in LIR.instances[0].queueData){
						if (wgTitle.match(new RegExp(LIR.instances[0].queueData[i].oldImage.replace(/\*/g, "\\*").replace(/\?/g, "\\?").replace(/\./g, "\\.").replace(/( |_)/g, "[ _]*?").replace(/\(/g, "\\(").replace(/\)/g, "\\)").replace(/\+/g, "\\+"), "gi") ) != null){
							
								$("#WikiaArticle").prepend('<table id="LIRNotification" class="metadata plainlinks ambox ambox-notice" style="border-left: 10px solid lightgreen;"><tbody><tr><td class="mbox-image"><div style="width: 52px;"><img alt="" src="https://upload.wikimedia.org/wikipedia/commons/b/bd/Checkmark_green.svg" width="46" height="40"></div></td><td class="mbox-text" style="">' + LIR.userLang.fileInQueue + '<br>' + LIR.userLang.newFileName + ': <span style="font-weight: bold;">'+LIR.instances[0].queueData[i].newImage+'</span></td></tr><tr><td colspan="2" style="text-align: right;"><a onclick="LIR.showQueueModal()" style="cursor: pointer;">' + LIR.userLang.queue + '</a>&nbsp;&bull;&nbsp;<a id="LIRRemoveFromQueue" style="cursor: pointer;">' + LIR.userLang.removeFromQueue + '</a></td></tr></tbody></table>');
						
							$("#LIRRemoveFromQueue").on("click", function(){
								LIR.removeFromQueue(LIR.instances[0].queueData[i].oldImage, function(){
									$("#LIRNotification").slideUp("fast", function(){
										this.remove();
									});
								});
							});
							break;
						}
					}
				}
			}else if ($(".fuau").length > 0){
				/* Add to queue button placeholders */
				LIR.buttonIndex = 0;
				$(".fuau").each(function(){
					LIR.instances[LIR.buttonIndex] = new LIR.constructInstance(LIR.buttonIndex);
					$(this).html("<a class='wikia-button' id='fuau-button-" + LIR.buttonIndex + "' data-fuau-from='" + $(this).attr('data-fuau-from') + "' data-fuau-to='" + $(this).attr('data-fuau-to') + "' onclick='LIR.addToQueueButton(" + LIR.buttonIndex + ")'>" + LIR.userLang.addToQueue + "</a><span id='liveLoader-" + LIR.buttonIndex + "' style='display:none'><img src='https://images.wikia.nocookie.net/common/skins/common/images/ajax.gif' /></span><span id='queueStatus-" + LIR.buttonIndex + "' style='font-weight: bold'></span>");
					LIR.buttonIndex++;
				});
				delete LIR.buttonIndex;
			}else{
				if (console) console.log("Looks like FileUsageAuto-update isn't supported");
			}
		}
	};
	
	LIR.initialize();
}
Advertisement