Jump to content

User:Alex 21/script-seriesoverview.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.
// <nowiki>
$(function($) {
	setTimeout(function() {
		$.when( mw.loader.using( ['mediawiki.util']), $.ready ).then(function() {
			var portletlink = mw.util.addPortletLink('p-tv', '#', 'Series overview');
			$(portletlink).click( function(e) {
				e.preventDefault();
				// Find overview table
				var overview = document.getElementById('seriesoverview');
				if (overview === null) {
					var k = 0;
					var alltables = document.getElementById('mw-content-text').getElementsByTagName('table');
					overview = alltables[k];
					var className = overview.className;
					while (so_tableIndexOf(className,"ambox") || so_tableIndexOf(className,"infobox") || so_tableIndexOf(className,"mw-collapsible")) { 
						k++;
						overview = alltables[k];
						className = overview.className;
					}
				}
				
				// Define parameters
				var df = 0; var _i = 1;
				var endExist = false; var episodesCol;
				var SpecialSplit = [' ',' ']; // 0: Special; 1: Split
				
				var headerBase = 3; var network_double = 0;
				var network_single = 0; var infoheaderonly = 0; var auxheaders = 0;
				
				var dateReg = /(([^\s]*)\s)?(([^\s,]*))?.*(\d{4})/;
				
				// Begin template
				var _template_head = "{{Series overview\n";
				var _template = _template_head;
				
				// Aux variables - see where episodes column is located
				for (var a = 1; a < overview.rows[0].cells.length; a++) {
					if (overview.rows[0].cells[a].innerHTML.indexOf('Episodes') != -1) {
						episodesCol = a;
						break;
					}
				}
				auxheaders = episodesCol-1;
				headerBase += auxheaders;
				
				if (auxheaders > 0) {
					for (a = 1; a < episodesCol; a++) {
						_template += "| aux"+(String.fromCharCode(64+a))+"         = "+overview.rows[0].cells[a].innerHTML+"\n";
					}
					_template += "\n";
				}
				
				// Find existance of info and network headers/columns
				if (overview.rows[1].cells[2+auxheaders] !== undefined && overview.rows[1+auxheaders].cells[2+auxheaders].innerHTML.toLowerCase() == "network") {
					network_single = 1;
				}
				if (overview.rows[0].cells[3+auxheaders] !== undefined) {
					if (overview.rows[0].cells[3+auxheaders].innerHTML.toLowerCase() == "network") {
						network_double = 1;
						headerBase++;
					} else if (overview.rows[0].cells[3+auxheaders].getAttribute('rowspan') > 1) {
						infoheaderonly = 1;
					}
				}
				var network = network_single || network_double;
				headerBase -= infoheaderonly;
				
				// Check if overview uses simple one-row header
				var onerowheader = (overview.rows[1].cells[1].tagName == "TD" ? 1 : 0);
				headerBase += onerowheader;
				
				// Add infoheader and info headers
				var extraHeadRows = overview.rows[0].cells.length-headerBase;
				var infoRows = overview.rows[1].cells.length-(headerBase-(network_single?0:1))+infoheaderonly;
				
				if (extraHeadRows > 0) {
					var infoheader = overview.rows[0].cells[headerBase+auxheaders].children[0];
					if (infoheader === undefined || infoheader.tagName == "BR") infoheader = overview.rows[0].cells[headerBase+auxheaders].innerHTML;
					if (typeof infoheader != "object") infoheader = infoheader.replace(/\n/g,'');
					else infoheader.innerHTML = infoheader.innerHTML.replace(/\n/g,'');
					
					_template += "| infoheader   = "+so_link(infoheader)+"\n";
				}
				if (infoRows > 0 && !onerowheader && !infoheaderonly) {
					for (a = 0; a < infoRows; a++) {
						_template += "| info"+(String.fromCharCode(65+a))+"        = "+overview.rows[1].cells[a+(headerBase-1)+auxheaders].innerHTML.replace("\n","")+"\n";
					}
				}
				
				// Extra links
				if (extraHeadRows > 0 || infoRows > 0 && !onerowheader) _template += "\n";
				_template = _template.replace(_template_head+"\n",_template_head);
				
				// Begin iteratin through season rows
				for (var i = 2-onerowheader; i < overview.rows.length; i++) {
					// Define parameters
					var startdate, enddate;
					var RC = overview.rows[i].cells;
					SpecialSplit[0] = ' '; var CellAdj = 0;
					
					// 0: Colour; 1: Link, 2: Episodes
					var CLE = ['','',''];
					
					if (SpecialSplit[1] == 'A') {
						SpecialSplit[1] = 'B'; // Was on first half, now on second half
					} else if (RC[0].getAttribute('rowspan') || RC[1].getAttribute('rowspan')) {
						SpecialSplit[1] = 'A'; // Now on first half
					} else {
						SpecialSplit[1] = ' '; // Not a split season
					}
					
					// Code to add after parameter name
					var ThisKey = so_ThisKey(_i,SpecialSplit);
					
					if (SpecialSplit[1] != 'B') {
						// First half or regular season, link and colour added
						// Link
						var linkCell = (RC[1].firstChild.href !== undefined ? RC[1].firstChild : RC[1].firstChild.firstChild);
						if (linkCell && linkCell.tagName != "A") {
							if (typeof linkCell == "object") linkCell = linkCell.textContent ? linkCell.textContent : linkCell.innerText;
							var aT = document.createElement('a');
							aT.innerHTML = linkCell;
							aT.href = '#Season '+linkCell;
							linkCell = aT;
						}
						
						var linkMain;
						var linkCellH = linkCell.href;
						if (!linkCell) {
							linkMain = '';
						} else if (linkCellH.indexOf('index.php') >= 0) {
							linkMain = linkCellH.substr(linkCellH.indexOf('title=')+6, linkCellH.indexOf('&')-(linkCellH.indexOf('title=')+6))+
								(linkCellH.indexOf('#') >= 0 ? linkCellH.substr(linkCellH.indexOf('#')) : '');
						} else {
							linkMain = linkCellH.substr(linkCellH.lastIndexOf('wiki/')+5);
						}
						linkMain = decodeURIComponent(linkMain.replace(/_/g, ' ').replace(/\.([A-Z0-9]{2})/g, '%$1')).split('#');
						
						// Special row
						if (linkCell.innerHTML != _i) {
							_i--;
							SpecialSplit[0] = 'S';
							CellAdj = Math.max(0,RC[1].getAttribute('colspan')-2);
							ThisKey = so_ThisKey(_i,SpecialSplit);
						}
						
						CLE[0] += "| color"+ThisKey+"     = "+(RC[0].bgColor?RC[0].bgColor:RGBSTRtoHEX(RC[0].style.background?RC[0].style.background:RC[0].style.backgroundColor))+"\n";
						CLE[1] += "| link"+_i+SpecialSplit[0]+"       = <includeonly>"+linkMain[0]+"</includeonly>"+(linkMain[1]?"#"+linkMain[1]:"")+"\n";
						if (isNaN(parseInt(so_wiki(linkCell.innerHTML),10))) {
							CLE[1] += "| linkT"+ThisKey+"     = "+so_wiki(linkCell.innerHTML)+"\n";
						}
					} else {
						// Second half, only colour required
						CLE[0] += "| color"+ThisKey+"     = "+(RC[0].bgColor?RC[0].bgColor:RGBSTRtoHEX(RC[0].style.background?RC[0].style.background:RC[0].style.backgroundColor))+"\n";
					}
					
					// Aux variables
					var aux = '';
					if (episodesCol != 1 && SpecialSplit[1] != 'B') {
						for (a = 1; a < episodesCol; a++) {
							if (SpecialSplit[1] == ' ' || (SpecialSplit[1] != ' ' && RC[1+a].getAttribute('rowspan') > 1))
								aux += "| aux"+String.fromCharCode(64+a)+_i+SpecialSplit[0]+"       = "+so_wiki(RC[1+a].innerHTML)+"\n";
							CellAdj--;
						}
					} else {
						CellAdj -= episodesCol-1;
					}
					
					// Total episodes
					if (SpecialSplit[1] != 'B' && so_tba(RC[2-CellAdj].innerHTML) && !isNaN(parseInt(so_ref(RC[2-CellAdj],false),10))) {
						CLE[2] += "| episodes"+_i+SpecialSplit[0]+"   = "+so_ref(RC[2-CellAdj],false)+"\n";
					}
					
					// Colour, Link, Episodes
					_template += ( SpecialSplit[1] != ' ' ? CLE[1]+aux+CLE[2]+CLE[0] : CLE[0]+CLE[1]+aux+CLE[2] );
					
					// Aux variables split season
					if (episodesCol != 1 && SpecialSplit[1] != ' ') {
						for (a = 1; a < episodesCol; a++) {
							var cell = RC[SpecialSplit[1] == 'B' ? a-CellAdj-1 : a-CellAdj];
							_template += "| aux"+String.fromCharCode(65+a)+ThisKey+"      = "+so_wiki(cell.innerHTML)+"\n";
						}
					}
					
					// Split season episodes
					if (SpecialSplit[1] != ' ') {
						CellAdj += (SpecialSplit[1] == 'B' ? 2 : 0);
						if (so_tba(RC[3-CellAdj].innerHTML) && !isNaN(parseInt(so_ref(RC[3-CellAdj],false),10))) {
							_template += "| episodes"+ThisKey+"  = "+so_ref(RC[3-CellAdj],false)+"\n";
						}
						CellAdj--;
					}
					
					// Start and end dates
					var temp;
					var reS = dateReg.exec(so_dateref(RC[3-CellAdj]));
					if (reS) {
						var reS_x = [reS[4],reS[2],reS[5]];
						if (reS_x[0] && isNaN(parseInt(reS_x[0],10))) {
							temp = reS_x[0]; reS_x[0] = reS_x[1]; reS_x[1] = temp; df = 1;
						}
						startdate = so_startend(reS_x,"Start",df);
					}
					
					var reE = '';
					if (RC[4-CellAdj] !== undefined && RC[3-CellAdj].getAttribute('colspan') <= 1) {
						reE = dateReg.exec(so_dateref(RC[4-CellAdj]));
						if (reE) {
							var reE_x = [reE[4],reE[2],reE[5]];
							if (reE_x[0] && isNaN(parseInt(reE_x[0],10))) {
								temp = reE_x[0]; reE_x[0] = reE_x[1]; reE_x[1] = temp; df = 1;
							}
							enddate = so_startend(reE_x,"End",df);
							endExist = true;
						}
					}
					if (RC[3-CellAdj].getAttribute('colspan') > 1) { CellAdj++; }
					
					if (reS) _template += "| start"+ThisKey+"     = "+startdate+so_ref(RC[3-CellAdj],true)+"\n";
					if (reE) _template += "| end"+ThisKey+"       = "+enddate+so_ref(RC[4-CellAdj],true)+"\n";
					else if (SpecialSplit[0] != 'S' && RC[3-CellAdj].getAttribute('colspan') > 1) _template += "| end"+ThisKey+"       = start\n";
					
					// Network
					if (network && RC[5-CellAdj] !== undefined && RC[5-CellAdj].getAttribute('rowspan')) {
						_template += "| network"+ThisKey+"   = "+so_link(RC[5-CellAdj].children[0])+"\n";
						CellAdj++;
					}
					
					// Info cells
					if (infoRows > 0) {
						for (var j = 0; j < 26; j++) {
							var infoCell = RC[5+j-CellAdj];
							if (infoCell && so_tba(so_ref(infoCell,false))) {
								_template += "| info"+String.fromCharCode(65+j)+ThisKey+"     = "+so_ref(infoCell,false)+"\n";
							}
						}
					}
					
					// New lines and updating split season variables
					if (i < overview.rows.length-1 && SpecialSplit[1] != 'A') _template += "\n";
					
					if (SpecialSplit[1] == 'B') SpecialSplit[1] = ' ';
					else if (SpecialSplit[1] == 'A') _i--;
					
					_i++;
				}
				
				// Released parameters
				var released = '';
				for (a = 1; a < overview.rows[0].cells.length; a++) {
					if (overview.rows[0].cells[a].innerHTML.indexOf('release') != -1) {
						released += "| released     = y\n";
						break;
					}
				}
				if (!endExist) {
					released += "| allreleased  = y\n";
				}
				if (released) _template = _template.replace(_template_head, _template_head+released+"\n");
				
				// Finished
				_template = _template.replace('<small><span style="color: #2C2C2C" title="To be announced">TBA</span></small>','{{TableTBA}}');
				_template += "}}";
				
				copyContent(_template);
				alert("Copied! Now go to the editing page and paste over the raw code.");
				
				// Function: Remove reference
				function so_ref(cell,comment) {
					if (comment) {
						if (cell.innerHTML.indexOf("<sup") < 0) return '';
						else return "<!--Be sure to restore the reference that existed here!-->";
					} else {
						if (cell.innerHTML.indexOf("<sup") < 0) return cell.innerHTML;
						else return cell.innerHTML.replace(/<sup(.*)\/sup\>/g,"<!--Be sure to restore the reference that existed here!-->");
					}
				}
				
				// Function: Raw link to wiki link
				function so_link(link) {
					if (link === undefined || link.href === undefined) return link;
					var nwlink = link.href.replace("https://en.wikipedia.org/wiki/","").replace("_", " ");
					return "[["+(link.innerHTML==nwlink?"":nwlink+"|")+link.innerHTML+"]]";
				}
				
				// Function: Remove reference from data
				function so_dateref(cell) {
					return (cell.innerHTML.indexOf('<')>=0 ? cell.innerHTML.substr(0, cell.innerHTML.indexOf('<')) : cell.innerHTML).split('&nbsp;').join(' ');
				}
				
				// Function: Bold and italic text to wiki
				function so_wiki(text) {
					return text.replace(/<i>(.*)<\/i>/g, "''$1''").replace(/<b>(.*)<\/b>/g, "'''$1'''");
				}
				
				// Function: Dates to wiki templates
				function so_startend(cell,se,df) {
					var monthNumber = new Date(Date.parse(cell[1]+" 1, 2005")).getMonth()+1;
					return "{{"+se+" date|"+cell[2]+
							(!isNaN(monthNumber) && cell[1] !== undefined ? "|"+monthNumber : "")+
							(!isNaN(cell[0]) && cell[0] !== undefined ? "|"+cell[0] : "")+
							(df ? "|df=y" : "")+"}}";
				}
				
				// Function: Chceck if classname contains single class
				function so_tableIndexOf(className,content) {
					return (className.indexOf(content) >= 0);
				}
				
				// Function: Check if text contains TBA, TBD, N/A
				function so_tba(text) {
					text = text.toLowerCase();
					return text.indexOf("tba") < 0 &&  text.indexOf("tbd") < 0 &&  text.indexOf("n/a") < 0;
				}
				
				// Function: Get value of ThisKey
				function so_ThisKey(_i,SpecialSplit) {
					var ThisKey = _i+SpecialSplit[1]+SpecialSplit[0];
					if (ThisKey.indexOf(' ') != -1) {
						var spaces = ThisKey.length-ThisKey.replace(/\s/g,'').length;
						ThisKey = ThisKey.replace(/\s/g,'');
						for (a = 0; a < spaces; a++) ThisKey += ' ';
					}
					return ThisKey;
				}
			});
		});
	},600);
});
// </nowiki>