User:Most2dot0/common.js
From Angelina Jordan 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)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
//syntax highlighter
mw.loader.load('//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-DotsSyntaxHighlighter.js&action=raw&ctype=text/javascript');
syntaxHighlighterConfig = { parameterColor: "#FFDD99" }
// embedded YouTube player implementation
// Use like this, where "&t=" designates an optional start, and "&end=" an optional stop time:
// <div class="youtube-player-placeholder" data-videos="VIDEO_ID_1&t=45&end=135,VIDEO_ID_2,VIDEO_ID_3&end=20"></div>
// It can also be configured by enclosing text that contains YouTube video urls:
// <div class="youtube-player-placeholder">
// <ul>
// <li><a url="https://www.youtube.com/watch?v=VIDEO_ID_1&t=45&end=135">Titel 1</a></li>
// <li><a url="https://www.youtube.com/watch?v=VIDEO_ID_2">Titel 2</a></li>
// <li><a url="https://www.youtube.com/watch?v=VIDEO_ID_3&end=20"></a></li>
// </ul>
// </div>
// There can be multiple players on a page, but only one will play at a time, the others will get stopped automatically
function insertYouTubePlayers() {
var placeholders = document.querySelectorAll('.youtube-player-placeholder');
// Load the YouTube IFrame API if not already loaded
if (!document.getElementById('youtube-iframe-api')) {
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
tag.id = 'youtube-iframe-api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
}
var videoLists = [];
var currentVideoIndices = [];
var checkIntervals = [];
function parseVideosFromPlaceholder(placeholder) {
var videoDataList = [];
var links = placeholder.querySelectorAll('a');
links.forEach(function(link) {
var href = link.getAttribute('href');
var match = href.match(/https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9_-]+)([^\s]*)/);
if (match) {
var videoId = match[2];
var urlParams = match[3];
var params = new URLSearchParams(urlParams);
var start = params.get('t') ? parseInt(params.get('t')) : 0;
var end = params.get('end') ? parseInt(params.get('end')) : null;
videoDataList.push({ videoId: videoId, start: start, end: end });
}
});
// If no URLs found, fall back to data-videos attribute
if (videoDataList.length === 0) {
var dataVideos = placeholder.getAttribute('data-videos').split(',');
dataVideos.forEach(function(videoData) {
var parts = videoData.split('&');
var videoId = parts[0];
var start = 0;
var end = null;
parts.forEach(function(part) {
if (part.startsWith('t=')) {
start = parseInt(part.substring(2)) || 0;
} else if (part.startsWith('end=')) {
end = parseInt(part.substring(4)) || null;
}
});
videoDataList.push({ videoId: videoId, start: start, end: end });
});
}
return videoDataList;
}
function onYouTubeIframeAPIReady() {
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var index = entry.target.getAttribute('data-index');
if (!entry.target.getAttribute('data-loaded')) {
entry.target.setAttribute('data-loaded', 'true');
loadYouTubePlayer(entry.target, index);
}
}
});
});
placeholders.forEach(function(placeholder, index) {
placeholder.setAttribute('data-index', index);
observer.observe(placeholder);
});
}
window.onYouTubeIframeAPIReady = onYouTubeIframeAPIReady;
function loadYouTubePlayer(placeholder, index) {
var videoDataList = parseVideosFromPlaceholder(placeholder);
videoLists[index] = videoDataList;
currentVideoIndices[index] = 0;
checkIntervals[index] = null;
var playerDiv = document.createElement('div');
playerDiv.id = 'youtube-player-' + index;
placeholder.appendChild(playerDiv);
var controlsDiv = document.createElement('div');
controlsDiv.className = 'youtube-player-controls';
controlsDiv.innerHTML = '<button class="prev-button" data-index="' + index + '">Previous</button>' +
'<button class="next-button" data-index="' + index + '">Next</button>';
placeholder.appendChild(controlsDiv);
window['youtube-player-' + index] = new YT.Player('youtube-player-' + index, {
height: '270',
width: '480',
videoId: videoLists[index][currentVideoIndices[index]].videoId,
playerVars: {
start: videoLists[index][currentVideoIndices[index]].start
},
events: {
'onStateChange': onPlayerStateChange(index),
'onReady': onPlayerReady(index)
}
});
// Add click event listeners to the YouTube links in the placeholder's text
var links = placeholder.querySelectorAll('a');
links.forEach(function(link) {
var href = link.getAttribute('href');
var match = href.match(/https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9_-]+)([^\s]*)/);
if (match) {
var videoId = match[2];
var urlParams = match[3];
var params = new URLSearchParams(urlParams);
var start = params.get('t') ? parseInt(params.get('t')) : 0;
var end = params.get('end') ? parseInt(params.get('end')) : null;
link.addEventListener('click', function(event) {
event.preventDefault();
var videoIndex = videoLists[index].findIndex(function(video) {
return video.videoId === videoId &&
video.start === start &&
video.end === end;
});
if (videoIndex !== -1) {
currentVideoIndices[index] = videoIndex;
window['youtube-player-' + index].loadVideoById({
videoId: videoLists[index][currentVideoIndices[index]].videoId,
startSeconds: videoLists[index][currentVideoIndices[index]].start
});
}
});
}
});
}
function onPlayerReady(index) {
return function(event) {
var placeholder = placeholders[index];
var originalHTML = placeholder.querySelector('.youtube-placeholder-text');
originalHTML.style.display = ''; // Ensure the original text is displayed correctly
};
}
function onPlayerStateChange(index) {
return function(event) {
clearInterval(checkIntervals[index]);
if (event.data == YT.PlayerState.PLAYING) {
// Pause all other players except the current one
for (var i = 0; i < placeholders.length; i++) {
if (i !== parseInt(index) && window['youtube-player-' + i] && window['youtube-player-' + i].getPlayerState() === YT.PlayerState.PLAYING) {
window['youtube-player-' + i].pauseVideo();
}
}
if (videoLists[index][currentVideoIndices[index]].end) {
checkIntervals[index] = setInterval(function() {
var currentTime = window['youtube-player-' + index].getCurrentTime();
if (currentTime >= videoLists[index][currentVideoIndices[index]].end) {
playVideo(index, 1); // Play next video
}
}, 1000); // Check every second
}
} else if (event.data == YT.PlayerState.ENDED) {
playVideo(index, 1); // Play next video
}
};
}
function playVideo(index, direction) {
clearInterval(checkIntervals[index]);
currentVideoIndices[index] += direction;
if (currentVideoIndices[index] >= videoLists[index].length) {
currentVideoIndices[index] = 0;
} else if (currentVideoIndices[index] < 0) {
currentVideoIndices[index] = videoLists[index].length - 1;
}
window['youtube-player-' + index].loadVideoById({
videoId: videoLists[index][currentVideoIndices[index]].videoId,
startSeconds: videoLists[index][currentVideoIndices[index]].start
});
}
document.addEventListener('click', function(event) {
if (event.target.classList.contains('next-button')) {
var index = event.target.getAttribute('data-index');
playVideo(index, 1); // Next video
} else if (event.target.classList.contains('prev-button')) {
var index = event.target.getAttribute('data-index');
playVideo(index, -1); // Previous video
}
});
}
insertYouTubePlayers();
//
// New combined YouTube and Facebook player implementation
//
function insertVidPlayers() {
var placeholders = document.querySelectorAll('.vid-player-placeholder');
if (!document.getElementById('youtube-iframe-api')) {
var ytTag = document.createElement('script');
ytTag.src = "https://www.youtube.com/iframe_api";
ytTag.id = 'youtube-iframe-api';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(ytTag, firstScriptTag);
}
if (!document.getElementById('facebook-jssdk')) {
var fbTag = document.createElement('script');
fbTag.src = "https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v10.0";
fbTag.id = 'facebook-jssdk';
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(fbTag, firstScriptTag);
}
var vidLists = [];
var currVidIndices = [];
var checkIntervals = [];
function parseVidsFromPlaceholder(placeholder) {
var vidDataList = [];
var links = placeholder.querySelectorAll('a');
links.forEach(function(link) {
var href = link.getAttribute('href');
var ytMatch = href.match(/https?:\/\/(www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9_-]+)([^\s]*)/);
var fbMatch = href.match(/https?:\/\/(www\.)?facebook\.com\/facebook\/videos\/([0-9]+)\/([^\s]*)/);
if (ytMatch) {
var vidId = ytMatch[2];
var params = new URLSearchParams(ytMatch[3]);
var start = params.get('t') ? parseInt(params.get('t')) : 0;
var end = params.get('end') ? parseInt(params.get('end')) : null;
vidDataList.push({ vidId: vidId, start: start, end: end, origin: 'youtube' });
} else if (fbMatch) {
var vidId = fbMatch[2];
var params = new URLSearchParams(fbMatch[3]);
var start = params.get('t') ? parseInt(params.get('t')) : 0;
var end = params.get('end') ? parseInt(params.get('end')) : null;
vidDataList.push({ vidId: vidId, start: start, end: end, origin: 'facebook' });
}
});
return vidDataList;
}
function onYouTubeIframeAPIReady() {
placeholders.forEach(function(placeholder, index) {
loadVidPlayer(placeholder, index);
});
}
window.onYouTubeIframeAPIReady = onYouTubeIframeAPIReady;
function loadVidPlayer(placeholder, index) {
var vidDataList = parseVidsFromPlaceholder(placeholder);
vidLists[index] = vidDataList;
currVidIndices[index] = 0;
checkIntervals[index] = null;
var playerDiv = document.createElement('div');
playerDiv.id = 'vid-player-' + index;
placeholder.appendChild(playerDiv);
loadPlayer(index);
}
function loadPlayer(index) {
var currVid = vidLists[index][currVidIndices[index]];
if (currVid.origin === 'youtube') {
loadYouTubePlayer(index);
} else {
loadFacebookPlayer(index);
}
}
function loadYouTubePlayer(index) {
var currVid = vidLists[index][currVidIndices[index]];
window['yt-player-' + index] = new YT.Player('vid-player-' + index, {
height: '270',
width: '480',
videoId: currVid.vidId,
playerVars: {
start: currVid.start
},
events: {
'onStateChange': onPlayerStateChange(index, 'youtube'),
'onReady': onPlayerReady(index)
}
});
}
function loadFacebookPlayer(index) {
var currVid = vidLists[index][currVidIndices[index]];
var playerDiv = document.getElementById('vid-player-' + index);
playerDiv.innerHTML = '<div class="fb-video" data-href="https://www.facebook.com/facebook/videos/' + currVid.vidId + '" data-width="480" data-show-text="false"></div>';
FB.XFBML.parse(playerDiv, function() {
var fbPlayer = playerDiv.querySelector('div.fb-video');
fbPlayer.addEventListener('play', function() {
onPlayerStateChange(index, 'facebook')({ data: 'playing' });
});
fbPlayer.addEventListener('pause', function() {
onPlayerStateChange(index, 'facebook')({ data: 'paused' });
});
fbPlayer.addEventListener('finish', function() {
onPlayerStateChange(index, 'facebook')({ data: 'ended' });
});
});
}
function onPlayerReady(index) {
return function(event) {
var placeholder = placeholders[index];
var originalHTML = placeholder.querySelector('.vid-placeholder-text');
if (originalHTML) {
originalHTML.style.display = ''; // Ensure the original text is displayed correctly
}
};
}
function onPlayerStateChange(index, origin) {
return function(event) {
clearInterval(checkIntervals[index]);
if ((origin === 'youtube' && event.data == YT.PlayerState.PLAYING) || (origin === 'facebook' && event.data === 'playing')) {
handlePlayerState(index, origin, event.data);
} else if ((origin === 'youtube' && event.data == YT.PlayerState.ENDED) || (origin === 'facebook' && event.data === 'ended')) {
nextVid(index);
}
};
}
function handlePlayerState(index, origin, state) {
for (var i = 0; i < placeholders.length; i++) {
if (i !== parseInt(index)) {
if (vidLists[i][currVidIndices[i]].origin === 'youtube' && window['yt-player-' + i] && window['yt-player-' + i].getPlayerState() === YT.PlayerState.PLAYING) {
window['yt-player-' + i].pauseVideo();
} else if (vidLists[i][currVidIndices[i]].origin === 'facebook') {
var fbPlayerDiv = document.getElementById('vid-player-' + i);
var fbPlayer = fbPlayerDiv.querySelector('div.fb-video');
if (fbPlayer && fbPlayer.pause) {
fbPlayer.pause();
}
}
}
}
if (vidLists[index][currVidIndices[index]].end) {
checkIntervals[index] = setInterval(function() {
if (origin === 'youtube') {
var currTime = window['yt-player-' + index].getCurrentTime();
if (currTime >= vidLists[index][currVidIndices[index]].end) {
window['yt-player-' + index].stopVideo();
}
} else if (origin === 'facebook') {
var fbPlayerDiv = document.getElementById('vid-player-' + index);
var fbPlayer = fbPlayerDiv.querySelector('div.fb-video');
if (fbPlayer && fbPlayer.getCurrentTime) {
var currTime = fbPlayer.getCurrentTime();
if (currTime >= vidLists[index][currVidIndices[index]].end) {
fbPlayer.stop();
}
}
}
}, 1000);
}
}
function nextVid(index) {
currVidIndices[index] = (currVidIndices[index] + 1) % vidLists[index].length;
loadPlayer(index);
}
placeholders.forEach(function(placeholder) {
var textContainer = document.createElement('div');
textContainer.className = 'vid-placeholder-text';
textContainer.innerHTML = placeholder.innerHTML;
placeholder.innerHTML = '';
placeholder.appendChild(textContainer);
});
}
insertVidPlayers();