Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
$(function($) {
	setTimeout(function() {
		$.when( mw.loader.using( ['mediawiki.util']), $.ready ).then(function() {
			var portletlink = mw.util.addPortletLink('p-tv', '#', 'Update episodes');
			$(portletlink).click( function(e) {
				e.preventDefault();
				// Textbox contents
				var NumEpisodesM;
				var wpTextbox1 = document.getElementById('wpTextbox1');
				var wpTextbox1_V = wpTextbox1.value.split("\n");
				
				// Declare variables
				var NumEpisodes = false; var RTitle = false; var line;
				var OriginalAirDate = false; var EpisodeNumber = false; var RmvRefs = false;
				
				// Go though contents one line at a time
				for (var i = 0; i < wpTextbox1_V.length; i++) {	
					// Retreive particular line
					line = wpTextbox1_V[i];
					
					// Remove references param set, and on to the next episode row
					if (RmvRefs && (line.toLowerCase().indexOf('episode list') >= 0 || line.trim() == '}}')) RmvRefs = false;
					
					// Update num_episodes in Template:Infobox_television, if it exists
					if (!NumEpisodesM) {
						NumEpisodesM = line.match(/(\s*\|\s*num_episodes\s*=\s*(<onlyinclude>)?)(\d+)(.*)/);
						if (NumEpisodesM) NumEpisodes = parseInt(NumEpisodesM[3])+1;
					}
					
					// Check if first appearance of RTitle is found
					if (!RTitle) {
						// If line contains RTitle, set to <<RTitle>> if only a ref (will be removed later), else set to contents of RTitle is more than a ref (e.g. raw episode title).
						var RTitleM = line.match(/(\s*\|\s*RTitle\s*=\s*)([^<]*)<ref(.*)/);
						if (RTitleM) {
							if (RTitleM[2] === "") line = '<<RTitle>>';
							else line = RTitleM[1]+RTitleM[2];
							RTitle = true;
							RmvRefs = true;
						}
						
						// Catch episode number to add to summary
						var EpisodeNumberM = line.match(/(\s*\|\s*EpisodeNumber\s*=\s*)(.*)/);
						if (EpisodeNumberM) EpisodeNumber = EpisodeNumberM[2];
					} else if (!OriginalAirDate) {
						// If RTitle is found but OriginalAirDate not set, find the next occurrence
						// of OriginalAirDate to update Template:Aired_episodes, if it exists
						var OriginalAirDateM = line.match(/(\s*\|\s*OriginalAirDate\s*=\s*)\{\{[s|S]tart date\|([^\}]*)\}\}/);
						if (OriginalAirDateM) OriginalAirDate = OriginalAirDateM[2].replace("|df=y","");
					}
					
					// Remove director/writer/etc. references
					if (RmvRefs) line = line.replace(/<ref(.*)\/(ref)?\>/g,"");
					
					// Update line
					wpTextbox1_V[i] = line;
				}
				
				EpisodeNumber = (EpisodeNumber?EpisodeNumber:NumEpisodes);
				
				// Save values or get saved values
				if (OriginalAirDate) {
					// If EpisodeNumber/OriginalAirDate was found, saved it from transcluded season page for LoE page update
					localStorage.setItem('EpisodeNumber', EpisodeNumber);
					localStorage.setItem('OriginalAirDate', OriginalAirDate);
				} else if (localStorage.getItem('OriginalAirDate') || localStorage.getItem('EpisodeNumber')) {
					// If EpisodeNumber/OriginalAirDate was not found, obtain it from transcluded season page save for LoE page update
					OriginalAirDate = localStorage.getItem('OriginalAirDate');
					localStorage.removeItem('OriginalAirDate');
					EpisodeNumber = localStorage.getItem('EpisodeNumber');
					localStorage.removeItem('EpisodeNumber');
				}
				
				// Alert of no existance of OriginalAirDate/EpisodeNumber
				var update = true;
				if (!OriginalAirDate && !EpisodeNumber) {
					alert('Be sure to update the individual transcluded season page first, then the List of Episode page, to save the episode number and air date.');
					update = false;
				}
				
				// Update summary
				var summary = document.getElementById('wpSummary');
				if (summary.value.indexOf('Update]]; aired') >= 0) summary.value += " ["+EpisodeNumber+"]";
				else if (update) summary.value += "[[User:Alex 21/script-updateepisodes|Update]]; aired ["+EpisodeNumber+"]";
				
				// Concatenate textbox values again, but without <<RTitle>>
				var wpTextbox1NewValue = '';
				for (i = 0; i < wpTextbox1_V.length; i++) if (wpTextbox1_V[i] != '<<RTitle>>') wpTextbox1NewValue += wpTextbox1_V[i]+"\n";
				
				// Update |num_episodes=
				if (NumEpisodesM) {
					if (RTitle) wpTextbox1NewValue = wpTextbox1NewValue.replace(NumEpisodesM[1]+NumEpisodesM[3], NumEpisodesM[1]+NumEpisodes); // Season page
					else wpTextbox1NewValue = wpTextbox1NewValue.replace(NumEpisodesM[1]+NumEpisodesM[3], NumEpisodesM[1]+EpisodeNumber); // Main page
				}
				// Update Template:Aired_episodes if it exists
				if (OriginalAirDate) wpTextbox1NewValue = wpTextbox1NewValue.replace(/(\{\{Aired episodes\|)((\d*)\|(\d*)\|(\d*))/, "$1"+OriginalAirDate);
				if (EpisodeNumber) wpTextbox1NewValue = wpTextbox1NewValue.replace(/((\{\{Aired episodes\|)(.*)(\|\s*num\s*=))(\d+)/, "$1"+EpisodeNumber);
				wpTextbox1NewValue = wpTextbox1NewValue.replace(/((\{\{Aired episodes\|)(.*)(\|\s*finished\s*=))([\d\.]+)/, "$2$3");
				
				// Reset textbox with new version
				wpTextbox1.value = wpTextbox1NewValue;
			});
		});
	},900);
});