From b0929e24318b903abdc27cca786b761f6d1f058a Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 13:27:20 -0400 Subject: Remade the popup menu to support Firefox and not use IFrames. --- content.js | 62 +- firefox_manifest.json | 6 +- manifest.json | 8 +- popup.css | 92 ++- popup.html | 278 ++++---- popup.js | 1743 +++++++++++++++++++++++++------------------------ 6 files changed, 1137 insertions(+), 1052 deletions(-) diff --git a/content.js b/content.js index 53347e07..c66e6937 100644 --- a/content.js +++ b/content.js @@ -59,8 +59,10 @@ chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { } }); -chrome.runtime.onMessage.addListener( // Detect URL Changes - function(request, sender, sendResponse) { +//get messages from the background script and the popup +chrome.runtime.onMessage.addListener(messageListener); + +function messageListener(request, sender, sendResponse) { //message from background script if (request.message == "ytvideoid") { videoIDChange(request.id); @@ -118,7 +120,7 @@ chrome.runtime.onMessage.addListener( // Detect URL Changes if (request.message == "trackViewCount") { trackViewCount = request.value; } -}); +} //check for hotkey pressed document.onkeydown = function(e){ @@ -474,31 +476,43 @@ function openInfoMenu() { //hide info button document.getElementById("infoButton").style.display = "none"; - let popup = document.createElement("div"); - popup.id = "sponsorBlockPopupContainer"; - - let popupFrame = document.createElement("iframe"); - popupFrame.id = "sponsorBlockPopupFrame" - popupFrame.src = chrome.extension.getURL("popup.html"); - popupFrame.className = "popup"; + sendRequestToCustomServer('GET', chrome.extension.getURL("popup.html"), function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + var popup = document.createElement("div"); + popup.id = "sponsorBlockPopupContainer"; + popup.innerHTML = xmlhttp.responseText + + //close button + let closeButton = document.createElement("div"); + closeButton.innerText = "Close Popup"; + closeButton.classList = "smallLink"; + closeButton.setAttribute("align", "center"); + closeButton.addEventListener("click", closeInfoMenu); + + //add the close button + popup.prepend(closeButton); + + let parentNode = document.getElementById("secondary"); + if (parentNode == null) { + //old youtube theme + parentNode = document.getElementById("watch7-sidebar-contents"); + } - //close button - let closeButton = document.createElement("div"); - closeButton.innerText = "Close Popup"; - closeButton.classList = "smallLink"; - closeButton.setAttribute("align", "center"); - closeButton.addEventListener("click", closeInfoMenu); + //make the logo source not 404 + //query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet + let logo = popup.querySelector("#sponsorBlockPopupLogo"); + logo.src = chrome.extension.getURL("icons/LogoSponsorBlocker256px.png"); - popup.appendChild(closeButton); - popup.appendChild(popupFrame); + //remove the style sheet and font that are not necessary + popup.querySelector("#sponorBlockPopupFont").remove(); + popup.querySelector("#sponorBlockStyleSheet").remove(); - let parentNode = document.getElementById("secondary"); - if (parentNode == null) { - //old youtube theme - parentNode = document.getElementById("watch7-sidebar-contents"); - } + parentNode.insertBefore(popup, parentNode.firstChild); - parentNode.prepend(popup); + //run the popup init script + runThePopup(); + } + }); } function closeInfoMenu() { diff --git a/firefox_manifest.json b/firefox_manifest.json index d8e2296b..3948c08a 100644 --- a/firefox_manifest.json +++ b/firefox_manifest.json @@ -10,11 +10,13 @@ ], "js": [ "config.js", - "content.js" + "content.js", + "popup.js" ], "css": [ "content.css", - "./libs/Source+Sans+Pro.css" + "./libs/Source+Sans+Pro.css", + "popup.css" ] } ], diff --git a/manifest.json b/manifest.json index b683f4d7..0ab2dac8 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.16", + "version": "1.0.18", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { @@ -10,11 +10,13 @@ ], "js": [ "config.js", - "content.js" + "content.js", + "popup.js" ], "css": [ "content.css", - "./libs/Source+Sans+Pro.css" + "./libs/Source+Sans+Pro.css", + "popup.css" ] } ], diff --git a/popup.css b/popup.css index a33f408a..5c06ae72 100644 --- a/popup.css +++ b/popup.css @@ -1,45 +1,75 @@ -* { +/* reset some properties to default (youtube messes with them */ +p.popupElement { + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +h1.popupElement { + margin-block-start: 0.67em; + margin-block-end: 0.67em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +h2.popupElement { + margin-block-start: 0.83em; + margin-block-end: 0.83em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +h3.popupElement { + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} +/* end reset */ + +.popupElement { font-family: 'Source Sans Pro', sans-serif; } -h1 { +h1.popupElement { margin-top: 0px; } -body { - font-size: 14px; - min-width: 300px; - background-color: #ffd9d9; +.popupBody { + font-size: 14px; + background-color: #ffd9d9; + padding: 5px; } -.recordingSubtitle { +.recordingSubtitle.popupElement { margin-bottom: 10px; } -.voteButton { +.voteButton.popupElement { height: 32px; margin-right: 15px; cursor: pointer; } -.voteButton:hover { +.voteButton:hover.popupElement { filter: brightness(80%); } -#discordButtonContainer { +#discordButtonContainer.popupElement { font-size: 12px; } -.sponsorTime { +.sponsorTime.popupElement { font-size: 20px; } -.smallLink { +.smallLink.popupElement { font-size: 10px; text-decoration: underline; cursor: pointer; } -.mediumLink { +.mediumLink.popupElement { font-size: 15px; padding-left: 15px; padding-right: 15px; @@ -47,8 +77,8 @@ body { cursor: pointer; } -.greenButton { - background-color:#ec1c1c; +.greenButton.popupElement { + background-color:#ec1c1c; -moz-border-radius:28px; -webkit-border-radius:28px; border-radius:28px; @@ -61,19 +91,19 @@ body { text-decoration:none; text-shadow:0px 0px 0px #662727; } -.greenButton:hover { +.greenButton:hover.popupElement { background-color:#bf2a2a; } -.greenButton:focus { +.greenButton:focus.popupElement { outline: none; background-color:#bf2a2a; } -.greenButton:active { +.greenButton:active.popupElement { position:relative; top:1px; } -.dangerButton { +.dangerButton.popupElement { -moz-box-shadow:inset 0px 1px 0px 0px #cf866c; -webkit-box-shadow:inset 0px 1px 0px 0px #cf866c; box-shadow:inset 0px 1px 0px 0px #cf866c; @@ -90,19 +120,19 @@ body { text-decoration:none; text-shadow:0px 1px 0px #854629; } -.dangerButton:hover { +.dangerButton:hover.popupElement { background-color:#bc3315; } -.dangerButton:focus { +.dangerButton:focus.popupElement { outline: none; background-color:#bc3315; } -.dangerButton:active { +.dangerButton:active.popupElement { position:relative; top:1px; } -.warningButton { +.warningButton.popupElement { -moz-box-shadow:inset 0px 1px 0px 0px #cfbd6c; -webkit-box-shadow:inset 0px 1px 0px 0px #cfbd6c; box-shadow:inset 0px 1px 0px 0px #cfbd6c; @@ -119,19 +149,19 @@ body { text-decoration:none; text-shadow:0px 1px 0px #856829; } -.warningButton:hover { +.warningButton:hover.popupElement { background-color:#bc8215; } -.warningButton:focus { +.warningButton:focus.popupElement { outline: none; background-color:#bc8215; } -.warningButton:active { +.warningButton:active.popupElement { position:relative; top:1px; } -.smallButton { +.smallButton.popupElement { background-color:#f9902d; -moz-border-radius:3px; -webkit-border-radius:3px; @@ -144,14 +174,14 @@ body { padding:6px 10px; text-decoration:none; } -.smallButton:hover { +.smallButton:hover.popupElement { background-color:#fa9806; } -.smallButton:focus { +.smallButton:focus.popupElement { outline: none; background-color:#fa9806; } -.smallButton:active { +.smallButton:active.popupElement { position:relative; top:1px; -} +} \ No newline at end of file diff --git a/popup.html b/popup.html index db0a1cdb..931ffd2d 100644 --- a/popup.html +++ b/popup.html @@ -1,182 +1,184 @@ Set Page Color Popup - - + + -
-
- + +
+
+ -

SponsorBlock

+

SponsorBlock

- -

Loading...

+ +

Loading...

- -
+
+ diff --git a/popup.js b/popup.js index 2e75f971..e26bafce 100644 --- a/popup.js +++ b/popup.js @@ -1,926 +1,961 @@ -// References -var SB = {}; - -SB.sponsorStart = document.getElementById("sponsorStart"); -SB.clearTimes = document.getElementById("clearTimes"); -SB.submitTimes = document.getElementById("submitTimes"); -SB.showNoticeAgain = document.getElementById("showNoticeAgain"); -SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); -SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); -SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); -SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); -SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); -SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); -SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); -SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); -SB.optionsButton = document.getElementById("optionsButton"); -SB.reportAnIssue = document.getElementById("reportAnIssue"); -// sponsorTimesContributions -SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); -SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); -SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); -// sponsorTimesViewsDisplay -SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); -SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); -SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); -// discordButtons -SB.discordButtonContainer = document.getElementById("discordButtonContainer"); -SB.hideDiscordButton = document.getElementById("hideDiscordButton"); - -//setup click listeners -SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); -SB.clearTimes.addEventListener("click", clearTimes); -SB.submitTimes.addEventListener("click", submitTimes); -SB.showNoticeAgain.addEventListener("click", showNoticeAgain); -SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); -SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); -SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); -SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); -SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); -SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); -SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); -SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); -SB.optionsButton.addEventListener("click", openOptions); -SB.reportAnIssue.addEventListener("click", reportAnIssue); -SB.hideDiscordButton.addEventListener("click", hideDiscordButton); - - -//if true, the button now selects the end time -var startTimeChosen = false; - -//the start and end time pairs (2d) -var sponsorTimes = []; - -//current video ID of this tab -var currentVideoID = null; - -//is this a YouTube tab? -var isYouTubeTab = false; - -//see if discord link can be shown -chrome.storage.sync.get(["hideDiscordLink"], function(result) { - let hideDiscordLink = result.hideDiscordLink; - if (hideDiscordLink == undefined || !hideDiscordLink) { - chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { - let hideDiscordLaunches = result.hideDiscordLaunches; - //only if less than 5 launches - if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { - SB.discordButtonContainer.style.display = null; - - if (hideDiscordLaunches == undefined) { - hideDiscordButton = 1; +//make this a function to allow this to run on the content page +function runThePopup() { + + //is it in the popup or content script + var inPopup = true; + if (chrome.tabs == undefined) { + //this is on the content script, use direct communication + chrome.tabs = {}; + chrome.tabs.sendMessage = function(id, request, callback) { + messageListener(request, null, callback); + } + + //add a dummy query method + chrome.tabs.query = function(config, callback) { + callback([{ + url: document.URL, + id: -1 + }]); + } + + inPopup = false; + } + + // References + let SB = {}; + + SB.sponsorStart = document.getElementById("sponsorStart"); + SB.clearTimes = document.getElementById("clearTimes"); + SB.submitTimes = document.getElementById("submitTimes"); + SB.showNoticeAgain = document.getElementById("showNoticeAgain"); + SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); + SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); + SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); + SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); + SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); + SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); + SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); + SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); + SB.optionsButton = document.getElementById("optionsButton"); + SB.reportAnIssue = document.getElementById("reportAnIssue"); + // sponsorTimesContributions + SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); + SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); + SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); + // sponsorTimesViewsDisplay + SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); + SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); + SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); + // discordButtons + SB.discordButtonContainer = document.getElementById("discordButtonContainer"); + SB.hideDiscordButton = document.getElementById("hideDiscordButton"); + + //setup click listeners + SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); + SB.clearTimes.addEventListener("click", clearTimes); + SB.submitTimes.addEventListener("click", submitTimes); + SB.showNoticeAgain.addEventListener("click", showNoticeAgain); + SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); + SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); + SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); + SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); + SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); + SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); + SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); + SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); + SB.optionsButton.addEventListener("click", openOptions); + SB.reportAnIssue.addEventListener("click", reportAnIssue); + SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + + + //if true, the button now selects the end time + let startTimeChosen = false; + + //the start and end time pairs (2d) + let sponsorTimes = []; + + //current video ID of this tab + let currentVideoID = null; + + //is this a YouTube tab? + let isYouTubeTab = false; + + //see if discord link can be shown + chrome.storage.sync.get(["hideDiscordLink"], function(result) { + let hideDiscordLink = result.hideDiscordLink; + if (hideDiscordLink == undefined || !hideDiscordLink) { + chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { + let hideDiscordLaunches = result.hideDiscordLaunches; + //only if less than 5 launches + if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { + SB.discordButtonContainer.style.display = null; + + if (hideDiscordLaunches == undefined) { + hideDiscordButton = 1; + } + + chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); } - - chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); + }); + } + }); + + //if the don't show notice again letiable is true, an option to + // disable should be available + chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { + let dontShowNoticeAgain = result.dontShowNoticeAgain; + if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { + SB.showNoticeAgain.style.display = "unset"; + } + }); + + //show proper video player controls options + chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { + let hideVideoPlayerControls = result.hideVideoPlayerControls; + if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { + let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; + if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { + let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; + if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; + } + }); + + //show proper tracking option + chrome.storage.sync.get(["trackViewCount"], function(result) { + let trackViewCount = result.trackViewCount; + if (trackViewCount != undefined && !trackViewCount) { + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; + } + }); + + //get the amount of times this user has contributed and display it to thank them + chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { + if (result.sponsorTimesContributed != undefined) { + if (result.sponsorTimesContributed > 1) { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." + } else { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + } + SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; + SB.sponsorTimesContributionsContainer.style.display = "unset"; + + //get the userID + chrome.storage.sync.get(["userID"], function(result) { + let userID = result.userID; + if (userID != undefined) { + //there are probably some views on these submissions then + //get the amount of views from the sponsors submitted + sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + let viewCount = JSON.parse(xmlhttp.responseText).viewCount; + if (viewCount != 0) { + if (viewCount > 1) { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." + } else { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." + } + SB.sponsorTimesViewsDisplay.innerText = viewCount; + SB.sponsorTimesViewsContainer.style.display = "unset"; + } + } + }); + } + }); + } + }); + + + chrome.tabs.query({ + active: true, + currentWindow: true + }, loadTabData); + + + function loadTabData(tabs) { + //set current videoID + currentVideoID = getYouTubeVideoID(tabs[0].url); + + if (!currentVideoID) { + //this isn't a YouTube video then + displayNoVideo(); + return; + } + + //load video times for this video + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.get([sponsorTimeKey], function(result) { + let sponsorTimesStorage = result[sponsorTimeKey]; + if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { + if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } + + sponsorTimes = sponsorTimesStorage; + + displaySponsorTimes(); + + //show submission section + document.getElementById("submissionSection").style.display = "unset"; + + showSubmitTimesIfNecessary(); } }); + + //check if this video's sponsors are known + chrome.tabs.sendMessage( + tabs[0].id, + {message: 'isInfoFound'}, + infoFound + ); } -}); - -//if the don't show notice again variable is true, an option to -// disable should be available -chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { - let dontShowNoticeAgain = result.dontShowNoticeAgain; - if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { - SB.showNoticeAgain.style.display = "unset"; - } -}); - -//show proper video player controls options -chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { - let hideVideoPlayerControls = result.hideVideoPlayerControls; - if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; + + function infoFound(request) { + if(chrome.runtime.lastError) { + //This page doesn't have the injected content script, or at least not yet + displayNoVideo(); + return; + } + + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + //this must be a YouTube video + //set letiable + isYouTubeTab = true; + + //remove loading text + document.getElementById("mainControls").style.display = "unset" + document.getElementById("loadingIndicator").innerHTML = ""; + + if (request.found) { + document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" + + displayDownloadedSponsorTimes(request); + } else { + document.getElementById("videoFound").innerHTML = "No sponsors found" + } + } } -}); -chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { - let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; - if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; + + function setVideoID(request) { + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + videoID = request.videoID; + } } -}); -chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { - let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; - if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; + + function sendSponsorStartMessage() { + //the content script will get the message if a YouTube page is open + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {from: 'popup', message: 'sponsorStart'}, + startSponsorCallback + ); + }); } -}); - -//show proper tracking option -chrome.storage.sync.get(["trackViewCount"], function(result) { - let trackViewCount = result.trackViewCount; - if (trackViewCount != undefined && !trackViewCount) { - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; + + function startSponsorCallback(response) { + let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); + + if (sponsorTimes[sponsorTimesIndex] == undefined) { + sponsorTimes[sponsorTimesIndex] = []; + } + + sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + updateStartTimeChosen(); + + //display video times on screen + displaySponsorTimes(); + + //show submission section + document.getElementById("submissionSection").style.display = "unset"; + + showSubmitTimesIfNecessary(); } -}); - -//get the amount of times this user has contributed and display it to thank them -chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { - if (result.sponsorTimesContributed != undefined) { - if (result.sponsorTimesContributed > 1) { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." - } else { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + + //display the video times from the array + function displaySponsorTimes() { + //set it to the message + let sponsorMessageTimes = document.getElementById("sponsorMessageTimes"); + + //remove all children + while (sponsorMessageTimes.firstChild) { + sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); } - SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; - SB.sponsorTimesContributionsContainer.style.display = "unset"; - - //get the userID - chrome.storage.sync.get(["userID"], function(result) { - let userID = result.userID; - if (userID != undefined) { - //there are probably some views on these submissions then - //get the amount of views from the sponsors submitted - sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let viewCount = JSON.parse(xmlhttp.responseText).viewCount; - if (viewCount != 0) { - if (viewCount > 1) { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." - } else { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." - } - SB.sponsorTimesViewsDisplay.innerText = viewCount; - SB.sponsorTimesViewsContainer.style.display = "unset"; - } - } + + //add sponsor times + sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + } + + //display the video times from the array at the top, in a different section + function displayDownloadedSponsorTimes(request) { + if (request.sponsorTimes != undefined) { + //set it to the message + document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); + + //add them as buttons to the issue reporting container + let container = document.getElementById("issueReporterTimeButtons"); + for (let i = 0; i < request.sponsorTimes.length; i++) { + let sponsorTimeButton = document.createElement("button"); + sponsorTimeButton.className = "warningButton popupElement"; + sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); + + let votingButtons = document.createElement("div"); + + let UUID = request.UUIDs[i]; + + //thumbs up and down buttons + let voteButtonsContainer = document.createElement("div"); + voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; + voteButtonsContainer.setAttribute("align", "center"); + voteButtonsContainer.style.display = "none" + + let upvoteButton = document.createElement("img"); + upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; + upvoteButton.className = "voteButton popupElement"; + upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); + upvoteButton.addEventListener("click", () => vote(1, UUID)); + + let downvoteButton = document.createElement("img"); + downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; + downvoteButton.className = "voteButton popupElement"; + downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); + downvoteButton.addEventListener("click", () => vote(0, UUID)); + + //add thumbs up and down buttons to the container + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(upvoteButton); + voteButtonsContainer.appendChild(downvoteButton); + + //add click listener to open up vote panel + sponsorTimeButton.addEventListener("click", function() { + voteButtonsContainer.style.display = "unset"; }); + + container.appendChild(sponsorTimeButton); + container.appendChild(voteButtonsContainer); + + //if it is not the last iteration + if (i != request.sponsorTimes.length - 1) { + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + } } - }); + } } -}); - - -chrome.tabs.query({ - active: true, - currentWindow: true -}, loadTabData); - -function loadTabData(tabs) { - //set current videoID - currentVideoID = getYouTubeVideoID(tabs[0].url); - - if (!currentVideoID) { - //this isn't a YouTube video then - displayNoVideo(); - return; + + //get the message that visually displays the video times + function getSponsorTimesMessage(sponsorTimes) { + let sponsorTimesMessage = ""; + + for (let i = 0; i < sponsorTimes.length; i++) { + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = ", " + timeMessage; + } + + sponsorTimesMessage += timeMessage; + } + } + + return sponsorTimesMessage; } - - //load video times for this video - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.get([sponsorTimeKey], function(result) { - let sponsorTimesStorage = result[sponsorTimeKey]; - if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { - if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + + //get the message that visually displays the video times + //this version is a div that contains each with delete buttons + function getSponsorTimesMessageDiv(sponsorTimes) { + // let sponsorTimesMessage = ""; + let sponsorTimesContainer = document.createElement("div"); + sponsorTimesContainer.id = "sponsorTimesContainer"; + + for (let i = 0; i < sponsorTimes.length; i++) { + let currentSponsorTimeContainer = document.createElement("div"); + currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; + currentSponsorTimeContainer.className = "sponsorTime popupElement"; + let currentSponsorTimeMessage = ""; + + let deleteButton = document.createElement("span"); + deleteButton.id = "sponsorTimeDeleteButton" + i; + deleteButton.innerText = "Delete"; + deleteButton.className = "mediumLink popupElement"; + let index = i; + deleteButton.addEventListener("click", () => deleteSponsorTime(index)); + + let spacer = document.createElement("span"); + spacer.innerText = " "; + + let editButton = document.createElement("span"); + editButton.id = "sponsorTimeEditButton" + i; + editButton.innerText = "Edit"; + editButton.className = "mediumLink popupElement"; + editButton.addEventListener("click", () => editSponsorTime(index)); + + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = timeMessage; + } + + currentSponsorTimeMessage += timeMessage; + } + + currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; + currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); + + sponsorTimesContainer.appendChild(currentSponsorTimeContainer); + sponsorTimesContainer.appendChild(deleteButton); + + //only if it is a complete sponsor time + if (sponsorTimes[i].length > 1) { + sponsorTimesContainer.appendChild(editButton); } - - sponsorTimes = sponsorTimesStorage; - - displaySponsorTimes(); - - //show submission section - document.getElementById("submissionSection").style.display = "unset"; - - showSubmitTimesIfNecessary(); } - }); - - //check if this video's sponsors are known - chrome.tabs.sendMessage( - tabs[0].id, - {message: 'isInfoFound'}, - infoFound - ); -} - -function infoFound(request) { - if(chrome.runtime.lastError) { - //This page doesn't have the injected content script, or at least not yet - displayNoVideo(); - return; + + return sponsorTimesContainer; } - - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - //this must be a YouTube video - //set variable - isYouTubeTab = true; - - //remove loading text - document.getElementById("mainControls").style.display = "unset" - document.getElementById("loadingIndicator").innerHTML = ""; - - if (request.found) { - document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" - - displayDownloadedSponsorTimes(request); - } else { - document.getElementById("videoFound").innerHTML = "No sponsors found" + + function editSponsorTime(index) { + if (document.getElementById("startTimeMinutes" + index) != null) { + //already open + return; + } + + let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); + + //get sponsor time minutes and seconds boxes + let startTimeMinutes = document.createElement("input"); + startTimeMinutes.id = "startTimeMinutes" + index; + startTimeMinutes.className = "sponsorTime popupElement"; + startTimeMinutes.type = "text"; + startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); + startTimeMinutes.style.width = "45px"; + + let startTimeSeconds = document.createElement("input"); + startTimeSeconds.id = "startTimeSeconds" + index; + startTimeSeconds.className = "sponsorTime popupElement"; + startTimeSeconds.type = "text"; + startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); + startTimeSeconds.style.width = "60px"; + + let endTimeMinutes = document.createElement("input"); + endTimeMinutes.id = "endTimeMinutes" + index; + endTimeMinutes.className = "sponsorTime popupElement"; + endTimeMinutes.type = "text"; + endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); + endTimeMinutes.style.width = "45px"; + + let endTimeSeconds = document.createElement("input"); + endTimeSeconds.id = "endTimeSeconds" + index; + endTimeSeconds.className = "sponsorTime popupElement"; + endTimeSeconds.type = "text"; + endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); + endTimeSeconds.style.width = "60px"; + + let colonText = document.createElement("span"); + colonText.innerText = ":"; + + let toText = document.createElement("span"); + toText.innerText = " to "; + + //remove all children to replace + while (sponsorTimeContainer.firstChild) { + sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); } + + sponsorTimeContainer.appendChild(startTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(startTimeSeconds); + sponsorTimeContainer.appendChild(toText); + sponsorTimeContainer.appendChild(endTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(endTimeSeconds); + + //add save button and remove edit button + let saveButton = document.createElement("span"); + saveButton.id = "sponsorTimeSaveButton" + index; + saveButton.innerText = "Save"; + saveButton.className = "mediumLink popupElement"; + saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); + + let editButton = document.getElementById("sponsorTimeEditButton" + index); + let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); + + editButton.remove(); + sponsorTimesContainer.appendChild(saveButton); } -} - -function setVideoID(request) { - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - videoID = request.videoID; + + function saveSponsorTimeEdit(index) { + let startTimeMinutes = document.getElementById("startTimeMinutes" + index); + let startTimeSeconds = document.getElementById("startTimeSeconds" + index); + + let endTimeMinutes = document.getElementById("endTimeMinutes" + index); + let endTimeSeconds = document.getElementById("endTimeSeconds" + index); + + sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); + sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); } -} - -function sendSponsorStartMessage() { - //the content script will get the message if a YouTube page is open + + //deletes the sponsor time submitted at an index + function deleteSponsorTime(index) { + //if it is not a complete sponsor time + if (sponsorTimes[index].length < 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + resetStartTimeChosen(); + } + + sponsorTimes.splice(index, 1); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + //update display + displaySponsorTimes(); + + //if they are all removed + if (sponsorTimes.length == 0) { + //update chrome tab + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + } + } + + function clearTimes() { + //send new sponsor time state to tab + if (sponsorTimes.length > 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + } + + //reset sponsorTimes + sponsorTimes = []; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + + resetStartTimeChosen(); + } + + function submitTimes() { + //make info message say loading + document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + + if (sponsorTimes.length > 0) { + chrome.runtime.sendMessage({ + message: "submitTimes", + videoID: currentVideoID + }, function(response) { + if (response != undefined) { + if (response.statusCode == 200) { + //hide loading message + document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; + + clearTimes(); + } else if(response.statusCode == 400) { + document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 429) { + document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 409) { + document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 502) { + document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else { + document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } + } + }); + } + } + + function showNoticeAgain() { + chrome.storage.sync.set({"dontShowNoticeAgain": false}); + chrome.tabs.query({ active: true, currentWindow: true - }, tabs => { - chrome.tabs.sendMessage( - tabs[0].id, - {from: 'popup', message: 'sponsorStart'}, - startSponsorCallback - ); + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "showNoticeAgain" + }); }); -} - -function startSponsorCallback(response) { - let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); - - if (sponsorTimes[sponsorTimesIndex] == undefined) { - sponsorTimes[sponsorTimesIndex] = []; - } - - sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - updateStartTimeChosen(); - - //display video times on screen - displaySponsorTimes(); - - //show submission section - document.getElementById("submissionSection").style.display = "unset"; - - showSubmitTimesIfNecessary(); -} - -//display the video times from the array -function displaySponsorTimes() { - //set it to the message - let sponsorMessageTimes = document.getElementById("sponsorMessageTimes"); - - //remove all children - while (sponsorMessageTimes.firstChild) { - sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); + + SB.showNoticeAgain.style.display = "none"; } - - //add sponsor times - sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); -} - -//display the video times from the array at the top, in a different section -function displayDownloadedSponsorTimes(request) { - if (request.sponsorTimes != undefined) { - //set it to the message - document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); - - //add them as buttons to the issue reporting container - let container = document.getElementById("issueReporterTimeButtons"); - for (let i = 0; i < request.sponsorTimes.length; i++) { - let sponsorTimeButton = document.createElement("button"); - sponsorTimeButton.className = "warningButton"; - sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); - - let votingButtons = document.createElement("div"); - - let UUID = request.UUIDs[i]; - - //thumbs up and down buttons - let voteButtonsContainer = document.createElement("div"); - voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; - voteButtonsContainer.setAttribute("align", "center"); - voteButtonsContainer.style.display = "none" - - let upvoteButton = document.createElement("img"); - upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; - upvoteButton.className = "voteButton"; - upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); - upvoteButton.addEventListener("click", () => vote(1, UUID)); - - let downvoteButton = document.createElement("img"); - downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; - downvoteButton.className = "voteButton"; - downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); - downvoteButton.addEventListener("click", () => vote(0, UUID)); - - //add thumbs up and down buttons to the container - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(upvoteButton); - voteButtonsContainer.appendChild(downvoteButton); - - //add click listener to open up vote panel - sponsorTimeButton.addEventListener("click", function() { - voteButtonsContainer.style.display = "unset"; + + function hideVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: true }); - - container.appendChild(sponsorTimeButton); - container.appendChild(voteButtonsContainer); - - //if it is not the last iteration - if (i != request.sponsorTimes.length - 1) { - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - } - } + }); + + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; } -} - -//get the message that visually displays the video times -function getSponsorTimesMessage(sponsorTimes) { - let sponsorTimesMessage = ""; - - for (let i = 0; i < sponsorTimes.length; i++) { - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = ", " + timeMessage; - } - - sponsorTimesMessage += timeMessage; - } + + function showVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: false + }); + }); + + SB.hideVideoPlayerControls.style.display = "unset"; + SB.showVideoPlayerControls.style.display = "none"; } - - return sponsorTimesMessage; -} - -//get the message that visually displays the video times -//this version is a div that contains each with delete buttons -function getSponsorTimesMessageDiv(sponsorTimes) { - // let sponsorTimesMessage = ""; - let sponsorTimesContainer = document.createElement("div"); - sponsorTimesContainer.id = "sponsorTimesContainer"; - - for (let i = 0; i < sponsorTimes.length; i++) { - let currentSponsorTimeContainer = document.createElement("div"); - currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; - currentSponsorTimeContainer.className = "sponsorTime"; - let currentSponsorTimeMessage = ""; - - let deleteButton = document.createElement("span"); - deleteButton.id = "sponsorTimeDeleteButton" + i; - deleteButton.innerText = "Delete"; - deleteButton.className = "mediumLink"; - let index = i; - deleteButton.addEventListener("click", () => deleteSponsorTime(index)); - - let spacer = document.createElement("span"); - spacer.innerText = " "; - - let editButton = document.createElement("span"); - editButton.id = "sponsorTimeEditButton" + i; - editButton.innerText = "Edit"; - editButton.className = "mediumLink"; - editButton.addEventListener("click", () => editSponsorTime(index)); - - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = timeMessage; - } - - currentSponsorTimeMessage += timeMessage; - } - - currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; - currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); - - sponsorTimesContainer.appendChild(currentSponsorTimeContainer); - sponsorTimesContainer.appendChild(deleteButton); - - //only if it is a complete sponsor time - if (sponsorTimes[i].length > 1) { - sponsorTimesContainer.appendChild(editButton); - } + + function hideInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeInfoButtonPlayerControlsVisibility", + value: true + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; } - - return sponsorTimesContainer; -} - -function editSponsorTime(index) { - if (document.getElementById("startTimeMinutes" + index) != null) { - //already open - return; + + function showInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "unset"; + SB.showInfoButtonPlayerControls.style.display = "none"; } - - let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); - - //get sponsor time minutes and seconds boxes - let startTimeMinutes = document.createElement("input"); - startTimeMinutes.id = "startTimeMinutes" + index; - startTimeMinutes.className = "sponsorTime"; - startTimeMinutes.type = "text"; - startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); - startTimeMinutes.style.width = "45"; - - let startTimeSeconds = document.createElement("input"); - startTimeSeconds.id = "startTimeSeconds" + index; - startTimeSeconds.className = "sponsorTime"; - startTimeSeconds.type = "text"; - startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); - startTimeSeconds.style.width = "60"; - - let endTimeMinutes = document.createElement("input"); - endTimeMinutes.id = "endTimeMinutes" + index; - endTimeMinutes.className = "sponsorTime"; - endTimeMinutes.type = "text"; - endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); - endTimeMinutes.style.width = "45"; - - let endTimeSeconds = document.createElement("input"); - endTimeSeconds.id = "endTimeSeconds" + index; - endTimeSeconds.className = "sponsorTime"; - endTimeSeconds.type = "text"; - endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); - endTimeSeconds.style.width = "60"; - - let colonText = document.createElement("span"); - colonText.innerText = ":"; - - let toText = document.createElement("span"); - toText.innerText = " to "; - - //remove all children to replace - while (sponsorTimeContainer.firstChild) { - sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); + + function hideDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeDeleteButtonPlayerControlsVisibility", + value: true + }); + }); + + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; } - - sponsorTimeContainer.appendChild(startTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(startTimeSeconds); - sponsorTimeContainer.appendChild(toText); - sponsorTimeContainer.appendChild(endTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(endTimeSeconds); - - //add save button and remove edit button - let saveButton = document.createElement("span"); - saveButton.id = "sponsorTimeSaveButton" + index; - saveButton.innerText = "Save"; - saveButton.className = "mediumLink"; - saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); - - let editButton = document.getElementById("sponsorTimeEditButton" + index); - let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); - - sponsorTimesContainer.removeChild(editButton); - sponsorTimesContainer.appendChild(saveButton); -} - -function saveSponsorTimeEdit(index) { - let startTimeMinutes = document.getElementById("startTimeMinutes" + index); - let startTimeSeconds = document.getElementById("startTimeSeconds" + index); - - let endTimeMinutes = document.getElementById("endTimeMinutes" + index); - let endTimeSeconds = document.getElementById("endTimeSeconds" + index); - - sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); - sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); -} - -//deletes the sponsor time submitted at an index -function deleteSponsorTime(index) { - //if it is not a complete sponsor time - if (sponsorTimes[index].length < 2) { + + function showDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", + value: false }); }); - - resetStartTimeChosen(); + + SB.hideDeleteButtonPlayerControls.style.display = "unset"; + SB.showDeleteButtonPlayerControls.style.display = "none"; } - - sponsorTimes.splice(index, 1); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - //update display - displaySponsorTimes(); - - //if they are all removed - if (sponsorTimes.length == 0) { - //update chrome tab + + function disableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": false}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: false }); }); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; + + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; } -} - -function clearTimes() { - //send new sponsor time state to tab - if (sponsorTimes.length > 0) { + + function enableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": true}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: true }); }); + + SB.enableSponsorViewTracking.style.display = "none"; + SB.disableSponsorViewTracking.style.display = "unset"; } - - //reset sponsorTimes - sponsorTimes = []; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; - - resetStartTimeChosen(); -} - -function submitTimes() { - //make info message say loading - document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - - if (sponsorTimes.length > 0) { + + function updateStartTimeChosen() { + //update startTimeChosen letiable + if (!startTimeChosen) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } else { + resetStartTimeChosen(); + } + } + + //set it to false + function resetStartTimeChosen() { + startTimeChosen = false; + SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; + } + + //hides and shows the submit times button when needed + function showSubmitTimesIfNecessary() { + //check if an end time has been specified for the latest sponsor time + if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { + //show submit times button + document.getElementById("submitTimesContainer").style.display = "unset"; + } else { + //hide submit times button + document.getElementById("submitTimesContainer").style.display = "none"; + } + } + + //make the options div visisble + function openOptions() { + document.getElementById("optionsButtonContainer").style.display = "none"; + document.getElementById("options").style.display = "unset"; + } + + //this is not a YouTube video page + function displayNoVideo() { + document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + + "If you know this is a YouTube tab, close this popup and open it again."; + } + + function reportAnIssue() { + document.getElementById("issueReporterContainer").style.display = "unset"; + SB.reportAnIssue.style.display = "none"; + } + + function addVoteMessage(message, UUID) { + let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); + //remove all children + while (container.firstChild) { + container.removeChild(container.firstChild); + } + + let thanksForVotingText = document.createElement("h2"); + thanksForVotingText.innerText = message; + //there are already breaks there + thanksForVotingText.style.marginBottom = "0px"; + + container.appendChild(thanksForVotingText); + } + + function vote(type, UUID) { + //add loading info + addVoteMessage("Loading...", UUID) + + //send the vote message to the tab chrome.runtime.sendMessage({ - message: "submitTimes", - videoID: currentVideoID + message: "submitVote", + type: type, + UUID: UUID }, function(response) { if (response != undefined) { - if (response.statusCode == 200) { - //hide loading message - document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; - - clearTimes(); - } else if(response.statusCode == 400) { - document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 429) { - document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 409) { - document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 502) { - document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else { - document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + //see if it was a success or failure + if (response.successType == 1) { + //success + addVoteMessage("Thanks for voting!", UUID) + } else if (response.successType == 0) { + //failure: duplicate vote + addVoteMessage("You have already voted this way before.", UUID) + } else if (response.successType == -1) { + if (response.statusCode == 502) { + addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) + } else { + //failure: unknown error + addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) + } } } }); } -} - -function showNoticeAgain() { - chrome.storage.sync.set({"dontShowNoticeAgain": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "showNoticeAgain" - }); - }); - - SB.showNoticeAgain.style.display = "none"; -} - -function hideVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: true - }); - }); - - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; -} - -function showVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: false - }); - }); - - SB.hideVideoPlayerControls.style.display = "unset"; - SB.showVideoPlayerControls.style.display = "none"; -} - -function hideInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeInfoButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; -} - -function showInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "unset"; - SB.showInfoButtonPlayerControls.style.display = "none"; -} - -function hideDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeDeleteButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; -} - -function showDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "unset"; - SB.showDeleteButtonPlayerControls.style.display = "none"; -} - -function disableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: false - }); - }); - - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; -} - -function enableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: true - }); - }); - - SB.enableSponsorViewTracking.style.display = "none"; - SB.disableSponsorViewTracking.style.display = "unset"; -} - -function updateStartTimeChosen() { - //update startTimeChosen variable - if (!startTimeChosen) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } else { - resetStartTimeChosen(); + + function hideDiscordButton() { + chrome.storage.sync.set({"hideDiscordLink": false}); + + SB.discordButtonContainer.style.display = "none"; } -} - -//set it to false -function resetStartTimeChosen() { - startTimeChosen = false; - SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; -} - -//hides and shows the submit times button when needed -function showSubmitTimesIfNecessary() { - //check if an end time has been specified for the latest sponsor time - if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { - //show submit times button - document.getElementById("submitTimesContainer").style.display = "unset"; - } else { - //hide submit times button - document.getElementById("submitTimesContainer").style.display = "none"; + + //converts time in seconds to minutes:seconds + function getFormattedTime(seconds) { + let minutes = Math.floor(seconds / 60); + let secondsDisplay = Math.round(seconds - minutes * 60); + if (secondsDisplay < 10) { + //add a zero + secondsDisplay = "0" + secondsDisplay; + } + + let formatted = minutes+ ":" + secondsDisplay; + + return formatted; } -} - -//make the options div visisble -function openOptions() { - document.getElementById("optionsButtonContainer").style.display = "none"; - document.getElementById("options").style.display = "unset"; -} - -//this is not a YouTube video page -function displayNoVideo() { - document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + - "If you know this is a YouTube tab, close this popup and open it again."; -} - -function reportAnIssue() { - document.getElementById("issueReporterContainer").style.display = "unset"; - SB.reportAnIssue.style.display = "none"; -} - -function addVoteMessage(message, UUID) { - let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); - //remove all children - while (container.firstChild) { - container.removeChild(container.firstChild); + + //converts time in seconds to minutes + function getTimeInMinutes(seconds) { + let minutes = Math.floor(seconds / 60); + + return minutes; } - - let thanksForVotingText = document.createElement("h2"); - thanksForVotingText.innerText = message; - //there are already breaks there - thanksForVotingText.style.marginBottom = "0px"; - - container.appendChild(thanksForVotingText); -} - -function vote(type, UUID) { - //add loading info - addVoteMessage("Loading...", UUID) - - //send the vote message to the tab - chrome.runtime.sendMessage({ - message: "submitVote", - type: type, - UUID: UUID - }, function(response) { - if (response != undefined) { - //see if it was a success or failure - if (response.successType == 1) { - //success - addVoteMessage("Thanks for voting!", UUID) - } else if (response.successType == 0) { - //failure: duplicate vote - addVoteMessage("You have already voted this way before.", UUID) - } else if (response.successType == -1) { - if (response.statusCode == 502) { - addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) - } else { - //failure: unknown error - addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) - } - } + + //converts time in seconds to seconds past the last minute + function getTimeInFormattedSeconds(seconds) { + let secondsFormatted = (seconds % 60).toFixed(3); + + if (secondsFormatted < 10) { + secondsFormatted = "0" + secondsFormatted; } - }); -} - -function hideDiscordButton() { - chrome.storage.sync.set({"hideDiscordLink": false}); - - SB.discordButtonContainer.style.display = "none"; -} - -//converts time in seconds to minutes:seconds -function getFormattedTime(seconds) { - let minutes = Math.floor(seconds / 60); - let secondsDisplay = Math.round(seconds - minutes * 60); - if (secondsDisplay < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; + + return secondsFormatted; } - - let formatted = minutes+ ":" + secondsDisplay; - - return formatted; -} - -//converts time in seconds to minutes -function getTimeInMinutes(seconds) { - let minutes = Math.floor(seconds / 60); - - return minutes; -} - -//converts time in seconds to seconds past the last minute -function getTimeInFormattedSeconds(seconds) { - let secondsFormatted = (seconds % 60).toFixed(3); - - if (secondsFormatted < 10) { - secondsFormatted = "0" + secondsFormatted; + + function sendRequestToServer(type, address, callback) { + let xmlhttp = new XMLHttpRequest(); + + xmlhttp.open(type, serverAddress + address, true); + + if (callback != undefined) { + xmlhttp.onreadystatechange = function () { + callback(xmlhttp, false); + }; + + xmlhttp.onerror = function(ev) { + callback(xmlhttp, true); + }; + } + + //submit this request + xmlhttp.send(); } - - return secondsFormatted; -} - -function sendRequestToServer(type, address, callback) { - let xmlhttp = new XMLHttpRequest(); - - xmlhttp.open(type, serverAddress + address, true); - - if (callback != undefined) { - xmlhttp.onreadystatechange = function () { - callback(xmlhttp, false); - }; - xmlhttp.onerror = function(ev) { - callback(xmlhttp, true); - }; + function getYouTubeVideoID(url) { // Return video id or false + let regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + let match = url.match(regExp); + return (match && match[7].length == 11) ? match[7] : false; } - - //submit this request - xmlhttp.send(); + +//end of function } -function getYouTubeVideoID(url) { // Return video id or false - var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; - var match = url.match(regExp); - return (match && match[7].length == 11) ? match[7] : false; -} +if (chrome.tabs != undefined) { + //add the width restriction (because Firefox) + document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0); + + //this means it is actually opened in the popup + runThePopup(); +} \ No newline at end of file -- cgit v1.2.3 From 53f611a43abd5ef5182943a1b71f47c6432f9b6a Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 18:59:06 +0100 Subject: Old function in-use --- popup.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/popup.js b/popup.js index 2e75f971..71aa4e87 100644 --- a/popup.js +++ b/popup.js @@ -919,8 +919,9 @@ function sendRequestToServer(type, address, callback) { xmlhttp.send(); } -function getYouTubeVideoID(url) { // Return video id or false +function getYouTubeVideoID(url) { // Returns with video id else returns false var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var match = url.match(regExp); - return (match && match[7].length == 11) ? match[7] : false; + var id = new URL(url).searchParams.get("v"); + return (match && match[7].length == 11) ? id : false; } -- cgit v1.2.3 From 69dee25ea8d95aeacf338c5f4a80604f3a219f13 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 20:43:45 +0100 Subject: "Improvements" to the Ref system --- popup.js | 75 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/popup.js b/popup.js index 71aa4e87..43a646df 100644 --- a/popup.js +++ b/popup.js @@ -1,32 +1,39 @@ -// References var SB = {}; -SB.sponsorStart = document.getElementById("sponsorStart"); -SB.clearTimes = document.getElementById("clearTimes"); -SB.submitTimes = document.getElementById("submitTimes"); -SB.showNoticeAgain = document.getElementById("showNoticeAgain"); -SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); -SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); -SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); -SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); -SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); -SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); -SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); -SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); -SB.optionsButton = document.getElementById("optionsButton"); -SB.reportAnIssue = document.getElementById("reportAnIssue"); +["sponsorStart", +"clearTimes", +"submitTimes", +"showNoticeAgain", +"hideVideoPlayerControls", +"showVideoPlayerControls", +"hideInfoButtonPlayerControls", +"showInfoButtonPlayerControls", +"hideDeleteButtonPlayerControls", +"showDeleteButtonPlayerControls", +"disableSponsorViewTracking", +"enableSponsorViewTracking", +"optionsButton", +"reportAnIssue", // sponsorTimesContributions -SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); -SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); -SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); +"sponsorTimesContributionsContainer", +"sponsorTimesContributionsDisplay", +"sponsorTimesContributionsDisplayEndWord", // sponsorTimesViewsDisplay -SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); -SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); -SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); +"sponsorTimesViewsContainer", +"sponsorTimesViewsDisplay", +"sponsorTimesViewsDisplayEndWord", // discordButtons -SB.discordButtonContainer = document.getElementById("discordButtonContainer"); -SB.hideDiscordButton = document.getElementById("hideDiscordButton"); +"discordButtonContainer", +"hideDiscordButton", +// More + "submissionSection", + "mainControls", + "loadingIndicator", + "videoFound", + "sponsorMessageTimes", + "downloadedSponsorMessageTimes", +].forEach(id => SB[id] = document.getElementById(id)); //setup click listeners SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); @@ -186,7 +193,7 @@ function loadTabData(tabs) { displaySponsorTimes(); //show submission section - document.getElementById("submissionSection").style.display = "unset"; + submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } @@ -214,15 +221,15 @@ function infoFound(request) { isYouTubeTab = true; //remove loading text - document.getElementById("mainControls").style.display = "unset" - document.getElementById("loadingIndicator").innerHTML = ""; + SB.mainControls.style.display = "unset" + SB.loadingIndicator.innerHTML = ""; if (request.found) { - document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" + SB.videoFound.innerHTML = "This video's sponsors are in the database!" displayDownloadedSponsorTimes(request); } else { - document.getElementById("videoFound").innerHTML = "No sponsors found" + SB.videoFound.innerHTML = "No sponsors found" } } } @@ -266,30 +273,28 @@ function startSponsorCallback(response) { displaySponsorTimes(); //show submission section - document.getElementById("submissionSection").style.display = "unset"; + SB.submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } //display the video times from the array function displaySponsorTimes() { - //set it to the message - let sponsorMessageTimes = document.getElementById("sponsorMessageTimes"); //remove all children - while (sponsorMessageTimes.firstChild) { - sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); + while (SB.sponsorMessageTimes.firstChild) { + SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); } //add sponsor times - sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); } //display the video times from the array at the top, in a different section function displayDownloadedSponsorTimes(request) { if (request.sponsorTimes != undefined) { //set it to the message - document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); + SB.downloadedSponsorMessageTimes.innerHTML = getSponsorTimesMessage(request.sponsorTimes); //add them as buttons to the issue reporting container let container = document.getElementById("issueReporterTimeButtons"); -- cgit v1.2.3 From d51e8044f4832a6f612ccdfcb5a4a0bbd46dd501 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 20:46:02 +0100 Subject: Update popup.js --- popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/popup.js b/popup.js index 43a646df..4d8997d0 100644 --- a/popup.js +++ b/popup.js @@ -193,7 +193,7 @@ function loadTabData(tabs) { displaySponsorTimes(); //show submission section - submissionSection.style.display = "unset"; + SB.submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } -- cgit v1.2.3 From 10d19785668e5445907981274395b2d20f5e57b6 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 15:57:28 -0400 Subject: Added better support for the old YouTube layout. --- popup.css | 15 ++++++++++++--- popup.html | 8 ++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/popup.css b/popup.css index 5c06ae72..d1efc61f 100644 --- a/popup.css +++ b/popup.css @@ -10,26 +10,35 @@ h1.popupElement { margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; - margin-inline-end: 0px; + margin-inline-end: 0px; + font-weight: bold; } h2.popupElement { margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; - margin-inline-end: 0px; + margin-inline-end: 0px; + font-weight: bold; } h3.popupElement { margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; - margin-inline-end: 0px; + margin-inline-end: 0px; + font-weight: bold; +} + +sub.popupElement { + font-size: smaller; } /* end reset */ .popupElement { font-family: 'Source Sans Pro', sans-serif; + + color: black; } h1.popupElement { diff --git a/popup.html b/popup.html index 931ffd2d..acdd455c 100644 --- a/popup.html +++ b/popup.html @@ -130,7 +130,7 @@
- + This hides the buttons that appear on the YouTube player to submit sponsors. I can see this being annoying for some people. Instead of using the button there, this popup can be used to submit sponsors. To hide the notice that appears, use the button that appears on the notice saying "Don't show this again". You can always enable these settings again @@ -143,7 +143,7 @@
- + This is the button that opens up a popup in the YouTube page. @@ -153,7 +153,7 @@
- + This is the button that allows you to clear all sponsors on the YouTube player. @@ -163,7 +163,7 @@
- + This feature tracks which sponsors you have skipped to let users know how much their submission has helped others and used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message to the server each time you skip a sponsor. Hopefully most people don't change this setting so that the view numbers -- cgit v1.2.3 From 74affbd9c08ee9a5ff0e1ff802f8917bc67eaa34 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 18:15:49 -0400 Subject: Fixed Firefox notification issue --- background.js | 9 +++++++++ manifest.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/background.js b/background.js index adb86553..55729fff 100644 --- a/background.js +++ b/background.js @@ -3,6 +3,9 @@ var previousVideoID = null //the id of this user, randomly generated once per install var userID = null; +//the last video id loaded, to make sure it is a video id change +var sponsorVideoID = null; + //when a new tab is highlighted chrome.tabs.onActivated.addListener( function(activeInfo) { @@ -162,6 +165,12 @@ function videoIDChange(currentVideoID, tabId) { id: currentVideoID }); + //not a url change + if (sponsorVideoID == currentVideoID){ + return; + } + sponsorVideoID = currentVideoID; + //warn them if they had unsubmitted times if (previousVideoID != null) { //get the sponsor times from storage diff --git a/manifest.json b/manifest.json index 0ab2dac8..0d76d2c2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.18", + "version": "1.0.19", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { -- cgit v1.2.3 From b1784fa31101b6677814801661a0725f68330cb1 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 18:18:03 -0400 Subject: Update version number. --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 0d76d2c2..45c1bb31 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.19", + "version": "1.0.20", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { -- cgit v1.2.3 From a2b4f8d141a5100f97cf98711e6e68f4fe816e36 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 18:21:23 -0400 Subject: Update version number --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 45c1bb31..0f427829 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.20", + "version": "1.0.21", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { -- cgit v1.2.3 From 85518d8130367cca69484caaed0ebddc9acf1cdb Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 30 Jul 2019 21:07:27 -0400 Subject: Fixed save button being in the wrong place and made submit button hide on editing. --- manifest.json | 2 +- popup.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 0f427829..8c43cd9d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.21", + "version": "1.0.22", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { diff --git a/popup.js b/popup.js index 95482305..2a321bfe 100644 --- a/popup.js +++ b/popup.js @@ -451,6 +451,9 @@ function runThePopup() { //already open return; } + + //hide submit button + document.getElementById("submitTimesContainer").style.display = "none"; let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); @@ -512,8 +515,7 @@ function runThePopup() { let editButton = document.getElementById("sponsorTimeEditButton" + index); let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); - editButton.remove(); - sponsorTimesContainer.appendChild(saveButton); + sponsorTimesContainer.replaceChild(saveButton, editButton); } function saveSponsorTimeEdit(index) { @@ -531,6 +533,8 @@ function runThePopup() { chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); displaySponsorTimes(); + + showSubmitTimesIfNecessary(); } //deletes the sponsor time submitted at an index -- cgit v1.2.3 From 585be8adf40e98f29e7ede2fa48e8db9e71f918a Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 00:12:02 -0400 Subject: Added help page on install. --- background.js | 13 ++++ firefox_manifest.json | 4 +- help/index.html | 122 ++++++++++++++++++++++++++++++++++ help/styles.css | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++ manifest.json | 6 +- 5 files changed, 318 insertions(+), 3 deletions(-) create mode 100644 help/index.html create mode 100644 help/styles.css diff --git a/background.js b/background.js index 55729fff..96e5a309 100644 --- a/background.js +++ b/background.js @@ -57,6 +57,19 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) { } }); +//add help page on install +chrome.runtime.onInstalled.addListener(function (object) { + chrome.storage.sync.get(["shownInstallPage"], function(result) { + let shownInstallPage = result.shownInstallPage; + if (shownInstallPage == undefined || !shownInstallPage) { + //open up the install page + chrome.tabs.create({url: chrome.extension.getURL("/help/index.html")}); + + //save that this happened + chrome.storage.sync.set({shownInstallPage: true}); + } + }); +}); //gets the sponsor times from memory function getSponsorTimes(videoID, callback) { diff --git a/firefox_manifest.json b/firefox_manifest.json index 3948c08a..e503a8e8 100644 --- a/firefox_manifest.json +++ b/firefox_manifest.json @@ -31,7 +31,9 @@ "icons/downvote.png", "icons/PlayerInfoIconSponsorBlocker256px.png", "icons/PlayerDeleteIconSponsorBlocker256px.png", - "popup.html" + "popup.html", + "help/index.html", + "help/style.css" ], "permissions": [ "tabs", diff --git a/help/index.html b/help/index.html new file mode 100644 index 00000000..28a2be0b --- /dev/null +++ b/help/index.html @@ -0,0 +1,122 @@ + + SponsorBlock + + + + + + +
+ + SponsorBlock +
+ +
+ +

Created By Ajay Ramachandran

+ +

+ Thanks for installing SponsorBlock. Here are some quick tips for getting started. Please join the Discord if you have any questions or suggestions. +

+ +

+ + + + + Come contribute, make some suggestions and help out in the Discord: https://discord.gg/QnmVMpU +

+ +

How skipping works

+ +

+ + + + + Videos will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are. + +
+
+ Whenever you skip a video, you will get a notice allowing you to vote on that submission. If it worked, upvote it! You can also vote in the popup. +

+ +
+ +

Submitting

+ +

+ + + + + Submitting can either be done in the popup by hitting the "Sponsorship Starts Now" button or in the video player with the buttons on the player. + +
+
+ + Clicking the play button indicated the start of a sponsorship section and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete. +

+ +

Editing

+ +

+ + + + + If you messed up, you can edit or delete your sponsor times in the popup or in the info menu (by hitting the info icon). + +

+ +

This is too slow

+ +

+ There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the appostrophe to submit. +

+ +

I hate these buttons, they are so ugly

+ +

+ All player buttons can be hidden in the options. +

+ +

Can I get a copy of the Database? What happens if you disappear?

+ +

+ The database is public and available at https://sponsor.ajay.app/database.db. The source code is freely available. So, even if something happens to me, your submissions are not lost. +

+ +

News and how it is made

+ +

+ See https://sponsor.ajay.app/news. +

+ +

I want more features!

+ +

+ Ask on Discord or make an Issue on GitHub. I am happy to hear suggestions or improvements you want. You may also contribute code or graphics if you would like. +

+ +

Where can I get the source code

+ +

Client:

+ + + +

Server:

+ + + +

Credit

+ +

The awesome Invidious API is used to grab the time the video was published.

+ +

Some icons made by Gregor Cresnar from www.flaticon.com and are licensed by CC 3.0 BY

+ +

Some icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY

+ +
+ + \ No newline at end of file diff --git a/help/styles.css b/help/styles.css new file mode 100644 index 00000000..338f1810 --- /dev/null +++ b/help/styles.css @@ -0,0 +1,176 @@ +:not(.hljs-keyword):not(.hljs-comment):not(.hljs-number):not(.hljs-string):not(pre):not(code) { + background-color: #333333; +} + +.projectPreview { + position: relative; +} + +.projectPreviewImage { + position: absolute; + left: -90; + width: 80; + top: 50%; + transform: translateY(-50%); +} + +.projectPreviewImageLarge { + position: absolute; + left: -210; + width: 200; + top: 50%; + transform: translateY(-20%); +} + +.projectPreviewImageLargeRight { + position: absolute; + right: -210; + width: 200; + top: 50%; + transform: translateY(-50%); +} + +.createdBy { + font-size: 14px; + text-align: center; + padding-top: 0px; + padding-bottom: 0px; +} + +#title { + background-color: #636363; + + text-align: center; + vertical-align: middle; + + font-family: sans-serif; + font-size: 50; + color: #212121; + + /* height: 100; */ + + padding: 20; + + text-decoration: none; + + transition: font-size 1s; +} + +#title:hover { + font-size: 60; + + transition: font-size 1s; +} + +.subtitle { + font-family: sans-serif; + font-size: 40; + color: #dad8d8; + + padding-top: 10; + + transition: font-size 0.4s; +} + +.subtitle:hover { + font-size: 45; + + transition: font-size 0.4s; +} + +.profilepic { + background-color: #636363 !important; + vertical-align: middle; +} + +a { + text-decoration: underline; + color: inherit; +} + +.link { + padding: 20; + + height: 80px; + + transition: height 0.2s; +} + +.link:hover { + height: 95px; + + transition: height 0.2s; +} + +#contact,.smalllink { + font-family: sans-serif; + font-size: 25; + color: #e8e8e8; + + text-align: center; + + padding: 10; +} + +#contact { + text-decoration: none; +} + +p,li { + font-family: sans-serif; + font-size: 20; + color: #c4c4c4; + + padding: 10; +} + +p,li,code,a { + max-width: 60%; + text-align: left; + overflow-wrap: break-word; +} + +@media screen and (orientation:portrait) { + p,li,code,a { + max-width: 100%; + } + + .projectPreviewImage { + position: unset; + width: 130; + display: block; + margin: auto; + transform: none; + } +} + +.previewImage { + max-height: 200px; +} + +img { + max-width: 100%; + + text-align: center; +} + +#recentPostTitle { + font-family: sans-serif; + font-size: 30; + color: #dad8d8; +} + +#recentPostDate { + font-family: sans-serif; + font-size: 15; + color: #dad8d8; +} + +h1,h2,h3,h4,h5,h6 { + font-family: sans-serif; + color: #dad8d8; +} + +svg { + text-decoration: none; +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 8c43cd9d..60a434a7 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.22", + "version": "1.0.23", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { @@ -31,7 +31,9 @@ "icons/downvote.png", "icons/PlayerInfoIconSponsorBlocker256px.png", "icons/PlayerDeleteIconSponsorBlocker256px.png", - "popup.html" + "popup.html", + "help/index.html", + "help/style.css" ], "permissions": [ "tabs", -- cgit v1.2.3 From 1341d5e11dd6c3da61eb15dbd7217637ebc07b87 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 22:57:50 -0400 Subject: Fixed grammer --- help/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help/index.html b/help/index.html index 28a2be0b..61e4e6ad 100644 --- a/help/index.html +++ b/help/index.html @@ -115,7 +115,7 @@

Some icons made by Gregor Cresnar from www.flaticon.com and are licensed by CC 3.0 BY

-

Some icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY

+

Some icons made by Freepik from www.flaticon.com and are licensed by CC 3.0 BY

-- cgit v1.2.3 From 25801b6fcddd7f705ce508d25cafda1fe13b0c1b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 23:09:33 -0400 Subject: Merged into master --- popup.js | 1747 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 893 insertions(+), 854 deletions(-) diff --git a/popup.js b/popup.js index 4d8997d0..4ee821c5 100644 --- a/popup.js +++ b/popup.js @@ -1,932 +1,971 @@ -var SB = {}; - -["sponsorStart", -"clearTimes", -"submitTimes", -"showNoticeAgain", -"hideVideoPlayerControls", -"showVideoPlayerControls", -"hideInfoButtonPlayerControls", -"showInfoButtonPlayerControls", -"hideDeleteButtonPlayerControls", -"showDeleteButtonPlayerControls", -"disableSponsorViewTracking", -"enableSponsorViewTracking", -"optionsButton", -"reportAnIssue", -// sponsorTimesContributions -"sponsorTimesContributionsContainer", -"sponsorTimesContributionsDisplay", -"sponsorTimesContributionsDisplayEndWord", -// sponsorTimesViewsDisplay -"sponsorTimesViewsContainer", -"sponsorTimesViewsDisplay", -"sponsorTimesViewsDisplayEndWord", -// discordButtons -"discordButtonContainer", -"hideDiscordButton", -// More - "submissionSection", - "mainControls", - "loadingIndicator", - "videoFound", - "sponsorMessageTimes", - "downloadedSponsorMessageTimes", -].forEach(id => SB[id] = document.getElementById(id)); - -//setup click listeners -SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); -SB.clearTimes.addEventListener("click", clearTimes); -SB.submitTimes.addEventListener("click", submitTimes); -SB.showNoticeAgain.addEventListener("click", showNoticeAgain); -SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); -SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); -SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); -SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); -SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); -SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); -SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); -SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); -SB.optionsButton.addEventListener("click", openOptions); -SB.reportAnIssue.addEventListener("click", reportAnIssue); -SB.hideDiscordButton.addEventListener("click", hideDiscordButton); - - -//if true, the button now selects the end time -var startTimeChosen = false; - -//the start and end time pairs (2d) -var sponsorTimes = []; - -//current video ID of this tab -var currentVideoID = null; - -//is this a YouTube tab? -var isYouTubeTab = false; - -//see if discord link can be shown -chrome.storage.sync.get(["hideDiscordLink"], function(result) { - let hideDiscordLink = result.hideDiscordLink; - if (hideDiscordLink == undefined || !hideDiscordLink) { - chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { - let hideDiscordLaunches = result.hideDiscordLaunches; - //only if less than 5 launches - if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { - SB.discordButtonContainer.style.display = null; - - if (hideDiscordLaunches == undefined) { - hideDiscordButton = 1; +//make this a function to allow this to run on the content page +function runThePopup() { + + //is it in the popup or content script + var inPopup = true; + if (chrome.tabs == undefined) { + //this is on the content script, use direct communication + chrome.tabs = {}; + chrome.tabs.sendMessage = function(id, request, callback) { + messageListener(request, null, callback); + } + + //add a dummy query method + chrome.tabs.query = function(config, callback) { + callback([{ + url: document.URL, + id: -1 + }]); + } + + inPopup = false; + } + + var SB = {}; + + ["sponsorStart", + "clearTimes", + "submitTimes", + "showNoticeAgain", + "hideVideoPlayerControls", + "showVideoPlayerControls", + "hideInfoButtonPlayerControls", + "showInfoButtonPlayerControls", + "hideDeleteButtonPlayerControls", + "showDeleteButtonPlayerControls", + "disableSponsorViewTracking", + "enableSponsorViewTracking", + "optionsButton", + "reportAnIssue", + // sponsorTimesContributions + "sponsorTimesContributionsContainer", + "sponsorTimesContributionsDisplay", + "sponsorTimesContributionsDisplayEndWord", + // sponsorTimesViewsDisplay + "sponsorTimesViewsContainer", + "sponsorTimesViewsDisplay", + "sponsorTimesViewsDisplayEndWord", + // discordButtons + "discordButtonContainer", + "hideDiscordButton", + // More + "submissionSection", + "mainControls", + "loadingIndicator", + "videoFound", + "sponsorMessageTimes", + "downloadedSponsorMessageTimes", + ].forEach(id => SB[id] = document.getElementById(id)); + + //setup click listeners + SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); + SB.clearTimes.addEventListener("click", clearTimes); + SB.submitTimes.addEventListener("click", submitTimes); + SB.showNoticeAgain.addEventListener("click", showNoticeAgain); + SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); + SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); + SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); + SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); + SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); + SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); + SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); + SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); + SB.optionsButton.addEventListener("click", openOptions); + SB.reportAnIssue.addEventListener("click", reportAnIssue); + SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + + + //if true, the button now selects the end time + let startTimeChosen = false; + + //the start and end time pairs (2d) + let sponsorTimes = []; + + //current video ID of this tab + let currentVideoID = null; + + //is this a YouTube tab? + let isYouTubeTab = false; + + //see if discord link can be shown + chrome.storage.sync.get(["hideDiscordLink"], function(result) { + let hideDiscordLink = result.hideDiscordLink; + if (hideDiscordLink == undefined || !hideDiscordLink) { + chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { + let hideDiscordLaunches = result.hideDiscordLaunches; + //only if less than 5 launches + if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { + SB.discordButtonContainer.style.display = null; + + if (hideDiscordLaunches == undefined) { + hideDiscordButton = 1; + } + + chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); } - - chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); + }); + } + }); + + //if the don't show notice again letiable is true, an option to + // disable should be available + chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { + let dontShowNoticeAgain = result.dontShowNoticeAgain; + if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { + SB.showNoticeAgain.style.display = "unset"; + } + }); + + //show proper video player controls options + chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { + let hideVideoPlayerControls = result.hideVideoPlayerControls; + if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { + let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; + if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { + let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; + if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; + } + }); + + //show proper tracking option + chrome.storage.sync.get(["trackViewCount"], function(result) { + let trackViewCount = result.trackViewCount; + if (trackViewCount != undefined && !trackViewCount) { + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; + } + }); + + //get the amount of times this user has contributed and display it to thank them + chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { + if (result.sponsorTimesContributed != undefined) { + if (result.sponsorTimesContributed > 1) { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." + } else { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + } + SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; + SB.sponsorTimesContributionsContainer.style.display = "unset"; + + //get the userID + chrome.storage.sync.get(["userID"], function(result) { + let userID = result.userID; + if (userID != undefined) { + //there are probably some views on these submissions then + //get the amount of views from the sponsors submitted + sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + let viewCount = JSON.parse(xmlhttp.responseText).viewCount; + if (viewCount != 0) { + if (viewCount > 1) { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." + } else { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." + } + SB.sponsorTimesViewsDisplay.innerText = viewCount; + SB.sponsorTimesViewsContainer.style.display = "unset"; + } + } + }); + } + }); + } + }); + + + chrome.tabs.query({ + active: true, + currentWindow: true + }, loadTabData); + + + function loadTabData(tabs) { + //set current videoID + currentVideoID = getYouTubeVideoID(tabs[0].url); + + if (!currentVideoID) { + //this isn't a YouTube video then + displayNoVideo(); + return; + } + + //load video times for this video + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.get([sponsorTimeKey], function(result) { + let sponsorTimesStorage = result[sponsorTimeKey]; + if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { + if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } + + sponsorTimes = sponsorTimesStorage; + + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); } }); + + //check if this video's sponsors are known + chrome.tabs.sendMessage( + tabs[0].id, + {message: 'isInfoFound'}, + infoFound + ); } -}); + + function infoFound(request) { + if(chrome.runtime.lastError) { + //This page doesn't have the injected content script, or at least not yet + displayNoVideo(); + return; + } + + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + //this must be a YouTube video + //set letiable + isYouTubeTab = true; + + //remove loading text + SB.mainControls.style.display = "unset" + SB.loadingIndicator.innerHTML = ""; -//if the don't show notice again variable is true, an option to -// disable should be available -chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { - let dontShowNoticeAgain = result.dontShowNoticeAgain; - if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { - SB.showNoticeAgain.style.display = "unset"; - } -}); + if (request.found) { + SB.videoFound.innerHTML = "This video's sponsors are in the database!" -//show proper video player controls options -chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { - let hideVideoPlayerControls = result.hideVideoPlayerControls; - if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; + displayDownloadedSponsorTimes(request); + } else { + SB.videoFound.innerHTML = "No sponsors found" + } + } } -}); -chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { - let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; - if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; + + function setVideoID(request) { + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + videoID = request.videoID; + } } -}); -chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { - let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; - if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; + + function sendSponsorStartMessage() { + //the content script will get the message if a YouTube page is open + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {from: 'popup', message: 'sponsorStart'}, + startSponsorCallback + ); + }); } -}); - -//show proper tracking option -chrome.storage.sync.get(["trackViewCount"], function(result) { - let trackViewCount = result.trackViewCount; - if (trackViewCount != undefined && !trackViewCount) { - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; + + function startSponsorCallback(response) { + let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); + + if (sponsorTimes[sponsorTimesIndex] == undefined) { + sponsorTimes[sponsorTimesIndex] = []; + } + + sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + updateStartTimeChosen(); + + //display video times on screen + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); } -}); - -//get the amount of times this user has contributed and display it to thank them -chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { - if (result.sponsorTimesContributed != undefined) { - if (result.sponsorTimesContributed > 1) { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." - } else { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + + //display the video times from the array + function displaySponsorTimes() { + //remove all children + while (SB.sponsorMessageTimes.firstChild) { + SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); } - SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; - SB.sponsorTimesContributionsContainer.style.display = "unset"; - //get the userID - chrome.storage.sync.get(["userID"], function(result) { - let userID = result.userID; - if (userID != undefined) { - //there are probably some views on these submissions then - //get the amount of views from the sponsors submitted - sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let viewCount = JSON.parse(xmlhttp.responseText).viewCount; - if (viewCount != 0) { - if (viewCount > 1) { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." - } else { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." - } - SB.sponsorTimesViewsDisplay.innerText = viewCount; - SB.sponsorTimesViewsContainer.style.display = "unset"; - } - } + //add sponsor times + SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + } + + //display the video times from the array at the top, in a different section + function displayDownloadedSponsorTimes(request) { + if (request.sponsorTimes != undefined) { + //set it to the message + SB.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes); + + //add them as buttons to the issue reporting container + let container = document.getElementById("issueReporterTimeButtons"); + for (let i = 0; i < request.sponsorTimes.length; i++) { + let sponsorTimeButton = document.createElement("button"); + sponsorTimeButton.className = "warningButton popupElement"; + sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); + + let votingButtons = document.createElement("div"); + + let UUID = request.UUIDs[i]; + + //thumbs up and down buttons + let voteButtonsContainer = document.createElement("div"); + voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; + voteButtonsContainer.setAttribute("align", "center"); + voteButtonsContainer.style.display = "none" + + let upvoteButton = document.createElement("img"); + upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; + upvoteButton.className = "voteButton popupElement"; + upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); + upvoteButton.addEventListener("click", () => vote(1, UUID)); + + let downvoteButton = document.createElement("img"); + downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; + downvoteButton.className = "voteButton popupElement"; + downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); + downvoteButton.addEventListener("click", () => vote(0, UUID)); + + //add thumbs up and down buttons to the container + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(upvoteButton); + voteButtonsContainer.appendChild(downvoteButton); + + //add click listener to open up vote panel + sponsorTimeButton.addEventListener("click", function() { + voteButtonsContainer.style.display = "unset"; }); + + container.appendChild(sponsorTimeButton); + container.appendChild(voteButtonsContainer); + + //if it is not the last iteration + if (i != request.sponsorTimes.length - 1) { + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + } } - }); + } } -}); - - -chrome.tabs.query({ - active: true, - currentWindow: true -}, loadTabData); - -function loadTabData(tabs) { - //set current videoID - currentVideoID = getYouTubeVideoID(tabs[0].url); - - if (!currentVideoID) { - //this isn't a YouTube video then - displayNoVideo(); - return; + + //get the message that visually displays the video times + function getSponsorTimesMessage(sponsorTimes) { + let sponsorTimesMessage = ""; + + for (let i = 0; i < sponsorTimes.length; i++) { + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = ", " + timeMessage; + } + + sponsorTimesMessage += timeMessage; + } + } + + return sponsorTimesMessage; } - - //load video times for this video - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.get([sponsorTimeKey], function(result) { - let sponsorTimesStorage = result[sponsorTimeKey]; - if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { - if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + + //get the message that visually displays the video times + //this version is a div that contains each with delete buttons + function getSponsorTimesMessageDiv(sponsorTimes) { + // let sponsorTimesMessage = ""; + let sponsorTimesContainer = document.createElement("div"); + sponsorTimesContainer.id = "sponsorTimesContainer"; + + for (let i = 0; i < sponsorTimes.length; i++) { + let currentSponsorTimeContainer = document.createElement("div"); + currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; + currentSponsorTimeContainer.className = "sponsorTime popupElement"; + let currentSponsorTimeMessage = ""; + + let deleteButton = document.createElement("span"); + deleteButton.id = "sponsorTimeDeleteButton" + i; + deleteButton.innerText = "Delete"; + deleteButton.className = "mediumLink popupElement"; + let index = i; + deleteButton.addEventListener("click", () => deleteSponsorTime(index)); + + let spacer = document.createElement("span"); + spacer.innerText = " "; + + let editButton = document.createElement("span"); + editButton.id = "sponsorTimeEditButton" + i; + editButton.innerText = "Edit"; + editButton.className = "mediumLink popupElement"; + editButton.addEventListener("click", () => editSponsorTime(index)); + + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = timeMessage; + } + + currentSponsorTimeMessage += timeMessage; + } + + currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; + currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); + + sponsorTimesContainer.appendChild(currentSponsorTimeContainer); + sponsorTimesContainer.appendChild(deleteButton); + + //only if it is a complete sponsor time + if (sponsorTimes[i].length > 1) { + sponsorTimesContainer.appendChild(editButton); } - - sponsorTimes = sponsorTimesStorage; - - displaySponsorTimes(); - - //show submission section - SB.submissionSection.style.display = "unset"; - - showSubmitTimesIfNecessary(); } - }); - - //check if this video's sponsors are known - chrome.tabs.sendMessage( - tabs[0].id, - {message: 'isInfoFound'}, - infoFound - ); -} - -function infoFound(request) { - if(chrome.runtime.lastError) { - //This page doesn't have the injected content script, or at least not yet - displayNoVideo(); - return; + + return sponsorTimesContainer; } + + function editSponsorTime(index) { + if (document.getElementById("startTimeMinutes" + index) != null) { + //already open + return; + } - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - //this must be a YouTube video - //set variable - isYouTubeTab = true; - - //remove loading text - SB.mainControls.style.display = "unset" - SB.loadingIndicator.innerHTML = ""; - - if (request.found) { - SB.videoFound.innerHTML = "This video's sponsors are in the database!" - - displayDownloadedSponsorTimes(request); - } else { - SB.videoFound.innerHTML = "No sponsors found" + //hide submit button + document.getElementById("submitTimesContainer").style.display = "none"; + + let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); + + //get sponsor time minutes and seconds boxes + let startTimeMinutes = document.createElement("input"); + startTimeMinutes.id = "startTimeMinutes" + index; + startTimeMinutes.className = "sponsorTime popupElement"; + startTimeMinutes.type = "text"; + startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); + startTimeMinutes.style.width = "45px"; + + let startTimeSeconds = document.createElement("input"); + startTimeSeconds.id = "startTimeSeconds" + index; + startTimeSeconds.className = "sponsorTime popupElement"; + startTimeSeconds.type = "text"; + startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); + startTimeSeconds.style.width = "60px"; + + let endTimeMinutes = document.createElement("input"); + endTimeMinutes.id = "endTimeMinutes" + index; + endTimeMinutes.className = "sponsorTime popupElement"; + endTimeMinutes.type = "text"; + endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); + endTimeMinutes.style.width = "45px"; + + let endTimeSeconds = document.createElement("input"); + endTimeSeconds.id = "endTimeSeconds" + index; + endTimeSeconds.className = "sponsorTime popupElement"; + endTimeSeconds.type = "text"; + endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); + endTimeSeconds.style.width = "60px"; + + let colonText = document.createElement("span"); + colonText.innerText = ":"; + + let toText = document.createElement("span"); + toText.innerText = " to "; + + //remove all children to replace + while (sponsorTimeContainer.firstChild) { + sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); } + + sponsorTimeContainer.appendChild(startTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(startTimeSeconds); + sponsorTimeContainer.appendChild(toText); + sponsorTimeContainer.appendChild(endTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(endTimeSeconds); + + //add save button and remove edit button + let saveButton = document.createElement("span"); + saveButton.id = "sponsorTimeSaveButton" + index; + saveButton.innerText = "Save"; + saveButton.className = "mediumLink popupElement"; + saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); + + let editButton = document.getElementById("sponsorTimeEditButton" + index); + let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); + + sponsorTimesContainer.replaceChild(saveButton, editButton); } -} + + function saveSponsorTimeEdit(index) { + let startTimeMinutes = document.getElementById("startTimeMinutes" + index); + let startTimeSeconds = document.getElementById("startTimeSeconds" + index); + + let endTimeMinutes = document.getElementById("endTimeMinutes" + index); + let endTimeSeconds = document.getElementById("endTimeSeconds" + index); + + sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); + sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); -function setVideoID(request) { - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - videoID = request.videoID; + showSubmitTimesIfNecessary(); } -} - -function sendSponsorStartMessage() { - //the content script will get the message if a YouTube page is open + + //deletes the sponsor time submitted at an index + function deleteSponsorTime(index) { + //if it is not a complete sponsor time + if (sponsorTimes[index].length < 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + resetStartTimeChosen(); + } + + sponsorTimes.splice(index, 1); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + //update display + displaySponsorTimes(); + + //if they are all removed + if (sponsorTimes.length == 0) { + //update chrome tab + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + } + } + + function clearTimes() { + //send new sponsor time state to tab + if (sponsorTimes.length > 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + } + + //reset sponsorTimes + sponsorTimes = []; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + + resetStartTimeChosen(); + } + + function submitTimes() { + //make info message say loading + document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + + if (sponsorTimes.length > 0) { + chrome.runtime.sendMessage({ + message: "submitTimes", + videoID: currentVideoID + }, function(response) { + if (response != undefined) { + if (response.statusCode == 200) { + //hide loading message + document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; + + clearTimes(); + } else if(response.statusCode == 400) { + document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 429) { + document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 409) { + document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 502) { + document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else { + document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } + } + }); + } + } + + function showNoticeAgain() { + chrome.storage.sync.set({"dontShowNoticeAgain": false}); + chrome.tabs.query({ active: true, currentWindow: true - }, tabs => { - chrome.tabs.sendMessage( - tabs[0].id, - {from: 'popup', message: 'sponsorStart'}, - startSponsorCallback - ); + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "showNoticeAgain" + }); }); -} - -function startSponsorCallback(response) { - let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); - - if (sponsorTimes[sponsorTimesIndex] == undefined) { - sponsorTimes[sponsorTimesIndex] = []; - } - - sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - updateStartTimeChosen(); - - //display video times on screen - displaySponsorTimes(); - - //show submission section - SB.submissionSection.style.display = "unset"; - - showSubmitTimesIfNecessary(); -} - -//display the video times from the array -function displaySponsorTimes() { - - //remove all children - while (SB.sponsorMessageTimes.firstChild) { - SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); + + SB.showNoticeAgain.style.display = "none"; } - - //add sponsor times - SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); -} - -//display the video times from the array at the top, in a different section -function displayDownloadedSponsorTimes(request) { - if (request.sponsorTimes != undefined) { - //set it to the message - SB.downloadedSponsorMessageTimes.innerHTML = getSponsorTimesMessage(request.sponsorTimes); - - //add them as buttons to the issue reporting container - let container = document.getElementById("issueReporterTimeButtons"); - for (let i = 0; i < request.sponsorTimes.length; i++) { - let sponsorTimeButton = document.createElement("button"); - sponsorTimeButton.className = "warningButton"; - sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); - - let votingButtons = document.createElement("div"); - - let UUID = request.UUIDs[i]; - - //thumbs up and down buttons - let voteButtonsContainer = document.createElement("div"); - voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; - voteButtonsContainer.setAttribute("align", "center"); - voteButtonsContainer.style.display = "none" - - let upvoteButton = document.createElement("img"); - upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; - upvoteButton.className = "voteButton"; - upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); - upvoteButton.addEventListener("click", () => vote(1, UUID)); - - let downvoteButton = document.createElement("img"); - downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; - downvoteButton.className = "voteButton"; - downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); - downvoteButton.addEventListener("click", () => vote(0, UUID)); - - //add thumbs up and down buttons to the container - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(upvoteButton); - voteButtonsContainer.appendChild(downvoteButton); - - //add click listener to open up vote panel - sponsorTimeButton.addEventListener("click", function() { - voteButtonsContainer.style.display = "unset"; + + function hideVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: true }); - - container.appendChild(sponsorTimeButton); - container.appendChild(voteButtonsContainer); - - //if it is not the last iteration - if (i != request.sponsorTimes.length - 1) { - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - } - } + }); + + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; } -} - -//get the message that visually displays the video times -function getSponsorTimesMessage(sponsorTimes) { - let sponsorTimesMessage = ""; - - for (let i = 0; i < sponsorTimes.length; i++) { - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = ", " + timeMessage; - } - - sponsorTimesMessage += timeMessage; - } + + function showVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: false + }); + }); + + SB.hideVideoPlayerControls.style.display = "unset"; + SB.showVideoPlayerControls.style.display = "none"; } - - return sponsorTimesMessage; -} - -//get the message that visually displays the video times -//this version is a div that contains each with delete buttons -function getSponsorTimesMessageDiv(sponsorTimes) { - // let sponsorTimesMessage = ""; - let sponsorTimesContainer = document.createElement("div"); - sponsorTimesContainer.id = "sponsorTimesContainer"; - - for (let i = 0; i < sponsorTimes.length; i++) { - let currentSponsorTimeContainer = document.createElement("div"); - currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; - currentSponsorTimeContainer.className = "sponsorTime"; - let currentSponsorTimeMessage = ""; - - let deleteButton = document.createElement("span"); - deleteButton.id = "sponsorTimeDeleteButton" + i; - deleteButton.innerText = "Delete"; - deleteButton.className = "mediumLink"; - let index = i; - deleteButton.addEventListener("click", () => deleteSponsorTime(index)); - - let spacer = document.createElement("span"); - spacer.innerText = " "; - - let editButton = document.createElement("span"); - editButton.id = "sponsorTimeEditButton" + i; - editButton.innerText = "Edit"; - editButton.className = "mediumLink"; - editButton.addEventListener("click", () => editSponsorTime(index)); - - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = timeMessage; - } - - currentSponsorTimeMessage += timeMessage; - } - - currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; - currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); - - sponsorTimesContainer.appendChild(currentSponsorTimeContainer); - sponsorTimesContainer.appendChild(deleteButton); - - //only if it is a complete sponsor time - if (sponsorTimes[i].length > 1) { - sponsorTimesContainer.appendChild(editButton); - } + + function hideInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeInfoButtonPlayerControlsVisibility", + value: true + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; } - - return sponsorTimesContainer; -} - -function editSponsorTime(index) { - if (document.getElementById("startTimeMinutes" + index) != null) { - //already open - return; + + function showInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "unset"; + SB.showInfoButtonPlayerControls.style.display = "none"; } - - let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); - - //get sponsor time minutes and seconds boxes - let startTimeMinutes = document.createElement("input"); - startTimeMinutes.id = "startTimeMinutes" + index; - startTimeMinutes.className = "sponsorTime"; - startTimeMinutes.type = "text"; - startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); - startTimeMinutes.style.width = "45"; - - let startTimeSeconds = document.createElement("input"); - startTimeSeconds.id = "startTimeSeconds" + index; - startTimeSeconds.className = "sponsorTime"; - startTimeSeconds.type = "text"; - startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); - startTimeSeconds.style.width = "60"; - - let endTimeMinutes = document.createElement("input"); - endTimeMinutes.id = "endTimeMinutes" + index; - endTimeMinutes.className = "sponsorTime"; - endTimeMinutes.type = "text"; - endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); - endTimeMinutes.style.width = "45"; - - let endTimeSeconds = document.createElement("input"); - endTimeSeconds.id = "endTimeSeconds" + index; - endTimeSeconds.className = "sponsorTime"; - endTimeSeconds.type = "text"; - endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); - endTimeSeconds.style.width = "60"; - - let colonText = document.createElement("span"); - colonText.innerText = ":"; - - let toText = document.createElement("span"); - toText.innerText = " to "; - - //remove all children to replace - while (sponsorTimeContainer.firstChild) { - sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); + + function hideDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeDeleteButtonPlayerControlsVisibility", + value: true + }); + }); + + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; } - - sponsorTimeContainer.appendChild(startTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(startTimeSeconds); - sponsorTimeContainer.appendChild(toText); - sponsorTimeContainer.appendChild(endTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(endTimeSeconds); - - //add save button and remove edit button - let saveButton = document.createElement("span"); - saveButton.id = "sponsorTimeSaveButton" + index; - saveButton.innerText = "Save"; - saveButton.className = "mediumLink"; - saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); - - let editButton = document.getElementById("sponsorTimeEditButton" + index); - let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); - - sponsorTimesContainer.removeChild(editButton); - sponsorTimesContainer.appendChild(saveButton); -} - -function saveSponsorTimeEdit(index) { - let startTimeMinutes = document.getElementById("startTimeMinutes" + index); - let startTimeSeconds = document.getElementById("startTimeSeconds" + index); - - let endTimeMinutes = document.getElementById("endTimeMinutes" + index); - let endTimeSeconds = document.getElementById("endTimeSeconds" + index); - - sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); - sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); -} - -//deletes the sponsor time submitted at an index -function deleteSponsorTime(index) { - //if it is not a complete sponsor time - if (sponsorTimes[index].length < 2) { + + function showDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", + value: false }); }); - - resetStartTimeChosen(); + + SB.hideDeleteButtonPlayerControls.style.display = "unset"; + SB.showDeleteButtonPlayerControls.style.display = "none"; } - - sponsorTimes.splice(index, 1); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - //update display - displaySponsorTimes(); - - //if they are all removed - if (sponsorTimes.length == 0) { - //update chrome tab + + function disableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": false}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: false }); }); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; + + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; } -} - -function clearTimes() { - //send new sponsor time state to tab - if (sponsorTimes.length > 0) { + + function enableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": true}); + chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: true }); }); + + SB.enableSponsorViewTracking.style.display = "none"; + SB.disableSponsorViewTracking.style.display = "unset"; } - - //reset sponsorTimes - sponsorTimes = []; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; - - resetStartTimeChosen(); -} - -function submitTimes() { - //make info message say loading - document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - - if (sponsorTimes.length > 0) { + + function updateStartTimeChosen() { + //update startTimeChosen letiable + if (!startTimeChosen) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } else { + resetStartTimeChosen(); + } + } + + //set it to false + function resetStartTimeChosen() { + startTimeChosen = false; + SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; + } + + //hides and shows the submit times button when needed + function showSubmitTimesIfNecessary() { + //check if an end time has been specified for the latest sponsor time + if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { + //show submit times button + document.getElementById("submitTimesContainer").style.display = "unset"; + } else { + //hide submit times button + document.getElementById("submitTimesContainer").style.display = "none"; + } + } + + //make the options div visisble + function openOptions() { + document.getElementById("optionsButtonContainer").style.display = "none"; + document.getElementById("options").style.display = "unset"; + } + + //this is not a YouTube video page + function displayNoVideo() { + document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + + "If you know this is a YouTube tab, close this popup and open it again."; + } + + function reportAnIssue() { + document.getElementById("issueReporterContainer").style.display = "unset"; + SB.reportAnIssue.style.display = "none"; + } + + function addVoteMessage(message, UUID) { + let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); + //remove all children + while (container.firstChild) { + container.removeChild(container.firstChild); + } + + let thanksForVotingText = document.createElement("h2"); + thanksForVotingText.innerText = message; + //there are already breaks there + thanksForVotingText.style.marginBottom = "0px"; + + container.appendChild(thanksForVotingText); + } + + function vote(type, UUID) { + //add loading info + addVoteMessage("Loading...", UUID) + + //send the vote message to the tab chrome.runtime.sendMessage({ - message: "submitTimes", - videoID: currentVideoID + message: "submitVote", + type: type, + UUID: UUID }, function(response) { if (response != undefined) { - if (response.statusCode == 200) { - //hide loading message - document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; - - clearTimes(); - } else if(response.statusCode == 400) { - document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 429) { - document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 409) { - document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 502) { - document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else { - document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + //see if it was a success or failure + if (response.successType == 1) { + //success + addVoteMessage("Thanks for voting!", UUID) + } else if (response.successType == 0) { + //failure: duplicate vote + addVoteMessage("You have already voted this way before.", UUID) + } else if (response.successType == -1) { + if (response.statusCode == 502) { + addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) + } else { + //failure: unknown error + addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) + } } } }); } -} - -function showNoticeAgain() { - chrome.storage.sync.set({"dontShowNoticeAgain": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "showNoticeAgain" - }); - }); - - SB.showNoticeAgain.style.display = "none"; -} - -function hideVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: true - }); - }); - - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; -} - -function showVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: false - }); - }); - - SB.hideVideoPlayerControls.style.display = "unset"; - SB.showVideoPlayerControls.style.display = "none"; -} - -function hideInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeInfoButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; -} - -function showInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "unset"; - SB.showInfoButtonPlayerControls.style.display = "none"; -} - -function hideDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeDeleteButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; -} - -function showDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "unset"; - SB.showDeleteButtonPlayerControls.style.display = "none"; -} - -function disableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: false - }); - }); - - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; -} - -function enableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: true - }); - }); - - SB.enableSponsorViewTracking.style.display = "none"; - SB.disableSponsorViewTracking.style.display = "unset"; -} - -function updateStartTimeChosen() { - //update startTimeChosen variable - if (!startTimeChosen) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } else { - resetStartTimeChosen(); + + function hideDiscordButton() { + chrome.storage.sync.set({"hideDiscordLink": false}); + + SB.discordButtonContainer.style.display = "none"; } -} - -//set it to false -function resetStartTimeChosen() { - startTimeChosen = false; - SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; -} - -//hides and shows the submit times button when needed -function showSubmitTimesIfNecessary() { - //check if an end time has been specified for the latest sponsor time - if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { - //show submit times button - document.getElementById("submitTimesContainer").style.display = "unset"; - } else { - //hide submit times button - document.getElementById("submitTimesContainer").style.display = "none"; + + //converts time in seconds to minutes:seconds + function getFormattedTime(seconds) { + let minutes = Math.floor(seconds / 60); + let secondsDisplay = Math.round(seconds - minutes * 60); + if (secondsDisplay < 10) { + //add a zero + secondsDisplay = "0" + secondsDisplay; + } + + let formatted = minutes+ ":" + secondsDisplay; + + return formatted; } -} - -//make the options div visisble -function openOptions() { - document.getElementById("optionsButtonContainer").style.display = "none"; - document.getElementById("options").style.display = "unset"; -} - -//this is not a YouTube video page -function displayNoVideo() { - document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + - "If you know this is a YouTube tab, close this popup and open it again."; -} - -function reportAnIssue() { - document.getElementById("issueReporterContainer").style.display = "unset"; - SB.reportAnIssue.style.display = "none"; -} - -function addVoteMessage(message, UUID) { - let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); - //remove all children - while (container.firstChild) { - container.removeChild(container.firstChild); + + //converts time in seconds to minutes + function getTimeInMinutes(seconds) { + let minutes = Math.floor(seconds / 60); + + return minutes; } - - let thanksForVotingText = document.createElement("h2"); - thanksForVotingText.innerText = message; - //there are already breaks there - thanksForVotingText.style.marginBottom = "0px"; - - container.appendChild(thanksForVotingText); -} - -function vote(type, UUID) { - //add loading info - addVoteMessage("Loading...", UUID) - - //send the vote message to the tab - chrome.runtime.sendMessage({ - message: "submitVote", - type: type, - UUID: UUID - }, function(response) { - if (response != undefined) { - //see if it was a success or failure - if (response.successType == 1) { - //success - addVoteMessage("Thanks for voting!", UUID) - } else if (response.successType == 0) { - //failure: duplicate vote - addVoteMessage("You have already voted this way before.", UUID) - } else if (response.successType == -1) { - if (response.statusCode == 502) { - addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) - } else { - //failure: unknown error - addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) - } - } + + //converts time in seconds to seconds past the last minute + function getTimeInFormattedSeconds(seconds) { + let secondsFormatted = (seconds % 60).toFixed(3); + + if (secondsFormatted < 10) { + secondsFormatted = "0" + secondsFormatted; } - }); -} - -function hideDiscordButton() { - chrome.storage.sync.set({"hideDiscordLink": false}); - - SB.discordButtonContainer.style.display = "none"; -} - -//converts time in seconds to minutes:seconds -function getFormattedTime(seconds) { - let minutes = Math.floor(seconds / 60); - let secondsDisplay = Math.round(seconds - minutes * 60); - if (secondsDisplay < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; + + return secondsFormatted; } - - let formatted = minutes+ ":" + secondsDisplay; - - return formatted; -} - -//converts time in seconds to minutes -function getTimeInMinutes(seconds) { - let minutes = Math.floor(seconds / 60); - - return minutes; -} - -//converts time in seconds to seconds past the last minute -function getTimeInFormattedSeconds(seconds) { - let secondsFormatted = (seconds % 60).toFixed(3); - - if (secondsFormatted < 10) { - secondsFormatted = "0" + secondsFormatted; + + function sendRequestToServer(type, address, callback) { + let xmlhttp = new XMLHttpRequest(); + + xmlhttp.open(type, serverAddress + address, true); + + if (callback != undefined) { + xmlhttp.onreadystatechange = function () { + callback(xmlhttp, false); + }; + + xmlhttp.onerror = function(ev) { + callback(xmlhttp, true); + }; + } + + //submit this request + xmlhttp.send(); } - - return secondsFormatted; -} - -function sendRequestToServer(type, address, callback) { - let xmlhttp = new XMLHttpRequest(); - - xmlhttp.open(type, serverAddress + address, true); - - if (callback != undefined) { - xmlhttp.onreadystatechange = function () { - callback(xmlhttp, false); - }; - xmlhttp.onerror = function(ev) { - callback(xmlhttp, true); - }; + function getYouTubeVideoID(url) { // Returns with video id else returns false + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + var id = new URL(url).searchParams.get("v"); + return (match && match[7].length == 11) ? id : false; } - - //submit this request - xmlhttp.send(); + +//end of function } -function getYouTubeVideoID(url) { // Returns with video id else returns false - var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; - var match = url.match(regExp); - var id = new URL(url).searchParams.get("v"); - return (match && match[7].length == 11) ? id : false; +if (chrome.tabs != undefined) { + //add the width restriction (because Firefox) + document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0); + + //this means it is actually opened in the popup + runThePopup(); } + -- cgit v1.2.3