/** The MIT License (MIT) Copyright (c) 2014 Jeppe Rune Mortensen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **/ // ==UserScript== // @id YouTubeCenter // @name YouTube Center // @namespace http://www.facebook.com/YouTubeCenter // @version 2.1.7 // @author Jeppe Rune Mortensen // @description YouTube Center contains all kind of different useful functions which makes your visit on YouTube much more entertaining. // @icon https://raw.github.com/YePpHa/YouTubeCenter/master/assets/icon48.png // @icon64 https://raw.github.com/YePpHa/YouTubeCenter/master/assets/icon64.png // @domain yeppha.github.io // @domain youtube.com // @domain www.youtube.com // @domain gdata.youtube.com // @domain apis.google.com // @domain plus.googleapis.com // @domain googleapis.com // @domain raw.github.com // @domain raw2.github.com // @domain raw.githubusercontent.com // @domain s.ytimg.com // @match http://www.youtube.com/* // @match https://www.youtube.com/* // @match http://youtube.com/* // @match https://youtube.com/* // @match https://yeppha.github.io/downloads/YouTubeCenter.meta.js // @match http://s.ytimg.com/yts/jsbin/* // @match https://s.ytimg.com/yts/jsbin/* // @match https://raw.github.com/YePpHa/YouTubeCenter/master/* // @match https://raw.githubusercontent.com/YePpHa/YouTubeCenter/master/* // @match http://raw.github.com/YePpHa/YouTubeCenter/master/* // @match http://raw.githubusercontent.com/YePpHa/YouTubeCenter/master/* // @match http://apis.google.com/*/widget/render/comments?* // @match https://apis.google.com/*/widget/render/comments?* // @match http://plus.googleapis.com/*/widget/render/comments?* // @match https://plus.googleapis.com/*/widget/render/comments?* // @include http://www.youtube.com/* // @include https://www.youtube.com/* // @include http://youtube.com/* // @include https://youtube.com/* // @include http://apis.google.com/*/widget/render/comments?* // @include https://apis.google.com/*/widget/render/comments?* // @include http://plus.googleapis.com/*/widget/render/comments?* // @include https://plus.googleapis.com/*/widget/render/comments?* // @exclude http://apiblog.youtube.com/* // @exclude https://apiblog.youtube.com/* // @exclude http://*.youtube.com/subscribe_embed?* // @exclude https://*.youtube.com/subscribe_embed?* // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_log // @grant GM_registerMenuCommand // @grant unsafeWindow // @updateVersion 156 // @run-at document-start // @priority 9001 // @contributionURL https://github.com/YePpHa/YouTubeCenter/wiki/Donate // @license MIT // @resource translations https://yeppha.github.io/downloads/translations.json // @downloadURL none // ==/UserScript== (function(){ "use strict"; function inject(func) { var script = document.createElement("script"); var p = document.body || document.head || document.documentElement; if (!p) { setTimeout(bind(null, inject, func), 0); return; } script.setAttribute("type", "text/javascript"); if (typeof func === "string") { func = "function(){" + func + "}"; } script.appendChild(document.createTextNode("(" + func + ")(true, 0, false, 406, " + GM_getResourceText("translations") + ");\n//# sourceURL=YouTubeCenter.js")); p.appendChild(script); p.removeChild(script); } var main_function = function(injected, identifier, devbuild, devnumber, ytcenter_locales, _unsafeWindow, preloadedSettings, undefined){ "use strict"; /* UTILS */ function $UpdateChecker() { if (!ytcenter.settings.enableUpdateChecker) return; var curr = (new Date().getTime()), c = curr - 1000*60*60*parseInt(ytcenter.settings.updateCheckerInterval); con.log("Checking for updates in " + ((ytcenter.settings.updateCheckerLastUpdate - c)/1000/60/60) + " hours..."); if (c >= ytcenter.settings.updateCheckerLastUpdate) { con.log("Checking for updates now..."); ytcenter.settings.updateCheckerLastUpdate = curr; ytcenter.saveSettings(); ytcenter.checkForUpdates(); } } function $HasAttribute(elm, attr) { var i; for (i = 0; i < elm.attributes.length; i++) { if (elm.attributes[i].name == attr) return true; } return false; } function $GetOffset(elm) { var x = 0, y = 0; while (elm != null) { y += elm.offsetTop; x += elm.offsetLeft; elm = elm.offsetParent; } return [x, y]; } function $CreateAspectButton() { var btn = document.createElement("button"); btn.className = "yt-uix-button yt-uix-tooltip" + (ytcenter.settings.aspectEnable ? "" : " hid") + (!ytcenter.watch7 ? " yt-uix-button-default" : " yt-uix-button-text"); btn.setAttribute("title", ytcenter.language.getLocale("BUTTON_ASPECT_TOOLTIP")); btn.setAttribute("type", "button"); btn.setAttribute("role", "button"); ytcenter.events.addEvent("ui-refresh", function(){ btn.setAttribute("title", ytcenter.language.getLocale("BUTTON_ASPECT_TOOLTIP")); if (ytcenter.settings.aspectEnable) { ytcenter.utils.removeClass(btn, "hid"); } else { ytcenter.utils.addClass(btn, "hid"); } }); var btnContent = document.createElement("span"); btnContent.className = "yt-uix-button-content"; btnContent.textContent = ytcenter.language.getLocale("BUTTON_ASPECT_TEXT"); ytcenter.language.addLocaleElement(btnContent, "BUTTON_ASPECT_TEXT", "@textContent"); btn.appendChild(btnContent); var arrow = document.createElement("img"); arrow.className = "yt-uix-button-arrow"; arrow.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; arrow.setAttribute("alt", ""); btn.appendChild(arrow); var groups = { 'crop': 'BUTTON_ASPECT_CROP', 'stretch': 'BUTTON_ASPECT_STRETCH' }; var groupChoices = { '4:3': 'BUTTON_ASPECT_4:3', '3:2': 'BUTTON_ASPECT_3:2', '16:9': 'BUTTON_ASPECT_16:9' }; var menu = document.createElement("ul"); menu.className = "yt-uix-button-menu yt-uix-button-menu-default yt-uix-button-menu-external hid"; menu.setAttribute("role", "menu"); menu.setAttribute("aria-haspopup", "true"); var playerAspectTMP = ytcenter.settings['aspectValue']; var item; item = document.createElement("span"); if (ytcenter.settings.aspectValue === "none") { item.setAttribute("style", "background:#555!important;color:#FFF!important;"); } item.className = "yt-uix-button-menu-item"; item.setAttribute("onclick", ";return false;"); item.textContent = ytcenter.language.getLocale("BUTTON_ASPECT_NONE"); ytcenter.language.addLocaleElement(item, "BUTTON_ASPECT_NONE", "@textContent"); ytcenter.utils.addEventListener(item, "click", function(){ playerAspectTMP = "none"; if (ytcenter.settings.aspectSave) { ytcenter.settings['aspectValue'] = "none"; } for (var i = 0; i < this.parentNode.parentNode.children.length; i++) { if (this.parentNode.parentNode.children[i].children[0] && this.parentNode.parentNode.children[i].children[0].tagName === "SPAN") { this.parentNode.parentNode.children[i].children[0].setAttribute("style", ""); } } this.setAttribute("style", "background:#555!important;color:#FFF!important;"); ytcenter.saveSettings(); ytcenter.player.aspect("none"); }, false); var li = document.createElement("li"); li.setAttribute("role", "menuitem"); li.appendChild(item); menu.appendChild(li); item = document.createElement("span"); if (ytcenter.settings.aspectValue === "default") { item.setAttribute("style", "background:#555!important;color:#FFF!important;"); } item.className = "yt-uix-button-menu-item"; item.setAttribute("onclick", ";return false;"); item.textContent = ytcenter.language.getLocale("BUTTON_ASPECT_DEFAULT"); ytcenter.utils.addEventListener(item, "click", function(){ playerAspectTMP = "default"; if (ytcenter.settings.aspectSave) { ytcenter.settings['aspectValue'] = "default"; } for (var i = 0; i < this.parentNode.parentNode.children.length; i++) { if (this.parentNode.parentNode.children[i].children[0] && this.parentNode.parentNode.children[i].children[0].tagName === "SPAN") { this.parentNode.parentNode.children[i].children[0].setAttribute("style", ""); } } this.setAttribute("style", "background:#555!important;color:#FFF!important;"); ytcenter.saveSettings(); ytcenter.player.aspect("default"); }, false); ytcenter.language.addLocaleElement(item, "BUTTON_ASPECT_DEFAULT", "@textContent"); li = document.createElement("li"); li.setAttribute("role", "menuitem"); li.appendChild(item); menu.appendChild(li); for (var group in groups) { if (groups.hasOwnProperty(group)) { item = document.createElement("li"); item.style.fontWeight = "bold"; item.style.padding = "6px"; item.textContent = ytcenter.language.getLocale(groups[group]); ytcenter.language.addLocaleElement(item, groups[group], "@textContent"); menu.appendChild(item); for (var child in groupChoices) { if (groupChoices.hasOwnProperty(child)) { if (child === "4:3" && group === "crop") continue; var val = "yt:" + group + "=" + child; item = document.createElement("span"); if (val === ytcenter.settings.aspectValue) { item.setAttribute("style", "background:#555!important;color:#FFF!important;"); } item.className = "yt-uix-button-menu-item"; item.setAttribute("role", "menuitem"); item.setAttribute("onclick", ";return false;"); item.textContent = ytcenter.language.getLocale(groupChoices[child]); ytcenter.language.addLocaleElement(item, groupChoices[child], "@textContent"); ytcenter.utils.addEventListener(item, "click", (function(val, group, child){ return function(){ var val = "yt:" + group + "=" + child; playerAspectTMP = val; if (ytcenter.settings.aspectSave) { ytcenter.settings['aspectValue'] = val; } for (var i = 0; i < this.parentNode.parentNode.children.length; i++) { if (this.parentNode.parentNode.children[i].children[0] && this.parentNode.parentNode.children[i].children[0].tagName === "SPAN") { this.parentNode.parentNode.children[i].children[0].setAttribute("style", ""); } } this.setAttribute("style", "background:#555!important;color:#FFF!important;"); ytcenter.saveSettings(); ytcenter.player.aspect(val); }; })(val, group, child), false); var li = document.createElement("li"); li.setAttribute("role", "menuitem"); li.appendChild(item); menu.appendChild(li); } } if (group === "crop") { var val = "yt:" + group + "=24:10"; item = document.createElement("span"); if (val === ytcenter.settings.aspectValue) { item.setAttribute("style", "background:#555!important;color:#FFF!important;"); } item.className = "yt-uix-button-menu-item"; item.setAttribute("role", "menuitem"); item.setAttribute("onclick", ";return false;"); item.textContent = ytcenter.language.getLocale("BUTTON_ASPECT_24:10"); ytcenter.language.addLocaleElement(item, "BUTTON_ASPECT_24:10", "@textContent"); ytcenter.utils.addEventListener(item, "click", (function(val, group, child){ return function(){ var val = "yt:" + group + "=24:10"; playerAspectTMP = val; if (ytcenter.settings.aspectSave) { ytcenter.settings['aspectValue'] = val; } for (var i = 0; i < this.parentNode.parentNode.children.length; i++) { if (this.parentNode.parentNode.children[i].children[0] && this.parentNode.parentNode.children[i].children[0].tagName === "SPAN") { this.parentNode.parentNode.children[i].children[0].setAttribute("style", ""); } } this.setAttribute("style", "background:#555!important;color:#FFF!important;"); ytcenter.saveSettings(); ytcenter.player.aspect(val); }; })(val, group, child), false); var li = document.createElement("li"); li.setAttribute("role", "menuitem"); li.appendChild(item); menu.appendChild(li); } } } item = document.createElement("div"); item.style.padding = "7px 9px 0 9px"; item.style.borderTop = "1px #555 solid"; var itemLabel = document.createElement("label"); var label = document.createTextNode(ytcenter.language.getLocale("SETTINGS_ASPECT_REMEMBER")); itemLabel.appendChild(label); ytcenter.language.addLocaleElement(label, "SETTINGS_ASPECT_REMEMBER", "@textContent"); var itemCheckbox = $CreateCheckbox(ytcenter.settings.aspectSave); itemCheckbox.style.marginLeft = "3px"; ytcenter.utils.addEventListener(itemLabel, "click", function(){ ytcenter.settings.aspectSave = !ytcenter.settings.aspectSave; if (ytcenter.settings.aspectSave) { ytcenter.utils.addClass(itemCheckbox, "checked"); ytcenter.settings.aspectValue = playerAspectTMP; } else { ytcenter.utils.removeClass(itemCheckbox, "checked"); } ytcenter.saveSettings(); }, false); itemLabel.appendChild(itemCheckbox); item.appendChild(itemLabel); menu.appendChild(item); btn.appendChild(menu); ytcenter.placementsystem.addElement("ytcenter", "aspectbtn", btn); } function $CreateResizeButton() { function getItemTitle(item) { var dim = ytcenter.utils.calculateDimensions(item.config.width, item.config.height); if (typeof item.config.customName !== "undefined" && item.config.customName !== "") { return item.config.customName; } else if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")); } else { return dim[0] + "×" + dim[1]; } } function getItemSubText(item) { if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } else { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } } function setValue(id) { var item; ytcenter.utils.each(ytcenter.settings["resize-playersizes"], function(i, val){ if (val.id !== ytcenter.player.currentResizeId) return; item = val; return false; }); } function updateItems(items) { menu.innerHTML = ""; var db = []; ytcenter.utils.each(items, function(i, item){ var li = document.createElement("li"); li.setAttribute("role", "menuitem"); var span = document.createElement("span"); db.push(span); span.className = "yt-uix-button-menu-item" + (ytcenter.player.currentResizeId === item.id ? " ytcenter-resize-dropdown-selected" : ""); span.style.paddingBottom = "12px"; if (ytcenter.player.currentResizeId === item.id) { setValue(ytcenter.player.currentResizeId); } var title = document.createElement("span"); title.textContent = getItemTitle(item); ytcenter.events.addEvent("ui-refresh", function(){ title.textContent = getItemTitle(item); }); title.style.display = "block"; title.style.fontWeight = "bold"; var subtext = document.createElement("span"); subtext.textContent = getItemSubText(item); ytcenter.events.addEvent("ui-refresh", function(){ subtext.textContent = getItemSubText(item); }); subtext.style.display = "block"; subtext.style.fontSize = "11px"; subtext.style.lineHeight = "0px"; ytcenter.utils.addEventListener(li, "click", function(){ try { ytcenter.player.currentResizeId = item.id; ytcenter.player.updateResize(); setValue(ytcenter.player.currentResizeId); try { document.body.click(); } catch (e) { con.error(e); } ytcenter.utils.each(db, function(_i, elm){ ytcenter.utils.removeClass(elm, "ytcenter-resize-dropdown-selected"); }); ytcenter.utils.addClass(span, "ytcenter-resize-dropdown-selected"); } catch (e) { con.error(e); } }); span.appendChild(title); span.appendChild(subtext); li.appendChild(span); menu.appendChild(li); }); } var btnLabel = ytcenter.gui.createYouTubeButtonTextLabel("BUTTON_RESIZE_TEXT"); var menu = document.createElement("ul"); menu.className = "yt-uix-button-menu yt-uix-button-menu-default yt-uix-button-menu-external hid"; menu.setAttribute("role", "menu"); var arrow = ytcenter.gui.createYouTubeButtonArrow(); var btn = ytcenter.gui.createYouTubeButton("BUTTON_RESIZE_TOOLTIP", [btnLabel, arrow, menu]); btn.style.textAlign = "left"; if (ytcenter.settings.resizeEnable) { ytcenter.utils.removeClass(btn, "hid"); } else { ytcenter.utils.addClass(btn, "hid"); } updateItems(ytcenter.settings["resize-playersizes"]); ytcenter.events.addEvent("settings-update", function(){ updateItems(ytcenter.settings["resize-playersizes"]); }); ytcenter.player.resizeCallback.push(function(){ updateItems(ytcenter.settings["resize-playersizes"]); }); ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.resizeEnable) { ytcenter.utils.removeClass(btn, "hid"); } else { ytcenter.utils.addClass(btn, "hid"); } }); ytcenter.placementsystem.addElement("ytcenter", "resizebtn", btn); } function $CreateCheckbox(_checked) { var checked = _checked || false; var cont = document.createElement("span"); cont.className = "yt-uix-form-input-checkbox-container" + (checked ? " checked" : ""); var inp = document.createElement("input"); inp.setAttribute("type", "checkbox"); inp.className = "yt-uix-form-input-checkbox"; inp.value = "true"; if (checked) { inp.checked = "checked"; } var span = document.createElement("span"); span.className = "yt-uix-form-input-checkbox-element"; cont.appendChild(inp); cont.appendChild(span); return cont; } function $CreateLightButton() { var btn = document.createElement("button"); ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.lightbulbEnable) { ytcenter.utils.removeClass(btn, "hid"); } else { ytcenter.utils.addClass(btn, "hid"); } }); btn.setAttribute("onclick", ";return false;"); btn.setAttribute("type", "button"); btn.setAttribute("role", "button"); btn.className = "yt-uix-button yt-uix-tooltip" + (ytcenter.settings.lightbulbEnable ? "" : " hid") + (!ytcenter.watch7 ? " yt-uix-button-default" : " yt-uix-button-text"); btn.title = ytcenter.language.getLocale("LIGHTBULB_TOOLTIP"); //btn.style.marginLeft = ".5em"; ytcenter.language.addLocaleElement(btn, "LIGHTBULB_TOOLTIP", "title"); var s = document.createElement("span"); s.className = "yt-uix-button-content"; var icon = document.createElement("img"); icon.setAttribute("alt", ""); icon.src = ytcenter.icon.lightbulb; s.appendChild(icon); btn.appendChild(s); ytcenter.utils.addEventListener(btn, "click", function(){ ytcenter.player.toggleLights(); }, false); ytcenter.placementsystem.addElement("ytcenter", "lightbtn", btn); } function $CreateRepeatButton() { var btn = document.createElement("button"); btn.style.margin = "0 2px 0 0"; ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.enableRepeat) { ytcenter.utils.removeClass(btn, 'hid'); } else { ytcenter.utils.addClass(btn, 'hid'); } }); btn.title = ytcenter.language.getLocale("BUTTON_REPEAT_TOOLTIP"); ytcenter.language.addLocaleElement(btn, "BUTTON_REPEAT_TOOLTIP", "title"); btn.setAttribute("role", "button"); btn.setAttribute("type", "button"); btn.setAttribute("onclick", ";return false;"); btn.className = "yt-uix-button yt-uix-tooltip" + (ytcenter.settings.autoActivateRepeat ? " ytcenter-uix-button-toggled" : " yt-uix-button-text") + (ytcenter.settings.enableRepeat ? "" : " hid"); ytcenter.utils.addEventListener(btn, "click", function(){ if (ytcenter.doRepeat) { ytcenter.utils.removeClass(this, 'ytcenter-uix-button-toggled'); ytcenter.utils.addClass(this, 'yt-uix-button-text'); ytcenter.doRepeat = false; } else { ytcenter.utils.addClass(this, 'ytcenter-uix-button-toggled'); ytcenter.utils.removeClass(this, 'yt-uix-button-text'); ytcenter.doRepeat = true; } }, false); if (ytcenter.settings.autoActivateRepeat) { ytcenter.doRepeat = true; } else { ytcenter.doRepeat = false; } var iconw = document.createElement("span"); iconw.className = "yt-uix-button-icon-wrapper"; if (!ytcenter.settings.repeatShowIcon) { iconw.style.display = "none"; } var icon = document.createElement("img"); icon.className = "yt-uix-button-icon " + (ytcenter.watch7 ? "ytcenter-repeat-icon" : "yt-uix-button-icon-playlist-bar-autoplay"); icon.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; if (!ytcenter.watch7) { icon.style.background = "no-repeat url(//s.ytimg.com/yts/imgbin/www-refresh-vflMaphyY.png) -173px -60px"; icon.style.width = "20px"; icon.style.height = "17px"; } /*icon.style.width = "20px"; icon.style.height = "18px"; icon.style.background = "no-repeat url(//s.ytimg.com/yt/imgbin/www-master-vfl8ZHa_q.png) -303px -38px";*/ icon.setAttribute("alt", ""); iconw.appendChild(icon); btn.appendChild(iconw); var t = document.createElement("span"); t.className = "yt-uix-button-content"; t.textContent = ytcenter.language.getLocale("BUTTON_REPEAT_TEXT"); ytcenter.language.addLocaleElement(t, "BUTTON_REPEAT_TEXT", "@textContent"); if (!ytcenter.settings.repeatShowText) { t.style.display = "none"; } ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.repeatShowIcon) { iconw.style.display = ""; } else { iconw.style.display = "none"; } if (ytcenter.settings.repeatShowText) { t.style.display = ""; } else { t.style.display = "none"; } }); btn.appendChild(t); ytcenter.placementsystem.addElement("ytcenter", "repeatbtn", btn); } function $DownloadButtonStream() { var priority = ['small', 'medium', 'large', 'hd720', 'hd1080', 'hd1440', 'highres']; var stream; var format = (function(){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (ytcenter.settings.downloadFormat == ytcenter.video.format[i].key) { return ytcenter.video.format[i].type; } } return ytcenter.language.getLocale("UNKNOWN"); })(); for (var i = 0; i < ytcenter.video.streams.length; i++) { if ((stream == null || $ArrayIndexOf(priority, ytcenter.video.streams[i].quality) > $ArrayIndexOf(priority, stream.quality)) && $ArrayIndexOf(priority, ytcenter.video.streams[i].quality) <= $ArrayIndexOf(priority, ytcenter.settings.downloadQuality) && ytcenter.video.streams[i].type && ytcenter.video.streams[i].type.indexOf(format) == 0 && ytcenter.video.streams[i].url) { stream = ytcenter.video.streams[i]; } } return stream; } function $CreateDownloadButton() { if (identifier === 8) return; // The Chrome Webstore version of YouTube Center has the download feature disabled. var g = document.createElement("span"); g.style.margin = "0 2px 0 0"; ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.enableDownload) { ytcenter.utils.removeClass(g, "hid"); g.style.display = ""; } else { ytcenter.utils.addClass(g, "hid"); g.style.display = "none"; } }); g.className = "yt-uix-button-group" + (ytcenter.settings.enableDownload ? "" : " hid"); if (!ytcenter.settings.enableDownload) { g.style.display = "none"; } var stream = $DownloadButtonStream(); var btn1a = document.createElement("a"); if (stream) { btn1a.setAttribute("href", ytcenter.video.downloadLink(stream)); btn1a.setAttribute("download", ytcenter.video.getFilename(stream) + ytcenter.video.getFilenameExtension(stream)); } btn1a.setAttribute("target", "_blank"); ytcenter.events.addEvent("ui-refresh", function(){ stream = $DownloadButtonStream(); if (stream) { btn1a.setAttribute("href", ytcenter.video.downloadLink(stream)); btn1a.setAttribute("download", ytcenter.video.getFilename(stream) + ytcenter.video.getFilenameExtension(stream)); } }); var btn1 = document.createElement("button"); btn1.className = "start yt-uix-button yt-uix-tooltip" + (!ytcenter.watch7 ? " yt-uix-button-default" : " yt-uix-button-text"); //btn1.setAttribute("onclick", ";return false;"); btn1.setAttribute("type", "button"); btn1.setAttribute("role", "button"); ytcenter.utils.addEventListener(btn1, "click", function(e){ if (!ytcenter.settings.downloadAsLinks) { stream = $DownloadButtonStream(); if (stream) { ytcenter.video.download(stream.itag); } e.preventDefault(); } }, false); if (stream != null) { var stream_name = { highres: ytcenter.language.getLocale("HIGHRES"), hd1440: ytcenter.language.getLocale("HD1440"), hd1080: ytcenter.language.getLocale("HD1080"), hd720: ytcenter.language.getLocale("HD720"), large: ytcenter.language.getLocale("LARGE"), medium: ytcenter.language.getLocale("MEDIUM"), small: ytcenter.language.getLocale("SMALL") }[stream.quality]; btn1.title = ytcenter.utils.replaceTextAsString(ytcenter.language.getLocale("BUTTON_DOWNLOAD_TOOLTIP"), { stream_name: stream_name, stream_resolution: stream.dimension.split("x")[1] + "p", stream_dimension: stream.dimension, stream_3d: (stream.stereo3d && stream.stereo3d == 1 ? " 3D" : ""), stream_type: (function(stream){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (stream.type.indexOf(ytcenter.video.format[i].type) == 0) { return ytcenter.language.getLocale(ytcenter.video.format[i].name); } } return ytcenter.language.getLocale("UNKNOWN"); })(stream) }); } else { btn1.title = ytcenter.utils.replaceTextAsString(ytcenter.language.getLocale("BUTTON_DOWNLOAD_TOOLTIP_NONE"), { type: (function(){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (ytcenter.settings.downloadFormat == ytcenter.video.format[i].key) { return ytcenter.language.getLocale(ytcenter.video.format[i].name); } } return ytcenter.language.getLocale("UNKNOWN"); })() }); } ytcenter.events.addEvent("ui-refresh", function(){ var stream = $DownloadButtonStream(); if (stream != null) { var stream_name = { highres: ytcenter.language.getLocale("HIGHRES"), hd1440: ytcenter.language.getLocale("HD1440"), hd1080: ytcenter.language.getLocale("HD1080"), hd720: ytcenter.language.getLocale("HD720"), large: ytcenter.language.getLocale("LARGE"), medium: ytcenter.language.getLocale("MEDIUM"), small: ytcenter.language.getLocale("SMALL") }[stream.quality]; btn1.title = ytcenter.utils.replaceTextAsString(ytcenter.language.getLocale("BUTTON_DOWNLOAD_TOOLTIP"), { stream_name: stream_name, stream_resolution: stream.dimension.split("x")[1] + "p", stream_dimension: stream.dimension, stream_3d: (stream.stereo3d && stream.stereo3d == 1 ? " 3D" : ""), stream_type: (function(stream){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (stream.type.indexOf(ytcenter.video.format[i].type) == 0) { return ytcenter.language.getLocale(ytcenter.video.format[i].name); } } return ytcenter.language.getLocale("UNKNOWN"); })(stream) }); } else { btn1.title = ytcenter.utils.replaceTextAsString(ytcenter.language.getLocale("BUTTON_DOWNLOAD_TOOLTIP_NONE"), { type: (function(){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (ytcenter.settings.downloadFormat == ytcenter.video.format[i].key) { return ytcenter.language.getLocale(ytcenter.video.format[i].name); } } return ytcenter.language.getLocale("UNKNOWN"); })() }); } }); btn1a.appendChild(btn1); var btn1_text = document.createElement("span"); btn1_text.className = "yt-uix-button-content"; btn1_text.textContent = ytcenter.language.getLocale("BUTTON_DOWNLOAD_TEXT"); ytcenter.language.addLocaleElement(btn1_text, "BUTTON_DOWNLOAD_TEXT", "@textContent"); btn1.appendChild(btn1_text); g.appendChild(btn1a); var btn2 = document.createElement("button"); btn2.className = "end yt-uix-button yt-uix-tooltip" + (!ytcenter.watch7 ? " yt-uix-button-default" : " yt-uix-button-text"); btn2.setAttribute("onclick", ";return false;"); btn2.setAttribute("type", "button"); btn2.setAttribute("role", "button"); btn2.title = ytcenter.language.getLocale("BUTTON_DOWNlOAD2_TOOLTIP"); ytcenter.language.addLocaleElement(btn2, "BUTTON_DOWNlOAD2_TOOLTIP", "title"); var img = document.createElement("img"); img.className = "yt-uix-button-arrow"; img.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; img.setAttribute("alt", ""); img.style.marginLeft = "0px"; img.style.marginRight = "0px"; btn2.appendChild(img); var stream_groups = (function(){ var groups = (function(){ var obj = {}; for (var i = 0; i < ytcenter.video.format.length; i++) { obj[ytcenter.video.format[i].type] = { label: ytcenter.video.format[i].name, key: ytcenter.video.format[i].key, help: ytcenter.video.format[i].help }; } return obj; })(); var sorted = {}; for (var i = 0; i < ytcenter.video.streams.length; i++) { if (ytcenter.video.streams[i].type.indexOf("audio/mp4") !== 0 && (ytcenter.video.streams[i].size || ytcenter.video.streams[i].bitrate)) continue; if (ytcenter.video.streams[i].type) { var f = ytcenter.video.streams[i].type.split(";")[0]; if (groups.hasOwnProperty(f)) { if (!sorted[groups[f].label]) sorted[groups[f].label] = {streams: [], key: groups[f].key, help: groups[f].help}; sorted[groups[f].label].streams.push(ytcenter.video.streams[i]); } else { if (!sorted['UNKNOWN']) sorted['UNKNOWN'] = {streams: [], key: "unknown"}; sorted['UNKNOWN'].streams.push(ytcenter.video.streams[i]); } } else { if (!sorted['UNKNOWN']) sorted['UNKNOWN'] = {streams: [], key: "unknown"}; sorted['UNKNOWN'].streams.push(ytcenter.video.streams[i]); } } return sorted; })(); var menu = document.createElement("ul"); menu.className = "yt-uix-button-menu yt-uix-button-menu-default yt-uix-button-menu-external hid" + (ytcenter.settings.show3DInDownloadMenu ? "" : " ytcenter-menu-3d-hide"); menu.setAttribute("role", "menu"); menu.setAttribute("aria-haspopup", "true"); ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.show3DInDownloadMenu) { ytcenter.utils.removeClass(menu, "ytcenter-menu-3d-hide"); } else { ytcenter.utils.addClass(menu, "ytcenter-menu-3d-hide"); } }); for (var key in stream_groups) { if (stream_groups.hasOwnProperty(key)) { var title = document.createElement("li"); title.setAttribute("role", "menuitem"); title.style.color = "#666"; title.style.fontSize = "0.9166em"; title.style.paddingLeft = "9px"; if (key !== "UNKNOWN") { var __t = document.createTextNode(ytcenter.language.getLocale(key)); title.appendChild(__t); ytcenter.language.addLocaleElement(__t, key, "@textContent"); title.className = "ytcenter-downloadmenu-" + stream_groups[key].key; if (stream_groups[key].help) { var help = document.createElement("a"); help.setAttribute("href", stream_groups[key].help); help.setAttribute("target", "_blank"); help.setAttribute("style", "vertical-align: super; font-size: 10px"); help.appendChild(document.createTextNode('?')); var replace = { option: { toString: function() { return ytcenter.language.getLocale(key); } } }; help.setAttribute("title", ytcenter.utils.replaceTextAsString(ytcenter.language.getLocale("SETTINGS_HELP_ABOUT"), replace)); ytcenter.language.addLocaleElement(help, "SETTINGS_HELP_ABOUT", "title", replace); title.appendChild(help); } } else { title.className = "ytcenter-downloadmenu-unknown"; title.textContent = ytcenter.language.getLocale("UNKNOWN"); ytcenter.language.addLocaleElement(title, "UNKNOWN", "@textContent"); } //stream_groups[key] = stream_groups[key].streams; // Just lazy... menu.appendChild(title); for (var i = 0; i < stream_groups[key].streams.length; i++) { var is3D = (stream_groups[key].streams[i].stereo3d && stream_groups[key].streams[i].stereo3d == 1 ? true : false); var item = document.createElement("a"); if (!stream_groups[key].streams[i].url) { item.style.color = "#A7A7A7"; item.style.display = "block"; item.style.margin = "0"; item.style.padding = "6px 20px"; item.style.textDecoration = "none"; item.style.whiteSpace = "nowrap"; item.style.wordWrap = "normal"; } else { item.className = "yt-uix-button-menu-item"; item.setAttribute("target", "_blank"); item.setAttribute("download", ytcenter.video.getFilename(stream_groups[key].streams[i]) + ytcenter.video.getFilenameExtension(stream_groups[key].streams[i])); item.href = ytcenter.video.downloadLink(stream_groups[key].streams[i]); var downloadStreamListener = (function(_stream){ return function(e){ if (!ytcenter.settings.downloadAsLinks) { ytcenter.video.download(_stream.itag); e.preventDefault(); } }; })(stream_groups[key].streams[i]); ytcenter.utils.addEventListener(item, "click", downloadStreamListener, false); ytcenter.events.addEvent("ui-refresh", (function(__stream, item, _downloadStreamListener){ return function(){ item.href = ytcenter.video.downloadLink(__stream); item.setAttribute("download", ytcenter.video.getFilename(__stream) + ytcenter.video.getFilenameExtension(__stream)); }; })(stream_groups[key].streams[i], item, downloadStreamListener)); } var stream_name = { highres: ytcenter.language.getLocale("HIGHRES"), hd1440: ytcenter.language.getLocale("HD1440"), hd1080: ytcenter.language.getLocale("HD1080"), hd720: ytcenter.language.getLocale("HD720"), large: ytcenter.language.getLocale("LARGE"), medium: ytcenter.language.getLocale("MEDIUM"), small: ytcenter.language.getLocale("SMALL") }[stream_groups[key].streams[i].quality]; var _t = document.createElement("table"), _tb = document.createElement("tbody"), _tr = document.createElement("tr"), _td = document.createElement("td"), _td2 = document.createElement("td"); _t.style.width = "100%"; _t.style.border = "0"; _t.style.margin = "0"; _t.style.padding = "0"; if (stream_groups[key].streams[i].bitrate) { _td.textContent = Math.round(parseInt(stream_groups[key].streams[i].bitrate)/1000) + " Kbps"; } else { _td.textContent = stream_name + ", " + (stream_groups[key].streams[i].dimension ? stream_groups[key].streams[i].dimension.split("x")[1] : "") + "p (" + (stream_groups[key].streams[i].dimension ? stream_groups[key].streams[i].dimension : "") + ")"; _td2.textContent = (is3D ? " 3D" : ""); } _tr.appendChild(_td); _tr.appendChild(_td2); _tb.appendChild(_tr); _t.appendChild(_tb); item.appendChild(_t); ytcenter.events.addEvent("ui-refresh", (function(stream, _is3D, _td, _td2){ return function(){ var stream_name = { highres: ytcenter.language.getLocale("HIGHRES"), hd1440: ytcenter.language.getLocale("HD1440"), hd1080: ytcenter.language.getLocale("HD1080"), hd720: ytcenter.language.getLocale("HD720"), large: ytcenter.language.getLocale("LARGE"), medium: ytcenter.language.getLocale("MEDIUM"), small: ytcenter.language.getLocale("SMALL") }[stream.quality]; if (stream.bitrate) { _td.textContent = Math.round(parseInt(stream.bitrate)/1000) + " Kbps"; } else { _td.textContent = stream_name + ", " + (stream.dimension ? stream.dimension.split("x")[1] : "") + "p (" + (stream.dimension ? stream.dimension : "") + ")"; _td2.textContent = (_is3D ? " 3D" : ""); } }; })(stream_groups[key].streams[i], is3D, _td, _td2)); var li = document.createElement("li"); li.className = "ytcenter-downloadmenu-" + (stream_groups[key].key === "UNKNOWN" ? "unknown" : stream_groups[key].key) + (is3D ? " ytcenter-menu-item-3d" : ""); li.setAttribute("role", "menuitem"); li.appendChild(item); menu.appendChild(li); } } } var mp3title = document.createElement("li"); mp3title.className = (ytcenter.settings.mp3Services == '' ? "hid" : ""); if (ytcenter.settings.mp3Services === '') { mp3title.style.display = "none"; } mp3title.style.color = "#666"; mp3title.style.fontSize = "0.9166em"; mp3title.style.paddingLeft = "9px"; mp3title.textContent = ytcenter.language.getLocale("BUTTON_DOWNLOAD_MENU_MP3SERVICES"); ytcenter.language.addLocaleElement(mp3title, "BUTTON_DOWNLOAD_MENU_MP3SERVICES", "@textContent"); ytcenter.events.addEvent("ui-refresh", function(){ if (ytcenter.settings.mp3Services === '') { ytcenter.utils.addClass(mp3title, 'hid'); mp3title.style.display = "none"; } else { ytcenter.utils.removeClass(mp3title, 'hid'); mp3title.style.display = ""; } }); menu.appendChild(mp3title); var hasMP3Service = function(value){ var a = ytcenter.settings.mp3Services.split("&"); for (var i = 0; i < a.length; i++) { if (decodeURIComponent(a[i]) === value) { return true; } } return false; }; var removeNonExistentMP3Services = function(){ var newArr = []; var a = ytcenter.settings.mp3Services.split("&"); for (var i = 0; i < a.length; i++) { for (var j = 0; j < ytcenter.mp3services.length; j++) { if (ytcenter.mp3services[j].value === decodeURIComponent(a[i])) { newArr.push(a[i]); break; } } } ytcenter.settings.mp3Services = newArr.join("&"); }; removeNonExistentMP3Services(); for (var i = 0; i < ytcenter.mp3services.length; i++) { var li = document.createElement("li"); var item = document.createElement("a"); item.className = "yt-uix-button-menu-item"; li.setAttribute("role", "menuitem"); li.className = "ytcenter-downloadmenu-MP3" + (hasMP3Service(ytcenter.mp3services[i].value) ? "" : " hid"); if (!hasMP3Service(ytcenter.mp3services[i].value)) { li.style.display = "none"; } item.setAttribute("href", ytcenter.utils.replaceTextAsString(ytcenter.mp3services[i].value, { title: ytcenter.video.title, videoid: ytcenter.video.id, author: ytcenter.video.author, url: loc.href })); item.setAttribute("target", "_blank"); var mp3RedirectListener = (function(mp3){ return function(e){ if (!ytcenter.settings.downloadAsLinks) { ytcenter.redirect(mp3.value, true); e.preventDefault(); return false; } }; })(ytcenter.mp3services[i]); ytcenter.utils.addEventListener(item, "click", mp3RedirectListener, false); ytcenter.events.addEvent("ui-refresh", (function(mp3, li){ return function(){ var a = ytcenter.settings.mp3Services.split("&"); var f = false; for (var i = 0; i < a.length; i++) { if (decodeURIComponent(a[i]) === mp3.value) { f = true; break; } } if (f) { ytcenter.utils.removeClass(li, 'hid'); li.style.display = ""; } else { ytcenter.utils.addClass(li, 'hid'); li.style.display = "none"; } }; })(ytcenter.mp3services[i], li)); item.textContent = ytcenter.language.getLocale(ytcenter.mp3services[i].label); ytcenter.language.addLocaleElement(item, ytcenter.mp3services[i].label, "@textContent"); li.appendChild(item); menu.appendChild(li); } btn2.appendChild(menu); g.appendChild(btn2); ytcenter.placementsystem.addElement("ytcenter", "downloadgroup", g); } function $CreateSettingsUI() { var appbar = document.getElementById("appbar-settings-menu"), appSecondaryContainer = document.getElementById("appbar-secondary-container"), liSettings = document.createElement("li"), spanText = document.createElement("span"), textIconContainer = document.createElement("span"), textIcon = document.createElement("img"), text = null; if (ytcenter.feather) { var wrapper = document.getElementById("us"), aLink = document.createElement("a"), gearicon = document.createElement("img"); gearicon.src = ytcenter.icon.gear; gearicon.setAttribute("alt", ""); aLink.appendChild(gearicon); aLink.className = "ml"; aLink.setAttribute("href", "javascript:void(0);"); ytcenter.utils.addEventListener(aLink, "click", function(e){ if (!ytcenter.settingsPanelDialog) ytcenter.settingsPanelDialog = ytcenter.settingsPanel.createDialog(); ytcenter.settingsPanelDialog.setVisibility(true); e && e.preventDefault && e.preventDefault(); return false; }, false); aLink.title = ytcenter.language.getLocale("BUTTON_SETTINGS_TITLE"); ytcenter.language.addLocaleElement(aLink, "BUTTON_SETTINGS_TITLE", "title"); wrapper.appendChild(aLink); } else if (appbar) { liSettings.setAttribute("id", "ytcenter-settings-toggler"); liSettings.setAttribute("role", "menuitem"); liSettings.className = "yt-uix-button-menu-new-section-separator"; spanText.className = "yt-uix-button-menu-item upload-menu-item"; ytcenter.utils.addEventListener(spanText, "click", function(){ if (!ytcenter.settingsPanelDialog) ytcenter.settingsPanelDialog = ytcenter.settingsPanel.createDialog(); ytcenter.settingsPanelDialog.setVisibility(true); }, false); textIconContainer.className = "yt-valign icon-container"; textIcon.className = "upload-menu-account-settings-icon yt-valign-container"; textIcon.setAttribute("src", "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"); textIconContainer.appendChild(textIcon); text = document.createTextNode(ytcenter.language.getLocale("BUTTON_SETTINGS_LABEL")); ytcenter.language.addLocaleElement(text, "BUTTON_SETTINGS_LABEL", "@textContent"); spanText.appendChild(textIconContainer); spanText.appendChild(text); liSettings.appendChild(spanText); appbar.appendChild(liSettings); } else if (appSecondaryContainer) { var btn = document.createElement("button"), iconWrapper = document.createElement("span"), icon = document.createElement("img"); btn.className = "appbar-action-button flip yt-uix-button yt-uix-button-default yt-uix-button-size-default yt-uix-button-has-icon yt-uix-button-empty yt-uix-tooltip"; btn.title = ytcenter.language.getLocale("BUTTON_SETTINGS_TITLE"); ytcenter.language.addLocaleElement(btn, "BUTTON_SETTINGS_TITLE", "title"); btn.setAttribute("type", "button"); btn.setAttribute("role", "button"); btn.setAttribute("onclick", ";return false;"); ytcenter.utils.addEventListener(btn, "click", function(){ if (!ytcenter.settingsPanelDialog) ytcenter.settingsPanelDialog = ytcenter.settingsPanel.createDialog(); ytcenter.settingsPanelDialog.setVisibility(true); }, false); iconWrapper.className = "yt-uix-button-icon-wrapper"; icon.className = "yt-uix-button-icon yt-uix-button-icon-appbar-settings"; icon.src = "https://s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"; icon.setAttribute("alt", ""); icon.setAttribute("title", ""); iconWrapper.appendChild(icon); btn.appendChild(iconWrapper); appSecondaryContainer.appendChild(btn); } else { var btn = document.createElement("button"); btn.id = "masthead-user-button"; if (document.getElementById("masthead-gaia-photo-expander")) { btn.style.marginTop = "3px"; } else if (document.getElementById("masthead-user-expander")) { btn.style.verticalAlign = "middle"; } btn.title = ytcenter.language.getLocale("BUTTON_SETTINGS_TITLE"); ytcenter.language.addLocaleElement(btn, "BUTTON_SETTINGS_TITLE", "title"); btn.setAttribute("type", "button"); btn.setAttribute("role", "button"); btn.setAttribute("onclick", ";return false;"); btn.className = "yt-uix-tooltip-reverse yt-uix-button " + (ytcenter.watch7 ? "yt-uix-button-text" : "yt-uix-button-text") + " yt-uix-tooltip"; var btnt = document.createElement("span"); btnt.className = "yt-uix-button-icon-wrapper"; btnt.style.margin = "0"; var gearicon = document.createElement("img"); gearicon.src = ytcenter.icon.gear; gearicon.setAttribute("alt", ""); var ytvt = document.createElement("span"); ytvt.className = "yt-valign-trick"; btnt.appendChild(gearicon); btnt.appendChild(ytvt); btn.appendChild(btnt); var ytuixbc = document.createElement("span"); ytuixbc.className = "yt-uix-button-content"; ytuixbc.textContent = " "; btn.appendChild(ytuixbc); ytcenter.utils.addEventListener(btn, "click", function(){ if (!ytcenter.settingsPanelDialog) ytcenter.settingsPanelDialog = ytcenter.settingsPanel.createDialog(); ytcenter.settingsPanelDialog.setVisibility(true); }, false); if (document.getElementById("masthead-user")) { document.getElementById("masthead-user").appendChild(btn); } else if (document.getElementById("yt-masthead-user")) { document.getElementById("yt-masthead-user").appendChild(btn); } else if (document.getElementById("yt-masthead-signin")) { btn.style.margin = "0 10px"; document.getElementById("yt-masthead-signin").appendChild(btn); } else { con.error("Settings UI - Couldn't add settings button"); } } } function $CloneArray(arr) { var copy = []; for (var i = 0; i < arr.length; i++) { copy[i] = arr[i]; } return copy; } function $Clone(obj) { var copy; if (null == obj || typeof obj != "object") { return obj; } if (obj instanceof Date) { copy = new Date(); copy.setTime(obj.getTime()); return copy; } if (obj instanceof Array) { copy = []; for (var i = 0; i < obj.length; i++) { copy[i] = $Clone(obj[i]); } return copy; } if (obj instanceof Object) { copy = {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = $Clone(obj[key]); } } return copy; } return null; } function $ArrayIndexOf(arr, obj) { for (var i = 0; i < arr.length; i++) { if (arr[i] === obj) return i; } return -1; } function $SlideRange(elm, handle, min, max, defaultValue) { function mousemove(e){ if (range.mouse.down) { e.preventDefault(); if (e && e.type.indexOf("touch") !== -1 && e.changedTouches && e.changedTouches.length > 0 && e.changedTouches[0]) { e = e.changedTouches[0]; } var pos = e.clientX - $AbsoluteOffset(range.elm)[0] - range.handle.offsetWidth/2; var max = range.elm.clientWidth - range.handle.offsetWidth; if (pos > max) { pos = max; } else if (pos < 0) { pos = 0; } range.handle.style.left = pos + "px"; for (var i = 0; i < range.listeners.length; i++) { if (range.listeners[i].e === 'valuechange') { var max = range.elm.clientWidth - range.handle.offsetWidth; var a = range.max - range.min; range.listeners[i].c(parseFloat(range.handle.style.left)/max*a+range.min); } } } } function mousedownListener(e){ range.mouse.down = true; throttleFunc = ytcenter.utils.throttle(mousemove, 50); ytcenter.utils.addEventListener(document, "mousemove", throttleFunc, false); ytcenter.utils.addEventListener(document, "touchmove", throttleFunc, false); e.preventDefault(); } function mouseupListener(e){ if (range.mouse.down) { range.mouse.down = false; e.stopPropagation(); for (var i = 0; i < range.listeners.length; i++) { if (range.listeners[i].e === 'change') { var max = range.elm.clientWidth - range.handle.offsetWidth; var a = range.max - range.min; range.listeners[i].c(parseFloat(range.handle.style.left)/max*a+range.min); } } if (throttleFunc) ytcenter.utils.removeEventListener(document, "mousemove", throttleFunc, false); if (throttleFunc) ytcenter.utils.removeEventListener(document, "touchmove", throttleFunc, false); e.preventDefault(); } } function clickListener(e) { var a; var pos = e.clientX - $AbsoluteOffset(range.elm)[0] - range.handle.offsetWidth/2; var max = range.elm.clientWidth - range.handle.offsetWidth; if (pos > max) { pos = max; } else if (pos < 0) { pos = 0; } range.handle.style.left = pos + "px"; for (var i = 0; i < range.listeners.length; i++) { if (range.listeners[i].e === 'valuechange') { max = range.elm.clientWidth - range.handle.offsetWidth; a = range.max - range.min; range.listeners[i].c(parseFloat(range.handle.style.left)/max*a+range.min); } else if (range.listeners[i].e === 'change') { max = range.elm.clientWidth - range.handle.offsetWidth; a = range.max - range.min; range.listeners[i].c(parseFloat(range.handle.style.left)/max*a+range.min); } } e.preventDefault(); } var range = { elm: elm, handle: handle, min: (min ? min : 0), max: (max ? max : 100), defaultValue: (defaultValue ? defaultValue : min), mouse: { down: false }, listeners: [], width: 240, height: 15 }, throttleFunc = null; range.elm.style.marginTop = "-4px"; range.elm.style.width = range.width + "px"; range.elm.style.height = range.height + "px"; range.handle.style.width = range.height + "px"; range.handle.style.height = range.height + "px"; var returnKit = { addEventListener: (function(range){ return function(event, callback){ range.listeners.push({ e: event, c: callback }); }; })(range), getValue: (function(range){ return function(){ var max = parseInt(range.elm.style.width) - (range.height + 2); var a = range.max - range.min; return parseFloat(range.handle.style.left)/max*a+range.min || range.defaultValue; }; })(range), setValue: (function(range){ return function(val){ var max = parseInt(range.elm.style.width) - (range.height + 2); var pos = (val - range.min)/(range.max - range.min)*max; if (pos > max) { pos = max; } else if (pos < 0) { pos = 0; } range.handle.style.left = pos + "px"; if (val == 0) { return 0; } else { return returnKit.getValue(); } }; })(range) }; returnKit.setValue(range.defaultValue); ytcenter.utils.addEventListener(elm, "click", clickListener, false); /* Mouse */ ytcenter.utils.addEventListener(elm, "mousedown", mousedownListener, false); ytcenter.utils.addEventListener(document, "mouseup", mouseupListener, false); /* Touch */ ytcenter.utils.addEventListener(elm, "touchstart", mousedownListener, false); ytcenter.utils.addEventListener(document, "touchend", mouseupListener, false); return returnKit; } function $AbsoluteOffset(elm) { var pos = [elm.offsetLeft || 0, elm.offsetTop || 0]; if (elm.offsetParent) { var ao = $AbsoluteOffset(elm.offsetParent); pos[0] += ao[0]; pos[1] += ao[1]; } return pos; } /* END UTILS */ /* Classes */ function defineLockedProperty(obj, key, setter, getter) { if (typeof obj !== "object") obj = {}; if (ytcenter.utils.ie || typeof Object.defineProperty === "function") { Object.defineProperty(obj, key, { get: getter, set: setter }); return obj; } else { obj.__defineGetter__(key, getter); obj.__defineSetter__(key, setter); return obj; } } function freeze(parent, freezeObject) { function wait(_parent, _freezeObject) { var args = _freezeObject.split("."); var _object = undefined; defineLockedProperty(_parent, args[0], function(val){ args.splice(0, 1); freeze(val, args.join(".")); _object = val; }, function(){ return _object; }); } var args = freezeObject.split("."); var at = parent; for (var i = 0, len = args.length - 1; i < len; i++) { if (typeof at[args[i]] === "object") { at = at[args[i]]; } else { args.splice(0, i); wait(at, args.join(".")); return; } } var defObject = undefined; var frozen = false; if (typeof at[args[args.length - 1]] !== "undefined") { defObject = at[args[args.length - 1]]; frozen = true; } defineLockedProperty(at, args[args.length - 1], function(val){ if (!frozen) { frozen = true; defObject = val; } }, function(){ return defObject; }); } function PlayerConfig(configSetter, configGetter) { defineLockedProperty(this, "config", function(value){ configSetter(value); }, function(){ return configGetter(); }); } var console_debug = devbuild; // Disable this to stop YouTube Center from writing in the console log. var _console = []; var uw = null, loc = null, con = null, ytcenter = {}, yt = {}; uw = _unsafeWindow || (function(){ var a; try { a = unsafeWindow === window ? false : unsafeWindow; } catch (e) { } finally { return a || (function(){ try { var e = document.createElement('p'); e.setAttribute('onclick', 'return window;'); return e.onclick(); } catch (e) { return window; } }()); } })(); if (uw && typeof uw.ytcenter !== "undefined") { return; } ytcenter.unsafe = {}; uw.ytcenter = ytcenter.unsafe; ytcenter.ltr = true; ytcenter.utils = {}; ytcenter.utils.ie = (function(){ for (var v = 3, el = document.createElement('b'), all = el.all || []; el.innerHTML = '', all[0];); return v > 4 ? v : !!document.documentMode; }()); ytcenter.updateLogoLink_ = null; ytcenter.updateLogoLink = function(){ var logoContainer = document.getElementById("logo-container"), url = ytcenter.settings.logoLink; if (logoContainer && logoContainer.tagName === "A") { if (ytcenter.updateLogoLink_ === null) { ytcenter.updateLogoLink_ = document.getElementById("logo-container").getAttribute("href"); } if (ytcenter.updateLogoLink_ !== "/" && (url.indexOf("http://") === 0 || url.indexOf("https://") === 0)) { url = ytcenter.updateLogoLink_.substring(0, ytcenter.updateLogoLink_.indexOf("http")) + url; } else if (ytcenter.updateLogoLink_ !== "/") { if (url.indexOf("/") === 0) url = url.substring(1); url = ytcenter.updateLogoLink_ + url; } document.getElementById("logo-container").setAttribute("href", url); } else if (logoContainer) { var map = logoContainer.getElementsByTagName("map"); if (map && map.length > 0 && map[0] && map[0].children && map[0].children.length > 0) { if (ytcenter.updateLogoLink_ === null) ytcenter.updateLogoLink_ = map[0].children[0].getAttribute("href"); if (ytcenter.updateLogoLink_ !== "/" && (url.indexOf("http://") === 0 || url.indexOf("https://") === 0)) { url = ytcenter.updateLogoLink_.substring(0, ytcenter.updateLogoLink_.indexOf("http")) + url; } else if (ytcenter.updateLogoLink_ !== "/") { if (url.indexOf("/") === 0) url = url.substring(1); url = ytcenter.updateLogoLink_ + url; } map[0].children[0].setAttribute("href", url); } } }; ytcenter.spfPackages = function(originalPackages){ function parse(data) { if (ytcenter.utils.isArray(data)) { var i, type; for (i = 0; i < data.length; i++) { type = parseType(data[i]); addType(type, data[i]); } } else { if (data.type && !multipart) { multipart = true; parse(data.parts); } else { addType(parseType(data), data); } } } function addType(type, data) { var _types = type.split(","), i, index = packages.push(ytcenter.spfData(data)) - 1; for (i = 0; i < _types.length; i++) { if (!hasType(_types[i])) { types.push(_types[i]); } if (!pointer[_types[i]]) pointer[_types[i]] = []; pointer[_types[i]].push(index); } } function parseType(data) { var type = []; if ((data.swfcfg) || (data.html && data.html.content && data.html.content.indexOf("")[0]; return JSON.parse(content); } function parsePlayerConfig(d) { if (!d) return; if (d.swfcfg) { playerConfig = d.swfcfg; } else if (d.html && d.html.content && d.html.content.indexOf(""); } function injectDataPlayerConfig(d, config) { if (d.swfcfg) { d.swfcfg = config; } else if (d.html && d.html.content && d.html.content.indexOf("")[0]; cfg = JSON.parse(cfg); } } catch (e) { con.error(e); if (r.responseText.indexOf("flashvars=\"") !== -1) { var a = r.responseText.split("flashvars=\"")[1].split("\"")[0].replace(/&/g, "&").replace(/"/g, "\"").split("&"), i, b; cfg = {args: {}}; for (i = 0; i < a.length; i++) { b = a[i].split("="); cfg.args[decodeURIComponent(b[0])] = decodeURIComponent(b[1]); } } else if (r.responseText.indexOf("new yt.player.Application('p', {") !== -1) { cfg = {}; cfg.args = r.responseText.split("new yt.player.Application('p', ")[1].split(");var fbetatoken")[0]; cfg.args = JSON.parse(cfg.args); } } item.stream = ytcenter.player.getBestStream(ytcenter.parseStreams(cfg.args), (ytcenter.settings.videoThumbnailQualitySeparated ? (ytcenter.settings.dashPlayback ? 1 : 0) : -1)); if (!item.stream) { if (cfg && cfg.args && cfg.args.ypc_module && cfg.args.ypc_vid) { item.stream = { quality: "ondemand" }; } } if (cfg && cfg.args) { item.storyboard = cfg.args.storyboard_spec || cfg.args.live_storyboard_spec; } try { delete item.stream.fallback_host; delete item.stream.sig; delete item.stream.flashVersion; delete item.stream.url; } catch (e) { con.error(e); } try { if (isInCache(item)) { updateItemInCache(item); } else { addNewDataToCache(item); } } catch (e) { con.error(e); } if (item.stream) { callback(item.stream, item.storyboard); } else { callback("error", null, "Error!"); } } catch (e) { var msg = ""; if (e === "unavailable") { msg = "Video Unavailable!"; } else { if (r.responseText.indexOf("Too many") !== -1) { msg = "Too many requests!"; } else { msg = "Error!"; con.error(e); con.error(cfg); try { con.error(JSON.parse(r.responseText)); } catch (e) { con.error(r.responseText); } } } con.error("[VideoThumbnail Quality] IO Error => " + msg); callback("error", null, msg); } }, onerror: function(){ var msg = "Connection failed!"; con.error("[VideoThumbnail Quality] IO Error => " + msg); callback("error", null, msg); } }); } } function loadVideoData(item, callback) { if (item.likes && item.dislikes) { callback(item.likes, item.dislikes); } else if (item.id) { ytcenter.utils.xhr({ url: "https://gdata.youtube.com/feeds/api/videos/" + item.id + "?v=2&alt=json", method: "GET", onload: function(r){ try { if (!r.responseText) throw "unavailable"; var videoData = JSON.parse(r.responseText).entry, ratings = videoData.yt$rating; item.likes = parseInt(ratings ? ratings.numLikes : 0); item.dislikes = parseInt(ratings ? ratings.numDislikes : 0); if (isInCache(item)) { updateItemInCache(item); } else { addNewDataToCache(item); } callback(item.likes, item.dislikes); } catch (e) { var msg = ""; if (e === "unavailable") { msg = "Unavailable!"; } else { if (r.responseText.indexOf("GData") === 0) { msg = "Error!"; if (r.responseText.indexOf("") !== -1 && r.responseText.indexOf("") !== -1) { msg = ytcenter.utils.unescapeXML(r.responseText.split("")[1].split("")[0]) + "!"; } } else if (r.responseText.indexOf("too_many_recent_calls") !== -1 && r.responseText.indexOf("yt:quota") !== -1) { msg = "Too many requests!"; } else { msg = "Error!"; con.error(e); try { con.error(JSON.parse(r.responseText)); } catch (e) { con.error(r.responseText); } } } con.error("[VideoThumbnail Ratings] IO Error => " + msg); callback("error", msg); } }, onerror: function(){ var msg = "Connection failed!"; con.error("[VideoThumbnail Quality] IO Error => " + msg); callback("error", msg); } }); } } function appendRatingBar(item, likes, dislikes) { try { var total = likes + dislikes, sparkBars = document.createElement("div"), sparkBarLikes = document.createElement("div"), sparkBarDislikes = document.createElement("div"), barLength; sparkBars.className = "video-extras-sparkbars" + (ytcenter.settings.videoThumbnailRatingsBarVisible === "show_hover" ? " ytcenter-video-thumb-show-hover" : "") + (ytcenter.settings.videoThumbnailRatingsBarVisible === "hide_hover" ? " ytcenter-video-thumb-hide-hover" : ""); sparkBars.style.height = ytcenter.settings.videoThumbnailRatingsBarHeight + "px"; if (!ytcenter.utils.hasClass(item.videoThumb, "yt-thumb-fluid") && item.videoThumb.className.match(/yt-thumb-[0-9]+/)) { barLength = /yt-thumb-([0-9]+)/.exec(item.videoThumb.className)[1] + "px"; } else if (item.videoThumb.style.width && parseInt(item.videoThumb.style.width) > 0) { barLength = item.videoThumb.style.width; } else { barLength = "100%"; } sparkBarLikes.className = "video-extras-sparkbar-likes"; sparkBarLikes.style.background = ytcenter.settings.videoThumbnailRatingsBarLikesColor; sparkBarLikes.style.height = ytcenter.settings.videoThumbnailRatingsBarHeight + "px"; sparkBarDislikes.className = "video-extras-sparkbar-dislikes"; sparkBarDislikes.style.height = ytcenter.settings.videoThumbnailRatingsBarHeight + "px"; if (likes === "error") { sparkBarDislikes.style.background = "#BF3EFF"; total = 1; likes = 0; dislikes = 1; } else if (total > 0) { sparkBarDislikes.style.background = ytcenter.settings.videoThumbnailRatingsBarDislikesColor; } else { dislikes = 1; total = 1; } sparkBars.appendChild(sparkBarLikes); sparkBars.appendChild(sparkBarDislikes); sparkBars.style.position = "absolute"; switch (ytcenter.settings.videoThumbnailRatingsBarPosition) { case "top": sparkBars.style.top = "0px"; sparkBars.style.left = "0px"; sparkBarLikes.style.width = (likes/total*100) + "%"; sparkBarDislikes.style.width = (dislikes/total*100) + "%"; sparkBars.style.width = barLength; break; case "bottom": sparkBars.style.bottom = "0px"; sparkBars.style.left = "0px"; sparkBarLikes.style.width = (likes/total*100) + "%"; sparkBarDislikes.style.width = (dislikes/total*100) + "%"; sparkBars.style.width = barLength; break; case "left": sparkBars.style.top = "0px"; sparkBars.style.left = "0px"; sparkBarLikes.style.height = (likes/total*100) + "%"; sparkBarDislikes.style.height = (dislikes/total*100) + "%"; sparkBarLikes.style.width = "2px"; sparkBarDislikes.style.width = "2px"; sparkBarLikes.style.cssFloat = "none"; sparkBarDislikes.style.cssFloat = "none"; sparkBars.style.height = "100%"; break; case "right": sparkBars.style.top = "0px"; sparkBars.style.right = "0px"; sparkBarLikes.style.height = (likes/total*100) + "%"; sparkBarDislikes.style.height = (dislikes/total*100) + "%"; sparkBarLikes.style.width = "2px"; sparkBarDislikes.style.width = "2px"; sparkBarLikes.style.cssFloat = "none"; sparkBarDislikes.style.cssFloat = "none"; sparkBars.style.height = "100%"; break; } item.content.appendChild(sparkBars); } catch (e) { con.error("[Id=" + item.id + "] Likes: " + likes + ", " + dislikes); con.error(e); } } function appendRatingCount(item, likes, dislikes) { try { var numLikesDislikes = document.createElement("span"), likesCount = document.createElement("span"), dislikesCount = document.createElement("span"), likeIcon = document.createElement("img"), dislikeIcon = document.createElement("img"); numLikesDislikes.className = "video-extras-likes-dislikes" + (ytcenter.settings.videoThumbnailRatingsCountVisible === "show_hover" ? " ytcenter-video-thumb-show-hover" : "") + (ytcenter.settings.videoThumbnailRatingsCountVisible === "hide_hover" ? " ytcenter-video-thumb-hide-hover" : "") + " ytcenter-thumbnail-ratingcount"; numLikesDislikes.style.background = "#000"; numLikesDislikes.style.opacity = "0.75"; numLikesDislikes.style.filter = "alpha(opacity=75)"; numLikesDislikes.style.padding = "0 4px"; numLikesDislikes.style.lineHeight = "14px"; numLikesDislikes.style.fontWeight = "bold"; numLikesDislikes.style.zoom = "1"; if (likes === "error") { numLikesDislikes.style.color = "#fff"; numLikesDislikes.style.verticalAlign = "middle"; numLikesDislikes.style.fontSize = "11px"; numLikesDislikes.appendChild(document.createTextNode(dislikes)); } else { likesCount.className = "likes-count"; likesCount.style.marginRight = "4px"; likesCount.style.color = "#fff"; likesCount.style.verticalAlign = "middle"; likesCount.style.fontSize = "11px"; likesCount.textContent = ytcenter.utils.number1000Formating(likes); dislikesCount.className = "dislikes-count"; dislikesCount.style.color = "#fff"; dislikesCount.style.verticalAlign = "middle"; dislikesCount.style.fontSize = "11px"; dislikesCount.textContent = ytcenter.utils.number1000Formating(dislikes); if (ytcenter.utils.hasClass(item.videoThumb, "yt-thumb-120") || ytcenter.utils.hasClass(item.videoThumb, "yt-thumb-106")) { likesCount.style.fontSize = "11px"; dislikesCount.style.fontSize = "11px"; } likeIcon.className = ""; // icon-watch-stats-like likeIcon.setAttribute("alt", "Like"); likeIcon.src = ytcenter.icon.smallThumbsUpWhite; likeIcon.style.position = "relative"; likeIcon.style.marginRight = "2px"; likeIcon.style.marginTop = "4px"; likeIcon.style.top = "-2px"; likeIcon.style.verticalAlign = "middle"; dislikeIcon.className = ""; // icon-watch-stats-dislike dislikeIcon.setAttribute("alt", "Dislike"); dislikeIcon.src = ytcenter.icon.smallThumbsDownWhite; dislikeIcon.style.position = "relative"; dislikeIcon.style.marginRight = "2px"; dislikeIcon.style.marginTop = "4px"; dislikeIcon.style.top = "-2px"; dislikeIcon.style.verticalAlign = "middle"; numLikesDislikes.appendChild(likeIcon); numLikesDislikes.appendChild(likesCount); numLikesDislikes.appendChild(dislikeIcon); numLikesDislikes.appendChild(dislikesCount); } numLikesDislikes.style.position = "absolute"; item.content.className += " ytcenter-thumbnail-ratingcount-pos-" + ytcenter.settings.videoThumbnailRatingsCountPosition; item.content.appendChild(numLikesDislikes); } catch (e) { con.error("[Id=" + item.id + "] Likes: " + likes + ", " + dislikes); con.error(e); } } function appendAnimatedThumbnail(item, storyboard, errorMessage){ function preload(images) { var i, img; for (i = 0; i < images.length; i++) { img = new Image(); img.src = images[i]; } } function preloadNextMosaic(frame) { if (level) { var nextMosaic = level.getMosaic(frame) + 1; if (preloadURLS.length <= nextMosaic || nextMosaic < 0) { nextMosaic = 0; } if (!preloaded[nextMosaic]) { preload([preloadURLS[nextMosaic]]); con.log("[Animated Thumbnail] Preloaded " + preloadURLS[nextMosaic]); preloaded[nextMosaic] = true; } } else { frame += 1; if (frame > 3 || frame < 1) frame = 1; if (!preloadedDefaultImgs[frame - 1]) { preload([urlTemplate.replace("$N", frame)]); con.log("[Animated Thumbnail] Preloaded " + urlTemplate.replace("$N", frame)); preloadedDefaultImgs[frame - 1] = true; } } } function mouseover() { function moi() { if (level) { a.src = "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"; a.parentNode.style.backgroundColor = "#000"; if (frame >= level.frames) frame = 0; rect = level.getRect(frame, box); a.style.width = rect.width + "px"; a.style.height = rect.height + "px"; a.style.top = "0px"; a.style.backgroundSize = rect.imageWidth + "px " + rect.imageHeight + "px"; a.style.backgroundImage = "URL(" + level.getURL(frame) + ")"; a.style.backgroundPosition = -rect.x + "px " + -rect.y + "px"; preloadNextMosaic(frame); } else { if (frame > 3 || frame < 1) frame = 1; a.src = urlTemplate.replace("$N", frame); preloadNextMosaic(frame); } if (ytcenter.settings.videoThumbnailAnimationShuffle) { if (level) { frame = Math.round(Math.random()*(level.frames - 1)); } else { frame = Math.round(Math.random()*2) + 1; } } else { frame++; } } preloadNextMosaic(frame - 1); timer2 = uw.setTimeout(function(){ if (level) { timer = uw.setInterval(moi, ytcenter.settings.videoThumbnailAnimationInterval); } else { urlTemplate = originalImage.replace(/\/(mq)?default\.jpg$/, "/$N.jpg"); timer = uw.setInterval(moi, ytcenter.settings.videoThumbnailAnimationFallbackInterval); } moi(); }, ytcenter.settings.videoThumbnailAnimationDelay); } function mouseout() { uw.clearInterval(timer); uw.clearTimeout(timer2); a.src = originalImage; a.style.backgroundSize = ""; a.style.backgroundImage = ""; a.style.backgroundPosition = ""; a.style.width = ""; a.style.height = ""; a.style.top = ""; a.parentNode.style.backgroundColor = ""; frame = 0; } try { var a = item.wrapper.getElementsByTagName("img")[0], b = ytcenter.player.parseThumbnailStream(storyboard || ""), originalImage = a.getAttribute("data-thumb") || a.src, timer, timer2, frame = 0, level, i, urlTemplate, box = { width: a.offsetWidth, height: 0 }, rect, preloaded = [], preloadURLS = null, preloadedDefaultImgs = [false, false, false]; if (b.levels.length > 0) { for (i = 0; i < b.levels.length; i++) { if (!level) level = b.levels[i]; else if (b.levels[i].width > level.width) level = b.levels[i]; } } if (level) { preloadURLS = level.getURLS(); for (i = 0; i < preloadURLS.length; i++) { preloaded.push(false); } } else { urlTemplate = originalImage.replace(/\/(mq)?default\.jpg$/, "/$N.jpg"); } if (item.mouseover) { mouseover(); } else { mouseout(); } ytcenter.utils.addEventListener(item.wrapper, "mouseover", mouseover, false); ytcenter.utils.addEventListener(item.wrapper, "mouseout", mouseout, false); } catch (e) { con.error(e); } } function appendQuality(item, stream, errorMessage) { var tableQuality = { "error": errorMessage, "auto": errorMessage, "ondemand": "OnDemand", "tiny": "144p", "small": "240p", "medium": "360p", "large": "480p", "hd720": "720p", "hd1080": "1080p", "hd1440": "1440p", "highres": "1080p+" }, tableBackground = { "error": "#b00", "auto": "#b00", "ondemand": "#aaa", "tiny": "#7e587e", "small": "#aaa", "medium": "#0aa", "large": "#00f", "hd720": "#0a0", "hd1080": "#f00", "hd1440": "#000", "highres": "#000" }, tableColor = { "error": "#fff", "auto": "#fff", "ondemand": "#fff", "tiny": "#fff", "small": "#fff", "medium": "#fff", "large": "#fff", "hd720": "#fff", "hd1080": "#fff", "hd1440": "#fff", "highres": "#fff" }, text, background, color, wrapper = document.createElement("span"); if (stream === null) { text = tableQuality["error"]; background = tableBackground["error"]; color = tableColor["error"]; } else if (stream === "error") { text = tableQuality[stream]; background = tableBackground[stream]; color = tableColor[stream]; } else if (stream && stream.quality === "ondemand") { text = tableQuality[stream.quality]; background = tableBackground[stream.quality]; color = tableColor[stream.quality]; } else if (stream && stream.quality) { text = stream.dimension.split("x")[1] + "p"; background = tableBackground[stream.quality]; color = tableColor[stream.quality]; } else if (stream && stream.size) { var quality = ytcenter.player.convertDimensionToQuality(stream.size); text = stream.size.split("x")[1] + "p"; background = tableBackground[quality]; color = tableColor[quality]; } if (ytcenter.settings.videoThumbnailQualityFPS && stream && stream !== "error") { var fps = stream.fps || "30"; text += "@" + fps; } wrapper.className = (ytcenter.settings.videoThumbnailQualityVisible === "show_hover" ? " ytcenter-video-thumb-show-hover" : "") + (ytcenter.settings.videoThumbnailQualityVisible === "hide_hover" ? " ytcenter-video-thumb-hide-hover" : "") + " ytcenter-thumbnail-quality"; wrapper.textContent = text; item.content.className += " ytcenter-thumbnail-quality-pos-" + ytcenter.settings.videoThumbnailQualityPosition; wrapper.style.background = background; wrapper.style.color = color; item.content.appendChild(wrapper); } function updateWatchedClass(item) { var watched = ytcenter.utils.hasClass(item.content, "watched"), am, li, s; if (item.itemWrapper && watched) { ytcenter.utils.addClass(item.itemWrapper, "ytcenter-video-watched-wrapper"); // For hiding the item } else if (item.itemWrapper) { ytcenter.utils.removeClass(item.itemWrapper, "ytcenter-video-watched-wrapper"); // For hiding the item } if (loc.pathname === "/feed/subscriptions" && !item.actionMenu) { item.actionMenu = item.wrapper.parentNode.parentNode.parentNode.parentNode.parentNode.nextElementSibling; if (item.actionMenu) { am = item.actionMenu.getElementsByTagName("ul")[0]; li = document.createElement("li"); li.setAttribute("role", "menuitem"); s = document.createElement("span"); s.className = "dismiss-menu-choice yt-uix-button-menu-item"; s.setAttribute("onclick", ";return false;"); if (ytcenter.videoHistory.isVideoWatched(item.id)) { s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_REMOVE"); } else { s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_ADD"); } ytcenter.utils.addEventListener(li, "click", function(){ if (ytcenter.videoHistory.isVideoWatched(item.id)) { ytcenter.videoHistory.removeVideo(item.id); s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_ADD"); } else { ytcenter.videoHistory.addVideo(item.id); s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_REMOVE"); } updateWatchedMessage(item); }, false); li.appendChild(s); am.insertBefore(li, am.children[0]); ytcenter.events.addEvent("language-refresh", function(){ if (ytcenter.videoHistory.isVideoWatched(item.id)) { s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_REMOVE"); } else { s.textContent = ytcenter.language.getLocale("VIDEOWATCHED_ADD"); } }); } } } function updateWatchedMessage(item) { var ivw = ytcenter.videoHistory.isVideoWatched(item.id), watchedElement; if (ivw) { watchedElement = document.createElement("div"); if (item.content.getElementsByClassName("watched-message").length === 0 && item.content.getElementsByClassName("watched-badge").length === 0) { //watchedElement.className = "watched-message"; watchedElement.className = "watched-badge"; watchedElement.textContent = ytcenter.language.getLocale("SETTINGS_WATCHED"); ytcenter.language.addLocaleElement(watchedElement, "SETTINGS_WATCHED", "@textContent"); item.content.insertBefore(watchedElement, item.content.children[0]); } ytcenter.utils.addClass(item.content, "watched"); } else { ytcenter.utils.removeClass(item.content, "watched"); if (item.itemWrapper) ytcenter.utils.removeClass(item.itemWrapper, "ytcenter-video-watched-wrapper"); } } function getChannelBubble(item) { var elm = null; if (item.itemWrapper) { elm = item.itemWrapper.getElementsByTagName("a"); if (elm && elm.length > 0) { elm = elm[0]; } else { elm = null; } } return elm; } function getChannelName(wrapper) { var elm = null; if (wrapper) { elm = wrapper.getElementsByTagName("img"); if (elm && elm.length > 0) { elm = elm[0]; } } if (elm) { elm = elm.getAttribute("alt"); } return elm; } function convertChannelBubble(elm) { if (elm) { elm.textContent = getChannelName(elm); elm.className = elm.className.replace("feed-author-bubble", ""); } return elm; } function isInSubscription(item) { var feed = document.getElementById("feed"), children = feed.getElementsByClassName("video-thumb"), i; for (i = 0; i < children.length; i++) { if (children[i] === item.videoThumb) { return true; } } return false; } function processItemHeavyLoad(item) { if (!ytcenter.settings.videoThumbnailQualityBar && !ytcenter.settings.videoThumbnailAnimationEnabled) return; if (ytcenter.settings.videoThumbnailQualityDownloadAt === "scroll_into_view") { ytcenter.domEvents.addEvent(item.wrapper, "enterview", function(){ loadVideoConfig(item, function(stream, storyboard, errorMessage){ if (ytcenter.settings.videoThumbnailQualityBar) appendQuality(item, stream, errorMessage); if (ytcenter.settings.videoThumbnailAnimationEnabled) appendAnimatedThumbnail(item, storyboard, errorMessage); }); }, true); } else if (ytcenter.settings.videoThumbnailQualityDownloadAt === "hover_thumbnail") { ytcenter.utils.addEventListener(item.wrapper, "mouseover", (function(){ var added = false; return function(){ if (added) return; added = true; loadVideoConfig(item, function(stream, storyboard, errorMessage){ if (ytcenter.settings.videoThumbnailQualityBar) appendQuality(item, stream, errorMessage); if (ytcenter.settings.videoThumbnailAnimationEnabled) appendAnimatedThumbnail(item, storyboard, errorMessage); }); }; })(), false); } else { loadVideoConfig(item, function(stream, storyboard, errorMessage){ if (ytcenter.settings.videoThumbnailQualityBar) appendQuality(item, stream, errorMessage); if (ytcenter.settings.videoThumbnailAnimationEnabled) { ytcenter.utils.addEventListener(item.wrapper, "mouseover", (function(){ var added = false; return function(){ if (added) return; added = true; appendAnimatedThumbnail(item, storyboard, errorMessage); }; })(), false); } }); } } function processItem(item) { if (!ytcenter.settings.videoThumbnailRatingsCount && !ytcenter.settings.videoThumbnailRatingsBar) return; if (ytcenter.settings.videoThumbnailRatingsBarDownloadAt === "hover_thumbnail" && ytcenter.settings.videoThumbnailRatingsCountDownloadAt === "hover_thumbnail") { ytcenter.utils.addEventListener(item.wrapper, "mouseover", (function(){ var added = false; return function(){ if (added) return; added = true; loadVideoData(item, function(likes, dislikes){ if (ytcenter.settings.videoThumbnailRatingsCount) { appendRatingCount(item, likes, dislikes); } if (ytcenter.settings.videoThumbnailRatingsBar) { appendRatingBar(item, likes, dislikes); } }); }; })(), false); } else { if (ytcenter.settings.videoThumbnailRatingsBarDownloadAt === "page_start" || ytcenter.settings.videoThumbnailRatingsCountDownloadAt === "page_start") { loadVideoData(item, function(likes, dislikes){ if (ytcenter.settings.videoThumbnailRatingsCount) { appendRatingCount(item, likes, dislikes); } if (ytcenter.settings.videoThumbnailRatingsBar) { appendRatingBar(item, likes, dislikes); } }); } else { if (ytcenter.settings.videoThumbnailRatingsBarDownloadAt === "scroll_into_view" && ytcenter.settings.videoThumbnailRatingsBar) { ytcenter.domEvents.addEvent(item.wrapper, "enterview", function(){ loadVideoData(item, function(likes, dislikes){ appendRatingBar(item, likes, dislikes); }); }, true); } else if (ytcenter.settings.videoThumbnailRatingsBarDownloadAt === "hover_thumbnail" && ytcenter.settings.videoThumbnailRatingsBar) { ytcenter.utils.addEventListener(item.wrapper, "mouseover", (function(){ var added = false; return function(){ if (added) return; added = true; loadVideoData(item, function(likes, dislikes){ appendRatingBar(item, likes, dislikes); }); }; })(), false); } else if (ytcenter.settings.videoThumbnailRatingsBar) { loadVideoData(item, function(likes, dislikes){ appendRatingBar(item, likes, dislikes); }); } if (ytcenter.settings.videoThumbnailRatingsCountDownloadAt === "scroll_into_view" && ytcenter.settings.videoThumbnailRatingsCount) { ytcenter.domEvents.addEvent(item.wrapper, "enterview", function(){ loadVideoData(item, function(likes, dislikes){ appendRatingCount(item, likes, dislikes); }); }, true); } else if (ytcenter.settings.videoThumbnailRatingsCountDownloadAt === "hover_thumbnail" && ytcenter.settings.videoThumbnailRatingsCount) { ytcenter.utils.addEventListener(item.wrapper, "mouseover", (function(){ var added = false; return function(){ if (added) return; added = true; loadVideoData(item, function(likes, dislikes){ appendRatingCount(item, likes, dislikes); }); }; })(), false); } else if (ytcenter.settings.videoThumbnailRatingsCount) { loadVideoData(item, function(likes, dislikes){ appendRatingCount(item, likes, dislikes); }); } } } } function compareDifference(newData, oldData) { var a = false; var arr = []; for (var i = 0, len = newData.length; i < len; i++) { a = false; for (var j = 0, lenj = oldData.length; j < lenj; j++) { if (oldData[j].wrapper === newData[i].wrapper) { a = true; break; } } if (!a) { arr.push(newData[i]); } } return arr; } function updateItemInCache(data) { var index = getDataCacheIndex(data); if (data.stream && !ytcenter.settings.videoThumbnailData[index].stream) { ytcenter.settings.videoThumbnailData[index].stream = data.stream; } if (data.storyboard && !ytcenter.settings.videoThumbnailData[index].storyboard) { ytcenter.settings.videoThumbnailData[index].storyboard = data.storyboard; } if (data.likes && data.dislikes && !ytcenter.settings.videoThumbnailData[index].likes && !ytcenter.settings.videoThumbnailData[index].dislikes) { ytcenter.settings.videoThumbnailData[index].likes = data.likes; ytcenter.settings.videoThumbnailData[index].dislikes = data.dislikes; } ytcenter.saveSettings(); } function updateReuse(data) { var index = getDataCacheIndex(data); if (index === -1) return; ytcenter.settings.videoThumbnailData[index].reused++; if (ytcenter.settings.videoThumbnailData[index].reused > 5) ytcenter.settings.videoThumbnailData[index].reused = 5; ytcenter.saveSettings(); } function getDataCacheById(id) { var i; for (i = 0; i < ytcenter.settings.videoThumbnailData.length; i++) { if (id === ytcenter.settings.videoThumbnailData[i].id) return ytcenter.settings.videoThumbnailData[i]; } return null; } function getDataCacheIndex(data) { var i; for (i = 0; i < ytcenter.settings.videoThumbnailData.length; i++) { if (data.id === ytcenter.settings.videoThumbnailData[i].id) return i; } return -1; } function isInCache(data) { return getDataCacheIndex(data) !== -1; } function addNewDataToCache(data) { if (isInCache(data)) return; var nData = {}; while (ytcenter.settings.videoThumbnailData.length >= ytcenter.settings.videoThumbnailCacheSize) removeOldestFromCache(); nData.id = data.id; nData.reused = 0; nData.date = ytcenter.utils.now(); if (data.stream) nData.stream = data.stream; if (data.storyboard) nData.storyboard = data.storyboard; if (data.likes) nData.likes = data.likes; if (data.dislikes) nData.dislikes = data.dislikes; ytcenter.settings.videoThumbnailData.push(nData); ytcenter.saveSettings(); } function calculateCacheLife(data) { return 1000*60*10 + (1000*60*5)*(data.reused ? data.reused : 0); } function removeOldestFromCache() { if (ytcenter.settings.videoThumbnailData.length === 0) return; var i, now = ytcenter.utils.now(), life, lifeRemaining, oldest = ytcenter.settings.videoThumbnailData[0], j = 0; for (i = 1; i < ytcenter.settings.videoThumbnailData.length; i++) { life = calculateCacheLife(ytcenter.settings.videoThumbnailData[i]); lifeRemaining = (ytcenter.settings.videoThumbnailData[i].date + life) - now; if (lifeRemaining < (oldest.date + calculateCacheLife(oldest)) - now) { oldest = ytcenter.settings.videoThumbnailData[i]; j = i; } } ytcenter.settings.videoThumbnailData.splice(j, 1); } function cacheChecker() { if (ytcenter.settings.videoThumbnailData.length === 0) return; var i, now = ytcenter.utils.now(), life, nData = []; for (i = 0; i < ytcenter.settings.videoThumbnailData.length; i++) { life = calculateCacheLife(ytcenter.settings.videoThumbnailData[i]); if (now < ytcenter.settings.videoThumbnailData[i].date + life) { if (ytcenter.settings.videoThumbnailData[i].reused < 5) ytcenter.settings.videoThumbnailData[i].reused++; nData.push(ytcenter.settings.videoThumbnailData[i]); } } ytcenter.settings.videoThumbnailData = nData; ytcenter.saveSettings(); } var exports = {}, videoThumbs = [], observer = null, observer2 = null; exports.update = function(){ ytcenter.gridview.update(); ytcenter.videoHistory.loadWatchedVideosFromYouTubePage(); ytcenter.channelPlaylistLinks.update(); var vt = compareDifference(getVideoThumbs(), videoThumbs), i; for (i = 0; i < vt.length; i++) { ytcenter.utils.addEventListener(vt[i].wrapper, "mouseover", (function(item){ return function(){ item.mouseover = true; }; })(vt[i]), false); ytcenter.utils.addEventListener(vt[i].wrapper, "mouseout", (function(item){ return function(){ item.mouseover = false; }; })(vt[i]), false); videoThumbs.push(vt[i]); updateReuse(vt[i]); // TODO make it load with scrolling. /*if (vt[i].thumbnailImage && vt[i].thumbnailImage.hasAttribute("data-thumb")) { vt[i].thumbnailImage.src = vt[i].thumbnailImage.getAttribute("data-thumb"); }*/ processItem(vt[i]); processItemHeavyLoad(vt[i]); if (loc.pathname === "/" || loc.pathname === "/results" || loc.pathname.indexOf("/feed/") === 0) { updateWatchedClass(vt[i]); } if ((loc.pathname === "/" || loc.pathname === "/results" || loc.pathname.indexOf("/feed/") === 0) && ytcenter.settings.watchedVideosIndicator) { updateWatchedMessage(vt[i]); } } }; exports.setupObserver = function(){ exports.dispose(); // We don't want multiple observers if (document.getElementById("content")) { observer = ytcenter.mutation.observe(document.getElementById("content"), { childList: true, subtree: true }, function(){ exports.update(); }); } }; exports.dispose = function(){ if (observer) { observer.disconnect(); observer = null; } if (observer2) { observer2.disconnect(); observer2 = null; } }; ytcenter.unload(exports.dispose); exports.setup = function(){ con.log("[Thumbnail] Setup has begun..."); ytcenter.gridview.update(); try { var i; cacheChecker(); ytcenter.videoHistory.loadWatchedVideosFromYouTubePage(); videoThumbs = getVideoThumbs(); for (i = 0; i < videoThumbs.length; i++) { ytcenter.utils.addEventListener(videoThumbs[i].wrapper, "mouseover", (function(item){ return function(){ item.mouseover = true; }; })(videoThumbs[i]), false); ytcenter.utils.addEventListener(videoThumbs[i].wrapper, "mouseout", (function(item){ return function(){ item.mouseover = false; }; })(videoThumbs[i]), false); updateReuse(videoThumbs[i]); processItem(videoThumbs[i]); processItemHeavyLoad(videoThumbs[i]); if (loc.pathname === "/" || loc.pathname === "/results" || loc.pathname.indexOf("/feed/") === 0) { updateWatchedClass(videoThumbs[i]); } if ((loc.pathname === "/" || loc.pathname === "/results" || loc.pathname.indexOf("/feed/") === 0) && ytcenter.settings.watchedVideosIndicator) { updateWatchedMessage(videoThumbs[i]); } } exports.setupObserver(); } catch (e) { con.error(e); } }; return exports; })(); ytcenter.getDebug = function(){ var debugText = "{}", dbg = {}, a; try { dbg.htmlelements = {}; if (document.body) dbg.htmlelements.body = { "className": document.body.className }; dbg.injected = injected; dbg.identifier = identifier; dbg.devbuild = devbuild; // variable is true if this a developer build dbg.devnumber = devnumber; // developer build number. Only really needed for the developer build. dbg.feather = ytcenter.feather; dbg.cookies = {}; dbg.cookies["VISITOR_INFO1_LIVE"] = ytcenter.utils.getCookie("VISITOR_INFO1_LIVE"); dbg.location = { hash: loc.hash, host: loc.host, hostname: loc.hostname, href: loc.href, origin: loc.origin, pathname: loc.pathname, port: loc.port, protocol: loc.protocol, search: loc.search }; dbg.navigator = { userAgent: uw.navigator.userAgent, vendor: uw.navigator.vendor, vendorSub: uw.navigator.vendorSub, platform: uw.navigator.platform }; dbg.settings = {}; for (a in ytcenter.settings) { if (ytcenter.settings.hasOwnProperty(a)) { if (ytcenter.settings.debug_settings_playersize && a === "resize-playersizes") continue; if (ytcenter.settings.debug_settings_buttonPlacement && (a === "buttonPlacement" || a === "buttonPlacementWatch7")) continue; if (ytcenter.settings.debug_settings_videoThumbnailData && a === "videoThumbnailData") continue; if (ytcenter.settings.debug_settings_commentCountryData && a === "commentCountryData") continue; if (ytcenter.settings.debug_settings_watchedVideos && a === "watchedVideos") continue; if (ytcenter.settings.debug_settings_notwatchedVideos && a === "notwatchedVideos") continue; dbg.settings[a] = ytcenter.settings[a]; } } dbg.settings = ytcenter.settings; dbg.ytcenter = {}; dbg.ytcenter.video = ytcenter.video; dbg.ytcenter.signatureDecipher = ytcenter.utils._signatureDecipher; dbg.ytcenter._signatureDecipher = ytcenter.utils.__signatureDecipher; dbg.ytcenter.player = {}; dbg.ytcenter.player.flashvars = ""; try { dbg.ytcenter.player.flashvars = document.getElementById("movie_player").getAttribute("flashvars"); } catch (e) { dbg.ytcenter.player.flashvars = e; } dbg.ytcenter.player.config = ytcenter.player.config; try { dbg.ytcenter.player.apiinterface = ytcenter.player.getReference().api.getApiInterface(); } catch (e) { dbg.ytcenter.player.apiinterface = {}; } if (typeof dbg.ytcenter.player.reference !== "undefined") { dbg.ytcenter.player.reference = true; } else { dbg.ytcenter.player.reference = false; } try { var tests = ["getAvailablePlaybackRates", "getAvailableQualityLevels", "getCurrentTime", "getDebugText", "getDuration", "getPlaybackQuality", "getPlaybackRate", "getPlayerState", "getPlayerType", "getVolume", "isMuted", "isReady"]; dbg.player_test = {}; for (var i = 0; i < tests.length; i++) { if (ytcenter.player.getReference().api[tests[i]]) dbg.player_test[tests[i]] = ytcenter.player.getReference().api[tests[i]](); } } catch (e) { dbg.player_test_error = e.message; } dbg.console = _console; debugText = JSON.stringify(dbg); } catch (e) { con.error(e); con.log("[Debug Text]", dbg); debugText = e.message; } return debugText; }; ytcenter.alert = function(type, message, closeable){ var exports = {}, types = { "error": "yt-alert-error", "warning": "yt-alert-warning", "info": "yt-alert-info" }, wrapper = document.createElement("div"), icon = document.createElement("div"), iconImg = document.createElement("img"), content = document.createElement("div"), contentVerticalTrick = document.createElement("span"), contentMessage = document.createElement("div"); closeable = typeof closeable === "boolean" ? closeable : true; wrapper.className = "yt-alert yt-alert-default " + types[type]; icon.className = "yt-alert-icon"; iconImg.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; iconImg.className = "icon master-sprite"; icon.appendChild(iconImg); wrapper.appendChild(icon); if (closeable) { var buttons = document.createElement("div"), closeButton = document.createElement("button"), closeButtonText = document.createElement("span"); buttons.className = "yt-alert-buttons"; closeButton.setAttribute("type", "button"); closeButton.setAttribute("role", "button"); closeButton.setAttribute("onclick", ";return false;"); closeButton.className = "close yt-uix-close yt-uix-button yt-uix-button-close"; ytcenter.utils.addEventListener(closeButton, "click", function(){ exports.setVisibility(false); }); closeButtonText.className = "yt-uix-button-content"; closeButtonText.textContent = "Close "; closeButton.appendChild(closeButtonText); buttons.appendChild(closeButton); wrapper.appendChild(buttons); } content.className = "yt-alert-content"; contentVerticalTrick.className = "yt-alert-vertical-trick"; contentMessage.className = "yt-alert-message"; if (typeof message === "string") { contentMessage.textContent = message; } else { contentMessage.appendChild(message); } content.appendChild(contentVerticalTrick); content.appendChild(contentMessage); wrapper.appendChild(content); exports.setVisibility = function(visible){ if (visible) { if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper); document.getElementById("alerts").appendChild(wrapper); } else { if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper); } }; return exports; }; ytcenter.message = (function(){ var exports = {}; exports.listen = function(win, origin, token, callback){ ytcenter.utils.addEventListener(win || uw, "message", function(e){ if (origin && e.origin !== origin) return; if (!e || !e.data) return; // Checking if data is present if (typeof e.data !== "string") return; // Checking if the object is a string. if (!e.data.indexOf || e.data.indexOf(token) !== 0) return; // Checking if the token is present at the start of the string var data = JSON.parse(e.data.substring(token.length)); //con.log("[Message:" + loc.href + "] Listen@" + token, data); callback(data); }, false); }; exports.broadcast = function(win, origin, token, data){ win.postMessage(token + JSON.stringify(data), origin); }; return exports; })(); ytcenter.domEvents = (function(){ function onViewUpdate() { if (uw.self !== uw.top && !offset && !windowDim) return; onEnterViewUpdate(); onExitViewUpdate(); var i, elms = document.getElementsByTagName("iframe"), scrollOffset = null, elmOffset = null, data; for (i = 0; i < elms.length; i++) { if (elms[i] && elms[i].src && (elms[i].src.indexOf("http://apis.google.com/") === 0 || elms[i].src.indexOf("https://apis.google.com/") === 0 || elms[i].src.indexOf("http://plus.googleapis.com") === 0 || elms[i].src.indexOf("https://plus.googleapis.com") === 0) && elms[i].src.indexOf("/widget/render/comments?") !== -1) { scrollOffset = ytcenter.utils.getBoundingClientRect(elms[i]); data = { scrollOffset: scrollOffset, windowDim: windowDim || {width: window.innerWidth || document.documentElement.clientWidth, height: window.innerHeight || document.documentElement.clientHeight } }; ytcenter.message.broadcast( elms[i].contentWindow, elms[i].src, "$_scroll", data ); } } } function onEnterViewUpdate() { if (!db["enterview"]) return; var trash = [], i = 0, a; while (i < db["enterview"].length) { if (processEnterViewUpdate(db["enterview"][i])) { if (db["enterview"][i].once) { db["enterview"].splice(i, 1); i -= 1; } } i += 1; } } function onExitViewUpdate() { if (!db["exitview"]) return; var trash = [], i = 0, a; while (i < db["exitview"].length) { if (processExitViewUpdate(db["exitview"][i])) { if (db["exitview"][i].once) { db["exitview"].splice(i, 1); i -= 1; } } i += 1; } } function processEnterViewUpdate(item) { var inView = ytcenter.utils.isElementPartlyInView(item.element, offset, windowDim); if (!inView) { item.inview = false; return false; } if (!("inview" in item)) item.inview = false; if (item.inview) return false; item.inview = true; item.callback.apply(item.element, []); return true; } function processExitViewUpdate(item) { var inView = ytcenter.utils.isElementPartlyInView(item.element, offset, windowDim); if (inView) { item.inview = true; return false; } if (!("inview" in item)) { item.inview = inView; return false; } if (item.inview && !inView) { item.callback.apply(item.element, []); } item.inview = inView; return true; } var exports = {}, db = {}, _buffer = null, onViewUpdateBuffer = null, offset = null, windowDim = null; exports.update = function(){ onViewUpdate(); }; exports.addEvent = function(elm, event, callback, once){ if (!elm) return; if (!db[event]) db[event] = []; db[event].push({ element: elm, callback: callback, once: once || false }); }; exports.ready = function(){ if (uw.self === uw.top) return; if ((loc.href.indexOf("apis.google.com/u/") !== -1 || loc.href.indexOf("plus.googleapis.com") !== -1) && loc.href.indexOf("/widget/render/comments?") !== -1) { ytcenter.message.broadcast( uw.parent, document.referrer, "$_ready", {} ); } }; exports.setup = function(){ if (onViewUpdateBuffer) { ytcenter.utils.removeEventListener(window, "scroll", onViewUpdateBuffer, false); ytcenter.utils.removeEventListener(window, "resize", onViewUpdateBuffer, false); ytcenter.events.removeEvent("ui-refresh", onViewUpdateBuffer); } else { if ((loc.href.indexOf("apis.google.com/u/") !== -1 || loc.href.indexOf("plus.googleapis.com") !== -1) && loc.href.indexOf("/widget/render/comments?") !== -1) { ytcenter.message.listen(uw, null, "$_scroll", function(data){ offset = data.scrollOffset; windowDim = data.windowDim; }); } if (ytcenter.getPage() === "watch") { ytcenter.message.listen(uw, null, "$_ready", function(data){ onViewUpdate(); }); } } onViewUpdateBuffer = ytcenter.utils.throttle(onViewUpdate, 500); ytcenter.utils.addEventListener(window, "scroll", onViewUpdateBuffer, false); ytcenter.utils.addEventListener(window, "resize", onViewUpdateBuffer, false); ytcenter.events.addEvent("ui-refresh", onViewUpdateBuffer); uw.setInterval(onViewUpdateBuffer, 7500); // Todo attach this to an event instead. onViewUpdateBuffer(); }; return exports; })(); ytcenter.scrollEvent = (function(){ function createHandler(group) { return function(event){ var data = handler(event), i; for (i = 0; i < group.listeners.length; i++) { group.listeners[i].apply(group.element, data); } }; } function addEventListener(elm, listener) { var group = getEventGroup(elm); if (group === null) { group = { element: elm, listeners: [], handler: null }; groups.push(group); } group.listeners.push(listener); if (group.listeners.length > 0 && group.handler === null) { setupGroup(group); } } function removeEventListener(elm, listener) { var group = getEventGroup(elm), i; if (group !== null) { for (i = 0; i < group.listeners.length; i++) { if (group.listeners[i] === listener) { group.listeners.splice(i, 1); } } if (group.listeners.length === 0 && group.handler !== null) { destroyGroup(group); } } } function getEventGroup(elm) { var i; for (i = 0; i < groups.length; i++) { if (groups[i].element === elm) { return groups[i]; } } return null; } function setupGroup(group) { var i; if (group.handler === null) { group.handler = createHandler(group); for (i = 0; i < events.length; i++) { ytcenter.utils.addEventListener(group.element, events[i], group.handler, false); } } } function destroyGroup(group) { var i; if (group.handler !== null) { for (i = 0; i < events.length; i++) { ytcenter.utils.removeEventListener(group.element, events[i], group.handler, false); } group.handler = null; } } function setup() { var i; for (i = 0; i < groups.length; i++) { setupGroup(groups[i]); } } function destroy() { var i; for (i = 0; i < groups.length; i++) { destroyGroup(groups[i]); } } function unload() { destroy(); groups = []; } function handler(event) { var orgEvent = event || window.event; var args = Array.prototype.splice.call(arguments, 1); var delta = 0; var deltaX = 0; var deltaY = 0; var absDelta = 0; var absDeltaXY = 0; var fn = null; // Old school scrollwheel delta if (orgEvent.wheelDelta) { delta = orgEvent.wheelDelta; } if (orgEvent.detail) { delta = orgEvent.detail * -1; } // New school wheel delta (wheel event) if (orgEvent.deltaY) { deltaY = orgEvent.deltaY * -1; delta = deltaY; } if (orgEvent.deltaX) { deltaX = orgEvent.deltaX; delta = deltaX * -1; } // Webkit if (orgEvent.wheelDeltaY !== undefined) { deltaY = orgEvent.wheelDeltaY; } if (orgEvent.wheelDeltaX !== undefined) { deltaX = orgEvent.wheelDeltaX * -1; } // Look for lowest delta to normalize the delta values absDelta = Math.abs(delta); if (!lowestDelta || absDelta < lowestDelta) { lowestDelta = absDelta; } absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX)); if (!lowestDeltaXY || absDeltaXY < lowestDeltaXY) { lowestDeltaXY = absDeltaXY; } fn = delta > 0 ? "floor" : "ceil"; delta = Math[fn](delta / lowestDelta); deltaX = Math[fn](deltaX / lowestDeltaXY); deltaY = Math[fn](deltaY / lowestDeltaXY); return [event, delta, deltaX, deltaY]; } var events = 'onwheel' in document || document.documentMode >= 9 ? ["wheel"] : ["mousewheel", "DomMouseScroll", "MozMousePixelScroll"], lowestDelta = null, lowestDeltaXY = null, groups = []; return { addEventListener: addEventListener, removeEventListener: removeEventListener, destroy: destroy, setup: setup, unload: unload }; })(); ytcenter.events = (function(){ var db = {}, exports = {}; exports.addEvent = function(event, callback){ if (!db.hasOwnProperty(event)) db[event] = []; db[event].push(callback); return [event, callback]; }; exports.removeEvent = function(event, callback){ var i; for (i = 0; i < db[event].length; i++) { if (db[event][i] === callback) { db[event].splice(i, 1); return; } } }; exports.performEvent = function(event){ if (!db.hasOwnProperty(event)) return; var staticArguments = Array.prototype.splice.call(arguments, 1, arguments.length); //con.log("performEvent: " + event, staticArguments, arguments); for (var i = 0; i < db[event].length; i++) { try { db[event][i].apply(null, staticArguments); } catch (e) { con.error(e); } } }; return exports; })(); ytcenter._dialogVisible = null ytcenter.dialog = function(titleLabel, content, actions, alignment){ var exports = {}, ___parent_dialog = null, bgOverlay, root, base, fg, fgContent, footer, eventListeners = {}, actionButtons = {}, _visible = false; alignment = alignment || "center"; bgOverlay = ytcenter.dialogOverlay(); root = document.createElement("div"); root.className = "ytcenter-dialog"; base = document.createElement("div"); base.className = "ytcenter-dialog-base"; fg = document.createElement("div"); fg.className = "ytcenter-dialog-fg"; fgContent = document.createElement("div"); fgContent.className = "ytcenter-dialog-fg-content ytcenter-dialog-show-content"; fg.appendChild(fgContent); if (alignment === "center") { var align = document.createElement("span"); align.className = "ytcenter-dialog-align"; base.appendChild(align); } else { fg.style.margin = "13px 0"; } base.appendChild(fg); root.appendChild(base); if (typeof titleLabel === "string" && titleLabel !== "") { var header = document.createElement("div"); header.className = "ytcenter-dialog-header"; var title = document.createElement("h2"); title.className = "ytcenter-dialog-title"; title.textContent = ytcenter.language.getLocale(titleLabel); ytcenter.language.addLocaleElement(title, titleLabel, "@textContent"); header.appendChild(title); fgContent.appendChild(header); } else { var header = document.createElement("div"); header.style.margin = "0 -20px 20px"; fgContent.appendChild(header); } if (typeof content !== "undefined") { var cnt = document.createElement("div"); cnt.className = "ytcenter-dialog-content"; cnt.appendChild(content); fgContent.appendChild(cnt); } footer = document.createElement("div"); footer.className = "ytcenter-dialog-footer"; fgContent.appendChild(footer); if (typeof actions !== "undefined") { /* Array * Object * label: "", * primary: false, # Should be the primary button. * callback: Function */ for (var i = 0; i < actions.length; i++) { var btn = document.createElement("button"); btn.setAttribute("type", "button"); btn.setAttribute("role", "button"); btn.setAttribute("onclick", ";return false;"); btn.className = "yt-uix-button " + (actions[i].primary ? "yt-uix-button-primary" : "yt-uix-button-default"); if (typeof actions[i].callback === "function") { ytcenter.utils.addEventListener(btn, "click", actions[i].callback, false); } var btnContent = document.createElement("span"); btnContent.className = "yt-uix-button-content"; btnContent.textContent = ytcenter.language.getLocale(actions[i].label); ytcenter.language.addLocaleElement(btnContent, actions[i].label, "@textContent"); btn.appendChild(btnContent); footer.appendChild(btn); if (actions[i].name) actionButtons[actions[i].name] = btn; } } else { // Default var closeBtn = document.createElement("button"); closeBtn.setAttribute("type", "button"); closeBtn.setAttribute("role", "button"); closeBtn.setAttribute("onclick", ";return false;"); closeBtn.className = "yt-uix-button yt-uix-button-default"; ytcenter.utils.addEventListener(closeBtn, "click", function(){ exports.setVisibility(false); }, false); var closeContent = document.createElement("span"); closeContent.className = "yt-uix-button-content"; closeContent.textContent = ytcenter.language.getLocale("DIALOG_CLOSE"); ytcenter.language.addLocaleElement(closeContent, "DIALOG_CLOSE", "@textContent"); closeBtn.appendChild(closeContent); footer.appendChild(closeBtn); actionButtons['close'] = btn; } exports.getActionButton = function(name){ return actionButtons[name]; }; exports.addEventListener = function(eventName, func){ if (!eventListeners.hasOwnProperty(eventName)) eventListeners[eventName] = []; eventListeners[eventName].push(func); return eventListeners[eventName].length - 1; }; exports.removeEventListener = function(eventName, index){ if (!eventListeners.hasOwnProperty(eventName)) return; if (index < 0 && index >= eventListeners[eventName].length) return; eventListeners[eventName].splice(index, 1); }; exports.setWidth = function(width){ fg.style.width = width; }; exports.getRoot = function(){ return root; }; exports.getBase = function(){ return base; }; exports.getContent = function(){ return cnt; }; exports.getFooter = function(){ return footer; }; exports.getHeader = function(){ return header; }; exports.setPureVisibility = function(visible){ if (visible) { if (!root.parentNode) document.body.appendChild(root); else { root.parentNode.removeChild(root); document.body.appendChild(root); } if (!bgOverlay.parentNode) document.body.appendChild(bgOverlay); else { bgOverlay.parentNode.removeChild(bgOverlay); document.body.appendChild(bgOverlay); } if (document.getElementById("player-api-legacy") || document.getElementById("player-api")) (document.getElementById("player-api-legacy") || document.getElementById("player-api")).style.visibility = "hidden"; } else { if (root.parentNode) root.parentNode.removeChild(root); if (bgOverlay.parentNode) bgOverlay.parentNode.removeChild(bgOverlay); if ((document.getElementById("player-api-legacy") || document.getElementById("player-api")) && !___parent_dialog) (document.getElementById("player-api-legacy") || document.getElementById("player-api")).style.visibility = ""; } }; exports.setFocus = function(focus){ if (!base) { con.error("[Dialog.setFocus] base element was not found!"); return; } if (focus) { base.style.zIndex = ""; } else { base.style.zIndex = "1998"; } }; exports.setVisibility = function(visible){ if (_visible === visible) return; _visible = visible; if (eventListeners["visibility"]) { for (var i = 0; i < eventListeners["visibility"].length; i++) { eventListeners["visibility"][i](visible); } } if (visible) { if (document.body) ytcenter.utils.addClass(document.body, "ytcenter-dialog-active"); ___parent_dialog = ytcenter._dialogVisible; if (___parent_dialog) { ___parent_dialog.setFocus(false); } exports.setPureVisibility(true); ytcenter._dialogVisible = exports; } else { exports.setPureVisibility(false); if (___parent_dialog) { ___parent_dialog.setFocus(true); ytcenter._dialogVisible = ___parent_dialog; } else { ytcenter._dialogVisible = null; if (document.body) ytcenter.utils.removeClass(document.body, "ytcenter-dialog-active"); } } }; return exports; }; ytcenter.dialogOverlay = function(){ var bg = document.createElement("div"); bg.id = "ytcenter-dialog-bg"; bg.className = "ytcenter-dialog-bg"; bg.style.height = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight) + "px"; bg.style.position = "absolute"; return bg; }; ytcenter.confirmBox = function(titleLabel, messageLabel, onConfirm, confirmLabel){ // Only being used for the resizeitemlist confirmLabel = confirmLabel || "EMBED_RESIZEITEMLIST_CONFIRM_DISCARD"; var msgElm = document.createElement("h3"); msgElm.style.fontWeight = "normal"; msgElm.textContent = ytcenter.language.getLocale(messageLabel); ytcenter.language.addLocaleElement(msgElm, messageLabel, "@textContent"); var dialog = ytcenter.dialog(titleLabel, msgElm, [ { label: "CONFIRM_CANCEL", primary: false, callback: function(){ try { onConfirm(false); dialog.setVisibility(false); } catch (e) { con.error(e); } } }, { label: confirmLabel, primary: true, callback: function(){ try { onConfirm(true); dialog.setVisibility(false); } catch (e) { con.error(e); } } } ]); dialog.setVisibility(true); }; ytcenter.welcome = (function(){ function update() { return ytcenter.utils.replaceText(ytcenter.language.getLocale("WELCOME_CONTENT"), { "{lb}": function(){ return document.createElement("br"); }, "{sectionbreak}": function(){ var c = document.createElement("div"); c.style.marginTop = "40px"; return c; }, "{img1}": img1, "{wiki-url}": wikilink, "{donate}": donatelink } ); } var a = {}, dialog, b = document.createElement("div"), img1 = document.createElement("div"), img1src = document.createElement("img"), wikilink = document.createElement("a"), donatelink = document.createElement("a"); img1.className = "ytcenter-image-welcome-settings-repeater"; img1src.className = "ytcenter-image-welcome-settings clearfix"; img1src.style.cssFloat = "right"; img1src.style.backgroundPosition = "right"; img1src.style.width = "100%"; img1src.src = "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"; img1.appendChild(img1src); wikilink.href = "https://github.com/YePpHa/YouTubeCenter/wiki"; wikilink.setAttribute("target", "_blank"); donatelink.href = "https://github.com/YePpHa/YouTubeCenter/wiki/Donate"; donatelink.setAttribute("target", "_blank"); a.createDialog = function(){ if (dialog) return; donatelink.textContent = ytcenter.language.getLocale("WELCOME_CONTENT_DONATE"); ytcenter.language.addLocaleElement(donatelink, "WELCOME_CONTENT_DONATE", "@textContent"); wikilink.textContent = ytcenter.language.getLocale("WELCOME_CONTENT_WIKI"); ytcenter.language.addLocaleElement(wikilink, "WELCOME_CONTENT_WIKI", "@textContent"); ytcenter.events.addEvent("language-refresh", function(){ b.innerHTML = ""; b.appendChild(update()); }); b.appendChild(update()); dialog = ytcenter.dialog("WELCOME_TITLE", b, [ { label: "DIALOG_CLOSE", primary: false, callback: function(){ try { a.setLaunchStatus(true); a.setVisibility(false); } catch (e) { con.error(e); } } }, { label: "WELCOME_CONFIRM_SETTINGS", primary: true, callback: function(){ try { a.setLaunchStatus(true); a.setVisibility(false); if (!ytcenter.settingsPanelDialog) ytcenter.settingsPanelDialog = ytcenter.settingsPanel.createDialog(); ytcenter.settingsPanelDialog.setVisibility(true); } catch (e) { con.error(e); } } } ]); dialog.setWidth("530px"); }; a.setLaunchStatus = function(launch){ ytcenter.settings['welcome_launched'] = launch; ytcenter.saveSettings(); }; a.hasBeenLaunched = function(){ return ytcenter.settings['welcome_launched'] ? true : false; }; a.setVisibility = function(visible){ a.createDialog(); if (visible) { ytcenter.utils.addClass(document.body, "player-disable"); } else { ytcenter.utils.removeClass(document.body, "player-disable"); } dialog.setVisibility(visible); }; return a; })(); ytcenter.dragdrop = function(list){ function mousemove(e) { if (!dragging) return; if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } var target = e.target; if (e && e.type.indexOf("touched") !== -1 && e.changedTouches && e.changedTouches.length > 0 && e.changedTouches[0]) { e = e.changedTouches[0]; } var t = ytcenter.utils.toParent(target, "ytcenter-dragdrop-item"); if (t === draggingElement || t === document.body || typeof t === "undefined") return; var offset = ytcenter.utils.getOffset(target, t); var top = (typeof e.offsetY === "undefined" ? e.layerY : e.offsetY) + offset.top; if (top > t.clientHeight/2) { if (t.nextSibling === draggingElement) return; ytcenter.utils.insertAfter(draggingElement, t); } else { if (t.previousSibling === draggingElement) return; t.parentNode.insertBefore(draggingElement, t); } ytcenter.utils.each(listeners.onDragging, function(i, callback){ callback(getItemIndex(draggingElement) /* Current Index */, draggingIndex, draggingElement); }); return false; } function mousedownListener(e) { if (!ytcenter.utils.hasClass(e.target, "ytcenter-dragdrop-handle")) return; if (!ytcenter.utils.hasChild(list, e.target)) return; draggingElement = ytcenter.utils.toParent(e.target, "ytcenter-dragdrop-item"); if (typeof draggingElement === "undefined") return; dragging = true; ytcenter.utils.addClass(draggingElement, "ytcenter-dragdrop-dragging"); ytcenter.utils.addClass(list, "ytcenter-dragdrop-indragging"); ytcenter.utils.removeClass(list, "ytcenter-dragdrop-notdragging"); draggingIndex = getItemIndex(draggingElement); ytcenter.utils.each(listeners.onDrag, function(i, callback){ callback(draggingIndex, draggingElement); }); throttleFunc = ytcenter.utils.throttle(mousemove, 50); ytcenter.utils.addEventListener(document, "mousemove", throttleFunc, false); ytcenter.utils.addEventListener(document, "touchmove", throttleFunc, false); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mouseupListener(e) { if (!dragging) return; dragging = false; ytcenter.utils.removeClass(draggingElement, "ytcenter-dragdrop-dragging"); ytcenter.utils.removeClass(list, "ytcenter-dragdrop-indragging"); ytcenter.utils.addClass(list, "ytcenter-dragdrop-notdragging"); ytcenter.utils.each(listeners.onDrop, function(i, callback){ callback(getItemIndex(draggingElement) /* Drop Index */, draggingIndex, draggingElement); }); if (throttleFunc) ytcenter.utils.removeEventListener(document, "mousemove", throttleFunc); if (throttleFunc) ytcenter.utils.removeEventListener(document, "touchmove", throttleFunc); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function getItemIndex(item) { for (var i = 0; i < list.children.length; i++) { if (list.children[i] === item) return i; } return -1; } var dragging = false; var draggingElement; var draggingIndex; var offset; var listeners = { onDrag: [], onDragging: [], onDrop: [] }; var throttleFunc = null; ytcenter.utils.addClass(list, "ytcenter-dragdrop-notdragging"); ytcenter.utils.addEventListener(list, "mousedown", mousedownListener); ytcenter.utils.addEventListener(document, "mouseup", mouseupListener); ytcenter.utils.addEventListener(list, "touchstart", mousedownListener); ytcenter.utils.addEventListener(document, "touchend", mouseupListener); return { addEventListener: function(event, callback){ if (typeof listeners[event] === "undefined") listeners[event] = []; listeners[event].push(callback); } }; }; ytcenter.style = {}; ytcenter.style.update = function(){ var containerWidth = 985, guideWidth = 175, guideOffset = 10, contentWidth = 640, sidebarOffset = 0; var pageWidth = containerWidth + 2*(guideWidth + guideOffset), sidebarWidth = containerWidth - contentWidth - sidebarOffset; // @media and screen (max-width: ...){...} }; ytcenter.listeners = (function(){ var exports = {}; exports.addEvent = function(elm, event, callback, useCapture){ if (elm.addEventListener) { elm.addEventListener(event, callback, useCapture || false); } else if (elm.attachEvent) { elm.attachEvent("on" + event, callback); } }; return exports; })(); ytcenter.gui = {}; ytcenter.gui.icons = {}; ytcenter.gui.icons.cog = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAFM0aXcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAkFJREFUeNpi+v//P8OqVatcmVavXt3JwMDwGAAAAP//Yvr//z/D////GZhWr179f/Xq1RMBAAAA//9igqr5D8WKTAwQ0MPAwPCEgYGhBwAAAP//TMtBEUBQAAXA9ZsII8IrIIQOBHF5EdwU42TGffcT+/8e2No+MLAmmaDtMnC3PTEnuV4AAAD//zTOQRGCUAAG4YWrCbxSwQzYYDt452AGHCKQ4H9gAYNwcsabMeDyKLD7nY01SZfkn2ROMiV5n80euABf9VoFA3ArpYyt+gEe9bEDW6Uu6rMFUH8VcgdeaqMOAAcZZIiDMBQE0cdv0jQhQREMGDRB9B5Ihssguc2OhHsg4ACoKhQgSIPAbDGsG7GZee/HHhFVRByHPPRPbJ+BGbCxPU5HdQHewBrosvMFXCX1BTgAVQ4ZAXdgZftWgB3/9wRcJC3T8jaRpulgX2zXwAKY51cDXICmSOqTrQNOwEdSK+nxZZJ8VSIKoyD+24uw3CAIYhAEBZNdbK6r0ShM9AH2abRpNwhnwEfQVaPYDQZBk4KIZTX4p8wut33nMMw3Z2a6d/aqqp93W1WvSfm4gxlUVTvzIfYOgF/gy/ZzrF6KjJHtx+i9Bu5st9MeIOkGWAO+o38VuAJOgTdgPUQXwCYwB9DYHof1CegHdChpT9JI0gpwm/0BMAE+bY8bSUNgPil9BHRm+9L2ie0XYDv7+5jXkzScNv4HOAcWMr8Du6nccn5+SB//4tHs5gmwBeyEdRE46hDtS9pIhk084n8AVJscCePQvIsAAAAASUVORK5CYII="; ytcenter.gui.createMiddleAlignHack = function(content){ var e = document.createElement("div"), a = document.createElement("span"); a.className = "yt-dialog-align"; content.style.verticalAlign = "middle"; content.style.display = "inline-block"; e.appendChild(a); e.appendChild(content); return e; }; ytcenter.gui.createYouTubeButtonIcon = function(src){ var wrapper = document.createElement("span"); wrapper.className = "yt-uix-button-icon-wrapper"; var img = document.createElement("img"); img.src = src; img.alt = ""; img.style.marginLeft = "3px"; wrapper.appendChild(img); return wrapper; }; ytcenter.gui.createYouTubeButtonArrow = function(){ var img = document.createElement("img"); img.className = "yt-uix-button-arrow"; img.src = "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"; img.alt = ""; return img; }; ytcenter.gui.createYouTubeTextInput = function(){ var elm = document.createElement("input"); elm.setAttribute("type", "text"); elm.className = "yt-uix-form-input-text"; return elm; }; ytcenter.gui.createYouTubeCheckBox = function(selected){ if (typeof selected === "undefined") selected = false; var cw = document.createElement("span"); cw.className = "yt-uix-form-input-checkbox-container" + (selected ? " checked" : ""); cw.style.height = "auto"; var checkbox = document.createElement("input"); checkbox.setAttribute("type", "checkbox"); checkbox.setAttribute("value", "true"); checkbox.className = "yt-uix-form-input-checkbox"; if (selected) checkbox.checked = true; var elm = document.createElement("span"); elm.className = "yt-uix-form-input-checkbox-element"; cw.appendChild(checkbox); cw.appendChild(elm); return cw; }; ytcenter.gui.createYouTubeButtonText = function(text){ var wrapper = document.createElement("span"); wrapper.className = "yt-uix-button-content"; wrapper.textContent = text; return wrapper; }; ytcenter.gui.createYouTubeButtonTextLabel = function(label){ var wrapper = document.createElement("span"); wrapper.className = "yt-uix-button-content"; wrapper.textContent = ytcenter.language.getLocale(label); ytcenter.language.addLocaleElement(wrapper, label, "@textContent"); return wrapper; }; ytcenter.gui.createYouTubeButton = function(title, content, styles){ var btn = document.createElement("button"); if (typeof title === "string" && title !== "") { btn.setAttribute("title", ytcenter.language.getLocale(title)); ytcenter.language.addLocaleElement(btn, title, "title"); } btn.setAttribute("role", "button"); btn.setAttribute("type", "button"); btn.setAttribute("onclick", ";return false;"); btn.className = "yt-uix-tooltip-reverse yt-uix-button yt-uix-button-text yt-uix-tooltip"; if (typeof styles !== "undefined") { for (var key in styles) { if (styles.hasOwnProperty(key)) { btn.style[key] = styles[key]; } } } for (var i = 0; i < content.length; i++) { btn.appendChild(content[i]); } return btn; }; ytcenter.gui.createYouTubeDefaultButton = function(title, content, styles){ var btn = document.createElement("button"); if (title !== "") { btn.setAttribute("title", ytcenter.language.getLocale(title)); ytcenter.language.addLocaleElement(btn, title, "title"); } btn.setAttribute("role", "button"); btn.setAttribute("type", "button"); btn.setAttribute("onclick", ";return false;"); btn.className = "yt-uix-button yt-uix-button-default yt-uix-tooltip"; if (typeof styles !== "undefined") { for (var key in styles) { if (styles.hasOwnProperty(key)) { btn.style[key] = styles[key]; } } } for (var i = 0; i < content.length; i++) { btn.appendChild(content[i]); } return btn; }; ytcenter.gui.createYouTubePrimaryButton = function(title, content, styles){ var btn = document.createElement("button"); if (title !== "") { btn.setAttribute("title", ytcenter.language.getLocale(title)); ytcenter.language.addLocaleElement(btn, title, "title"); } btn.setAttribute("role", "button"); btn.setAttribute("type", "button"); btn.setAttribute("onclick", ";return false;"); btn.setAttribute("class", "yt-uix-tooltip-reverse yt-uix-button yt-uix-button-primary yt-uix-tooltip"); if (typeof styles !== "undefined") { for (var key in styles) { if (styles.hasOwnProperty(key)) { btn.style[key] = styles[key]; } } } for (var i = 0; i < content.length; i++) { btn.appendChild(content[i]); } return btn; }; ytcenter.gui.createYouTubeButtonGroup = function(buttons){ // start end var wrapper = document.createElement("span"); wrapper.className = "yt-uix-button-group"; for (var i = 0; i < buttons.length; i++) { if (i == 0) { ytcenter.utils.addClass(buttons[i], "start"); } else { ytcenter.utils.removeClass(buttons[i], "start"); } if (i === buttons.length-1) { ytcenter.utils.addClass(buttons[i], "end"); } else { ytcenter.utils.removeClass(buttons[i], "end"); } wrapper.appendChild(buttons[i]); } return wrapper; }; ytcenter.gui.createYouTubeGuideHelpBoxAfter = function(){ var after = document.createElement("div"); after.className = "after"; return after; }; ytcenter.gui.createMask = function(zIndex){ zIndex = zIndex || "4"; var iframe = document.createElement("iframe"); iframe.setAttribute("frameborder", "0"); iframe.setAttribute("src", ""); iframe.style.position = "absolute"; iframe.style.top = "0px"; iframe.style.left = "0px"; iframe.style.width = "100%"; iframe.style.height = "100%"; iframe.style.overflow = "hidden"; iframe.style.zIndex = zIndex; return iframe; }; ytcenter.listeners = (function(){ var exports = {}; exports.addEvent = function(elm, event, callback, useCapture){ if (elm.addEventListener) { elm.addEventListener(event, callback, useCapture || false); } else if (elm.attachEvent) { elm.attachEvent("on" + event, callback); } }; return exports; })(); ytcenter.modules = {}; ytcenter.modules.layoutExperiments = function(option){ function loadExperiments() { loadedOnce = true; setButtonStatus(1); ytcenter.utils.xhr({ method: "GET", url: "https://raw.github.com/YePpHa/YouTubeCenter/master/data/ytexperiments.json", ignoreCache: true, headers: { "Content-Type": "text/plain" }, onload: function(response){ try { var data = JSON.parse(response.responseText); ytcenter.settings[option.defaultSetting] = data; ytcenter.saveSettings(); setButtonStatus(2); setStatus("Updated"); update(); } catch (e) { con.error(e); setButtonStatus(3); setStatus("error"); } }, onerror: function(){ setButtonStatus(3); setStatus("error"); } }); } function setButtonStatus(status) { if (setButtonStatusTimer) uw.clearTimeout(setButtonStatusTimer); if (status === 0) { updateButton.setText("MODULES_YTEXPERIMENTS_UPDATELIST"); updateButton.setEnabled(true); } else if (status === 1) { updateButton.setText("MODULES_YTEXPERIMENTS_UPDATINGLIST"); updateButton.setEnabled(false); } else if (status === 2) { updateButton.setText("MODULES_YTEXPERIMENTS_UPDATEDLIST"); updateButton.setEnabled(true); setButtonStatusTimer = uw.setTimeout(function(){ setButtonStatus(0); }, 2500); } else if (status === 3) { updateButton.setText("MODULES_YTEXPERIMENTS_UPDATELISTERROR"); updateButton.setEnabled(true); } } function createText(data, replace) { function getText() { if (data.locale) { return ytcenter.language.getLocale(data.locale) || data.raw; } else if (data.raw_locales) { if (data.raw_locales[language]) { return data.raw_locales[language]; } else { return data.raw_locales["en-US"] || data.raw; } } else if (data.raw) { return data.raw; } } var node = document.createTextNode((replace ? ytcenter.utils.replaceTextToText(getText(), replace) : getText())); unloadEventList.push(ytcenter.events.addEvent("language-refresh", function(){ node.textContent = (replace ? ytcenter.utils.replaceTextToText(getText(), replace) : getText()); })); return node; } function createListItem(data) { var wrapper = document.createElement("li"); wrapper.className = "clearfix"; if (data.preview) { var previewWrapper = document.createElement("div"), redirectElm = document.createElement("a"), img = document.createElement("img"), src = ""; if (ytcenter.utils.isArray(data.preview)) { if (data.preview.length > 0) { var rand = Math.floor(Math.random()*data.preview.length); src = data.preview[rand]; } } else { src = data.preview; } redirectElm.href = src; redirectElm.setAttribute("target", "_blank"); img.src = src; previewWrapper.className = "layoutExperimentPreview"; redirectElm.appendChild(img); previewWrapper.appendChild(redirectElm); wrapper.appendChild(previewWrapper); } var content = document.createElement("div"); content.className = "layoutExperimentContent"; if (data.description) { var descriptionWrapper = document.createElement("div"), descriptionTitle = document.createElement("h3"), descriptionContent = document.createElement("span"); descriptionWrapper.className = "layoutExperimentDescription"; descriptionTitle.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_DESCRIPTION"); // Raw: Description unloadEventList.push(ytcenter.events.addEvent("language-refresh", function(){ descriptionTitle.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_DESCRIPTION"); })); descriptionContent.appendChild(createText(data.description)); descriptionWrapper.appendChild(descriptionTitle); descriptionWrapper.appendChild(descriptionContent); content.appendChild(descriptionWrapper); } if (data.features) { var featuresWrapper = document.createElement("div"), featuresTitle = document.createElement("h3"), featuresContent = document.createElement("ul"); featuresWrapper.className = "layoutExperimentFeatures"; featuresContent.className = "layoutExperimentFeaturesList"; featuresTitle.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_FEATURES"); // Raw: Description unloadEventList.push(ytcenter.events.addEvent("language-refresh", function(){ featuresTitle.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_FEATURES"); })); featuresWrapper.appendChild(featuresTitle); var i; for (i = 0; i < data.features.length; i++) { var item = document.createElement("li"); item.appendChild(createText(data.features[i])); featuresContent.appendChild(item); } featuresWrapper.appendChild(featuresContent); content.appendChild(featuresWrapper); } if (data.screenshots) { var screenshotsWrapper = document.createElement("div"); screenshotsWrapper.className = "layoutExperimentScreenshots"; var i; for (i = 0; i < data.screenshots.length; i++) { var screenshot = document.createElement("a"); screenshot.href = data.screenshots[i]; screenshot.setAttribute("target", "_blank"); screenshot.appendChild(createText({ locale: "MODULES_YTEXPERIMENTS_SCREENSHOTS" }, { "{number}": i + 1 })); screenshotsWrapper.appendChild(screenshot); } content.appendChild(screenshotsWrapper); } if (data.date) { // data = { expires: some data, created/started: some date } } if (data.codes) { var codesWrapper = document.createElement("div"), codesButton = ytcenter.modules.button({ args: { text: "MODULES_YTEXPERIMENTS_CODES_SELECT", listeners: [ { event: "click", callback: function(){ applyCookieCode(data.codes[0]); } } ] } }); codesWrapper.className = "layoutExperimentCodes"; codesWrapper.appendChild(codesButton.element); if (content.children.length > 0) { content.lastChild.className += " layoutExperimentPad"; } content.appendChild(codesWrapper); } wrapper.appendChild(content); return wrapper; } function update() { var i; unloadEvents(); // Unloading events list.innerHTML = ""; // Clearing the list if (ytcenter.settings[option.defaultSetting].length === 0) { var listItem = document.createElement("li"); listItem.className = "empty"; listItem.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_EMPTY"); // Raw: Description unloadEventList.push(ytcenter.events.addEvent("language-refresh", function(){ listItem.textContent = ytcenter.language.getLocale("MODULES_YTEXPERIMENTS_EMPTY"); })); list.appendChild(listItem); } else { for (i = 0; i < ytcenter.settings[option.defaultSetting].length; i++) { list.appendChild(createListItem(ytcenter.settings[option.defaultSetting][i])); } } } function unloadEvents() { var i; for (i = 0; i < unloadEventList.length; i++) { ytcenter.events.removeEvent(unloadEventList[i][0], unloadEventList[i][1]); } unloadEventList = []; } function setStatus(text) { } function applyCookieCode(code) { ytcenter.utils.setCookie("VISITOR_INFO1_LIVE", code, ".youtube.com", "/", 3600*60*24*30); loc.reload(); } function init() { var headerWrapper = document.createElement("div"), setCodeWrapper = document.createElement("div"); updateButton.element.className += " layoutExperimentsHeaderUpdateListButton"; setCodeWrapper.className = "layoutExperimentsHeaderSetCodeButton"; setButtonInput.style.width = "85px"; setButtonInput.style.height = "15px"; setButtonInput.style.verticalAlign = "middle"; setButtonInput.value = ytcenter.utils.getCookie("VISITOR_INFO1_LIVE"); setCodeWrapper.appendChild(setButton.element); setCodeWrapper.appendChild(setButtonInput); headerWrapper.appendChild(setCodeWrapper); headerWrapper.appendChild(updateButton.element); elm.className = "ytcenter-modules-layoutExperiments"; headerWrapper.className = "layoutExperimentsHeader clearfix"; list.className = "layoutExperimentList"; elm.appendChild(headerWrapper); elm.appendChild(list); } var elm = document.createElement("div"), list = document.createElement("ul"), updateButton = ytcenter.modules.button({ args: { text: "MODULES_YTEXPERIMENTS_UPDATELIST", listeners: [ { event: "click", callback: function(){ loadExperiments(); } } ] } }), setButton = ytcenter.modules.button({ args: { text: "MODULES_YTEXPERIMENTS_SETCODE", listeners: [ { event: "click", callback: function(){ applyCookieCode(setButtonInput.value); } } ] } }), setButtonInput = ytcenter.gui.createYouTubeTextInput(), unloadEventList = [], setButtonStatusTimer = null, loadedOnce = false; init(); update(); return { element: elm, bind: function(){}, update: function(){ update(); }, loadExperiments: function(){ loadExperiments(); }, hasLoadedOnce: function(){ return loadedOnce; } }; }; ytcenter.modules.aboutText = function(option){ var elm = document.createElement("div"), content1 = document.createElement("div"); content1.textContent = ytcenter.language.getLocale("SETTINGS_ABOUT_COPYRIGHTS"); elm.appendChild(content1); elm.appendChild(document.createElement("br")); elm.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("SETTINGS_ABOUT_TEXT"), { "{email}": function(){ var a = document.createElement("a"); a.href = "mailto:jepperm@gmail.com"; a.textContent = "jepperm@gmail.com"; return a; }, "{lb}": function(){ return document.createElement("br"); } })); ytcenter.events.addEvent("language-refresh", function(){ elm.innerHTML = ""; content1 = document.createElement("div"); content1.textContent = ytcenter.language.getLocale("SETTINGS_ABOUT_COPYRIGHTS"); elm.appendChild(content1); elm.appendChild(document.createElement("br")); elm.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("SETTINGS_ABOUT_TEXT"), { "{email}": function(){ var a = document.createElement("a"); a.href = "mailto:jepperm@gmail.com"; a.textContent = "jepperm@gmail.com"; return a; }, "{lb}": function(){ return document.createElement("br"); } })); }); return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.bool = function(option){ function update(checked) { checkboxInput.checked = checked; if (checked) { ytcenter.utils.addClass(checkboxOuter, "checked"); } else { ytcenter.utils.removeClass(checkboxOuter, "checked"); } } function bind(callback) { boundCallback = callback; } var boundCallback = null, frag = document.createDocumentFragment(), checkboxOuter = document.createElement("span"), checkboxInput = document.createElement("input"), checkboxOverlay = document.createElement("span"), checked = ytcenter.settings[option.defaultSetting]; if (typeof checked !== "boolean") checked = false; // Just to make sure it's a boolean! checkboxOuter.className = "yt-uix-form-input-checkbox-container" + (checked ? " checked" : ""); checkboxInput.className = "yt-uix-form-input-checkbox"; checkboxOverlay.className = "yt-uix-form-input-checkbox-element"; checkboxInput.checked = checked; checkboxInput.setAttribute("type", "checkbox"); checkboxInput.setAttribute("value", checked); checkboxOuter.appendChild(checkboxInput); checkboxOuter.appendChild(checkboxOverlay); ytcenter.utils.addEventListener(checkboxOuter, "click", function(){ checked = !checked; if (checked) { ytcenter.utils.addClass(checkboxOuter, "checked"); checkboxInput.checked = true; } else { ytcenter.utils.removeClass(checkboxOuter, "checked"); checkboxInput.checked = false; } checkboxInput.setAttribute("value", checked); if (boundCallback) boundCallback(checked); if (option && option.args && option.args.listeners) { for (var i = 0; i < option.args.listeners.length; i++) { if (option.args.listeners[i].event === "click") option.args.listeners[i].callback.apply(this, arguments); } } }, false); frag.appendChild(checkboxOuter); return { element: frag, bind: bind, update: update }; }; ytcenter.modules.button = function(option){ var elm = document.createElement("button"), languageListener = null, localeText = null; elm.setAttribute("type", "button"); elm.setAttribute("role", "button"); elm.setAttribute("onclick", ";return false;"); elm.className = "yt-uix-button yt-uix-button-default"; var c = document.createElement("span"); c.className = "yt-uix-button-content"; if (option && option.args && option.args.text) { localeText = option.args.text; c.textContent = ytcenter.language.getLocale(localeText); languageListener = ytcenter.events.addEvent("language-refresh", function(){ c.textContent = ytcenter.language.getLocale(localeText); }); } if (option && option.args && option.args.listeners) { for (var j = 0; j < option.args.listeners.length; j++) { elm.addEventListener(option.args.listeners[j].event, option.args.listeners[j].callback, (option.args.listeners[j].bubble ? option.args.listeners[j].bubble : false)); } } if (option && option.args && option.args.style) { for (var key in option.args.style) { if (option.args.style.hasOwnProperty(key)) { elm.style[key] = option.args.style[key]; } } } elm.appendChild(c); return { element: elm, bind: function(){}, update: function(){}, addEventListener: function(event, callback, bubble){ elm.addEventListener(event, callback, bubble); }, removeEventListener: function(event, callback, bubble){ elm.removeEventListener(event, callback, bubble); }, setText: function(text){ localeText = text; c.textContent = ytcenter.language.getLocale(localeText); if (!languageListener) { languageListener = ytcenter.events.addEvent("language-refresh", function(){ c.textContent = ytcenter.language.getLocale(localeText); }) } }, setStyle: function(key, value){ elm.style[key] = value; }, setEnabled: function(enabled){ elm.disabled = !enabled; } }; }; ytcenter.modules.checkbox = function(selected){ selected = selected || false; var wrapper = document.createElement("span"); wrapper.className = "ytcenter-embed"; var cw = document.createElement("span"); cw.className = "yt-uix-form-input-checkbox-container" + (selected ? " checked" : ""); var checkbox = document.createElement("input"); checkbox.setAttribute("type", "checkbox"); checkbox.setAttribute("value", "true"); checkbox.className = "yt-uix-form-input-checkbox"; if (selected) checkbox.checked = true; var elm = document.createElement("span"); elm.className = "yt-uix-form-input-checkbox-element"; cw.appendChild(checkbox); cw.appendChild(elm); wrapper.appendChild(cw); return { element: wrapper, // So the element can be appended to an element. bind: function(callback){ ytcenter.utils.addEventListener(checkbox, "change", function(){ callback(ytcenter.utils.hasClass(cw, "checked")); }, false); }, update: function(value){ if (value === true) { ytcenter.utils.addClass(cw, "checked"); checkbox.checked = true; } else { ytcenter.utils.removeClass(cw, "checked"); checkbox.checked = false; } }, fixHeight: function(){ cw.style.height = "auto"; }, isSelected: function(){ return checkbox.checked; } }; }; ytcenter.modules.colorpicker = function(option){ function update() { wrapper.style.background = ytcenter.utils.colorToHex(red, green, blue); currentColor.style.background = ytcenter.utils.colorToHex(red, green, blue); redRange.update(red); greenRange.update(green); blueRange.update(blue); htmlColor.update(ytcenter.utils.colorToHex(red, green, blue)); } function updateHueRange() { if (Math.max(red, green, blue) !== Math.min(red, green, blue)) { hsv = ytcenter.utils.getHSV(red, green, blue); hueRange.update(hsv.hue); } else { var __hsv = ytcenter.utils.getHSV(red, green, blue); if (hsv.value > hsv.saturation) { hsv.saturation = __hsv.saturation; } else if (hsv.value < hsv.saturation) { hsv.value = __hsv.value; } else { hsv.saturation = __hsv.saturation; hsv.value = __hsv.value; } hueRange.update(hsv.hue); } } function updateColorField() { if (Math.max(red, green, blue) !== Math.min(red, green, blue)) { hsv = ytcenter.utils.getHSV(red, green, blue); hueRangeField.update(hsv.hue, hsv.saturation, hsv.value); } else { var __hsv = ytcenter.utils.getHSV(red, green, blue); if (hsv.value > hsv.saturation) { hsv.saturation = __hsv.saturation; } else if (hsv.value < hsv.saturation) { hsv.value = __hsv.value; } else { hsv.saturation = __hsv.saturation; hsv.value = __hsv.value; } hueRangeField.update(hsv.hue, hsv.saturation, hsv.value); } } var red = 0, green = 0, blue = 0, sessionHex = "#000000", hsv = ytcenter.utils.getHSV(red, green, blue), _hue = hsv.hue, bCallback, wrapper = document.createElement("span"), redRange = ytcenter.modules.range({ args: { value: red, min: 0, max: 255 } }), greenRange = ytcenter.modules.range({ args: { value: green, min: 0, max: 255 } }), blueRange = ytcenter.modules.range({ args: { value: blue, min: 0, max: 255 } }), rWrapper = document.createElement("div"), rText = ytcenter.modules.label({label: "COLORPICKER_COLOR_RED"}), gWrapper = document.createElement("div"), gText = ytcenter.modules.label({label: "COLORPICKER_COLOR_GREEN"}), bWrapper = document.createElement("div"), bText = ytcenter.modules.label({label: "COLORPICKER_COLOR_BLUE"}), hueWrapper = document.createElement("div"), hueRangeField = ytcenter.modules.colorPickerField(), rgb, hueRangeHandle = document.createElement("div"), hueRangeHandleRight = document.createElement("div"), hueRange = ytcenter.modules.range({ args: { value: hsv.hue, min: 0, max: 360, method: "vertical", handle: hueRangeHandle, offset: 7 } }), d1, d2, d3, d4, d5, d6, hWrapper = document.createElement("div"), htmlColorLabel = ytcenter.utils.wrapModule(ytcenter.modules.label({label: "COLORPICKER_COLOR_HTMLCODE"})), htmlColor = ytcenter.modules.textfield(), currentColor = document.createElement("span"), rgbWrapper = document.createElement("div"), cpWrapper = document.createElement("div"), dialog; wrapper.className += " ytcenter-modules-colorpicker"; redRange.bind(function(value){ red = value; update(); updateColorField(); updateHueRange(); }); greenRange.bind(function(value){ green = value; update(); updateColorField(); updateHueRange(); }); blueRange.bind(function(value){ blue = value; update(); updateColorField(); updateHueRange(); }); rWrapper.appendChild(rText.element); rWrapper.appendChild(redRange.element); gWrapper.appendChild(gText.element); gWrapper.appendChild(greenRange.element); bWrapper.appendChild(bText.element); bWrapper.appendChild(blueRange.element); hueWrapper.className += " ytcenter-modules-colorpicker-huewrapper"; hueRangeField.bind(function(saturation, value){ hsv.saturation = saturation; hsv.value = value; rgb = ytcenter.utils.getRGB(hsv.hue, hsv.saturation, hsv.value); red = rgb.red; green = rgb.green; blue = rgb.blue; update(); }); hueRangeField.element.className += " ytcenter-modules-colorpickerfield-hue"; hueRangeHandle.className += " ytcenter-modules-range-handle"; hueRangeHandleRight.className += " ytcenter-modules-range-handle-right"; hueRangeHandle.appendChild(hueRangeHandleRight); hueRange.element.className += " ytcenter-modules-huerange ytcenter-modules-hue"; d1 = document.createElement("div"); d1.className = "ie-1"; d2 = document.createElement("div"); d2.className = "ie-2"; d3 = document.createElement("div"); d3.className = "ie-3"; d4 = document.createElement("div"); d4.className = "ie-4"; d5 = document.createElement("div"); d5.className = "ie-5"; d6 = document.createElement("div"); d6.className = "ie-6"; hueRange.element.appendChild(d1); hueRange.element.appendChild(d2); hueRange.element.appendChild(d3); hueRange.element.appendChild(d4); hueRange.element.appendChild(d5); hueRange.element.appendChild(d6); hueRange.bind(function(value){ hsv.hue = value; rgb = ytcenter.utils.getRGB(hsv.hue, hsv.saturation, hsv.value); red = rgb.red; green = rgb.green; blue = rgb.blue; update(); updateColorField(); }); hWrapper.className += " ytcenter-modules-hwrapper"; htmlColorLabel.className += " ytcenter-modules-htmlcolorlabel"; htmlColor.bind(function(value){ rgb = ytcenter.utils.hexToColor(value); red = rgb.red; green = rgb.green; blue = rgb.blue; hsv = ytcenter.utils.getHSV(red, green, blue); update(); updateColorField(); updateHueRange(); }); htmlColor.element.className += " ytcenter-modules-htmlcolor"; currentColor.className += " ytcenter-modules-currentcolor"; currentColor.style.background = sessionHex; htmlColor.element.appendChild(currentColor); hWrapper.appendChild(htmlColorLabel); hWrapper.appendChild(htmlColor.element); rgbWrapper.className += " ytcenter-modules-rgbwrapper"; rgbWrapper.appendChild(rWrapper); rgbWrapper.appendChild(gWrapper); rgbWrapper.appendChild(bWrapper); rgbWrapper.appendChild(hWrapper); if (option && option.args && option.args.presetColors && option.args.presetColors.length > 0) { var presets = document.createElement("div"), presetsLabel = ytcenter.utils.wrapModule(ytcenter.modules.label({label: "COLORPICKER_PRESETS"})), i, color; presets.className = "ytcenter-colorpicker-presets clearfix"; presetsLabel.className = "ytcenter-colorpicker-presets-label"; presets.appendChild(presetsLabel); for (i = 0; i < option.args.presetColors.length; i++) { color = document.createElement("div"); color.className = "ytcenter-colorpicker-presets-color"; color.style.background = option.args.presetColors[i]; ytcenter.utils.addEventListener(color, "click", (function(bgcolor){ return function(){ rgb = ytcenter.utils.hexToColor(bgcolor); red = rgb.red; green = rgb.green; blue = rgb.blue; hsv = ytcenter.utils.getHSV(red, green, blue); update(); updateColorField(); updateHueRange(); }; })(option.args.presetColors[i]), false); presets.appendChild(color); } rgbWrapper.appendChild(presets); } hueWrapper.appendChild(hueRangeField.element); hueWrapper.appendChild(hueRange.element); cpWrapper.className += " ytcenter-modules-cpwrapper"; cpWrapper.appendChild(hueWrapper); cpWrapper.appendChild(rgbWrapper); dialog = ytcenter.dialog("COLORPICKER_TITLE", cpWrapper, [ { label: "COLORPICKER_CANCEL", primary: false, callback: function(){ rgb = ytcenter.utils.hexToColor(sessionHex); red = rgb.red; green = rgb.green; blue = rgb.blue; update(); updateColorField(); updateHueRange(); ytcenter.events.performEvent("ui-refresh"); dialog.setVisibility(false); } }, { label: "COLORPICKER_SAVE", primary: true, callback: function(){ ytcenter.events.performEvent("ui-refresh"); sessionHex = ytcenter.utils.colorToHex(red, green, blue); if (bCallback) bCallback(sessionHex); dialog.setVisibility(false); } } ]); ytcenter.utils.addEventListener(wrapper, "click", function(){ dialog.setVisibility(true); ytcenter.events.performEvent("ui-refresh"); ytcenter.events.performEvent("settings-update"); update(); }); update(); updateColorField(); updateHueRange(); return { element: wrapper, bind: function(callback){ bCallback = callback; }, update: function(value){ sessionHex = value; rgb = ytcenter.utils.hexToColor(sessionHex); red = rgb.red; green = rgb.green; blue = rgb.blue; update(); updateColorField(); updateHueRange(); //ytcenter.events.performEvent("ui-refresh"); } }; }; ytcenter.modules.colorPickerField = function(option){ function update() { var x = sat/100*wrapper.clientWidth, y = (100 - val)/100*wrapper.clientHeight; handler.style.top = Math.round(y - handler.offsetHeight/2) + "px"; if (ytcenter.ltr) { handler.style.left = Math.round(x - handler.offsetWidth/2) + "px"; } else { handler.style.right = Math.round(wrapper.clientWidth - x - handler.offsetWidth/2) + "px"; } } function updateBackground() { wrapper.style.background = ytcenter.utils.hsvToHex(hue, 100, 100); } function eventToValue(e) { if (e && e.type.indexOf("touched") !== -1 && e.changedTouches && e.changedTouches.length > 0 && e.changedTouches[0]) { e = e.changedTouches[0]; } var offset = ytcenter.utils.getOffset(wrapper), scrollOffset = ytcenter.utils.getScrollOffset(), x = Math.max(0, Math.min(e.pageX - offset.left - scrollOffset.left, wrapper.clientWidth)), y = e.pageY - offset.top - scrollOffset.top; if (y < 0) y = 0; if (y > wrapper.clientHeight) y = wrapper.clientHeight; sat = x/wrapper.clientWidth*100; val = 100 - y/wrapper.clientHeight*100; } function mousemove(e) { if (!mousedown) return; eventToValue(e); update(); if (bCallback) bCallback(sat, val); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mousedownListener(e) { if (mousedown) return; mousedown = true; eventToValue(e); update(); if (bCallback) bCallback(sat, val); throttleFunc = ytcenter.utils.throttle(mousemove, 50); ytcenter.utils.addEventListener(document, "mousemove", throttleFunc, false); ytcenter.utils.addEventListener(document, "touchmove", throttleFunc, false); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mouseupListener(e) { if (!mousedown) return; mousedown = false; if (throttleFunc) ytcenter.utils.removeEventListener(document, "mousemove", throttleFunc, false); if (throttleFunc) ytcenter.utils.removeEventListener(document, "touchmove", throttleFunc, false); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } var bCallback, hue = (option && option.args && option.args.hue) || 0, sat = (option && option.args && option.args.sat) || 0, val = (option && option.args && option.args.val) || 0, wrapper = document.createElement("div"), _sat = document.createElement("div"), _value = document.createElement("div"), handler = document.createElement("div"), mousedown = false, throttleFunc = null; wrapper.style.background = ytcenter.utils.hsvToHex(hue, 100, 100); wrapper.style.position = "relative"; // CLASS!! wrapper.style.overflow = "hidden"; // CLASS!! _sat.className = "ytcenter-modules-colorpicker-saturation"; _value.className = "ytcenter-modules-colorpicker-value"; _sat.appendChild(_value); wrapper.appendChild(_sat); handler.className = "ytcenter-modules-colorpicker-handler"; wrapper.appendChild(handler); ytcenter.utils.addEventListener(wrapper, "mousedown", mousedownListener); ytcenter.utils.addEventListener(document, "mouseup", mouseupListener); ytcenter.utils.addEventListener(wrapper, "touchstart", mousedownListener); ytcenter.utils.addEventListener(document, "touchend", mouseupListener); /*throttleFunc = ytcenter.utils.throttle(mousemove, 50); ytcenter.utils.addEventListener(document, "mousemove", throttleFunc, false);*/ ytcenter.events.addEvent("settings-update", function(){ update(); updateBackground(); }); update(); updateBackground(); return { element: wrapper, bind: function(callback){ bCallback = callback; }, update: function(h, s, v){ hue = h; sat = s; val = v; update(); updateBackground(); } }; }; ytcenter.modules.defaultplayersizedropdown = function(option){ function getItemTitle(item) { try { var dim = ytcenter.utils.calculateDimensions(item.config.width, item.config.height); if (typeof item.config.customName !== "undefined" && item.config.customName !== "") { return item.config.customName; } else if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")); } else { return dim[0] + "×" + dim[1]; } } catch (e) { con.error(e); } } function getItemSubText(item) { try{ if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } else { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } }catch(e){con.error(e)} } function setValue(id) { selectedId = id; if (selectedId === "default") { btnLabel.textContent = ytcenter.language.getLocale("SETTINGS_RESIZE_DEFAULTPLAYERSIZE_DEFAULT"); } else { var item; ytcenter.utils.each(items, function(i, val){ if (val.id !== selectedId) return; item = val; return false; }); btnLabel.textContent = getItemTitle(item); } } function defaultItem(db) { if (typeof selectedId === "undefined") setValue("default"); if ("default" === selectedId) { setValue("default"); } var li = document.createElement("li"); li.setAttribute("role", "menuitem"); var span = document.createElement("span"); db.push(span); span.className = "yt-uix-button-menu-item" + ("default" === selectedId ? " ytcenter-resize-dropdown-selected" : ""); var title = document.createElement("span"); title.textContent = ytcenter.language.getLocale("SETTINGS_RESIZE_DEFAULTPLAYERSIZE_DEFAULT"); ytcenter.language.addLocaleElement(title, "SETTINGS_RESIZE_DEFAULTPLAYERSIZE_DEFAULT", "@textContent"); title.style.display = "block"; ytcenter.utils.addEventListener(li, "click", function(){ if ("default" === selectedId) return; setValue("default"); ytcenter.utils.each(db, function(_i, elm){ ytcenter.utils.removeClass(elm, "ytcenter-resize-dropdown-selected"); }); ytcenter.utils.addClass(span, "ytcenter-resize-dropdown-selected"); if (saveCallback) saveCallback("default"); try { document.body.click(); } catch (e) { con.error(e); } }); span.appendChild(title); li.appendChild(span); menu.appendChild(li); } function updateItems(_items) { items = _items; menu.innerHTML = ""; // Clearing it var db = []; defaultItem(db); ytcenter.utils.each(items, function(i, item){ if (typeof selectedId === "undefined") setValue(item.id); if (item.id === selectedId) { setValue(item.id); } var li = document.createElement("li"); li.setAttribute("role", "menuitem"); var span = document.createElement("span"); db.push(span); span.className = "yt-uix-button-menu-item" + (item.id === selectedId ? " ytcenter-resize-dropdown-selected" : ""); span.style.paddingBottom = "12px"; var title = document.createElement("span"); title.textContent = getItemTitle(item); title.style.display = "block"; title.style.fontWeight = "bold"; var subtext = document.createElement("span"); subtext.textContent = getItemSubText(item); subtext.style.display = "block"; subtext.style.fontSize = "11px"; subtext.style.lineHeight = "0px"; ytcenter.utils.addEventListener(li, "click", function(){ if (item.id === selectedId) return; setValue(item.id); ytcenter.utils.each(db, function(_i, elm){ ytcenter.utils.removeClass(elm, "ytcenter-resize-dropdown-selected"); }); ytcenter.utils.addClass(span, "ytcenter-resize-dropdown-selected"); if (saveCallback) saveCallback(item.id); try { document.body.click(); } catch (e) { con.error(e); } }); span.appendChild(title); span.appendChild(subtext); li.appendChild(span); menu.appendChild(li); }); } var saveCallback, selectedId = ytcenter.settings[option.defaultSetting], items, wrapper = document.createElement("div"), btnLabel = ytcenter.gui.createYouTubeButtonText("Player Sizes..."), menu = document.createElement("ul"), arrow = ytcenter.gui.createYouTubeButtonArrow(), btn = ytcenter.gui.createYouTubeDefaultButton("", [btnLabel, arrow, menu]); wrapper.style.display = "inline-block"; btnLabel.style.display = "inline-block"; btnLabel.style.width = "100%"; menu.className = "yt-uix-button-menu yt-uix-button-menu-default yt-uix-button-menu-external hid"; menu.setAttribute("role", "menu"); arrow.className += " ytcenter-arrow-fix"; btn.className += " ytcenter-button-fix"; btn.style.width = "175px"; wrapper.appendChild(btn); if (option.parent) { option.parent.addEventListener("click", function(){ selectedId = ytcenter.settings[option.defaultSetting]; var opt = ytcenter.settings[option.args.bind], found = false, i; for (i = 0; i < opt.length; i++) { if (opt[i].id === selectedId) found = true; } if (!found && selectedId !== "default") { selectedId = opt[0].id; if (saveCallback) saveCallback(selectedId); } updateItems(opt); }); } return { element: wrapper, // So the element can be appended to an element. bind: function(callback){ saveCallback = callback; }, update: function(v){ selectedId = v; var opt = ytcenter.settings[option.args.bind], found = false, i; for (i = 0; i < opt.length; i++) { if (opt[i].id === selectedId) found = true; } if (!found && selectedId !== "default") { selectedId = opt[0].id; if (saveCallback) saveCallback(selectedId); } updateItems(opt); } }; }; ytcenter.modules.element = function(option){ var elm = document.createElement(option && option.args && option.args.tagname); if (option && option.args && option.args.style) { for (var key in option.args.style) { if (option.args.style.hasOwnProperty(key)) { elm.style[key] = option.args.style[key]; } } } if (option && option.args && option.args.className) { elm.className += " " + option.args.className; } if (option && option.args && option.args.text) { elm.textContent = option.args.text; } if (option && option.args && option.args.html) { con.error("[Settings Recipe] Element attribute HTML not allowed!"); } if (option && option.args && option.args.load) { tab.addEventListener("click", function(){ option.args.load.apply(null, [elm]); }); } if (option && option.args && option.args.listeners) { for (var i = 0; i < option.args.listeners.length; i++) { elm.addEventListener(option.args.listeners[i].event, option.args.listeners[i].callback, (option.args.listeners[i].bubble ? option.args.listeners[i].bubble : false)); } } return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.importexport = function(){ var textLabel = ytcenter.gui.createYouTubeButtonTextLabel("SETTINGS_IMEX_TITLE"), content = document.createElement("div"), VALIDATOR_STRING = "YTCSettings=>", dropZone = document.createElement("div"), dropZoneContent = document.createElement("div"), filechooser = document.createElement("input"), settingsPool = document.createElement("textarea"), dialog = ytcenter.dialog("SETTINGS_IMEX_TITLE", content, [ { label: "SETTINGS_IMEX_CANCEL", primary: false, callback: function(){ dialog.setVisibility(false); } }, { name: "save", label: "SETTINGS_IMEX_SAVE", primary: true, callback: function(){ if (!saveEnabled) return; ytcenter.settings = JSON.parse(settingsPool.value); ytcenter.saveSettings(); loc.reload(); } } ]), status, loadingText = document.createElement("div"), messageText = document.createElement("div"), messageTimer, dropZoneEnabled = true, saveEnabled = true, pushMessage = function(message, color, timer){ //dropZoneEnabled = false; messageText.textContent = message; messageText.style.display = "inline-block"; if (typeof color === "string") messageText.style.color = color; else messageText.style.color = ""; status.style.display = ""; dropZoneContent.style.visibility = "hidden"; uw.clearTimeout(messageTimer); if (typeof timer === "number") { messageTimer = uw.setTimeout(function(){ removeMessage(); }, timer); } }, removeMessage = function(){ status.style.display = "none"; dropZoneContent.style.visibility = ""; messageText.style.display = "none"; messageText.textContent = ""; //dropZoneEnabled = true; uw.clearTimeout(messageTimer); }, validateFileAndLoad = function(file){ dropZone.style.border = "2px dashed rgb(187, 187, 187)"; pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_VALIDATE")); var reader = new FileReader(); reader.onerror = function(e){ switch (e.target.error.code) { case e.target.error.NOT_FOUND_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_NOT_FOUND"), "#ff0000", 10000); break; case e.target.error.NOT_READABLE_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_NOT_READABLE"), "#ff0000", 10000); break; case e.target.error.ABORT_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_ABORT"), "#ff0000", 10000); break; default: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_UNKNOWN"), "#ff0000", 10000); break; } }; reader.onabort = function(){ pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_ABORT"), "#ff0000", 10000); }; reader.onload = function(e){ if (e.target.result === VALIDATOR_STRING) { readFile(file); } else { pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_VALIDATE_ERROR_NOT_VALID"), "#ff0000", 3500); } }; reader.readAsText(file.slice(0, VALIDATOR_STRING.length)); }, readFile = function(file){ pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_LOADING")); var reader = new FileReader(); reader.onerror = function(e){ switch (e.target.error.code) { case e.target.error.NOT_FOUND_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_NOT_FOUND"), "#ff0000", 10000); break; case e.target.error.NOT_READABLE_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_NOT_READABLE"), "#ff0000", 10000); break; case e.target.error.ABORT_ERR: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_ABORT"), "#ff0000", 10000); break; default: pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_UNKNOWN"), "#ff0000", 10000); break; } }; reader.onabort = function(){ pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_ERROR_ABORT"), "#ff0000", 10000); }; reader.onload = function(e){ settingsPool.value = e.target.result; pushMessage(ytcenter.language.getLocale("SETTINGS_IMEX_IMPORT_MESSAGE"), "", 10000); }; reader.readAsText(file.slice(VALIDATOR_STRING.length)); }, exportFileButtonLabel = ytcenter.gui.createYouTubeButtonTextLabel("SETTINGS_IMEX_EXPORT_AS_FILE"), exportFileButton = ytcenter.gui.createYouTubeDefaultButton("", [exportFileButtonLabel]), statusContainer = document.createElement("div"); var elm = ytcenter.gui.createYouTubeDefaultButton("", [textLabel]); // Message Text messageText.style.fontWeight = "bold"; messageText.style.fontSize = "16px"; messageText.style.textAlign = "center"; messageText.style.width = "100%"; messageText.style.display = "none"; status = ytcenter.gui.createMiddleAlignHack(messageText); status.style.position = "absolute"; status.style.top = "0px"; status.style.left = "0px"; status.style.width = "100%"; status.style.height = "100%"; status.style.display = "none"; filechooser.setAttribute("type", "file"); ytcenter.utils.addEventListener(elm, "click", function(){ dialog.setVisibility(true); }, false); var __f = function(e){ validateFileAndLoad(e.target.files[0]); var newNode = document.createElement("input"); newNode.setAttribute("type", "file"); ytcenter.utils.addEventListener(newNode, "change", __f, false); filechooser.parentNode.replaceChild(newNode, filechooser); filechooser = newNode; }; ytcenter.utils.addEventListener(filechooser, "change", __f, false); ytcenter.utils.addEventListener(dropZone, "drop", function(e){ e.stopPropagation(); e.preventDefault(); validateFileAndLoad(e.dataTransfer.files[0]); }, false); ytcenter.utils.addEventListener(dropZone, "dragover", function(e){ if (!dropZoneEnabled) return; e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = "copy"; dropZone.style.border = "2px dashed rgb(130, 130, 130)"; }, false); ytcenter.utils.addEventListener(dropZone, "dragleave", function(e){ if (!dropZoneEnabled) return; dropZone.style.border = "2px dashed rgb(187, 187, 187)"; e.dataTransfer.dropEffect = "none"; }, false); ytcenter.utils.addEventListener(dropZone, "dragend", function(e){ if (!dropZoneEnabled) return; dropZone.style.border = "2px dashed rgb(187, 187, 187)"; e.dataTransfer.dropEffect = "none"; }, false); var text1 = document.createElement("span"); text1.style.fontWeight = "bold"; text1.style.fontSize = "16px"; text1.textContent = ytcenter.language.getLocale("SETTINGS_IMEX_DROPFILEHERE"); ytcenter.language.addLocaleElement(text1, "SETTINGS_IMEX_DROPFILEHERE", "@textContent"); dropZoneContent.appendChild(text1); dropZoneContent.appendChild(document.createElement("br")); var text2 = document.createTextNode(ytcenter.language.getLocale("SETTINGS_IMEX_OR")); ytcenter.language.addLocaleElement(text2, "SETTINGS_IMEX_OR", "@textContent"); dropZoneContent.appendChild(text2); dropZoneContent.appendChild(document.createTextNode(" ")); dropZoneContent.appendChild(filechooser); dropZone.style.position = "relative"; dropZone.style.border = "2px dashed rgb(187, 187, 187)"; dropZone.style.borderRadius = "4px"; dropZone.style.color = "rgb(110, 110, 110)"; dropZone.style.padding = "20px 0"; dropZone.style.width = "100%"; dropZone.style.marginBottom = "10px"; dropZone.style.textAlign = "center"; settingsPool.style.width = "100%"; settingsPool.style.height = "120px"; dropZoneContent.style.margin = "0 auto"; dropZoneContent.style.display = "inline-block"; if (ytcenter.ltr) { dropZoneContent.style.textAlign = "left"; } else { dropZoneContent.style.textAlign = "right"; } dropZone.appendChild(dropZoneContent); dropZone.appendChild(status); content.appendChild(dropZone); content.appendChild(settingsPool); dialog.setWidth("490px"); var settingsPoolChecker = function(){ try { JSON.parse(settingsPool.value); dialog.getActionButton("save").disabled = false; settingsPool.style.background = ""; saveEnabled = true; } catch (e) { dialog.getActionButton("save").disabled = true; settingsPool.style.background = "#FFAAAA"; saveEnabled = false; } }; ytcenter.utils.addEventListener(settingsPool, "input", settingsPoolChecker, false); ytcenter.utils.addEventListener(settingsPool, "keyup", settingsPoolChecker, false); ytcenter.utils.addEventListener(settingsPool, "paste", settingsPoolChecker, false); ytcenter.utils.addEventListener(settingsPool, "change", settingsPoolChecker, false); dialog.addEventListener("visibility", function(visible){ if (visible) settingsPool.value = JSON.stringify(ytcenter.settings); else settingsPool.value = ""; }); ytcenter.utils.addEventListener(exportFileButton, "click", function(){ try { var blob = new ytcenter.unsafe.io.Blob([VALIDATOR_STRING + settingsPool.value], { "type": "application/octet-stream" }); ytcenter.unsafe.io.saveAs(blob, "ytcenter-settings.ytcs"); } catch (e) { con.error(e); } }, false); content.appendChild(exportFileButton); return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.label = function(option){ var frag = document.createDocumentFragment(), text = document.createTextNode(ytcenter.language.getLocale(option.label)); frag.appendChild(text); ytcenter.language.addLocaleElement(text, option.label, "@textContent"); return { element: frag, // So the element can be appended to an element. bind: function(){}, update: function(){} }; }; ytcenter.modules.line = function(){ var frag = document.createDocumentFragment(), hr = document.createElement("hr"); hr.className = "yt-horizontal-rule"; frag.appendChild(hr); return { element: frag, bind: function(){}, update: function(){} }; }; ytcenter.modules.link = function(option){ var elm = document.createElement("div"), title = document.createElement("b"); if (option && option.args && option.args.titleLocale) { var __t1 = document.createTextNode(ytcenter.language.getLocale(option.args.titleLocale)), __t2 = document.createTextNode(":"); ytcenter.language.addLocaleElement(__t1, option.args.titleLocale, "@textContent", option.args.replace || {}); title.appendChild(__t1); title.appendChild(__t2); } else if (option && option.args && option.args.title) { title.textContent = option.args.title + ":"; } var content = document.createElement("div"); content.className = "ytcenter-modules-links"; for (var i = 0; i < option.args.links.length; i++) { if (i > 0) content.appendChild(document.createElement("br")); var __a = document.createElement("a"); __a.href = option.args.links[i].url; __a.textContent = option.args.links[i].text; __a.setAttribute("target", "_blank"); content.appendChild(__a); } elm.appendChild(title); elm.appendChild(content); return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.list = function(option){ function update(value) { var i; for (i = 0; i < s.options.length; i++) { if (s.options[i].value === value) { s.selectedIndex = i; break; } } } function bind(callback) { cCallback = callback; } var frag = document.createDocumentFragment(), elm = document.createElement("span"), sc = document.createElement("span"), defaultLabel, s = document.createElement("select"), list = [], defaultLabelText, sc1 = document.createElement("img"), sc2 = document.createElement("span"), cCallback; elm.className = "yt-uix-form-input-select"; sc.className = "yt-uix-form-input-select-content"; s.className = "yt-uix-form-input-select-element"; s.style.cursor = "pointer"; if (typeof option.args.list === "function") { list = option.args.list(); } else { list = option.args.list; } if (list && list.length > 0) { defaultLabelText = ytcenter.language.getLocale(list[0].label); for (var i = 0; i < list.length; i++) { var item = document.createElement("option"); item.value = list[i].value; if (typeof list[i].label === "function") { item.textContent = list[i].label(); } else if (typeof list[i].label !== "undefined") { item.textContent = ytcenter.language.getLocale(list[i].label); ytcenter.language.addLocaleElement(item, list[i].label, "@textContent"); } if (list[i].value === ytcenter.settings[option.defaultSetting]) { item.selected = true; defaultLabelText = item.textContent; } s.appendChild(item); } sc1.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; sc1.className = "yt-uix-form-input-select-arrow"; sc.appendChild(sc1); sc2.className = "yt-uix-form-input-select-value"; sc2.textContent = defaultLabelText; sc.appendChild(sc2); ytcenter.events.addEvent("language-refresh", function(){ sc2.textContent = s.options[s.selectedIndex].textContent; }); ytcenter.utils.addEventListener(s, "change", function(){ if (cCallback) cCallback(s.value); if (option && option.args && option.args.listeners) { for (var i = 0; i < option.args.listeners.length; i++) { if (option.args.listeners[i].event === "update") { option.args.listeners[i].callback(); } else { con.error("[Module:List] Unknown event " + option.args.listeners[i].event); } } } }, false); } elm.appendChild(sc); elm.appendChild(s); frag.appendChild(elm); return { element: frag, bind: bind, update: update }; }; ytcenter.modules.multilist = function(option){ function fixList(_settingData) { if (_settingData === "") return ""; var a = _settingData.split("&"), b = [], c = [], d, i; for (i = 0; i < list.length; i++) { c.push(list[i].value); } for (i = 0; i < a.length; i++) { if (a[i] !== "") { d = decodeURIComponent(a[i]); if ($ArrayIndexOf(c, d) !== -1 && $ArrayIndexOf(b, d) === -1) { b.push(a[i]); } } } return b.join("&"); } function saveItem(value) { if (settingData === "") return encodeURIComponent(value); var a = settingData.split("&"), i; for (i = 0; i < a.length; i++) { if (decodeURIComponent(a[i]) === value) return; } a.push(encodeURIComponent(value)); return a.join("&"); } function removeItem(value) { if (settingData === "") return encodeURIComponent(value); var a = settingData.split("&"), b = [], i; for (i = 0; i < a.length; i++) { if (decodeURIComponent(a[i]) !== value) { b.push(a[i]); } } return b.join("&"); } function isEnabled(value) { if (settingData === "") return false; var a = settingData.split("&"), i; for (i = 0; i < a.length; i++) { if (decodeURIComponent(a[i]) === value) return true; } return false; } function createItem(label, value) { var s = document.createElement("label"), cb = ytcenter.modules.checkbox(isEnabled(value)), text = document.createTextNode(ytcenter.language.getLocale(label)); ytcenter.language.addLocaleElement(text, label, "@textContent"); cb.bind(function(checked){ if (checked) { settingData = saveItem(value); } else { settingData = removeItem(value); } if (typeof saveCallback === "function") saveCallback(settingData); callbackListeners(); }); cb.element.style.marginRight = "6px"; s.appendChild(cb.element); s.appendChild(text); return s; } function updateList() { var d, item; settingData = fixList(settingData); wrapper.innerHTML = ""; for (var i = 0; i < list.length; i++) { d = document.createElement("div"); item = createItem(list[i].label, list[i].value); d.appendChild(item); wrapper.appendChild(d); } } function callbackListeners() { var i; if (option.args.listeners && option.args.listeners) { for (i = 0; i < option.args.listeners.length; i++) { if (option.args.listeners[i].event === "click") { option.args.listeners[i].callback(); } } } } var list = (option && option.args && option.args.list) || [], settingData, wrapper = document.createElement("div"), saveCallback; wrapper.style.paddingLeft = "16px"; settingData = ytcenter.settings[option.defaultSetting]; updateList(); return { element: wrapper, update: function(data){ settingData = data; updateList(); }, bind: function(a){ saveCallback = a; } }; }; ytcenter.modules.newline = function(option){ var elm = document.createElement("br"); if (option && option.args && option.args.style) { for (var key in option.args.style) { if (option.args.style.hasOwnProperty(key)) { elm.style[key] = option.args.style[key]; } } } return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.placement = function(args){ function createListItem(content) { var a = document.createElement("li"); a.className = "ytcenter-module-placement-item"; a.textContent = content; return a; } var template = [ { "type": "block", "id": "player", "prepend": true, "insert": false, "append": false, "content": "Player" }, { "type": "interactive", "id": "watch7-headline", "prepend": true, "insert": true, "append": false }, { "type": "interactive", "id": "watch7-sentiment-actions", "prepend": true, "insert": true, "append": false } ], predefinedElements = [ { "parent": "watch7-sentiment-actions", "id": "watch-like-dislike-buttons", "content": "Like/Dislike" }, { "parent": "watch7-headline", "id": "watch-headline-title", "content": "TITLE" } ]; var elm = document.createElement("div"), i, j, a, b, c; for (i = 0; i < template.length; i++) { a = document.createElement("ol"); if (template[i].type === "interactive") { a.className = "ytcenter-moduel-placement-interactive"; } else if (template[i].type === "block") { a.className = "ytcenter-moduel-placement-block"; } else if (template[i].type === "hidden") { a.className = "ytcenter-moduel-placement-hidden"; } if (template[i].content) a.textContent = template[i].content; if (template[i].prepend) { b = document.createElement("ol"); b.className = "ytcenter-moduel-placement-empty"; b.textContent = "+"; elm.appendChild(b); } if (template[i].insert) { for (j = 0; j < predefinedElements.length; j++) { if (predefinedElements[j].parent === template[i].id) { c = createListItem(predefinedElements[j].content); a.appendChild(c); } } } elm.appendChild(a); if (template[i].append) { b = document.createElement("ol"); b.className = "ytcenter-moduel-placement-empty"; b.textContent = "+"; elm.appendChild(b); } } return { element: elm, update: function(){}, bind: function(){} }; }; ytcenter.modules.range = function(option){ function setValue(val) { if (val === options.value) return; if (options.step !== 0) { var diff = val%options.step; if (diff >= options.step/2 && (options.step-diff)+val <= options.max) { options.value = (options.step-diff)+val; } else { options.value = val - diff; } } else { options.value = val; } update(); if (options.value > options.max) { setValue(options.max); return; } if (options.value < options.min) { setValue(options.min); return; } }; function update() { if (options.method === "vertical") { handle.style.top = ((options.value - options.min)/(options.max - options.min)*(wrapper.clientHeight - handle.offsetHeight)) + "px"; } else { handle.style.left = ((options.value - options.min)/(options.max - options.min)*(wrapper.clientWidth - handle.offsetWidth)) + "px"; handle.style.right = ((options.value - options.min)/(options.max - options.min)*(wrapper.clientWidth - handle.offsetWidth)) + "px"; } } function eventToValue(e) { var offset = ytcenter.utils.getOffset(wrapper), scrollOffset = ytcenter.utils.getScrollOffset(), v, l; if (e && e.type.indexOf("touch") !== -1 && e.changedTouches && e.changedTouches.length > 0 && e.changedTouches[0]) { e = e.changedTouches[0]; } if (options.method === "vertical") { offset.top += options.offset; v = e.pageY - scrollOffset.top - offset.top; l = v + parseInt(options.height)/2 - 3; if (l < 0) l = 0; if (l > wrapper.clientHeight - handle.clientHeight) l = wrapper.clientHeight - handle.clientHeight; setValue(l/(wrapper.clientHeight - handle.clientHeight)*(options.max - options.min) + options.min); } else { offset.left += options.offset; v = e.pageX - scrollOffset.left - offset.left; l = v - parseInt(options.height)/2; if (l < 0) l = 0; if (l > wrapper.clientWidth - handle.clientWidth) l = wrapper.clientWidth - handle.clientWidth; if (!ytcenter.ltr) l = (wrapper.clientWidth - handle.clientWidth) - l; setValue(l/(wrapper.clientWidth - handle.clientWidth)*(options.max - options.min) + options.min); } update(); } function mousemove(e){ if (!mousedown) return; eventToValue(e); if (bCallback) bCallback(options.value); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function initListeners() { /* Mouse */ ytcenter.utils.addEventListener(wrapper, "mousedown", mousedownListener); ytcenter.utils.addEventListener(document, "mouseup", mouseupListener); /* Touch */ ytcenter.utils.addEventListener(wrapper, "touchstart", mousedownListener); ytcenter.utils.addEventListener(document, "touchend", mouseupListener); } function unloadListeners() { /* Mouse */ ytcenter.utils.removeEventListener(wrapper, "mousedown", mousedownListener); ytcenter.utils.removeEventListener(document, "mouseup", mouseupListener); /* Touch */ ytcenter.utils.removeEventListener(wrapper, "touchstart", mousedownListener); ytcenter.utils.removeEventListener(document, "touchend", mouseupListener); } function mouseupListener(e) { if (!mousedown) return; mousedown = false; if (throttleFunc) ytcenter.utils.removeEventListener(document, "mousemove", throttleFunc, false); if (throttleFunc) ytcenter.utils.removeEventListener(document, "touchmove", throttleFunc, false); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mousedownListener(e) { if (mousedown) return; mousedown = true; eventToValue(e); if (bCallback) bCallback(options.value); throttleFunc = ytcenter.utils.throttle(mousemove, 50); ytcenter.utils.addEventListener(document, "mousemove", throttleFunc, false); ytcenter.utils.addEventListener(document, "touchmove", throttleFunc, false); if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } var options = ytcenter.utils.mergeObjects({ value: 0, min: 0, max: 100, step: 1, width: "225px", height: "14px", method: "horizontal", // horizontal, vertical handle: null, offset: 0 }, option.args), handle, mousedown = false, bCallback, wrapper = document.createElement("span"), throttleFunc = null; wrapper.className = "ytcenter-modules-range"; if (options.method === "vertical") { wrapper.style.width = options.height; wrapper.style.height = options.width; } else { wrapper.style.width = options.width; wrapper.style.height = options.height; } if (options.handle) { handle = options.handle; } else { handle = document.createElement("div"); handle.className = "ytcenter-modules-range-handle"; handle.style.width = (parseInt(options.height)) + "px"; handle.style.height = parseInt(options.height) + "px"; } wrapper.appendChild(handle); if (option.parent) { option.parent.addEventListener("click", function(){ setValue(options.value); update(); }); } setValue(options.value); update(); initListeners(); return { element: wrapper, bind: function(callback){ bCallback = callback; }, update: function(value){ setValue(value); update(); }, getValue: function(){ return options.value; } }; }; ytcenter.modules.rangetext = function(option){ function getValue(text) { if (prefixSuffixActive) { if (option.args.prefix && option.args.prefix !== "") { if (text.indexOf(option.args.prefix) === 0) text = text.substring(option.args.prefix.length); } if (option.args.suffix && option.args.suffix !== "") { if (text.indexOf(option.args.suffix) === text.length - option.args.suffix.length) text = text.substring(0, text.length - option.args.suffix.length); } } text = parseInt(text, 10); if (isNaN(text) || text === Infinity) text = 0; return text; } function update() { _text.value = (option.args.prefix ? option.args.prefix : "") + Math.round(range.getValue()) + (option.args.suffix ? option.args.suffix : ""); prefixSuffixActive = true; } var range = ytcenter.modules.range(option), wrapper = document.createElement("div"), bCallback, prefixSuffixActive = true; wrapper.style.display = "inline-block"; wrapper.appendChild(range.element); var _text = document.createElement("input"); _text.setAttribute("type", "text"); _text.value = Math.round(range.getValue()); _text.className = "ytcenter-modules-rangetext"; if (option.args["text-width"]) { _text.style.width = option.args["text-width"]; } wrapper.appendChild(_text); range.bind(function(value){ update(); if (bCallback) bCallback(value); }); if (option.parent) { option.parent.addEventListener("click", function(){ update(); }); } _text.addEventListener("focus", function(){ var val = getValue(this.value); range.update(val); var sel = ytcenter.utils.getCaretPosition(this); this.value = val; prefixSuffixActive = false; ytcenter.utils.setCaretPosition(this, sel); this.setSelectionRange(); }, false); _text.addEventListener("blur", function(){ var val = getValue(this.value); range.update(val); val = range.getValue(); if (bCallback) bCallback(val); update(); }, false); _text.addEventListener("input", function(){ var val = getValue(this.value); range.update(val); }, false); _text.addEventListener("change", function(){ var val = getValue(this.value); range.update(val); val = range.getValue(); if (bCallback) bCallback(val); update(); }, false); return { element: wrapper, bind: function(callback){ var a = null, b = false, c = null; bCallback = function(value){ c = value; if (b) { return; } b = true; uw.clearTimeout(a); a = uw.setTimeout(function(){ callback(c); b = false; }, 500); }; }, update: function(value){ range.update(value); update(); }, getValue: function(){ return range.getValue(); } }; }; ytcenter.modules.resizedropdown = function(option){ function getItemTitle(item) { var dim = ytcenter.utils.calculateDimensions(item.config.width, item.config.height); if (typeof item.config.customName !== "undefined" && item.config.customName !== "") { return item.config.customName; } else if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")); subtext.textContent = (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")); } else { return dim[0] + "×" + dim[1]; subtext.textContent = (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")); } } function getItemSubText(item) { if (isNaN(parseInt(item.config.width)) && isNaN(parseInt(item.config.height))) { return (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } else { return (item.config.large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.config.align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.config.scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } } function setValue(id) { selectedId = id; var item; ytcenter.utils.each(items, function(i, val){ if (val.id !== selectedId) return; item = val; return false; }); btnLabel.textContent = getItemTitle(item); } function updateItems(_items) { items = _items; menu.innerHTML = ""; // Clearing it var db = []; ytcenter.utils.each(items, function(i, item){ if (typeof selectedId === "undefined") setValue(item.id); if (item.id === selectedId) { setValue(item.id); } var li = document.createElement("li"); li.setAttribute("role", "menuitem"); var span = document.createElement("span"); db.push(span); span.className = "yt-uix-button-menu-item" + (item.id === selectedId ? " ytcenter-resize-dropdown-selected" : ""); span.style.paddingBottom = "12px"; var title = document.createElement("span"); title.textContent = getItemTitle(item); title.style.display = "block"; title.style.fontWeight = "bold"; var subtext = document.createElement("span"); subtext.textContent = getItemSubText(item); subtext.style.display = "block"; subtext.style.fontSize = "11px"; subtext.style.lineHeight = "0px"; ytcenter.utils.addEventListener(li, "click", function(){ if (item.id === selectedId) return; setValue(item.id); ytcenter.utils.each(db, function(_i, elm){ ytcenter.utils.removeClass(elm, "ytcenter-resize-dropdown-selected"); }); ytcenter.utils.addClass(span, "ytcenter-resize-dropdown-selected"); if (saveCallback) saveCallback(item.id); try { document.body.click(); } catch (e) { con.error(e); } }); span.appendChild(title); span.appendChild(subtext); li.appendChild(span); menu.appendChild(li); }); } var saveCallback; var selectedId; var items; var wrapper = document.createElement("div"); wrapper.className = "ytcenter-embed"; var btnLabel = ytcenter.gui.createYouTubeButtonText("Player Sizes..."); btnLabel.style.display = "inline-block"; btnLabel.style.width = "100%"; var menu = document.createElement("ul"); menu.className = "yt-uix-button-menu yt-uix-button-menu-default yt-uix-button-menu-external hid"; menu.setAttribute("role", "menu"); var arrow = ytcenter.gui.createYouTubeButtonArrow(); arrow.style.marginLeft = "-10px"; var btn = ytcenter.gui.createYouTubeDefaultButton("", [btnLabel, arrow, menu]); btn.style.width = "175px"; btn.style.textAlign = "left"; wrapper.appendChild(btn); updateItems(ytcenter.settings[option.defaultSetting]); if (option.parent) { option.parent.addEventListener("click", function(){ var opt = ytcenter.settings[option.defaultSetting]; var found = false; for (var i = 0; i < opt.length; i++) { if (opt[i].id === selectedId) found = true; } if (!found) { selectedId = opt[0].id; if (saveCallback) saveCallback(selectedId); } updateItems(opt); }); } return { element: wrapper, // So the element can be appended to an element. bind: function(callback){ saveCallback = callback; }, update: function(v){ selectedId = v; updateItems(items); } }; }; ytcenter.modules.resizeItemList = function(option){ function wrapItem(item) { if (typeof item.getItemElement !== "undefined") return item; // It's already been processed var selected = false; var li = document.createElement("li"); li.className = "ytcenter-list-item ytcenter-dragdrop-item"; var order = document.createElement("div"); order.className = "ytcenter-dragdrop-handle"; var content = document.createElement("div"); content.className = "ytcenter-list-item-content"; var title = document.createElement("span"); title.className = "ytcenter-list-item-title"; var subtext = document.createElement("span"); subtext.className = "ytcenter-list-item-subtext"; content.appendChild(title); content.appendChild(subtext); li.appendChild(order); li.appendChild(content); ytcenter.utils.addEventListener(content, "click", function(){ if (selected) return; selectSizeItem(item.id); }); var out = { getId: function(){ return item.id; }, getData: function(){ return item; }, getConfig: function(){ return item.config; }, setConfig: function(conf){ item.config = conf; }, updateItemElement: function(){ var dim = ytcenter.utils.calculateDimensions(item.config.width, item.config.height); title.textContent = getItemTitle(out); subtext.textContent = getItemSubText(out); }, getItemElement: function(){ return li; }, select: function(){ if (selected) return; selectSizeItem(item.id); }, setSelection: function(_selected){ selected = _selected; if (selected) { ytcenter.utils.addClass(li, "ytcenter-list-item-selected"); } else { ytcenter.utils.removeClass(li, "ytcenter-list-item-selected"); } } }; out.updateItemElement(); ytcenter.events.addEvent("ui-refresh", function(){ out.updateItemElement(); }); return out; } function getItemInfo(item) { var exports = {}; var dim = ytcenter.utils.calculateDimensions(item.getConfig().width, item.getConfig().height); if (item.getConfig().width === "" && item.getConfig().height === "") { exports.width = ""; exports.height = ""; } else { if (typeof dim[0] === "number" && !isNaN(parseInt(item.getConfig().width))) { exports.width = dim[0] + "px"; } else if (!isNaN(parseInt(item.getConfig().width))) { exports.width = dim[0]; } else { exports.width = ""; } if (typeof dim[1] === "number" && !isNaN(parseInt(item.getConfig().height))) { exports.height = dim[1] + "px"; } else if (!isNaN(parseInt(item.getConfig().height))) { exports.height = dim[1]; } else { exports.height = ""; } } exports.large = item.getConfig().large; exports.align = item.getConfig().align; exports.scrollToPlayer = item.getConfig().scrollToPlayer; exports.scrollToPlayerButton = item.getConfig().scrollToPlayerButton; exports.customName = (typeof item.getConfig().customName === "undefined" ? "" : item.getConfig().customName); exports.aspectRatioLocked = (typeof item.getConfig().aspectRatioLocked === "undefined" ? false : item.getConfig().aspectRatioLocked); return exports; } function createEditor() { function hasUnsavedChanges() { if (state === 0) return false; if (state === 2) return true; if (original.width !== __getWidth()) return true; if (original.height !== __getHeight()) return true; if (original.large !== largeInput.isSelected()) return true; if (original.align !== alignInput.isSelected()) return true; if (original.scrollToPlayer !== scrollToPlayerInput.isSelected()) return true; if (original.scrollToPlayerButton !== scrollToPlayerButtonInput.isSelected()) return true; if (original.customName !== customNameInput.value) return true; if (original.aspectRatioLocked !== ratioLocked) return true; return false; } var __getWidth = function(){ if (isNaN(parseInt(widthInput.value))) { return widthUnit.getValue(); } else { return parseInt(widthInput.value) + widthUnit.getValue(); } }; var __getHeight = function(){ if (isNaN(parseInt(heightInput.value))) { return heightUnit.getValue(); } else { return parseInt(heightInput.value) + heightUnit.getValue(); } }; var __getAspectRatio = function(){ if (isNaN(parseInt(widthInput.value)) || isNaN(parseInt(heightInput.value)) || widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; return parseInt(widthInput.value)/parseInt(heightInput.value); }; var __updateAspectRatio = function(){ aspectRatio = __getAspectRatio(); }; var __setAspectRatioLocked = function(locked){ ratioLocked = locked; if (ratioLocked) { ytcenter.utils.addClass(ratioIcon, "ytcenter-resize-chain"); ytcenter.utils.removeClass(ratioIcon, "ytcenter-resize-unchain"); aspectRatio = __getAspectRatio(); } else { ytcenter.utils.removeClass(ratioIcon, "ytcenter-resize-chain"); ytcenter.utils.addClass(ratioIcon, "ytcenter-resize-unchain"); aspectRatio = undefined; } }; var __setAspectVisibility = function(visible){ if (visible) { ytcenter.utils.removeClass(linkBorder, "force-hid"); ytcenter.utils.removeClass(ratioIcon, "force-hid"); } else { ytcenter.utils.addClass(linkBorder, "force-hid"); ytcenter.utils.addClass(ratioIcon, "force-hid"); } }; var saveListener, cancelListener, deleteListener, newSessionCallback; var original = {}; var state = 0; var ratioLocked = false; var aspectRatio; var wrp = document.createElement("div"); wrp.style.visibility = "hidden"; // Editor Panel var customNameWrapper = document.createElement("div"); customNameWrapper.className = "ytcenter-panel-label"; var customNameLabel = document.createElement("label"); customNameLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_CUSTOMNAME"); ytcenter.language.addLocaleElement(customNameLabel, "EMBED_RESIZEITEMLIST_CUSTOMNAME", "@textContent"); customNameWrapper.appendChild(customNameLabel); var customNameInput = ytcenter.gui.createYouTubeTextInput(); customNameInput.style.width = "210px"; customNameWrapper.appendChild(customNameInput); var dimensionWrapper = document.createElement("div"); var sizeWrapper = document.createElement("div"); sizeWrapper.style.display = "inline-block"; var widthWrapper = document.createElement("div"); widthWrapper.className = "ytcenter-panel-label"; var widthLabel = document.createElement("label"); widthLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_WIDTH"); ytcenter.language.addLocaleElement(widthLabel, "EMBED_RESIZEITEMLIST_WIDTH", "@textContent"); widthWrapper.appendChild(widthLabel); var widthInput = ytcenter.gui.createYouTubeTextInput(); widthInput.style.width = "105px"; widthWrapper.appendChild(widthInput); ytcenter.utils.addEventListener(widthInput, "change", function(){ if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; aspectRatio = __getAspectRatio(); }); ytcenter.utils.addEventListener(widthInput, "input", function(){ if (isNaN(parseInt(widthInput.value))) widthInput.value = ""; else widthInput.value = parseInt(widthInput.value); if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; if (typeof aspectRatio === "undefined" || !ratioLocked) return; if (isNaN(parseInt(widthInput.value))) { heightInput.value = ""; } else if (aspectRatio !== 0) { heightInput.value = Math.round(parseInt(widthInput.value)/aspectRatio); } }); var widthUnit = ytcenter.modules.select({args: {list: [ {label: "EMBED_RESIZEITEMLIST_PIXEL", value: "px"}, {label: "EMBED_RESIZEITEMLIST_PERCENT", value: "%"} ]}}); widthUnit.bind(function(){ if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") { __setAspectVisibility(false); return; } __setAspectVisibility(true); aspectRatio = __getAspectRatio(); }); widthWrapper.appendChild(widthUnit.element); sizeWrapper.appendChild(widthWrapper); var heightWrapper = document.createElement("div"); heightWrapper.className = "ytcenter-panel-label"; var heightLabel = document.createElement("label"); heightLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_HEIGHT"); ytcenter.language.addLocaleElement(heightLabel, "EMBED_RESIZEITEMLIST_HEIGHT", "@textContent"); heightWrapper.appendChild(heightLabel); var heightInput = ytcenter.gui.createYouTubeTextInput(); heightInput.style.width = "105px"; heightWrapper.appendChild(heightInput); ytcenter.utils.addEventListener(heightInput, "change", function(){ if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; aspectRatio = __getAspectRatio(); }); ytcenter.utils.addEventListener(heightInput, "input", function(){ if (isNaN(parseInt(heightInput.value))) heightInput.value = ""; else heightInput.value = parseInt(heightInput.value); if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; if (typeof aspectRatio === "undefined" || !ratioLocked) return; if (isNaN(parseInt(heightInput.value))) { widthInput.value = ""; } else if (aspectRatio !== 0) { widthInput.value = Math.round(parseInt(heightInput.value)*aspectRatio); } }); var heightUnit = ytcenter.modules.select({args: {list: [ {label: "EMBED_RESIZEITEMLIST_PIXEL", value: "px"}, {label: "EMBED_RESIZEITEMLIST_PERCENT", value: "%"} ]}}); heightUnit.bind(function(){ if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") { __setAspectVisibility(false); return; } __setAspectVisibility(true); aspectRatio = __getAspectRatio(); }); heightWrapper.appendChild(heightUnit.element); sizeWrapper.appendChild(heightWrapper); dimensionWrapper.appendChild(sizeWrapper); var linkBorder = document.createElement("div"); linkBorder.className = "ytcenter-resize-aspect-bind"; dimensionWrapper.appendChild(linkBorder); var ratioIcon = document.createElement("div"); ratioIcon.className = "ytcenter-resize-unchain ytcenter-resize-ratio"; ratioIcon.style.display = "inline-block"; ratioIcon.style.marginBottom = "13px"; ratioIcon.style.marginLeft = "-11px"; ratioIcon.style.width = "20px"; ytcenter.utils.addEventListener(ratioIcon, "click", function(e){ if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") return; if (ratioLocked) { __setAspectRatioLocked(false); } else { __setAspectRatioLocked(true); } if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; }); dimensionWrapper.appendChild(ratioIcon); var largeWrapper = document.createElement("div"); largeWrapper.className = "ytcenter-panel-label"; var largeLabel = document.createElement("label"); largeLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_LARGE"); ytcenter.language.addLocaleElement(largeLabel, "EMBED_RESIZEITEMLIST_LARGE", "@textContent"); largeWrapper.appendChild(largeLabel); var largeInput = ytcenter.modules.checkbox(); largeInput.element.style.background = "#fff"; largeInput.fixHeight(); largeWrapper.appendChild(largeInput.element); var alignWrapper = document.createElement("div"); alignWrapper.className = "ytcenter-panel-label"; var alignLabel = document.createElement("label"); alignLabel.textContent = "Align"; alignLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_ALIGN"); ytcenter.language.addLocaleElement(alignLabel, "EMBED_RESIZEITEMLIST_ALIGN", "@textContent"); alignWrapper.appendChild(alignLabel); var alignInput = ytcenter.modules.checkbox(); alignInput.element.style.background = "#fff"; alignInput.fixHeight(); alignWrapper.appendChild(alignInput.element); var scrollToPlayerWrapper = document.createElement("div"); scrollToPlayerWrapper.className = "ytcenter-panel-label"; var scrollToPlayerLabel = document.createElement("label"); scrollToPlayerLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_SCROLLTOPLAYER"); ytcenter.language.addLocaleElement(scrollToPlayerLabel, "EMBED_RESIZEITEMLIST_SCROLLTOPLAYER", "@textContent"); scrollToPlayerWrapper.appendChild(scrollToPlayerLabel); var scrollToPlayerInput = ytcenter.modules.checkbox(); scrollToPlayerInput.element.style.background = "#fff"; scrollToPlayerInput.fixHeight(); scrollToPlayerWrapper.appendChild(scrollToPlayerInput.element); var scrollToPlayerButtonWrapper = document.createElement("div"); scrollToPlayerButtonWrapper.className = "ytcenter-panel-label"; var scrollToPlayerButtonLabel = document.createElement("label"); scrollToPlayerButtonLabel.textContent = ytcenter.language.getLocale("EMBED_RESIZEITEMLIST_SCROLLTOPLAYERBUTTON"); ytcenter.language.addLocaleElement(scrollToPlayerButtonLabel, "EMBED_RESIZEITEMLIST_SCROLLTOPLAYERBUTTON", "@textContent"); scrollToPlayerButtonWrapper.appendChild(scrollToPlayerButtonLabel); var scrollToPlayerButtonInput = ytcenter.modules.checkbox(); scrollToPlayerButtonInput.element.style.background = "#fff"; scrollToPlayerButtonInput.fixHeight(); scrollToPlayerButtonWrapper.appendChild(scrollToPlayerButtonInput.element); var optionsWrapper = document.createElement("div"); optionsWrapper.className = "clearfix resize-options"; var saveBtn = ytcenter.gui.createYouTubePrimaryButton("", [ytcenter.gui.createYouTubeButtonTextLabel("SETTINGS_PLAYERSIZE_SAVE")]); saveBtn.className += " resize-options-right"; ytcenter.utils.addEventListener(saveBtn, "click", function(){ state = 0; wrp.style.visibility = "hidden"; if (typeof saveListener !== "undefined") saveListener(); ytcenter.events.performEvent("ui-refresh"); }); var cancelBtn = ytcenter.gui.createYouTubeDefaultButton("", [ytcenter.gui.createYouTubeButtonTextLabel("SETTINGS_PLAYERSIZE_CANCEL")]); cancelBtn.className += " resize-options-right"; ytcenter.utils.addEventListener(cancelBtn, "click", function(){ if (hasUnsavedChanges()) { ytcenter.confirmBox("EMBED_RESIZEITEMLIST_CONFIRM_TITLE", "EMBED_RESIZEITEMLIST_UNSAVED_CONFIRM_MESSAGE", function(accepted){ if (accepted) { state = 0; wrp.style.visibility = "hidden"; if (typeof cancelListener !== "undefined") cancelListener(); ytcenter.events.performEvent("ui-refresh"); } }); } else { state = 0; wrp.style.visibility = "hidden"; if (typeof cancelListener !== "undefined") cancelListener(); ytcenter.events.performEvent("ui-refresh"); } }); var deleteBtn = ytcenter.gui.createYouTubeDefaultButton("", [ytcenter.gui.createYouTubeButtonTextLabel("SETTINGS_PLAYERSIZE_DELETE")]); deleteBtn.className += " resize-options-left"; ytcenter.utils.addEventListener(deleteBtn, "click", function(){ ytcenter.confirmBox("EMBED_RESIZEITEMLIST_DELETE_CONFIRM_TITLE", "EMBED_RESIZEITEMLIST_DELETE_CONFIRM_MESSAGE", function(del){ if (del) { state = 0; wrp.style.visibility = "hidden"; if (typeof deleteListener !== "undefined") deleteListener(); ytcenter.events.performEvent("ui-refresh"); } }, "EMBED_RESIZEITEMLIST_CONFIRM_DELETE"); }); optionsWrapper.appendChild(deleteBtn); optionsWrapper.appendChild(saveBtn); optionsWrapper.appendChild(cancelBtn); wrp.appendChild(customNameWrapper); wrp.appendChild(dimensionWrapper); wrp.appendChild(largeWrapper); wrp.appendChild(alignWrapper); wrp.appendChild(scrollToPlayerWrapper); wrp.appendChild(scrollToPlayerButtonWrapper); wrp.appendChild(optionsWrapper); editWrapper.appendChild(wrp); return { destroy: function(){ editWrapper.removeChild(wrp); }, hasUnsavedChanges: hasUnsavedChanges, setState: function(s){ state = s; }, setDeleteButtonVisibility: function(visible) { if (visible) { deleteBtn.style.visibility = ""; } else { deleteBtn.style.visibility = "hidden"; } }, setSaveListener: function(callback){ saveListener = callback; }, setCancelListener: function(callback){ cancelListener = callback; }, setDeleteListener: function(callback){ deleteListener = callback; }, updateAspectRatio: function(){ __updateAspectRatio(); }, getAspectRatio: function(){ return aspectRatio; }, setAspectRatioLocked: function(locked){ __setAspectRatioLocked(locked); original.aspectRatioLocked = ratioLocked; }, isAspectRatioLocked: function(){ return ratioLocked; }, setWidth: function(width){ state = 1; if (width === "") { // Default widthInput.value = ""; widthUnit.setSelected("px"); width = "px"; } else { var _val = parseInt(width); if (isNaN(_val)) { widthInput.value = ""; } else { widthInput.value = _val; } widthUnit.setSelected((width.indexOf("%") !== -1 ? "%" : "px")); } original.width = __getWidth(); if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") { __setAspectVisibility(false); } else { __setAspectVisibility(true); } }, getWidth: __getWidth, setHeight: function(height){ state = 1; if (height === "") { // Default heightInput.value = ""; heightUnit.setSelected("px"); height = "px"; } else { var _val = parseInt(height); if (isNaN(_val)) { heightInput.value = ""; } else { heightInput.value = _val; } heightUnit.setSelected((height.indexOf("%") !== -1 ? "%" : "px")); } original.height = __getHeight(); if (widthUnit.getValue() !== "px" || heightUnit.getValue() !== "px") { __setAspectVisibility(false); } else { __setAspectVisibility(true); } }, getHeight: __getHeight, setLarge: function(large){ state = 1; largeInput.update(large); original.large = largeInput.isSelected(); }, getLarge: function(){ return largeInput.isSelected(); }, setAlign: function(align){ state = 1; alignInput.update(align); original.align = alignInput.isSelected(); }, getAlign: function(){ return alignInput.isSelected(); }, setScrollToPlayer: function(scrollToPlayer){ state = 1; scrollToPlayerInput.update(scrollToPlayer); original.scrollToPlayer = scrollToPlayerInput.isSelected(); }, getScrollToPlayer: function(){ return scrollToPlayerInput.isSelected(); }, setScrollToPlayerButton: function(scrollToPlayerButton){ state = 1; scrollToPlayerButtonInput.update(scrollToPlayerButton); original.scrollToPlayerButton = scrollToPlayerButtonInput.isSelected(); }, getScrollToPlayerButton: function(){ return scrollToPlayerButtonInput.isSelected(); }, setCustomName: function(customName){ if (typeof customName !== "string") customName = ""; state = 1; customNameInput.value = customName; original.customName = customName; }, getCustomName: function(){ return customNameInput.value; }, setVisibility: function(visible) { if (visible) { wrp.style.visibility = ""; } else { wrp.style.visibility = "hidden"; } }, newSession: function(){ if (typeof newSessionCallback !== "undefined") newSessionCallback(); }, setSessionListener: function(callback){ newSessionCallback = callback; }, focusCustomNameField: function(){ customNameInput.focus(); }, focusWidthField: function(){ widthInput.focus(); }, focusHeightField: function(){ heightInput.focus(); } }; } function getItemTitle(item) { var dim = ytcenter.utils.calculateDimensions(item.getConfig().width, item.getConfig().height); if (typeof item.getConfig().customName !== "undefined" && item.getConfig().customName !== "") { return item.getConfig().customName; } else if (isNaN(parseInt(item.getConfig().width)) && isNaN(parseInt(item.getConfig().height))) { return (item.getConfig().large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")); subtext.textContent = (item.getConfig().align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")); } else { return dim[0] + "×" + dim[1]; subtext.textContent = (item.getConfig().large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.getConfig().align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")); } } function getItemSubText(item) { if (isNaN(parseInt(item.getConfig().width)) && isNaN(parseInt(item.getConfig().height))) { return (item.getConfig().align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.getConfig().scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } else { return (item.getConfig().large ? ytcenter.language.getLocale("SETTINGS_RESIZE_LARGE") : ytcenter.language.getLocale("SETTINGS_RESIZE_SMALL")) + " - " + (item.getConfig().align ? ytcenter.language.getLocale("SETTINGS_RESIZE_ALIGN") : ytcenter.language.getLocale("SETTINGS_RESIZE_CENTER")) + (item.getConfig().scrollToPlayer ? " - " + ytcenter.language.getLocale("SETTINGS_RESIZE_SCROLLTOPLAYER") : ""); } } function updateListHeight() { var _h = editWrapper.clientHeight || editWrapper.scrollHeight; if (_h > 0) listWrapper.style.height = _h + "px"; } function selectSizeItem(id) { var bypassConfirm = false; if (typeof editor === "undefined") { bypassConfirm = true; editor = createEditor(); } var overrideData = function(){ editor.newSession(); var newItem = false; var newItemSaved = false; var newItemCancled = false; var item; if (typeof id === "undefined") { newItem = true; item = createEmptyItem(); items.push(item); listOl.appendChild(item.getItemElement()); listOl.scrollTop = listOl.scrollHeight - listOl.clientHeight; } else { item = getItemById(id); } markItem(item.getId()); var inf = getItemInfo(item); editor.setCustomName(inf.customName); editor.setWidth(inf.width); editor.setHeight(inf.height); editor.setAspectRatioLocked(inf.aspectRatioLocked); editor.setLarge(inf.large); editor.setAlign(inf.align); editor.setScrollToPlayer(inf.scrollToPlayer); editor.setScrollToPlayerButton(inf.scrollToPlayerButton); editor.updateAspectRatio(); editor.setSessionListener(function(){ if (!newItem || newItemSaved || newItemCancled) return; var sI; for (var i = 0; i < items.length; i++) { sI = i; if (items[i].getId() === item.getId()) break; } items.splice(sI, 1); if (typeof item.getItemElement().parentNode !== "undefined") item.getItemElement().parentNode.removeChild(item.getItemElement()); if (typeof saveCallback !== "undefined") saveCallback(getSaveArray()); }); editor.setSaveListener(function(){ newItemSaved = true; item.setConfig({ customName: editor.getCustomName(), width: editor.getWidth(), height: editor.getHeight(), large: editor.getLarge(), align: editor.getAlign(), scrollToPlayer: editor.getScrollToPlayer(), scrollToPlayerButton: editor.getScrollToPlayerButton(), aspectRatioLocked: editor.isAspectRatioLocked() }); item.updateItemElement(); unMarkAllItems(); if (typeof saveCallback !== "undefined") saveCallback(getSaveArray()); }); editor.setCancelListener(function(){ if (newItem) { newItemCancled = true; var sI; for (var i = 0; i < items.length; i++) { sI = i; if (items[i].getId() === item.getId()) break; } items.splice(sI, 1); if (item.getItemElement().parentNode) item.getItemElement().parentNode.removeChild(item.getItemElement()); if (typeof saveCallback !== "undefined") saveCallback(getSaveArray()); } unMarkAllItems(); }); editor.setDeleteListener(function(){ try { if (newItem) return; if (ytcenter.player.isSelectedPlayerSizeById(item.getId())) { if (ytcenter.settings["resize-playersizes"][0].id === item.getId()) { if (ytcenter.settings["resize-playersizes"].length > 1) { ytcenter.player.resize(ytcenter.settings["resize-playersizes"][1]); } } else { ytcenter.player.resize(ytcenter.settings["resize-playersizes"][0]); } } unMarkAllItems(); if (typeof item.getItemElement().parentNode !== "undefined") item.getItemElement().parentNode.removeChild(item.getItemElement()); var sI; for (var i = 0; i < items.length; i++) { sI = i; if (items[i].getId() === item.getId()) break; } items.splice(sI, 1); if (typeof saveCallback !== "undefined") saveCallback(getSaveArray()); } catch (e) { con.error(e); } }); editor.setDeleteButtonVisibility(!newItem); editor.setVisibility(true); editor.focusCustomNameField(); if (newItem) editor.setState(2); }; if (editor.hasUnsavedChanges() && !bypassConfirm) { ytcenter.confirmBox("EMBED_RESIZEITEMLIST_CONFIRM_TITLE", "EMBED_RESIZEITEMLIST_UNSAVED_CONFIRM_MESSAGE", function(accepted){ if (accepted) { editor.setState(0); overrideData(); } }); } else { overrideData(); } updateListHeight(); } function getItemById(id) { for (var i = 0; i < items.length; i++) { if (items[i].getId() === id) return items[i]; } } function unMarkAllItems() { for (var i = 0; i < items.length; i++) { items[i].setSelection(false); } } function markItem(id) { unMarkAllItems(); getItemById(id).setSelection(true); } function getSaveArray() { var _s = []; for (var i = 0; i < items.length; i++) { _s.push(items[i].getData()); } return _s; } function getItemByElement(li) { for (var i = 0; i < items.length; i++) { if (items.getItemElement() === li) return items[i]; } } function createEmptyItem() { return wrapItem({ id: ytcenter.utils.assignId("resize_item_list_"), config: { customName: "", width: "", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false, aspectRatioLocked: false } }); } function setItems(_items) { items = []; ytcenter.utils.each(_items, function(i, item){ items.push(wrapItem(item)); }); listOl.innerHTML = ""; ytcenter.utils.each(items, function(i, item){ var a = item.getItemElement(); listOl.appendChild(a); }); } var editor; var saveCallback; var items = []; var lastValue = ytcenter.settings[option.defaultSetting]; var wrapper = document.createElement("div"); wrapper.className = "ytcenter-embed ytcenter-resize-panel"; var headerWrapper = document.createElement("div"); headerWrapper.className = "ytcenter-resize-panel-header"; var addButton = ytcenter.gui.createYouTubeDefaultButton("", [ytcenter.gui.createYouTubeButtonTextLabel("EMBED_RESIZEITEMLIST_ADD_SIZE")]); ytcenter.utils.addClass(addButton, "ytcenter-list-header-btn"); ytcenter.utils.addEventListener(addButton, "click", function(){ selectSizeItem(); }); headerWrapper.appendChild(addButton); var contentWrapper = document.createElement("div"); contentWrapper.className = "ytcenter-resize-panel-content"; var positionerEditWrapper = document.createElement("div"); positionerEditWrapper.className = "ytcenter-resize-panel-right"; var editWrapper = document.createElement("div"); editWrapper.className = "ytcenter-panel"; positionerEditWrapper.appendChild(editWrapper); var listWrapper = document.createElement("div"); listWrapper.className = "ytcenter-resize-panel-list"; var listOl = document.createElement("ol"); listOl.className = "ytcenter-list ytcenter-dragdrop ytcenter-scrollbar ytcenter-scrollbar-hover"; var dd = ytcenter.dragdrop(listOl); dd.addEventListener("onDrop", function(newIndex, oldIndex, item){ var itm = items[oldIndex]; items.splice(oldIndex, 1); items.splice(newIndex, 0, itm); if (saveCallback) saveCallback(getSaveArray()); //ytcenter.events.performEvent("ui-refresh"); }); listWrapper.appendChild(listOl); contentWrapper.appendChild(listWrapper); contentWrapper.appendChild(positionerEditWrapper); wrapper.appendChild(headerWrapper); wrapper.appendChild(contentWrapper); if (option.parent) { option.parent.addEventListener("click", function(){ if (!editor) { editor = createEditor(); } updateListHeight(); }); } setItems(lastValue); return { element: wrapper, // So the element can be appended to an element. bind: function(callback){ saveCallback = function(arg){ if (callback) callback(arg); ytcenter.player.resizeUpdater(); } }, update: function(value){ if (value === lastValue) return; lastValue = value; setItems(value); if (typeof editor !== "undefined") editor.setVisibility(false); } }; }; ytcenter.modules.select = function(option){ function updateList() { select.innerHTML = ""; ytcenter.utils.each(list, function(i, item){ var o = document.createElement("option"); o.setAttribute("value", i); if (typeof item.label !== "undefined") { o.textContent = ytcenter.language.getLocale(item.label); ytcenter.language.addLocaleElement(o, item.label, "@textContent"); } else if (typeof item.text !== "undefined") { o.textContent = item.text; } else { o.textContent = "undefined"; } if (selectedValue === item.value) { o.setAttribute("selected", "selected"); selectedText.textContent = o.textContent; } select.appendChild(o); }); } var list = (option && option.args && option.args.list) || [], selectedValue, saveCallback, wrapper = document.createElement("span"), selectedContentWrapper = document.createElement("span"), selectedArrow = document.createElement("img"), selectedText = document.createElement("span"), select = document.createElement("select"); wrapper.className = "ytcenter-embed yt-uix-form-input-select"; wrapper.style.marginBottom = "2px"; wrapper.style.height = "27px"; selectedContentWrapper.className = "yt-uix-form-input-select-content"; selectedArrow.setAttribute("src", "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"); selectedArrow.className = "yt-uix-form-input-select-arrow"; selectedText.className = "yt-uix-form-input-select-value"; selectedContentWrapper.appendChild(selectedArrow); selectedContentWrapper.appendChild(selectedText); select.className = "yt-uix-form-input-select-element"; select.style.cursor = "pointer"; select.style.height = "27px"; updateList(); ytcenter.utils.addEventListener(select, "change", function(e){ selectedText.textContent = select.options[select.selectedIndex].textContent; if (saveCallback) saveCallback(list[select.selectedIndex].value); }); wrapper.appendChild(selectedContentWrapper); wrapper.appendChild(select); return { element: wrapper, bind: function(callback){ saveCallback = callback; }, setSelected: function(value){ selectedValue = value; for (var i = 0; i < list.length; i++) { if (list[i].value === value) { select.selectedIndex = i; break; } } if (select.options.length > 0) selectedText.textContent = select.options[select.selectedIndex].textContent; }, update: function(value){ selectedValue = value; for (var i = 0; i < list.length; i++) { if (list[i].value === value) { select.selectedIndex = i; break; } } if (select.options.length > 0) selectedText.textContent = select.options[select.selectedIndex].textContent; }, updateList: function(_list){ list = _list; updateList(); }, getValue: function(){ return list[select.selectedIndex].value; } }; }; ytcenter.modules.textarea = function(option){ var elm = document.createElement('textarea'), i, key; elm.className = "yt-uix-form-textarea"; if (option && option.args && option.args.className) { elm.className += " " + option.args.className; } if (option && option.args && option.args.styles) { for (key in option.args.styles) { if (option.args.styles.hasOwnProperty(key)) { elm.style.setProperty(key, option.args.styles[key]); } } } if (option && option.args && option.args.text) { elm.textContent = option.args.text; } if (option && option.args && option.args.attributes) { for (key in option.args.attributes) { if (option.args.attributes.hasOwnProperty(key)) { elm.setAttribute(key, option.args.attributes[key]); } } } if (option && option.args && option.args.listeners) { for (i = 0; i < option.args.listeners.length; i++) { elm.addEventListener(option.args.listeners[i].event, option.args.listeners[i].callback, (option.args.listeners[i].bubble ? option.args.listeners[i].bubble : false)); } } return { element: elm, bind: function(){}, update: function(){}, setText: function(txt){ elm.textContent = txt; }, selectAll: function(){ elm.focus(); elm.select(); } }; }; ytcenter.modules.textContent = function(option){ var elm = document.createElement("div"); if (option && option.args && option.args.styles) { for (var key in option.args.styles) { if (option.args.styles.hasOwnProperty(key)) { elm.style[key] = option.args.styles[key]; } } } if (option && option.args && option.args.text) { if (option && option.args && option.args.replace) { elm.appendChild(ytcenter.utils.replaceText(option.args.text, option.args.replace)); } else { elm.textContent = option.args.text; } } if (option && option.args && option.args.textlocale) { if (option && option.args && option.args.replace) { elm.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale(option.args.textlocale), option.args.replace)); } else { elm.textContent = ytcenter.language.getLocale(option.args.textlocale); } ytcenter.events.addEvent("language-refresh", function(){ elm.innerHTML = ""; if (option && option.args && option.args.replace) { elm.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale(option.args.textlocale), option.args.replace)); } else { elm.textContent = ytcenter.language.getLocale(option.args.textlocale); } }); } if (option && option.args && option.args.listeners) { for (var i = 0; i < option.args.listeners.length; i++) { elm.addEventListener(option.args.listeners[i].event, option.args.listeners[i].callback, (option.args.listeners[i].bubble ? option.args.listeners[i].bubble : false)); } } if (option && option.args && option.args.styles) { for (var key in option.args.styles) { if (option.args.styles.hasOwnProperty(key)) { elm.style[key] = option.args.styles[key]; } } } return { element: elm, bind: function(){}, update: function(){} }; }; ytcenter.modules.textfield = function(option){ function update(text) { input.value = text; } function bind(callback) { ytcenter.utils.addEventListener(input, "change", function(){ callback(input.value); }, false); } var frag = document.createDocumentFragment(), input = document.createElement("input"); input.setAttribute("type", "text"); input.className = "yt-uix-form-input-text"; input.value = option && ytcenter.settings[option.defaultSetting]; if (option && option.style) { for (var key in option.style) { if (option.style.hasOwnProperty(key)) { elm.style[key] = option.style[key]; } } } frag.appendChild(input); return { element: frag, bind: bind, update: update }; }; ytcenter.modules.translators = function(option){ option = typeof option !== "undefined" ? option : false; var elm = document.createElement("div"); var translators = document.createElement("div"), table = document.createElement("table"), thead = document.createElement("thead"), tbody = document.createElement("tbody"), tr, td; table.className = "ytcenter-settings-table"; tr = document.createElement("tr"); td = document.createElement("td"); td.textContent = ytcenter.language.getLocale("TRANSLATOR_LANGUAGE"); ytcenter.language.addLocaleElement(td, "TRANSLATOR_LANGUAGE", "@textContent"); tr.appendChild(td); td = document.createElement("td"); td.textContent = ytcenter.language.getLocale("TRANSLATOR_ENGLISH"); ytcenter.language.addLocaleElement(td, "TRANSLATOR_ENGLISH", "@textContent"); tr.appendChild(td); td = document.createElement("td"); td.textContent = ytcenter.language.getLocale("TRANSLATOR_CONTRIBUTORS"); ytcenter.language.addLocaleElement(td, "TRANSLATOR_CONTRIBUTORS", "@textContent"); tr.appendChild(td); thead.appendChild(tr); table.appendChild(thead); table.appendChild(tbody); ytcenter.utils.each(option.args.translators, function(key, value){ if (value.length > 0) { tr = document.createElement("tr"); td = document.createElement("td"); td.textContent = ytcenter.language.getLocale("LANGUAGE", key); tr.appendChild(td); td = document.createElement("td"); td.textContent = ytcenter.language.getLocale("LANGUAGE_ENGLISH", key); tr.appendChild(td); td = document.createElement("td"); for (var i = 0; i < value.length; i++) { if (i > 0) td.appendChild(document.createTextNode(" & ")); var el; if (value[i].url) { el = document.createElement("a"); el.href = value[i].url; el.textContent = value[i].name; el.setAttribute("target", "_blank"); } else { el = document.createTextNode(value[i].name); } td.appendChild(el); } tr.appendChild(td); tbody.appendChild(tr); } }); translators.appendChild(table); elm.appendChild(translators); return { element: elm, bind: function(){}, update: function(){} }; }; // @support ytcenter.supported = {}; ytcenter.supported.localStorage = (function(){ var mod = "ytc.supported"; try { uw.localStorage.setItem(mod, mod); uw.localStorage.removeItem(mod); return true; } catch (e) { return false; } })(); ytcenter.supported.CustomEvent = (function(){ var mod = "support.test"; try { var e = document.createEvent('CustomEvent'); if (e && typeof e.initCustomEvent === "function") { e.initCustomEvent(mod, true, true, { mod: mod }); return true; } return false; } catch (e) { return false; } })(); // @unsafeCall ytcenter.unsafeCall = (function(){ function storeFunctions(obj) { if (Object.prototype.toString.call(obj) === "[object Array]") { var i; for (i = 0; i < obj.length; i++) { obj[i] = storeFunctions(obj[i]); } } else if (typeof obj === "function") { return comm.push(obj) - 1; } else if (obj === Object(obj)) { var key; for (key in obj) { if (obj.hasOwnProperty(key)) { obj[key] = storeFunctions(obj[key]); } } } return obj; } function call(method, args, callback) { var id = null; if (callback !== null) { id = comm.push(callback) - 1; } var detail = { id: id, method: method, arguments: storeFunctions(args) }; if (ytcenter.supported.CustomEvent) { callEvent(detail); } else { callMessage(detail); } } function callMessage(detail) { detail.level = "unsafe"; postMessage(JSON.stringify(detail)); } function callEvent(detail) { var event = document.createEvent("CustomEvent"); event.initCustomEvent("ytc-content-call", true, true, JSON.stringify(detail)); document.documentElement.dispatchEvent(event); } function resp(e) { if (!e || !e.data) return; // Checking if data is present if (typeof e.data !== "string") return; // Checking if the object is a string. if (!e.data.indexOf || e.data.indexOf("{") !== 0) return; var data = JSON.parse(e.data); if (data.level === "unsafe") return; if (typeof comm[data.id] === "function") { comm[data.id].apply(null, data.arguments); } } function eventResponse(e) { var detail = e.detail; if (typeof detail !== "object") detail = JSON.parse(detail); if (typeof comm[detail.id] === "function") { comm[detail.id].apply(null, detail.arguments); } if (e && typeof e.stopPropagation === "function") e.stopPropagation(); } function postMessage(data) { window.postMessage(data, "*"); } function initListeners() { if (ytcenter.supported.CustomEvent) { window.addEventListener("ytc-page-call", eventResponse, false); } else { window.addEventListener("message", resp, false); } } var comm = []; initListeners(); return call; })(); /* The util function "throttle" and "once" has been taken from Underscore. * ************************** * http://underscorejs.org * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Underscore may be freely distributed under the MIT license. */ ytcenter.utils.throttle = function(func, delay, options){ function timeout() { previous = options.leading === false ? 0 : new Date; timer = null; result = func.apply(context, args); } var context, args, result, timer = null, previous = 0; options = options || {}; return function(){ var now = new Date, dt; context = this; args = arguments; if (!previous && options.leading === false) previous = now; dt = delay - (now - previous); if (dt <= 0) { uw.clearTimeout(timer); timer = null; previous = now; result = func.apply(context, args); } else if (!timer && options.trailing !== false) { timer = uw.setTimeout(timeout, dt); } return result; }; }; // @tabEvents ytcenter.tabEvents = (function(){ /* Fire an event to the other tabs for Firefox */ function fireEventFirefox() { ytcenter.unsafeCall("firefox_windowLinkerFireRegisteredEvent", Array.prototype.slice.call(arguments, 0)); } function fireEventLocalStorage() { // Create a guid if a guid hasn't been created. if (!guid) guid = ytcenter.utils.guid(); var locked = parseInt(uw.localStorage.getItem(STORAGE_LOCK) || 0, 10); var now = ytcenter.utils.now(); var args = Array.prototype.slice.call(arguments, 0); if (locked && now - locked < STORAGE_TIMEOUT) { uw.setTimeout(ytcenter.utils.funcBind.apply(ytcenter.utils, [null, fireEventLocalStorage].concat(args)), STORAGE_WAIT); } else { hasLock = true; uw.localStorage.setItem(STORAGE_LOCK, now); uw.localStorage.setItem(STORAGE_KEY, JSON.stringify({ origin: guid, args: args })); cleanThrottle(); // wait x milliseconds until cleaning items } } /* The standard event handler, which every handler will call at the end. */ function eventFired(event) { if (!listeners[event]) return; var args = Array.prototype.slice.call(arguments, 1); for (var i = 0, len = listeners[event].length; i < len; i++) { listeners[event][i].apply(null, args); } } /* Event handler for the localStorage */ function eventFiredStorage(e) { e = e || uw.event; if (e.key === STORAGE_KEY) { var data = JSON.parse(e.newValue || "{}"); if (data.origin !== guid) { eventFired.apply(null, data.args); } } } function clean() { if (hasLock) { hasLock = false; uw.localStorage.removeItem(STORAGE_LOCK); uw.localStorage.removeItem(STORAGE_KEY); } } /* Add an event listener to get information from other tabs */ function addEventListener(event, callback) { if (!listeners[event]) listeners[event] = []; listeners[event].push(callback); } /* Remove the added event listener */ function removeEventListener(event, callback) { if (!listeners[event]) return; for (var i = 0, len = listeners[event].length; i < len; i++) { listeners[event].splice(i, 1); break; } } /* Firefox replacement */ function addWindowListener(callback) { ytcenter.unsafeCall("firefox_addWindowListener", [], callback); } /* Init the event handlers */ function init() { if (firefox) { addWindowListener(eventFired); /* Firefox addon function */ } else if (ytcenter.supported.localStorage) { if (typeof uw.addEventListener === "function") { uw.addEventListener("storage", eventFiredStorage, false); } else if (typeof uw.attachEvent === "function") { uw.attachEvent("onstorage", eventFiredStorage, false); } } } function getExportsFirefox() { return { addEventListener: addEventListener, removeEventListener: removeEventListener, fireEvent: fireEventFirefox }; } function getExportsLocalStorage() { return { addEventListener: addEventListener, removeEventListener: removeEventListener, fireEvent: fireEventLocalStorage }; } function getExportsPlaceholder() { function empty() { } return { addEventListener: empty, removeEventListener: empty, fireEvent: empty }; } function getExports() { if (firefox) { return getExportsFirefox(); } else if (ytcenter.supported.localStorage) { return getExportsLocalStorage(); } else { return getExportsPlaceholder(); } } var listeners = {}; var guid = null; var firefox = identifier === 6; var hasLock = false; var STORAGE_KEY = "CMS-YTC"; var STORAGE_LOCK = "CMS-YTC-LOCK"; var STORAGE_EXPIRED = 3600000; var STORAGE_WAIT = 50; var STORAGE_TIMEOUT = 1000; var STORAGE_CLEAN = 1000; var cleanThrottle = ytcenter.utils.throttle(clean, STORAGE_CLEAN); init(); return getExports(); })(); ytcenter.channelPlaylistLinks = (function(){ function update() { var page = ytcenter.getPage(); if (page === "channel") { if (!ytcenter.settings.channelUploadedVideosPlaylist) { var elements = document.getElementsByTagName("a"); for (var i = 0, len = elements.length; i < len; i++) { var el = elements[i]; if (el && typeof el.getAttribute === "function") { var href = el.getAttribute("href"); if (href && typeof href.match === "function" && href.match(/^\/watch\?v=[a-zA-Z0-9_\-]+&list=/g) && (ytcenter.utils.hasClass(el, "ux-thumb-wrap") || ytcenter.utils.hasClass(el, "yt-uix-tile-link"))) { el.setAttribute("href", /^(\/watch\?v=[a-zA-Z0-9_\-]+)&list=/g.exec(href)[1]); el.setAttribute("data-ytc-href", href); } } } } else { var elements = document.getElementsByTagName("a"); for (var i = 0, len = elements.length; i < len; i++) { var el = elements[i]; if (el && typeof el.getAttribute === "function") { var href = el.getAttribute("data-ytc-href"); if (href) { el.setAttribute("href", href); el.removeAttribute("data-ytc-href"); } } } } } } return { update: update }; })(); // @utils ytcenter.utils.getViewPort = function() { var width = 0; var height = 0; if (typeof window.innerWidth === "number") { width = window.innerWidth; height = window.innerHeight; } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { width = document.documentElement.clientWidth; height = document.documentElement.clientHeight; } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { width = document.body.clientWidth; height = document.body.clientHeight; } return { width: width, height: height }; }; ytcenter.utils.getAbsolutePosition = function(el) { var x = el.offsetLeft || 0; var y = el.offsetTop || 0; if (el.offsetParent) { var parentAbsolutePosition = ytcenter.utils.getAbsolutePosition(el.offsetParent); x += parentAbsolutePosition.x; y += parentAbsolutePosition.y; } return { x: x, y: y }; }; ytcenter.utils.listClass = function(el) { if (!el || !el.className) return []; return el.className.split(" "); }; ytcenter.utils.getLocationOrigin = function(){ if (loc.origin) { return loc.origin; } else { return loc.protocol + "//" + loc.hostname + (loc.port ? ":" + loc.port: ""); } }; ytcenter.utils.getHTML5Player = function(){ var movie_player = document.getElementById("movie_player"); if (!movie_player) return null; var video = movie_player.getElementsByClassName("html5-main-video")[0]; return video || null; }; ytcenter.utils.errorProxy = function(scope, func){ var args = Array.prototype.slice.call(arguments, 2); return function(){ try { return func.apply(scope, args.concat(Array.prototype.slice.call(arguments))) } catch (e) { console.error(e); } }; }; ytcenter.utils.funcBind = function(scope, func){ var args = Array.prototype.slice.call(arguments, 2); return function(){ return func.apply(scope, args.concat(Array.prototype.slice.call(arguments))) }; }; (function(){ var cssElements = {}; ytcenter.utils.setCustomCSS = function(id, css){ ytcenter.utils.removeCustomCSS(id); var el = document.createElement("style"); el.type = "text/css"; el.textContent = css; document.getElementsByTagName('head')[0].appendChild(el); cssElements[id] = el; }; ytcenter.utils.removeCustomCSS = function(id){ if (cssElements.hasOwnProperty(id)) { cssElements[id].parentNode.removeChild(cssElements[id]); delete cssElements[id]; } }; })(); (function(){ function loadCanvas(url, rgba) { var i; for (i = 0; i < tintImages.length; i++) { if (url === tintImages[i].url && rgba.r === tintImages[i].rgba.r && rgba.g === tintImages[i].rgba.g && rgba.b === tintImages[i].rgba.b && rgba.a === tintImages[i].rgba.a ) { return tintImages[i].canvas; } } } var tintImages = []; ytcenter.utils.tintImage = function(url, rgba, callback) { function onerror() { throw "Couldn't load image!"; } function onload() { canvas.width = img.width; canvas.height = img.height; ctx.clearRect(0, 0, img.width, img.height); ctx.drawImage(img, 0, 0, img.width, img.height); var imageData = ctx.getImageData(0, 0, img.width, img.height); var idx, i, pixel; for (i = (img.width * img.height); i >= 0; --i) { idx = i << 2; pixel = {r: imageData.data[idx], g: imageData.data[idx + 1], b: imageData.data[idx + 2]}; imageData.data[idx] = (rgba.a * rgba.r + (1 - rgba.a) * pixel.r); imageData.data[idx + 1] = (rgba.a * rgba.g + (1 - rgba.a) * pixel.g); imageData.data[idx + 2] = (rgba.a * rgba.b + (1 - rgba.a) * pixel.b); } ctx.putImageData(imageData, 0, 0); tintImages.push({ url: url, rgba: rgba, canvas: canvas }); if (tintImages.length > 10) tintImages.splice(0, tintImages.length - 10); callback && callback(canvas); } var cache = loadCanvas(url, rgba); if (cache) { callback && callback(cache); return; } var canvas = document.createElement("canvas"); if (!(canvas.getContext && canvas.getContext('2d'))) return null; // Canvas is not supported! var ctx = canvas.getContext("2d"); var img = new Image(); img.src = url; img.onload = onload; img.onerror = onerror; }; })(); ytcenter.utils.setStyles = function(el, styles){ var key; for (key in styles) { if (styles.hasOwnProperty(key)) { el.style.setProperty(key, styles[key]) } } }; ytcenter.utils.filterColor = function(color, ohsv){ var hsv = ytcenter.utils.getHSV(color.red, color.green, color.blue); hsv.hue = Math.round(hsv.hue - ohsv.hue); if (hsv.hue < 0) hsv.hue += 360; hsv.saturation = Math.round(100 + (hsv.saturation - ohsv.saturation)); hsv.value = Math.round(100 + (hsv.value - ohsv.value)); return "hue-rotate(" + hsv.hue + "deg) saturate(" + hsv.saturation + "%) brightness(" + hsv.value + "%)"; }; ytcenter.utils.asyncCall = function(func){ var args = Array.prototype.splice.call(arguments, 1, arguments.length); var proxy = ytcenter.utils.oldBind(func); uw.setTimeout(function(){ proxy.apply(null, args); }, 0); }; ytcenter.utils.getScrollPosition = function(scrollElm){ var posX = 0; var posY = 0; while (scrollElm != null) { posX += scrollElm.offsetLeft; posY += scrollElm.offsetTop; scrollElm = scrollElm.offsetParent; } return { x: posX, y: posY }; }; ytcenter.utils.live = (function(){ function getElements(query) { return document.querySelectorAll(query); } function isElementParent(el, parent) { var found = false; while (el && !(found = el === parent)) el = el.parentElement; return found; } function handleElements(elements, e, listener) { var i; for (i = 0; i < elements.length; i++) { if (isElementParent(e.target, elements[i]) && typeof listener.listener === "function") { listener.listener.call(e.target, e); } } } function onListener(e) { var i; e = e || win.event; for (i = 0; i < listeners.length; i++) { if (listeners[i].type === e.type) { handleElements(getElements(listeners[i].query), e, listeners[i]); } } } function shutdown() { listeners = []; var i; for (i = 0; i < events.length; i++) { shutdownEvent(events[i]); } events = []; } function shutdownEvent(event) { document.removeEventListener(event, onListener, false); } function setupEvent(event) { if (!isEventInitialized(event)) { document.addEventListener(event, onListener, false); } } function clean(event) { var i; for (i = 0; i < listeners.length; i++) { if (listeners[i].type === event) { return; } } shutdownEvent(event); for (i = 0; i < events.length; i++) { if (events[i] === event) { events.splice(i, 1); break; } } } function isEventInitialized(event) { var i; for (i = 0; i < events.length; i++) { if (events[i] === event) return true; } return false; } function addEventListener(type, query, listener) { setupEvent(type); listeners.push({ type: type, query: query, listener: listener }); } function removeEventListener(type, query, listener) { var i; for (i = 0; i < listeners.length; i++) { if (type === listeners[i].type && query === listeners[i].query && listener === listeners[i].listener) { listeners.splice(i, 1); return; } } } var listeners = [], events = []; return { add: addEventListener, rem: removeEventListener, unload: shutdown }; })(); ytcenter.utils.setZeroTimeout = (function(){ function setZeroTimeout(fn) { timeouts.push(fn); window.postMessage(uniqueMessageName, "*"); } function handleMessage(event) { if ((event.source === window || event.source === uw) && event.data === uniqueMessageName) { event && event.stopPropagation && event.stopPropagation(); if (timeouts.length > 0) { timeouts.shift()(); } } } var timeouts = [], uniqueMessageName = "ytcenter-zero-timeout-message"; window.addEventListener("message", handleMessage, true); return setZeroTimeout; })(); ytcenter.utils.addEndTransitionListener = function(elm, listener){ function getTransitionEndKey() { var transitions = { "transition": "transitionend", "WebkitTransition": "webkitTransitionEnd", "MozTransition": "transitionend", "OTransition": "oTransitionEnd otransitionend" }, key; for (key in transitions) { if (typeof elm.style[key] !== "undefined") { return transitions[key]; } } return null; } var transitionKey = getTransitionEndKey(); if (transitionKey === null) return false; transitionKey = transitionKey.split(" "); ytcenter.utils.addEventListener(elm, transitionKey[0], listener, false); if (transitionKey[1]) { ytcenter.utils.addEventListener(elm, transitionKey[1], listener, false); } return true; }; ytcenter.utils.removeEndTransitionListener = function(elm, listener){ function getTransitionEndKey() { var transitions = { "transition": "transitionend", "WebkitTransition": "webkitTransitionEnd", "MozTransition": "transitionend", "OTransition": "oTransitionEnd otransitionend" }, key; for (key in transitions) { if (typeof elm.style[key] !== "undefined") { return transitions[key]; } } return null; } var transitionKey = getTransitionEndKey(); if (transitionKey === null) return false; transitionKey = transitionKey.split(" "); ytcenter.utils.removeEventListener(elm, transitionKey[0], listener, false); if (transitionKey[1]) { ytcenter.utils.removeEventListener(elm, transitionKey[1], listener, false); } return true; }; ytcenter.utils.urlComponentToObject = function(str){ var parts = str.split("&"), hash = {}, i, _tmp; for (i = 0; i < parts.length; i++) { _tmp = parts[i].split("="); hash[decodeURIComponent(_tmp[0])] = decodeURIComponent(_tmp[1]); } return hash; }; ytcenter.utils.objectToUrlComponent = function(obj){ var urlComponent = "", key; for (key in obj) { if (obj.hasOwnProperty(key)) { if (urlComponent !== "") urlComponent += "&"; urlComponent += encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]); } } return urlComponent; }; ytcenter.utils.cssFix = function(elm){ var width = elm.style.width; elm.style.width = "0px"; elm.offsetHeight; elm.style.width = (width ? width : ""); }; ytcenter.utils.getContentByTags = function(text, startTag, endTag){ text = text.split(startTag)[1]; text = text.split(endTag)[0]; return text; }; ytcenter.utils.cleanObject = function(obj){ try { if (obj instanceof Object && typeof obj["__exposedProps__"] !== "undefined") delete obj["__exposedProps__"]; } catch (e) { con.error(e); } var key; for (key in obj) { if (!obj.hasOwnProperty(key)) { delete obj[key]; } else { if (key === "__exposedProps__") { delete obj[key]; } else if (obj[key] instanceof Object) { obj[key] = ytcenter.utils.cleanObject(obj[key]); } } } return obj; }; ytcenter.utils.setCaretPosition = function(el, pos){ if (pos < 0) pos = 0; if (pos > el.value.length) pos = el.value.length; if (typeof el.selectionStart === "number") { el.selectionStart = pos; el.selectionEnd = pos; } else if (document.selection) { el.focus(); var sel = document.selection.createRange(); sel.moveStart("character", pos); sel.moveEnd("character", 0); sel.select(); } }; ytcenter.utils.getCaretPosition = function(el){ var pos = 0; if (typeof el.selectionStart === "number") { pos = el.selectionStart; } else if (document.selection) { el.focus(); var sel = document.selection.createRange(); sel.moveStart("character", -el.value.length); pos = sel.text.length; } return pos; }; ytcenter.utils.prefixText = function(text, prefixChar, preferedLength){ var t = ("" + text); if (t.length < preferedLength) { var i; for (i = 0; i < preferedLength - t.length; i++) { t = prefixChar + t; } } return t; }; ytcenter.utils.replaceContent = function(content, data, start, end) { var a = content.indexOf(start) b = content.indexOf(end); return content.substring(0, a + start.length) + JSON.stringify(data) + content.substring(b); } /* Code taken from https://code.google.com/p/doctype-mirror/wiki/ArticleNodeContains */ ytcenter.utils.contains = function(parent, descendant){ // W3C DOM Level 3 if (typeof parent.compareDocumentPosition != 'undefined') { return parent == descendant || Boolean(parent.compareDocumentPosition(descendant) & 16); } // W3C DOM Level 1 while (descendant && parent != descendant) { descendant = descendant.parentNode; } return descendant == parent; }; ytcenter.utils.toArray = function(list){ var arr = [], i, len = list.length; for (i = 0; i < len; i++) { arr.push(list[i]); } return arr; }; ytcenter.utils.scrollTop = function(scrollTop){ if (!document) return null; if (typeof scrollTop === "number") { con.log("[scrollTop] Scrolling to y-position: " + scrollTop); window.scroll(0, scrollTop); } else if (typeof scrollTop === "object" && scrollTop.scrollIntoView) { con.log("[scrollTop] Scrolling to element."); scrollTop.scrollIntoView(true); } if (document.body && typeof document.body.scrollTop === "number") { return document.body.scrollTop; } else { return document.documentElement.scrollTop; } }; ytcenter.utils.isParent = function(parent, child){ var children = parent.getElementsByTagName(child.tagName); for (var i = 0, len = children.length; i < len; i++) { if (children[i] === child) { return true; } } return false; }; ytcenter.utils.once = function(func) { var ran = false, memo; return function() { if (ran) return memo; ran = true; memo = func.apply(this, arguments); func = null; return memo; }; }; ytcenter.utils.isContainerOverflowed = function(a){ // Possible going to use this one // AKA Is the container bigger on the inside than the outside? return { x: a.scrollWidth > a.clientWidth, y: a.scrollHeight > a.clientHeight }; }; ytcenter.utils.isScrollable = function(a){ var b = ytcenter.utils.getOverflow(a); if (!b.x && !b.y) return false; return { x: b.x && a.scrollWidth > a.clientWidth, y: b.y && a.scrollHeight > a.clientHeight }; }; ytcenter.utils.getOverflow = function(a){ var b = ytcenter.utils.getComputedStyles(a), c = { auto: true, scroll: true, visible: false, hidden: false }; return { x: c[b.overflowX.toLowerCase()], y: c[b.overflowY.toLowerCase()] }; }; ytcenter.utils.getComputedStyles = function(a){ if (!a) return {}; if (document && document.defaultView && document.defaultView.getComputedStyle) return document.defaultView.getComputedStyle(a, null); return a.currentStyle; }; ytcenter.utils.getComputedStyle = function(a, b) { return ytcenter.utils.getComputedStyles(a)[b]; }; ytcenter.utils.getBoundingClientRect = function(a) { var b; if (!a) return null; try { b = a.getBoundingClientRect(); b = { left: b.left, top: b.top, right: b.right, bottom: b.bottom }; } catch (c) { return { left: 0, top: 0, right: 0, bottom: 0 } } if (a.ownerDocument.body) { a = a.ownerDocument; b.left -= a.documentElement.clientLeft + a.body.clientLeft; b.top -= a.documentElement.clientTop + a.body.clientTop; } return b; }; ytcenter.utils.getDimension = function(elm){ if (!elm) return { width: 0, height: 0 }; return { width: elm.offsetWidth, height: elm.offsetHeight }; }; ytcenter.utils.isElementPartlyInView = function(elm, offset, winDim){ var box = ytcenter.utils.getBoundingClientRect(elm) || { left: 0, top: 0, right: 0, bottom: 0 }, dim = ytcenter.utils.getDimension(elm), a = elm, b, c, d; offset = offset || { top: 0, left: 0 }; winDim = winDim || {width: window.innerWidth || document.documentElement.clientWidth, height: window.innerHeight || document.documentElement.clientHeight }; return (box.top + offset.top >= 0 - dim.height && box.left + offset.left >= 0 - dim.width && box.bottom + offset.top <= winDim.height + dim.height && box.right + offset.left <= winDim.width + dim.width); }; ytcenter.utils.isElementInView = function(elm){ // TODO Implement scrollable elements support. if (ytcenter.utils.getComputedStyle(elm, "display").toLowerCase() === "none") return false; var box = ytcenter.utils.getBoundingClientRect(elm) || { left: 0, top: 0, right: 0, bottom: 0 }, a = elm, b, c; while (!!(a = a.parentNode) && a !== document.body) { if (ytcenter.utils.getComputedStyle(a, "display").toLowerCase() === "none") return false; b = ytcenter.utils.isContainerOverflowed(a); if (b.x || b.y) { c = ytcenter.utils.getBoundingClientRect(a) || { left: 0, top: 0, right: 0, bottom: 0 }; c.top = c.top - box.top + a.scrollTop; c.left = c.left - box.left + a.scrollLeft; c.bottom = c.bottom - box.bottom + a.scrollTop; c.right = c.right - box.right + a.scrollLeft; if (!(c.top >= 0 && c.left >= 0 && c.bottom <= a.clientHeight && c.right <= a.clientWidth)) return false; // We now know that the element is visible in the parent and therefore we can just check if the parent is visible ~magic. return ytcenter.utils.isElementInView(a); } }; return (box.top >= 0 && box.left >= 0 && box.bottom <= (window.innerHeight || document.documentElement.clientHeight) && box.right <= (window.innerWidth || document.documentElement.clientWidth)); }; ytcenter.utils.getVideoIdFromLink = function(url){ var videoIdRegex = /v=([a-zA-Z0-9-_]+)/, indexRegex = /index=([0-9]+)/, videoIdsRegex = /video_ids=([0-9a-zA-Z-_%]+)/, i = 0, a; if (url.match(videoIdRegex)) { a = videoIdRegex.exec(url); if (a && a[1]) return a[1]; } else if (url.match(videoIdsRegex)) { a = indexRegex.exec(url); if (a && a[1]) { i = parseInt(a[1]); } a = videoIdsRegex.exec(url); if (a && a[1] && a[1].split("%2C").length > 0 && a[1].split("%2C")[i]) { return a[1].split("%2C")[i]; } } return null; }; ytcenter.utils.replaceTextAsString = function(text, rep) { if (!text) return text; var tmp = ""; var startB = false; var func = ""; var tmpName = ""; var tmpFunc = ""; var inFunc = false; for (var i = 0; i < text.length; i++) { if (text.charAt(i) == "{" && !startB && !inFunc) { startB = true; } else if (text.charAt(i) == "}" && startB) { var t = tmpName; for (var key in rep) { if (rep.hasOwnProperty(key)) { if (key === tmpName) { tmpName = ""; t = rep[key]; break; } } } tmp += t; startB = false; } else if (startB) { if (tmpName == "" && text.charAt(i) == "!") { tmp += "{"; startB = false; } else { tmpName += text.charAt(i); } } else { tmp += text.charAt(i); } } return tmp; }; ytcenter.utils.replaceTextToText = function(text, replacer){ var regex, arr = [], tmp = ""; text = text || ""; for (key in replacer) { if (replacer.hasOwnProperty(key)) { arr.push(ytcenter.utils.escapeRegExp(key)); } } regex = new RegExp(arr.join("|") + "|.", "g"); text.replace(regex, function(matched){ if (replacer[matched]) { if (typeof replacer[matched] === "function") { var a = replacer[matched](); if (typeof a === "string") { tmp += a; } else { con.error("[TextReplace] Unknown type of replacer!"); } } else if (typeof replacer[matched] === "string") { tmp += replacer[matched]; } else if (typeof replacer[matched] === "number") { tmp += replacer[matched]; } else { con.error("[TextReplace] Unknown type of replacer!"); } } else { tmp += matched; } }); return tmp; }; ytcenter.utils.guid = function(){ function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4(); }; ytcenter.utils.srtTimeFormat = function(totalSeconds){ var sec_num = Math.floor(totalSeconds), hours = Math.floor(sec_num / 3600), minutes = Math.floor((sec_num - (hours * 3600)) / 60), seconds = sec_num - (hours * 3600) - (minutes * 60), milliseconds = Math.round((totalSeconds - sec_num)*100); if (hours < 10) hours = "0" + hours; if (minutes < 10) minutes = "0" + minutes; if (seconds < 10) seconds = "0" + seconds; if (milliseconds < 100) milliseconds = "0" + milliseconds; if (milliseconds < 10) milliseconds = "0" + milliseconds; return hours + ":" + minutes + ":" + seconds + "," + milliseconds; }; ytcenter.utils.parseXML = function(rawxml){ var doc; if (uw.DOMParser) { var parser = new uw.DOMParser(); doc = parser.parseFromString(rawxml, "text/xml"); } else if (uw.ActiveXObject) { doc = new uw.ActiveXObject("Microsoft.XMLDOM"); doc.async = false; doc.loadXML(rawxml); } else { throw new Error("[XMLParser] Cannot parse XML!"); } return doc; }; ytcenter.utils.getURL = function(url){ var a = document.createElement("a"); a.href = url; return a; }; ytcenter.utils.wrapModule = function(module, tagname){ var a = document.createElement(tagname || "span"); a.appendChild(module.element); return a; }; ytcenter.utils.transformToArray = function(domArray){ var a = [], i; for (i = 0; i < domArray.length; i++) { a.push(domArray[i]); } return a; }; ytcenter.utils.decodeHTML = function(a){ return a.replace(/&([^;]+);/g, function(a, c){ switch (c) { case "amp": return "&"; case "lt": return "<"; case "gt": return ">"; case "quot": return '"'; default: if ("#" == c.charAt(0)) { var d = Number("0" + c.substr(1)); if (!isNaN(d)) return String.fromCharCode(d) } return a } }) }; ytcenter.utils.decode = function(a){ var b = { "&": "&", "<": "<", ">": ">", """: '"' }, c = window.document.createElement("div"); return a.replace(/&([^;\s<&]+);?/g, function(a, e){ var g = b[a]; if (g) return g; if ("#" == e.charAt(0)) { var h = Number("0" + e.substr(1)); (0, window.isNaN)(h) || (g = String.fromCharCode(h)) } g || (c.innerHTML = a + " ", g = c.firstChild.nodeValue.slice(0, -1)); return b[a] = g }) }; ytcenter.utils.encodeRawTag = function(text){ var a = document.createElement("a"), b = document.createElement("div"); a.setAttribute("class", text); b.appendChild(a); return b.innerHTML.substring("".length); }; ytcenter.utils.decodeRawTag = function(text){ var a = document.createElement("div"); a.innerHTML = ""; return a.firstChild.getAttribute("class"); }; ytcenter.utils.setterGetterClassCompatible = function(){ try { var a_getter = false, a_setter = false, a_instance, a_confirm = "WORKS"; a_instance = defineLockedProperty({}, "test", function(value){a_setter = value === a_confirm}, function(){a_getter = true;return a_confirm;}); if (a_confirm === a_instance.test) { a_instance.test = a_confirm; if (a_getter && a_setter) return true; } } catch (e) { con.error(e); return false; } return false; }; ytcenter.utils.isNode = function(a){ if (typeof Node === "object") { return a instanceof Node; } else if (a && typeof a === "object" && typeof a.nodeType === "number" && typeof a.nodeName === "string") { return true; } return false; }; ytcenter.utils.escapeRegExp = function(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); }; ytcenter.utils.replaceTextAsString = function(text, rep) { if (!text) return text; var tmp = ""; var startB = false; var func = ""; var tmpName = ""; var tmpFunc = ""; var inFunc = false; for (var i = 0; i < text.length; i++) { if (text.charAt(i) == "{" && !startB && !inFunc) { startB = true; } else if (text.charAt(i) == "}" && startB) { var t = tmpName; for (var key in rep) { if (rep.hasOwnProperty(key)) { if (key === tmpName) { tmpName = ""; t = rep[key]; break; } } } tmp += t; startB = false; } else if (startB) { if (tmpName == "" && text.charAt(i) == "!") { tmp += "{"; startB = false; } else { tmpName += text.charAt(i); } } else { tmp += text.charAt(i); } } return tmp; }; /** This will replace strings in a text with other strings or HTML elements. * replacer : { * "__REPLACEDSTRING__": document.createElement("div"), * "{REPLACESTRING}": "ANOTHER STRING" * } */ ytcenter.utils.replaceText = function(text, replacer){ var frag = document.createDocumentFragment(), regex, arr = [], tmp = ""; for (key in replacer) { if (replacer.hasOwnProperty(key)) { arr.push(ytcenter.utils.escapeRegExp(key)); } } regex = new RegExp(arr.join("|") + "|.", "g"); text.replace(regex, function(matched){ if (replacer[matched]) { if (tmp !== "") { frag.appendChild(document.createTextNode(tmp)); tmp = ""; } if (typeof replacer[matched] === "function") { var a = replacer[matched](); if (typeof a === "string") { frag.appendChild(document.createTextNode(a)); } else if (ytcenter.utils.isNode(a)) { frag.appendChild(a); } else { con.error("[TextReplace] Unknown type of replacer!"); } } else if (typeof replacer[matched] === "string") { frag.appendChild(document.createTextNode(replacer[matched])); } else if (ytcenter.utils.isNode(replacer[matched])) { frag.appendChild(replacer[matched]); } else { con.error("[TextReplace] Unknown type of replacer!"); } } else { tmp += matched; } }); if (tmp !== "") { frag.appendChild(document.createTextNode(tmp)); tmp = ""; } return frag; }; ytcenter.utils._escape_html_entities = [ [" ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", """, "&", "<", ">", "Œ", "œ", "Š", "š", "Ÿ", "ˆ", "˜", " ", " ", " ", "‌", "‍", "‎", "‏", "–", "—", "‘", "’", "‚", "“", "”", "„", "†", "‡", "‰", "‹", "›", "€", "ƒ", "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "ς", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϑ", "ϒ", "ϖ", "•", "…", "′", "″", "‾", "⁄", "℘", "ℑ", "ℜ", "™", "ℵ", "←", "↑", "→", "↓", "↔", "↵", "⇐", "⇑", "⇒", "⇓", "⇔", "∀", "∂", "∃", "∅", "∇", "∈", "∉", "∋", "∏", "∑", "−", "∗", "√", "∝", "∞", "∠", "∧", "∨", "∩", "∪", "∫", "∴", "∼", "≅", "≈", "≠", "≡", "≤", "≥", "⊂", "⊃", "⊄", "⊆", "⊇", "⊕", "⊗", "⊥", "⋅", "⌈", "⌉", "⌊", "⌋", "⟨", "⟩", "◊", "♠", "♣", "♥", "♦"], [" ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", """, "&", "<", ">", "Œ", "œ", "Š", "š", "Ÿ", "ˆ", "˜", " ", " ", " ", "‌", "‍", "‎", "‏", "–", "—", "‘", "’", "‚", "“", "”", "„", "†", "‡", "‰", "‹", "›", "€", "ƒ", "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "ς", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "ϑ", "ϒ", "ϖ", "•", "…", "′", "″", "‾", "⁄", "℘", "ℑ", "ℜ", "™", "ℵ", "←", "↑", "→", "↓", "↔", "↵", "⇐", "⇑", "⇒", "⇓", "⇔", "∀", "∂", "∃", "∅", "∇", "∈", "∉", "∋", "∏", "∑", "−", "∗", "√", "∝", "∞", "∠", "∧", "∨", "∩", "∪", "∫", "∴", "∼", "≅", "≈", "≠", "≡", "≤", "≥", "⊂", "⊃", "⊄", "⊆", "⊇", "⊕", "⊗", "⊥", "⋅", "⌈", "⌉", "⌊", "⌋", "〈", "〉", "◊", "♠", "♣", "♥", "♦"] ]; ytcenter.utils.escapeXML = function(str){ return ytcenter.utils.replaceArray(str, ["<", ">", "&", "\"", "'"], ["<", ">", "&", """, "'"]); }; ytcenter.utils.unescapeXML = function(str){ return ytcenter.utils.replaceArray(str, ["<", ">", "&", """, "'"], ["<", ">", "&", "\"", "'"]); }; ytcenter.utils.escapeHTML = function(str){ if (str === "") return ""; var i, a = ""; for (i = 0; i < str.length; i++) { switch (str[i]) { case "<": a += "<"; break; case ">": a += ">"; break; case "&": a += "&"; break; case "\"": a += """; break; case "'": a += "'"; break; default: if (str[i] < " " || str[i] > "~") a += "&#" + (str.charCodeAt(i)) + ";"; else a += str[i]; break; } if (str[i] === "<") { a += "<"; } } return a; }; ytcenter.utils.unescapeHTML = function(str){ if (typeof str !== "string" || str === "") return ""; str = ytcenter.utils.replaceArray(str, ytcenter.utils._escape_html_entities[0], ytcenter.utils._escape_html_entities[1]); var i, a = str.match(/&#[0-9]{1,5};/g), b, c; if (!a) return str; for (i = 0; i < a.length; i++) { b = a[i]; c = b.substring(2, b.length - 1); if (c > -32769 && c < 65536) { str = str.replace(b, String.fromCharCode(c)); } else { str = str.replace(b, ""); } } return str; }; ytcenter.utils.replaceArray = function(str, find, replace){ var i; if (find.length !== replace.length) throw "The find & replace array doesn't have the same length!"; for (i = 0; i < find.length; i++) { str = str.replace(new RegExp(find[i], "g"), replace[i]); } return str; }; ytcenter.utils.number1000Formating = function(num){ var i, j = 0, r = [], tmp = ""; num = num + ""; for (i = num.length - 1; i >= 0; i--) { tmp = num[i] + tmp; if (tmp.length === 3) { r.unshift(tmp); tmp = ""; } } if (tmp !== "") r.unshift(tmp); return r.join(","); }; ytcenter.utils.xhr = function(details){ ytcenter.unsafeCall("xhr", [details], null); }; ytcenter.utils.getScrollOffset = function(){ var top = Math.max(document.body.scrollTop, document.documentElement.scrollTop); var left = Math.max(document.body.scrollLeft, document.documentElement.scrollLeft); return {top:top,left:left}; }; ytcenter.utils.addEventListener = (function(){ var listeners = []; ytcenter.unload(function(){ var i; for (i = 0; i < listeners.length; i++) { if (listeners[i].elm.removeEventListener) { listeners[i].elm.removeEventListener(listeners[i].event, listeners[i].callback, listeners[i].useCapture || false); } } listeners = []; }); ytcenter.utils.removeEventListener = function(elm, event, callback, useCapture){ var i; if (elm.removeEventListener) { elm.removeEventListener(event, callback, useCapture || false); } for (i = 0; i < listeners.length; i++) { if (listeners[i].elm === elm && listeners[i].event === event && listeners[i].callback === callback && listeners[i].useCapture === useCapture) { listeners.splice(i, 1); break; } } }; return function(elm, event, callback, useCapture){ if (!elm) return; listeners.push({elm: elm, event: event, callback: callback, useCapture: useCapture}); if (elm.addEventListener) { elm.addEventListener(event, callback, useCapture || false); } else if (elm.attachEvent) { elm.attachEvent("on" + event, callback); } }; })(); ytcenter.utils.getRGB = function(h, s, v){ h = h/360 * 6; s = s/100; v = v/100; var i = Math.floor(h), f = h - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s), mod = i % 6, r = [v, q, p, p, t, v][mod], g = [t, v, v, q, p, p][mod], b = [p, p, t, v, v, q][mod]; return {red: r * 255, green: g * 255, blue: b * 255}; }; ytcenter.utils.getHSV = function(r, g, b) { var max = Math.max(r, g, b), min = Math.min(r, g, b); var h, s, v = max; var d = max - min; s = max === 0 ? 0 : d / max; if (max == min) { h = 0; } else { switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return {hue: h*360, saturation: s*100, value: v/255*100}; }; ytcenter.utils.hsvToHex = function(hue, sat, val){ var rgb = ytcenter.utils.getRGB(hue, sat, val); return ytcenter.utils.colorToHex(rgb.red, rgb.green, rgb.blue); }; ytcenter.utils.colorToHex = function(red, green, blue){ red = Math.round(red); green = Math.round(green); blue = Math.round(blue); if (red > 255) red = 255; if (red < 0) red = 0; if (green > 255) green = 255; if (green < 0) green = 0; if (blue > 255) blue = 255; if (blue < 0) blue = 0; var r = red.toString(16); if (r.length === 1) r = "0" + r; var g = green.toString(16); if (g.length === 1) g = "0" + g; var b = blue.toString(16); if (b.length === 1) b = "0" + b; r = r.toUpperCase(); g = g.toUpperCase(); b = b.toUpperCase(); return "#" + r + g + b; }; ytcenter.utils.hexToColor = function(hex){ if (hex.indexOf("#") === 0) hex = hex.substring(1); var r,g,b; if (hex.length === 6) { r = parseInt(hex.substring(0, 2), 16); g = parseInt(hex.substring(2, 4), 16); b = parseInt(hex.substring(4, 6), 16); } else if (hex.length === 3) { r = parseInt(hex.substring(0, 1) + hex.substring(0, 1), 16); g = parseInt(hex.substring(1, 2) + hex.substring(1, 2), 16); b = parseInt(hex.substring(2, 3) + hex.substring(2, 3), 16); } else { r = 0; g = 0; b = 0; } return {red: r, green: g, blue: b}; }; ytcenter.utils.setKeyword = function(keywords, key, value){ var a = keywords.split(","); for (var i = 0; i < a.length; i++) { if (a[i].split("=")[0] === "key") { if (typeof value === "string") { a[i] = key + "=" + value; } else { a[i] = key; } return a.join(","); } } if (typeof value === "string") { a.push(key + "=" + value); } else { a.push(key); } return a.join(","); }; ytcenter.utils.updateSignatureDecipher = function(){ //ytcenter.utils.updateSignatureDecipher = function(){}; // I'm just cheating a little bit ... if (ytcenter && ytcenter.player && ytcenter.player.config && ytcenter.player.config.assets && ytcenter.player.config.assets.js) { var js = (loc.href.indexOf("https") === 0 ? "https:" : "http:") + ytcenter.player.config.assets.js, regex = /function [a-zA-Z$0-9]+\(a\){a=a\.split\(""\);(.*?)return a\.join\(""\)}/g, regex2 = /function [a-zA-Z$0-9]+\(a\){a=a\.split\(""\);(((a=([a-zA-Z$0-9]+)\(a,([0-9]+)\);)|(a=a\.slice\([0-9]+\);)|(a=a\.reverse\(\);)|(var b=a\[0\];a\[0\]=a\[[0-9]+%a\.length\];a\[[0-9]+\]=b;)))*return a\.join\(""\)}/g; con.log("[updateSignatureDecipher] Contacting " + js); ytcenter.utils.xhr({ method: "GET", url: js, onload: function(response) { var a,i,b,v; if (response.responseText.match(regex2)) { con.log("[updateSignatureDecipher] Using regex 1"); a = regex2.exec(response.responseText)[0].split("{")[1].split("}")[0].split(";"); ytcenter.settings['signatureDecipher'] = []; // Clearing signatureDecipher for (i = 1; i < a.length-1; i++) { b = a[i]; if (b.indexOf("a.slice") !== -1) { // Slice v = b.split("(")[1].split(")")[0]; ytcenter.settings['signatureDecipher'].push({func: "slice", value: parseInt(v)}); } else if (b.indexOf("a.reverse") !== -1) { // Reverse ytcenter.settings['signatureDecipher'].push({func: "reverse", value: null}); } else if ((a[i] + ";" + a[i+1] + ";" + a[i+2]).indexOf("var b=a[0];a[0]=a[") !== -1){ // swapHeadAndPosition v = (a[i] + ";" + a[i+1] + ";" + a[i+2]).split("var b=a[0];a[0]=a[")[1].split("%")[0]; ytcenter.settings['signatureDecipher'].push({func: "swapHeadAndPosition", value: parseInt(v)}); i = i+2; } else { // swapHeadAndPosition (maybe it's deprecated by YouTube) v = b.split("(a,")[1].split(")")[0]; ytcenter.settings['signatureDecipher'].push({func: "swapHeadAndPosition", value: parseInt(v)}); } } } else if (response.responseText.match(regex)) { con.log("[updateSignatureDecipher] Using regex 2"); a = regex.exec(response.responseText)[1]; if (a.match(/a=([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)\(a,([0-9]+)\)/g)) { var commonObject = null; var arr = a.split(";"); var methods = []; var methodValues = []; for (var i = 0, len = arr.length - 1; i < len; i++) { var tokens = /a=([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)\(a,([0-9]+)\)/g.exec(arr[i]); if (commonObject !== tokens[1] && commonObject !== null) { throw "Unknown cipher method!"; } else { commonObject = tokens[1]; } methods.push(tokens[2]); methodValues.push(tokens[3]); } var prefix = "var " + ytcenter.utils.escapeRegExp(commonObject) + "=\\{("; var uniqueMethods = []; var regexMeth = []; for (var i = 0, len = methods.length; i < len; i++) { if (!ytcenter.utils.inArray(uniqueMethods, methods[i])) { uniqueMethods.push(methods[i]); regexMeth.push(ytcenter.utils.escapeRegExp(methods[i])); } } for (var i = 0, len = uniqueMethods.length; i < len; i++) { if (i > 0) prefix += "|"; prefix += "(([a-zA-Z0-9]+):function\\(([a-zA-Z0-9,]+)\\)\\{(.*?)\\}[,]?)"; } prefix += ")\\}"; var regexMethod = new RegExp(prefix, "g").exec(response.responseText); var definedFunctions = new RegExp("([a-zA-Z0-9]+):function\\(([a-zA-Z0-9,]+)\\)\\{(.*?)\\}", "g"); ytcenter.settings['signatureDecipher'] = []; var definedFunction; while (definedFunction = definedFunctions.exec(regexMethod[0])) { ytcenter.settings['signatureDecipher'].push({ func: "function", name: definedFunction[1], value: definedFunction[3] }); } for (var i = 0, len = methods.length; i < len; i++) { ytcenter.settings['signatureDecipher'].push({ func: "call", name: methods[i], value: methodValues[i] }); } } else if (a.match(/([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)\(a,([0-9]+)\)/g)) { var commonObject = null; var arr = a.split(";"); var methods = []; var methodValues = []; for (var i = 0, len = arr.length - 1; i < len; i++) { var tokens = /([a-zA-Z0-9]+)\.([a-zA-Z0-9]+)\(a,([0-9]+)\)/g.exec(arr[i]); if (commonObject !== tokens[1] && commonObject !== null) { throw "Unknown cipher method!"; } else { commonObject = tokens[1]; } methods.push(tokens[2]); methodValues.push(tokens[3]); } var prefix = "var " + ytcenter.utils.escapeRegExp(commonObject) + "=\\{("; var uniqueMethods = []; var regexMeth = []; for (var i = 0, len = methods.length; i < len; i++) { if (!ytcenter.utils.inArray(uniqueMethods, methods[i])) { uniqueMethods.push(methods[i]); regexMeth.push(ytcenter.utils.escapeRegExp(methods[i])); } } for (var i = 0, len = uniqueMethods.length; i < len; i++) { if (i > 0) prefix += "|"; prefix += "(([a-zA-Z0-9]+):function\\(([a-zA-Z0-9,]+)\\)\\{(.*?)\\}[,]?)"; } prefix += ")\\}"; var regexMethod = new RegExp(prefix, "g").exec(response.responseText); var definedFunctions = new RegExp("([a-zA-Z0-9]+):function\\(([a-zA-Z0-9,]+)\\)\\{(.*?)\\}", "g"); ytcenter.settings['signatureDecipher'] = []; var definedFunction; while (definedFunction = definedFunctions.exec(regexMethod[0])) { ytcenter.settings['signatureDecipher'].push({ func: "function", name: definedFunction[1], value: definedFunction[3] + ";return a;" }); } for (var i = 0, len = methods.length; i < len; i++) { ytcenter.settings['signatureDecipher'].push({ func: "call", name: methods[i], value: methodValues[i] }); } } else { ytcenter.settings['signatureDecipher'] = []; // Clearing signatureDecoder ytcenter.settings['signatureDecipher'].push({ func: "code", value: a }); } } else { con.error("[updateSignatureDecipher] Couldn't retrieve the signatureDecipher!"); } ytcenter.events.performEvent("ui-refresh"); ytcenter.saveSettings(); }, onerror: function() { con.error("[SignatureDecipher] Couldn't download data!"); } }); } }; ytcenter.utils.signatureDecipher = function(signatureCipher, decipherRecipe){ function swapHeadAndPosition(array, position) { var head = array[0]; var other = array[position % array.length]; array[0] = other; array[position] = head; return array; } if (!signatureCipher) return ""; var cipherArray = signatureCipher.split(""), i; decipherRecipe = decipherRecipe || ytcenter.settings['signatureDecipher']; var funcMap = {}; for (i = 0; i < decipherRecipe.length; i++) { if (decipherRecipe[i].func === "function") { funcMap[decipherRecipe[i].name] = new Function("a", "b", decipherRecipe[i].value); } else if (decipherRecipe[i].func === "call") { cipherArray = funcMap[decipherRecipe[i].name](cipherArray, decipherRecipe[i].value); } else if (decipherRecipe[i].func === "code") { cipherArray = new Function("a", decipherRecipe[i].value + "return a.join(\"\")")(cipherArray); } else if (decipherRecipe[i].func === "swapHeadAndPosition") { cipherArray = swapHeadAndPosition(cipherArray, decipherRecipe[i].value); } else if (decipherRecipe[i].func === "slice") { cipherArray = cipherArray.slice(decipherRecipe[i].value); } else if (decipherRecipe[i].func === "reverse") { cipherArray = cipherArray.reverse(); } } if (!ytcenter.utils.isArray(cipherArray)) return signatureCipher; return cipherArray.join(""); }; ytcenter.utils.crypt_h = void 0; ytcenter.utils.crypt_l = !0; ytcenter.utils.crypt_p = !1; ytcenter.utils.crypt_Ej = ytcenter.utils.crypt_h; ytcenter.utils.crypt = function(){ try { var a; try { if (ytcenter.utils.crypt_Ej == ytcenter.utils.crypt_h && (ytcenter.utils.crypt_Ej = ytcenter.utils.crypt_p, window.crypto && window.crypto.wx)) { try { a = new Uint8Array(1), window.crypto.wx(a), ytcenter.utils.crypt_Ej = ytcenter.utils.crypt_l } catch (b) { } } } catch (e) { con.error(e); } if (ytcenter.utils.crypt_Ej) { a = Array(16); var c = new Uint8Array(16); window.crypto.getRandomValues(c); for (var d = 0; d < a.length; d++) a[d] = c[d] } else { a = Array(16); for (c = 0; 16 > c; c++) { for (var d = ytcenter.utils.now(), f = 0; f < d % 23; f++) a[c] = Math.random(); a[c] = Math.floor(64 * Math.random()) } } c = []; for (d = 0; d < a.length; d++) c.push("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"[a[d] & 63]); return c.join(""); } catch (e) { con.error(e); } }; ytcenter.utils.calculateDimensions = function(width, height, player_ratio){ player_ratio = player_ratio || 16/9; var calcWidth, calcHeight; var widthType, heightType; if (width.indexOf("%") !== -1 && width.match(/%$/)) { widthType = "%"; } else { widthType = "px"; } if (height.indexOf("%") !== -1 && height.match(/%$/)) { heightType = "%"; } else { heightType = "px"; } if (widthType === "px") { calcWidth = parseInt(width); } else { calcWidth = width; } if (heightType === "px") { calcHeight = parseInt(height); } else { calcHeight = height; } if (widthType === "px" && heightType === "px") { if (!isNaN(parseInt(width)) && isNaN(parseInt(height))) { calcHeight = Math.round(calcWidth/player_ratio); } else if (isNaN(parseInt(width)) && !isNaN(parseInt(height))) { calcWidth = Math.round(calcHeight*player_ratio); } } return [calcWidth, calcHeight]; }; ytcenter.utils.bindArgument = function(func) { var sargs = Array.prototype.splice.call(arguments, 1, arguments.length); return function() { var args = Array.prototype.slice.call(sargs); Array.prototype.push.apply(args, arguments); return func.apply(null, args); }; }; ytcenter.utils.bind = function(scope, func) { var args = Array.prototype.slice.call(arguments, 2); return function(){ return func.apply(scope, args.concat(Array.prototype.slice.call(arguments))) }; }; ytcenter.utils.oldBind = function(func){ return func.call.apply(func.bind, arguments); }; ytcenter.utils.query = function(key){ if (loc.search.indexOf("?") === 0) { var a = loc.search.substring(1).split("&"); for (var i = 0; i < a.length; i++) { if (decodeURIComponent(a[i].split("=")[0]) === key) { return decodeURIComponent(a[i].split("=")[1]); } } } }; ytcenter.utils.now = Date.now || function () { return +new Date; }; ytcenter.utils.setCookie = function(name, value, domain, path, expires){ domain = domain ? ";domain=" + encodeURIComponent(domain) : ""; path = path ? ";path=" + encodeURIComponent(path) : ""; expires = 0 > expires ? "" : 0 == expires ? ";expires=" + (new Date(1970, 1, 1)).toUTCString() : ";expires=" + (new Date(ytcenter.utils.now() + 1E3 * expires)).toUTCString(); document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + domain + path + expires; }; ytcenter.utils.getCookie = function(key){ return ytcenter.utils.getCookies()[key]; }; ytcenter.utils.getCookies = function(){ function trimLeft(obj){ return obj.replace(/^\s+/, ""); } function trimRight(obj){ return obj.replace(/\s+$/, ""); } function map(obj, callback, thisArg) { for (var i = 0, n = obj.length, a = []; i < n; i++) { if (i in obj) a[i] = callback.call(thisArg, obj[i]); } return a; } var c = document.cookie, v = 0, cookies = {}; if (document.cookie.match(/^\s*\$Version=(?:"1"|1);\s*(.*)/)) { c = RegExp.$1; v = 1; } if (v === 0) { map(c.split(/[,;]/), function(cookie) { var parts = cookie.split(/=/, 2), name = decodeURIComponent(trimLeft(parts[0])), value = parts.length > 1 ? decodeURIComponent(trimRight(parts[1])) : null; cookies[name] = value; }); } else { map(c.match(/(?:^|\s+)([!#$%&'*+\-.0-9A-Z^`a-z|~]+)=([!#$%&'*+\-.0-9A-Z^`a-z|~]*|"(?:[\x20-\x7E\x80\xFF]|\\[\x00-\x7F])*")(?=\s*[,;]|$)/g), function($0, $1) { var name = $0, value = $1.charAt(0) === '"' ? $1.substr(1, -1).replace(/\\(.)/g, "$1") : $1; cookies[name] = value; }); } return cookies; }; ytcenter.utils.assignId = (function(){ var ___count = -1; return function(prefix) { ___count++; var timestamp = (new Date()).getTime(); return (prefix ? prefix : "") + ___count + (timestamp); }; })(); ytcenter.utils.inArrayIndex = function(a, v){ for (var i = 0; i < a.length; i++) { if (a[i] === v) return i; } return -1; }; ytcenter.utils.inArray = function(array, value){ for (var i = 0, len = array.length; i < len; i++) { if (array[i] === value) { return true; } } return false; }; ytcenter.utils.decodeURIArguments = function(uri){ var a = {}; ytcenter.utils.each(uri.split("&"), function(i, item){ var key = decodeURIComponent(item.split("=")[0]); var value = decodeURIComponent(item.split("=")[1]); a[key] = value; }); return a; }; ytcenter.utils.call = function(func, args){ var a = ""; ytcenter.utils.each(args, function(i){ if (i > 0) a += ", "; a += "b[" + i + "]"; }); return new Function("a", "return a(" + a + ")")(func); }; ytcenter.utils.randomString = function(str, len) { var buff = ""; for (var i = 0; i < len; i++) { buff += str[Math.floor(Math.random()*len)]; } return buff; }; ytcenter.utils.insertAfter = function(elm, after){ if (typeof after.parentNode === "undefined") return; if (typeof elm.parentNode !== "undefined") elm.parentNode.removeChild(elm); if (after.parentNode.lastChild === after) { after.parentNode.appendChild(elm); } else { after.parentNode.insertBefore(elm, after.nextSibling); } }; ytcenter.utils.hasChild = function(parent, elm){ var c = parent.children; for (var i = 0; i < c.length; i++) { if (c[i] === elm) return true; if (ytcenter.utils.hasChild(c[i], elm)) return true; } return false; }; ytcenter.utils.toParent = function(elm, className){ while (elm !== document.body && typeof elm !== "undefined") { if (ytcenter.utils.hasClass(elm, className)) return elm; elm = elm.parentNode; } }; ytcenter.utils.isArray = function(arr){ return Object.prototype.toString.call(arr) === "[object Array]"; }; ytcenter.utils.each = function(obj, callback){ if (ytcenter.utils.isArray(obj)) { for (var i = 0; i < obj.length; i++) { if (callback(i, obj[i]) === true) break; } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { if (callback(key, obj[key]) === true) break; } } } }; ytcenter.utils.mergeArrays = function(){ if (arguments.length <= 0) return []; if (arguments.length === 1) return arguments[0]; var arr = [], i, j; for (i = 0; i < arguments.length; i++) { if (typeof arguments[i] === "undefined") continue; for (j = 0; j < arguments[i].length; j++) { arr.push(arguments[i][j]); } } return arr; } ytcenter.utils.mergeObjects = function(){ if (arguments.length <= 0) return {}; if (arguments.length === 1) return arguments[0]; var _o = arguments[0]; for (var i = 1; i < arguments.length; i++) { if (typeof arguments[i] === "undefined") continue; ytcenter.utils.each(arguments[i], function(key, value){ var type = Object.prototype.toString.call(value); if (_o[key] && (type === "[object Array]" || type === "[object Object]")) { _o[key] = ytcenter.utils.mergeObjects(_o[key], value); } else { _o[key] = value; } }); } return _o; }; ytcenter.utils.cleanClasses = function(elm){ if (typeof elm === "undefined" || typeof elm.className === "undefined") return; var classNames = elm.className.split(" "), i, _new = []; for (i = 0; i < classNames.length; i++) { if (classNames[i] !== "" && !ytcenter.utils.inArray(_new, classNames[i])) { _new.push(classNames[i]); } } elm.className = _new.join(" "); }; ytcenter.utils.hasClass = function(elm, className){ if (typeof elm === "undefined" || typeof elm.className === "undefined") return; var classNames = elm.className.split(" "), i; for (i = 0; i < classNames.length; i++) { if (classNames[i] === className) return true; } return false; }; ytcenter.utils.toggleClass = function(elm, className){ if (typeof elm === "undefined" || typeof elm.className === "undefined") return; if (ytcenter.utils.hasClass(elm, className)) { ytcenter.utils.removeClass(elm, className); } else { ytcenter.utils.addClass(elm, className); } }; ytcenter.utils.addClass = function(elm, className){ if (typeof elm === "undefined" || typeof elm.className === "undefined") return; var classNames = elm.className.split(" "), addClassNames = className.split(" "), _new = [], i, j, found; for (i = 0; i < addClassNames.length; i++) { found = false; for (j = 0; j < classNames.length; j++) { if (addClassNames[i] === classNames[j]) { found = true; break; } } if (!found) { _new.push(addClassNames[i]); } } elm.className += " " + _new.join(" "); ytcenter.utils.cleanClasses(elm); }; ytcenter.utils.removeClass = function(elm, className){ if (typeof elm === "undefined" || typeof elm.className === "undefined") return; var classNames = elm.className.split(" "), remClassNames = className.split(" "), _new = [], i, j, found; for (var i = 0; i < classNames.length; i++) { if (classNames[i] === "") continue; found = false; for (j = 0; j < remClassNames.length; j++) { if (classNames[i] === remClassNames[j]) { found = true; break; } } if (!found) { _new.push(classNames[i]); } } elm.className = _new.join(" "); }; ytcenter.utils.getOffset = function(elm, toElement){ var _x = 0; var _y = 0; while(elm && elm !== toElement && !isNaN(elm.offsetLeft) && !isNaN(elm.offsetTop)) { _x += elm.offsetLeft - elm.scrollLeft; _y += elm.offsetTop - elm.scrollTop; elm = elm.offsetParent; } return { top: _y, left: _x }; }; ytcenter.utils.getOffScreenX = function(elm, border){ border = border || 0; if (ytcenter.utils.getOffset(elm).left - border < 0) { return ytcenter.utils.getOffset(elm).left + border; } else if (ytcenter.utils.getOffset(elm).left + elm.offsetWidth + border > window.innerWidth) { return ytcenter.utils.getOffset(elm).left + elm.offsetWidth + border - window.innerWidth; } else { return 0; } }; ytcenter.utils.getOffScreenY = function(elm, border){ border = border || 0; if (ytcenter.utils.getOffset(elm).top + border < 0) { return ytcenter.utils.getOffset(elm).top - border; } else if (ytcenter.utils.getOffset(elm).top + elm.offsetWidth > window.innerWidth - border) { return ytcenter.utils.getOffset(elm).top + elm.offsetWidth + border - window.innerWidth; } else { return 0; } }; ytcenter.utils.addCSS = function(id, styles, addElement) { function add() { if (oStyle.parentNode) { con.error("[addCSS] Element already added to document."); } else { if (document && document.body) { document.body.appendChild(oStyle); } else if (document && document.head) { document.head.appendChild(oStyle); } else if (document && document.documentElement) { document.documentElement.appendChild(oStyle); } else if (document) { document.appendChild(oStyle); } else { con.error("[addCSS] Couldn't add style to document!"); } } } function remove() { if (isAdded()) { oStyle.parentNode.removeChild(oStyle); } } function isAdded() { return oStyle && oStyle.parentNode; } if (typeof addElement !== "boolean") { addElement = true; } var oStyle = document.createElement("style"); oStyle.setAttribute("id", "ytcenter-styles-" + id); oStyle.setAttribute("type", "text\/css"); oStyle.appendChild(document.createTextNode(styles + "\n//# sourceURL=" + encodeURIComponent("ytcenter/" + id + ".css"))); if (addElement) { add(); } return { add: add, remove: remove, isAdded: isAdded }; }; ytcenter.utils.createElement = function(tagname, options){ options = options || {}; var elm = document.createElement(tagname); ytcenter.utils.each(options, function(key, value){ if (key === "style" && typeof value === "object") { ytcenter.utils.each(value, function(_key, _value){ elm.style[_key] = _value; }); } else if (key === "listeners" && typeof value === "object") { ytcenter.utils.each(value, function(_key, _value){ if (ytcenter.utils.isArray(_value)) { ytcenter.utils.each(_value, function(i, __value){ ytcenter.utils.addEventListener(elm, _key, __value, false); }); } else { ytcenter.utils.addEventListener(elm, _key, _value, false); } }); } else { elm.setAttribute(key, value); } }); return elm; }; ytcenter.utils.objectKeys = function(obj){ if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) { con.error("ytcenter.utils.objectKeys called on non-object"); } var result = [], key, i; for (key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { result.push(key); } } if (!({toString: null}).propertyIsEnumerable('toString')) { var dontEnums = [ 'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ], dontEnumsLength = dontEnums.length; for (i = 0; i < dontEnumsLength; i++) { if (Object.prototype.hasOwnProperty.call(obj, dontEnums[i])) { result.push(dontEnums[i]); } } } return result; }; ytcenter.utils.extend = function(what, wit) { var extObj, witKeys = Object.keys(wit); extObj = ytcenter.utils.objectKeys(what).length ? ytcenter.utils.clone(what) : {}; witKeys.forEach(function(key) { Object.defineProperty(extObj, key, Object.getOwnPropertyDescriptor(wit, key)); }); return extObj; } ytcenter.utils.jsonClone = function(obj){ return JSON.parse(JSON.stringify(obj)); }; ytcenter.utils.clone = function(obj){ return ytcenter.utils.extend({}, obj); }; ytcenter.getMutationObserver = function(){ var a; try { a = MutationObserver || uw.MutationObserver || WebKitMutationObserver || uw.WebKitMutationObserver || MozMutationObserver || uw.MozMutationObserver; } catch (e) { try { a = uw.MutationObserver || WebKitMutationObserver || uw.WebKitMutationObserver || MozMutationObserver || uw.MozMutationObserver; } catch (e) { try { a = WebKitMutationObserver || uw.WebKitMutationObserver || MozMutationObserver || uw.MozMutationObserver; } catch (e) { try { a = uw.WebKitMutationObserver || MozMutationObserver || uw.MozMutationObserver; } catch (e) { try { a = MozMutationObserver || uw.MozMutationObserver; } catch (e) { a = uw.MozMutationObserver; } } } } } return a; }; (function(global, propertyName){ function getTargetedGroup(x, y, groups) { var distance = null; var heightGroup = null; for (var i = 0, len = groups.length; i < len; i++) { // Group element var group = groups[i]; // Getting the absolute position of the group element var absolutePosition = utils.getAbsolutePosition(group); /* * The points on the rectangle, which represents the group element. * px is 1 and 2, * py is 1 and 3, * pWidth is 2 and 4, * pHeight is 3 and 4 * 1------------2 * | | * | | * 3------------4 */ var px = absolutePosition.x; var py = absolutePosition.y; var pWidth = absolutePosition.x + group.offsetWidth; var pHeight = absolutePosition.y + group.offsetHeight; // Detecting if the (x, y) point is inside or touches the group element (rectangle) if (x >= px && x <= pWidth && y >= py && y <= pHeight) { return group; } else if (y >= py && y <= pHeight) { var tmpDist = null; if (x < px) { // Left side tmpDist = px - x; } else if (x > pWidth) { // Right side tmpDist = x - pWidth; } else { continue; // This should never happen. } if (distance === null || tmpDist < distance) { heightGroup = group; distance = tmpDist; } } } return heightGroup; } function getRelativeGroupChild(x, y, group) { // The cursor is inside a group element. if (group !== null) { var groupChildren = group.children; // Iterate through every child of group for (var i = 0, len = groupChildren.length; i < len; i++) { var child = groupChildren[i]; // Making sure that an element is not placed beside itself. if (child !== refMoveableElement && child !== refTargetedElement) { // Get the child's absolute position on the page var absolutePosition = utils.getAbsolutePosition(child); // The for loop iterates through the children chronological, which means that // it only needs to look if the x-value of the cursor is before half of the // child element. if (x <= child.offsetWidth/2 + absolutePosition.x && y <= child.offsetHeight + absolutePosition.y) { return child; } } } } // No child was found, return null return null; } function mousemoveListener(e) { if (!mousedown || !moduleEnabled) return; e = e || window.event; // If user is using touch, make sure that it detects the touch instead of mouse. if (e && e.type.indexOf("touch") !== -1 && e.changedTouches && e.changedTouches.length > 0 && e.changedTouches[0]) { e = e.changedTouches[0]; } // The (x, y) coordinate of the mouse cursor on the page var x = e.pageX; var y = e.pageY; // Update the moveable element position refMoveableElement.style.top = (y - (relativeMousePosition.y || 0)) + "px"; refMoveableElement.style.left = (x - (relativeMousePosition.x || 0)) + "px"; // Get the targeted group with the (x, y) coordinate of the cursor var group = getTargetedGroup(x, y, groupElements); if (group) { // Get the relative group child element var child = getRelativeGroupChild(x, y, group); // Make sure that targeted element does have a parent to remove // the element from if (refTargetedElement.parentNode) { refTargetedElement.parentNode.removeChild(refTargetedElement); } if (child) { // A child was found insert the targeted element before said child group.insertBefore(refTargetedElement, child); } else { // A child was not found just append the element to the group group.appendChild(refTargetedElement); } } // Prevent default action if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mousedownListener(e) { if (mousedown || !moduleEnabled) return; e = e || window.event; var targetedElement = e.target; while (targetedElement) { if (!targetedElement.parentNode) return; // Targeted element not in a container // Is the targeted element a child of groupElements // and if so then we break out of this loop if (utils.inArray(groupElements, targetedElement.parentNode)) { break; } // The desired element is a child to one of the containers. targetedElement = targetedElement.parentNode; } mousedown = true; // Relative position to targeted element var absolutePosition = utils.getAbsolutePosition(targetedElement); relativeMousePosition = { x: e.pageX - absolutePosition.x, y: e.pageY - absolutePosition.y }; // Create the moveable element var moveableElement = createMoveableElement(targetedElement); // Make the targeted element invisible ytcenter.utils.addClass(targetedElement, "placementsystem-target"); //targetedElement.style.visibility = "hidden"; // Store two references for later use refMoveableElement = moveableElement; refTargetedElement = targetedElement; document.body.appendChild(moveableElement); // Add mouseup, mousemove, touchend and touchmove event listener utils.addEventListener(document, "mousemove", mousemoveListener, false); utils.addEventListener(document, "touchmove", mousemoveListener, false); // Prevent default action if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function mouseupListener(e) { if (!mousedown || !moduleEnabled || !refTargetedElement) return; mousedown = false; e = e || window.event; // Make the targeted element visible ytcenter.utils.removeClass(refTargetedElement, "placementsystem-target"); //refTargetedElement.style.visibility = ""; // Remove the moveable element from the DOM refMoveableElement.parentNode.removeChild(refMoveableElement); // Remove relative mouse position relativeMousePosition = null; // Remove stored references refMoveableElement = null; refTargetedElement = null; // Remove mousemove and touchmove event listener utils.removeEventListener(document, "mousemove", mousemoveListener, false); utils.removeEventListener(document, "touchmove", mousemoveListener, false); // Prevent default action if (e && e.preventDefault) { e.preventDefault(); } else { window.event.returnValue = false; } return false; } function setGroupElements(groups) { groupElements = groups; } function setMoveableElementPosition(el, moveableElement) { var absolutePosition = utils.getAbsolutePosition(el); // Give the moveable an absolute position, which will be // on top of the original element. moveableElement.style.position = "absolute"; moveableElement.style.top = absolutePosition.y + "px"; moveableElement.style.left = absolutePosition.x + "px"; moveableElement.style.zIndex = "1999999999999"; } function createMoveableElement(el) { function removeTooltip(el) { // Removes tooltip from element el.title = ""; el.setAttribute("data-button-action", ""); el.setAttribute("data-tooltip-text", ""); ytcenter.utils.removeClass(el, "yt-uix-tooltip"); // Removes tooltip from children var children = el.children; for (var i = 0, len = children.length; i < len; i++) { removeTooltip(children[i]); } } var moveableElement = el.cloneNode(true); // Move the moveable element on top of the targeted element setMoveableElementPosition(el, moveableElement); // Removes tooltip from the moveable element removeTooltip(moveableElement); return moveableElement; } function setEnabled(enabled) { moduleEnabled = enabled; utils.removeEventListener(document, "mousemove", mousemoveListener, false); utils.removeEventListener(document, "touchmove", mousemoveListener, false); utils.removeEventListener(document, "mousedown", mousedownListener, false); utils.removeEventListener(document, "touchstart", mousedownListener, false); utils.removeEventListener(document, "mouseup", mouseupListener, false); utils.removeEventListener(document, "touchend", mouseupListener, false); if (enabled) { utils.addEventListener(document, "mousedown", mousedownListener, false); utils.addEventListener(document, "touchstart", mousedownListener, false); utils.addEventListener(document, "mouseup", mouseupListener, false); utils.addEventListener(document, "touchend", mouseupListener, false); } } // Reference to ytcenter.utils var utils = ytcenter.utils; /** * An array of where the moveable elements can be placed in. * * @property groupElements * @type HTMLElement[] **/ var groupElements = [ ]; // A reference to the moveable and targeted elements for use in mousemove var relativeMousePosition = null; var refMoveableElement = null; var refTargetedElement = null; // Properties var moduleEnabled = false; var mousedown = false; // Throttle the listener as it can be taxing for the users system. mousemoveListener = utils.throttle(mousemoveListener, 50); var exports = {}; exports.setGroupElements = setGroupElements; exports.setEnabled = setEnabled; // Add mousedown, touchstart, mouseup and touchend event listener utils.addEventListener(document, "mousedown", mousedownListener, false); utils.addEventListener(document, "touchstart", mousedownListener, false); utils.addEventListener(document, "mouseup", mouseupListener, false); utils.addEventListener(document, "touchend", mouseupListener, false); global[propertyName] = exports; })(ytcenter, "placementdragdrop"); /** * Dynamic element placement library **/ (function(global, propertyName){ /** * Adding an element to a defined group. * * @param {String} id The id of the group. * @param {HTMLElement} element The element that will be added to the group. **/ function addElement(id, elementId, element) { if (!groups[id]) throw "Group " + id + " has not been created!"; groups[id].children.push({ id: elementId, element: element }); // Append the element to the group element groups[id].element.appendChild(element); } /** * Creating a group. * * @param {String} id The id of the group. * @param {HTMLElement} element The group element. * @param {Object} options The options for the group. **/ function createGroup(id, element, options) { if (groups[id]) throw "Group " + id + " has already been created!"; groups[id] = { element: element, // The container element where the children resides options: options, // The options for that specific group children: [] }; } /** * Returns the unique ID for the given element. * * @param {HTMLElement} element The element to get the element from. * @return {String} The unique ID for the element. **/ function getElementUniqueId(element) { var classes = utils.listClass(element); for (var i = 0, len = classes.length; i < len; i++) { if (classes[i] !== "") { classes[i] = encodeURIComponent(classes[i]); } } if (classes.length > 0) { classes = "." + classes.join("."); if (classes[classes.length - 1] === ".") { classes = classes.substring(0, classes.length - 1); } } else { classes = ""; } var id = element.getAttribute("id"); if (id) { id = "#" + encodeURIComponent(id); } else { id = ""; } var tagName = encodeURIComponent(element.tagName); var uid = null; var parent = element.parentNode && element.parentNode instanceof HTMLElement; if (!id && !classes && parent) { var parentNode = element.parentNode; for (var i = 0, len = parentNode.children.length; i < len; i++) { if (parentNode.children[i] === element) { uid = tagName + "[" + i + "]" break; } } } else { uid = tagName + id + classes; } if (!id && parent) { return getElementUniqueId(element.parentNode) + " " + uid; } else { return uid; } } /** * Returns the HTMLElement with a specific unique ID. * * @param {String} id The unique ID. * @return {HTMLElement} The element with the unique ID. **/ function getElementByUniqueId(uid) { var tokens = uid.split(" "); var element = null; for (var i = 0, len = tokens.length; i < len; i++) { var match = /([a-zA-Z0-9_%\-]+)(\[[0-9]+\])?(\#[a-zA-Z0-9_%\-]+)?((\.[a-zA-Z0-9_%\-]+)*)/g.exec(tokens[i]); var tagName = decodeURIComponent(match[1]); var childIndex = null; if (match[2]) { childIndex = parseInt(match[2].substring(1, match[2].length - 1), 10); } var id = null; if (match[3]) { id = decodeURIComponent(match[3].substring(1)); } var classes = []; if (match[4]) { classes = match[4].substring(1).split("."); } for (var j = 0, lenj = classes.length; j < lenj; j++) { classes[j] = decodeURIComponent(classes[j]); } var doc = document; if (element) { doc = element; } var continues = false; if (id) { element = document.getElementById(id); } else if (classes.length > 0) { var elements = doc.getElementsByClassName(classes.join(" ")); for (var j = 0, lenj = elements.length; j < lenj; j++) { if (elements[j].tagName.toLowerCase() === tagName.toLowerCase()) { element = elements[j]; continues = true; break; } } if (!continues) return null; } else if (typeof childIndex === "number") { var elements = doc.getElementsByTagName(tagName); for (var j = 0, lenj = elements.length; j < lenj; j++) { if (elements[j] && elements[j].parentNode && elements[j].parentNode instanceof HTMLElement && elements[j].parentNode.children[childIndex] === elements[j]) { element = elements[j]; continues = true; break; } } if (!continues) return null; } else { element = doc.getElementsByTagName(tagName)[0]; } if (!element) { return null; } } return element; } function getRegisteredElementUniqueId(el) { for (var key in groups) { if (groups.hasOwnProperty(key)) { var children = groups[key].children; for (var i = 0, len = children.length; i < len; i++) { if (el === children[i].element) { return children[i].id; } } } } return null; } function getRegisteredElementByUniqueId(id) { for (var key in groups) { if (groups.hasOwnProperty(key)) { var children = groups[key].children; for (var i = 0, len = children.length; i < len; i++) { if (id === children[i].id) { return children[i].element; } } } } return null; } function isElementRegistered(el) { for (var id in groups) { if (groups.hasOwnProperty(id)) { if (isElementInGroup(el, id)) { return true; } } } return false; } function isElementInGroup(el, groupId) { //if (!groups[groupId]) throw "Group " + groupId + " does not exist!"; if (!groups[groupId]) return false; var children = groups[groupId].children; for (var i = 0, len = children.length; i < len; i++) { if (children[i].element === el) { return true; } } return false; } function createReferenceList() { var map = {}; for (var key in groups) { if (groups.hasOwnProperty(key)) { var group = groups[key]; var groupElements = []; var el = group.element; if (el && el.children) { var children = el.children; for (var i = 0, len = children.length; i < len; i++) { var child = children[i]; var data = { }; if (isElementRegistered(child)) { data.type = REGISTERED; data.uniqueId = getRegisteredElementUniqueId(child); data.element = child; } else { data.type = NONREGISTERED; data.uniqueId = getElementUniqueId(child); data.element = child; } groupElements.push(data); } } map[key] = groupElements; } } return map; } function getReferencedUniqueId(child, reference) { if (!reference) return null; for (var key in reference) { if (reference.hasOwnProperty(key)) { var group = reference[key]; for (var i = 0, len = group.length; i < len; i++) { if (child === group[i].element) { return group[i].uniqueId; } } } } return null; } function getReferencedElement(id, reference) { if (!reference) return null; for (var key in reference) { if (reference.hasOwnProperty(key)) { var group = reference[key]; for (var i = 0, len = group.length; i < len; i++) { if (id === group[i].uniqueId) { return group[i].element; } } } } return null; } function getSortList(referenceList) { var map = {}; for (var key in groups) { if (groups.hasOwnProperty(key)) { var group = groups[key]; var groupElements = []; var el = group.element; if (el && el.children) { var children = el.children; for (var i = 0, len = children.length; i < len; i++) { var child = children[i]; var data = { }; if (isElementRegistered(child)) { data.type = REGISTERED; data.uniqueId = getRegisteredElementUniqueId(child); } else { data.type = NONREGISTERED; data.uniqueId = getReferencedUniqueId(child, referenceList) || getElementUniqueId(child); } groupElements.push(data); } } map[key] = groupElements; } } return map; } function setSortList(list, referenceList) { utils.each(list, function(groupId, elements){ if (!groups[groupId]) con.warn("Group " + groupId + " does not exist!"); var group = groups[groupId]; for (var i = 0, len = elements.length; i < len; i++) { var element = elements[i]; var el = null; if (element.type === REGISTERED) { el = getRegisteredElementByUniqueId(element.uniqueId); } else if (element.type === NONREGISTERED) { el = getReferencedElement(element.uniqueId, referenceList) || getElementByUniqueId(element.uniqueId); } if (el !== null) { if (el.parentNode) { el.parentNode.removeChild(el); } group.element.appendChild(el); } else { con.warn("Unknown element in settings", element); } } }); } function setMoveable(enabled) { ytcenter.placementdragdrop.setGroupElements(getGroupElements()); ytcenter.placementdragdrop.setEnabled(enabled); } function getGroupElements() { var groupElements = []; for (var key in groups) { if (groups.hasOwnProperty(key)) { groupElements.push(groups[key].element); } } return groupElements; } function clearGroups() { groups = {}; } /* Easier access to ytcenter.utils */ var utils = ytcenter.utils; var REGISTERED = 0; var NONREGISTERED = 1; var groups = {}; var exports = {}; /* Make the API public */ exports.setMoveable = setMoveable; exports.addElement = addElement; exports.createGroup = createGroup; exports.getSortList = getSortList; exports.setSortList = setSortList; exports.createReferenceList = createReferenceList; exports.clearGroups = clearGroups; global[propertyName] = exports; })(ytcenter, "placementsystem"); (function(global, propertyName){ function createOverlay() { var overlay = document.createElement("div"); overlay.className = "element-focus-overlay"; return overlay; } function focus(target, saveFunc, cancelFunc) { var replacementHolder = document.createElement("div"); replacementHolder.style.height = target.offsetHeight + "px"; var targetPos = utils.getAbsolutePosition(target); var targetWidth = target.offsetWidth; var targetHeight = target.offsetHeight; // Eclipse math //var sqrt2 = Math.sqrt(2); //var paddTop = targetHeight/sqrt2 - targetHeight/2 + 10; //var paddLeft = targetWidth/sqrt2 - targetWidth/2 + 10; // Box math var paddTop = 15; var paddLeft = 15; target.parentNode.replaceChild(replacementHolder, target); var wrapper = document.createElement("div"); wrapper.className = "element-focus-wrapper"; wrapper.style.top = (targetPos.y - paddTop) + "px"; wrapper.style.left = (targetPos.x - paddLeft) + "px"; var focusEl = document.createElement("div"); focusEl.className = "element-focus"; focusEl.style.padding = paddTop + "px " + paddLeft + "px"; focusEl.style.width = targetWidth + "px"; wrapper.appendChild(focusEl); var focusContainer = document.createElement("div"); focusContainer.className = "element-focus-container"; focusEl.appendChild(focusContainer); focusContainer.appendChild(target); var btnWrapper = document.createElement("div"); btnWrapper.className = "element-focus-btn-wrapper"; var labelSave = ytcenter.gui.createYouTubeButtonTextLabel("BTN_APPLY"); var btnSave = ytcenter.gui.createYouTubePrimaryButton("", [ labelSave ]); btnSave.addEventListener("click", saveFunc, false); var labelCancel = ytcenter.gui.createYouTubeButtonTextLabel("BTN_CANCEL"); var btnCancel = ytcenter.gui.createYouTubeDefaultButton("", [ labelCancel ]); btnCancel.addEventListener("click", cancelFunc, false); btnWrapper.appendChild(btnSave); btnWrapper.appendChild(btnCancel); wrapper.appendChild(btnWrapper); var overlay = createOverlay(); document.body.appendChild(overlay); document.body.appendChild(wrapper); var oldScroll = ytcenter.utils.scrollTop(); var viewPort = ytcenter.utils.getViewPort(); console.log(oldScroll, viewPort, targetPos); ytcenter.utils.scrollTop(targetPos.y - (viewPort.height - wrapper.offsetHeight)/2); //ytcenter.utils.addClass(document.body, "ytcenter-dialog-active"); return function(){ //ytcenter.utils.removeClass(document.body, "ytcenter-dialog-active"); ytcenter.utils.scrollTop(oldScroll); target.parentNode.removeChild(target); replacementHolder.parentNode.replaceChild(target, replacementHolder); overlay.parentNode.removeChild(overlay); wrapper.parentNode.removeChild(wrapper); }; } var utils = ytcenter.utils; var exports = {}; exports.focus = focus; global[propertyName] = exports; })(ytcenter, "elementfocus"); ytcenter.descriptionTags = (function(){ function addTags(list, tags) { for (var i = 0, len = tags.length; i < len; i++) { var item = document.createElement("li"); item.textContent = tags[i]; list.appendChild(item); } } function addSection(title, tags) { if (addedSections[title]) { addedSections[title].innerHTML = ""; addTags(addedSections[title], tags); return; } var extras = document.getElementById("watch-description-extras"); if (extras) { var list = extras.getElementsByClassName("watch-extras-section"); if (list && list[0]) { var item = document.createElement("li"); item.className = "watch-meta-item yt-uix-expander-body"; var titleElement = document.createElement("h4"); titleElement.className = "title"; titleElement.textContent = ytcenter.language.getLocale(title); ytcenter.events.addEvent("language-refresh", function(){ titleElement.textContent = ytcenter.language.getLocale(title); }); var tagList = document.createElement("ul"); tagList.className = "content watch-info-tag-list"; addedSections[title] = tagList; addTags(tagList, tags); item.appendChild(titleElement); item.appendChild(tagList); elements.push(item); list[0].appendChild(item); } } } function destroy() { for (var i = 0, len = elements.length; i < len; i++) { var element = elements[i]; if (element.parentNode && element.parentNode.removeChild) { element.parentNode.removeChild(element); } } addedSections = {}; elements = []; } var addedSections = {}; var elements = []; var exports = {}; exports.addSection = addSection; exports.destroy = destroy; return exports; })(); ytcenter.language = (function(){ function __setElementText(lang, elm, name, type, replace) { if (type.indexOf("@") === 0) { elm[type.substring(1)] = ytcenter.utils.replaceTextAsString(lang[name], replace); } else { elm.setAttribute(type, ytcenter.utils.replaceTextAsString(lang[name], replace)); } } var db = []; var currentLang = {}; var defaultLang = "en-US"; var exports = {}; /** * Adds an element to the database which will then be updated when the update function is called. * @elm The element which will get the update. * @name The locale name which will be used to update the text. * @type The type of how the element will be manipulated. If there's an @ followed by textContent it will update the textContent or else it's an argument. */ exports.addLocaleElement = function(elm, name, type, replace) { replace = replace || {}; db.push([elm, name, type, replace]); }; exports.getLanguage = function(language){ return ytcenter.languages[language]; }; /** * Gets the locale for the specific locale name. */ exports.getLocale = function(name, language){ if (!currentLang) currentLang = exports.getLanguage(defaultLang); if (typeof language !== "string" && currentLang.hasOwnProperty(name)) { return currentLang[name]; } else if (ytcenter.languages.hasOwnProperty(language)) { return exports.getLanguage(language)[name]; } else { return null; } }; /** * Updates all elements added to the database with the given language. * @lang The array with the specific language data. */ exports.update = function(lang, doNotRecurse){ lang = lang || ytcenter.settings.language; if (lang === "auto") { if (uw.yt && uw.yt.getConfig && uw.yt.getConfig("PAGE_NAME")) { if (uw.yt.config_.FEEDBACK_LOCALE_LANGUAGE && ytcenter.languages.hasOwnProperty(uw.yt.config_.FEEDBACK_LOCALE_LANGUAGE)) { lang = uw.yt.config_.FEEDBACK_LOCALE_LANGUAGE; } else if (uw.yt.config_.SANDBAR_LOCALE && ytcenter.languages.hasOwnProperty(uw.yt.config_.SANDBAR_LOCALE)) { lang = uw.yt.config_.SANDBAR_LOCALE; } else if (uw.yt.config_.HL_LOCALE && ytcenter.languages.hasOwnProperty(uw.yt.config_.HL_LOCALE)) { lang = uw.yt.config_.HL_LOCALE; } else { lang = defaultLang; } } else { lang = defaultLang; if (!doNotRecurse) { con.log("Language set to " + lang + " because it could not be auto-detected yet"); var languageUpdateCounter = 0; var languageUpdateInterval = uw.setInterval((function(){ if (uw.yt && uw.yt.getConfig && uw.yt.getConfig("PAGE_NAME")) { uw.clearInterval(languageUpdateInterval); ytcenter.language.update("auto", true); } else if (++languageUpdateCounter >= 100) { uw.clearInterval(languageUpdateInterval); con.log("YouTube configuration data is inaccessible; giving up on language auto-detection."); } }).bind(this), 500); } else { con.log("Language set to " + lang + " because auto-detection failed unexpectedly"); } } } if (!ytcenter.languages[lang]) lang = defaultLang; currentLang = ytcenter.languages[lang]; for (var i = 0; i < db.length; i++) { __setElementText(currentLang, db[i][0], db[i][1], db[i][2], db[i][3]); } ytcenter.events.performEvent("language-refresh"); //ytcenter.events.performEvent("settings-update"); }; return exports; })(); ytcenter.languages = ytcenter_locales; ytcenter._settings = { videoThumbnailQualityFPS: true, enableComments: true, channelUploadedVideosPlaylist: false, ytOnlyStageMode: false, playerGlowEffectOnPlayer: "both", bufferEnabled: false, bufferSize: 569228273678, embedBufferEnabled: false, embedBufferSize: 569228273678, channelBufferEnabled: false, channelBufferSize: 569228273678, playlistAutoPlay: true, playlistAutoPlayFreeze: false, /* Freeze the playlist auto play so that playlistAutoPlay is not changed when the toggle button has been clicked */ playerGlowEnabled: false, playerGlowPixelInterval: 100, playerGlowRequestAnimationFrame: true, playerGlowUpdateInterval: 20, playerGlowTransition: 0, playerGlowBlur: 15, playerGlowSpread: 5, playerGlowOpacity: 75, playerGlowFactor: 50, playerMultiGlowEffect: true, playerMultiGlowEffectDepth: 10, playerMultiGlowEffectBlockInterval: 5, likeButtonColor: "#000000", likeButtonHoverColor: "#000000", dislikeButtonColor: "#000000", dislikeButtonHoverColor: "#000000", likedButtonColor: "#2793e6", likedButtonHoverColor: "#2793e6", dislikedButtonColor: "#000000", dislikedButtonHoverColor: "#000000", likeButtonOpacity: 60, likeButtonHoverOpacity: 70, dislikeButtonOpacity: 60, dislikeButtonHoverOpacity: 70, likedButtonOpacity: 80, likedButtonHoverOpacity: 100, dislikedButtonOpacity: 80, dislikedButtonHoverOpacity: 100, enable_custom_fexp: false, custom_fexp: "", hideLangAlert: true, staticHeader_scrollToPlayer: false, staticHeader: false, debugConsole: true, // Saves the content of the console for the debug log. gridCollectionPage: true, logoLink: "/", hideRecommendedChannels: false, repeatShowText: true, enableYouTubeShortcuts: true, disableFeedItemActionMenu: false, disableGuideCount: false, YouTubeExperiments: [], headlineTitleExpanded: false, videoThumbnailQualitySeparated: true, embedWriteEmbedMethodReloadDelay: 1000, embedWriteEmbedMethod: "test5", // "standard", "test1", "test2", "test3", "standard+reload", "test1+reload", "test2+reload", "test3+reload", "test4", "test5" fixHTML5Annotations: false, saveErrorStatusTimeout: 5000, saveStatusTimeout: 2000, flexWidthOnChannelPage: true, playerDarkSideBGRetro: false, playerDarkSideBGColor: "#1b1b1b", playerDarkSideBG: false, useSecureProtocol: true, videoThumbnailRatingsBarHeight: 2, sparkbarHeight: 2, sparkbarLikesColor: "#590", sparkbarDislikesColor: "#ccc", commentsPlusLinkRedirectConfirm: true, commentsPlusScrollToCommentAtCollapse: true, commentsPlusRemoveLinks: false, commentsPlusBlacklist: [ { type: "equals", length: 1 }, { type: "repeat", amount: 9 }, { type: "profilelinks", regex: "${username}", attr: "textContent" }, { type: "hashlinks", regex: "fixyoutube", attr: "textContent" } ], commentsPlusWhitelist: [], likeSwitchToTab: "none", // none, share, stats, report, login, ratings-disabled, rental-required, error endOfVideoAutoSwitchToTab: "none", // none, share, stats, report, login, ratings-disabled, rental-required, error //enableYouTubeAutoSwitchToShareTab: false, topScrollPlayerEnabled: false, topScrollPlayerActivated: false, topScrollPlayerExitOnVideoEnd: false, topScrollPlayerEnterOnVideoPlay: false, topScrollPlayerExitOnVideoPause: false, topScrollPlayerTimesToEnter: 1, topScrollPlayerTimesToExit: 0, topScrollPlayerCountIncreaseBefore: true, topScrollPlayerHideScrollbar: false, topScrollPlayerBumpTimer: 2000, topScrollPlayerAnimation: true, topScrollPlayerEnabledOnlyVideoPlaying: true, topScrollPlayerScrollUpToExit: false, debug_settings_playersize: false, debug_settings_buttonPlacement: false, debug_settings_videoThumbnailData: false, debug_settings_commentCountryData: false, debug_settings_watchedVideos: false, debug_settings_notwatchedVideos: false, debug_playervars: false, debug_spf_args: false, signatureDecipher: [], embed_defaultAutoplay: true, hideTicker: true, enableEndscreenAutoplay: false, removeYouTubeTitleSuffix: true, playerPlayingTitleIndicator: false, playerOnlyOneInstancePlaying: true, videoThumbnailAnimationEnabled: true, videoThumbnailAnimationShuffle: false, videoThumbnailAnimationDelay: 1000, videoThumbnailAnimationInterval: 700, videoThumbnailAnimationFallbackInterval: 2000, forcePlayerType: "default", // default, flash, html5, aggressive_flash embed_forcePlayerType: "default", // default, flash, html5, aggressive_flash channel_forcePlayerType: "default", // default, flash, html5, aggressive_flash settingsDialogMode: true, ytExperimentFixedTopbar: false, ytspf: false, videoThumbnailCacheSize: 500, commentCacheSize: 500, watchedVideosIndicator: true, hideWatchedVideos: false, watchedVideos: [], notwatchedVideos: [], watchedVideosLimit: 10000, // Hope this isn't too big. notwatchedVideosLimit: 10000, // Hope this isn't too big. gridSubscriptionsPage: true, compatibilityCheckerForChromeDisable: false, removeRelatedVideosEndscreen: false, enableResize: true, guideMode: "default", // [default, always_open, always_closed] uploaderCountryEnabled: true, uploaderCountryShowFlag: true, uploaderCountryUseNames: true, uploaderCountryPosition: "after_username", // ["before_username", "after_username", "last"] commentCountryData: [], commentCountryEnabled: true, commentCountryShowFlag: true, commentCountryUseNames: true, commentCountryLazyLoad: true, commentCountryButtonLoad: true, commentCountryPosition: "after_username", // ["before_username", "after_username", "last"] videoThumbnailData: [], videoThumbnailQualityBar: true, videoThumbnailQualityPosition: "topleft", videoThumbnailQualityDownloadAt: "hover_thumbnail", videoThumbnailQualityVisible: "always", videoThumbnailRatingsBar: true, videoThumbnailRatingsBarPosition: "bottom", videoThumbnailRatingsBarDownloadAt: "scroll_into_view", videoThumbnailRatingsBarVisible: "always", videoThumbnailRatingsBarLikesColor: "#590", videoThumbnailRatingsBarDislikesColor: "#f00", videoThumbnailRatingsCount: true, videoThumbnailRatingsCountPosition: "bottomleft", videoThumbnailRatingsCountDownloadAt: "scroll_into_view", videoThumbnailRatingsCountVisible: "show_hover", videoThumbnailWatchLaterPosition: "bottomright", videoThumbnailWatchLaterVisible: "show_hover", videoThumbnailTimeCodePosition: "bottomright", videoThumbnailTimeCodeVisible: "hide_hover", dashPlayback: true, embed_dashPlayback: true, channel_dashPlayback: true, language: 'auto', filename: '{title}', fixfilename: false, flexWidthOnPage: true, enableAutoVideoQuality: true, autoVideoQuality: 'hd720', removeAdvertisements: true, preventAutoPlay: false, preventAutoBuffer: false, preventTabAutoPlay: false, preventTabAutoBuffer: false, preventTabPlaylistAutoPlay: false, preventTabPlaylistAutoBuffer: false, preventPlaylistAutoPlay: false, preventPlaylistAutoBuffer: false, scrollToPlayer: true, expandDescription: false, enableAnnotations: true, //enableCaptions: true, // % enableShortcuts: true, autohide: '-1', enableVolume: false, volume: 100, mute: false, enableDownload: true, downloadQuality: 'highres', downloadFormat: 'mp4', downloadAsLinks: true, show3DInDownloadMenu: false, enableRepeat: true, repeatSave: false, autoActivateRepeat: false, mp3Services: '', lightbulbEnable: true, lightbulbBackgroundColor: '#000000', lightbulbBackgroundOpaque: 95, lightbulbClickThrough: false, lightbulbAutoOff: false, flashWMode: 'none', // none, window, direct, opaque, transparent, gpu playerTheme: 'dark', // dark, light playerColor: 'red', // red, white enableUpdateChecker: true, updateCheckerInterval: "0", updateCheckerLastUpdate: 0, channel_enableAutoVideoQuality: true, channel_autoVideoQuality: "medium", channel_autohide: "-1", channel_playerTheme: "dark", channel_playerColor: "red", channel_flashWMode: "none", channel_enableAnnotations: true, channel_preventAutoPlay: false, channel_preventAutoBuffer: true, channel_enableVolume: false, channel_volume: 100, channel_mute: false, channel_experimentalFlashMode: "clone", channel_experimentalHTML5Mode: "none", embed_enabled: true, embed_enableAutoVideoQuality: true, embed_autoVideoQuality: "medium", embed_autohide: "-1", embed_playerTheme: "dark", embed_playerColor: "red", embed_flashWMode: "none", embed_enableAnnotations: true, embed_preventAutoPlay: false, embed_preventAutoBuffer: true, embed_enableVolume: false, embed_volume: 100, embed_mute: false, resizeEnable: true, resizeSave: false, aspectEnable: true, aspectSave: false, aspectValue: "default", repeatShowIcon: true, watch7playerguidehide: false, watch7playerguidealwayshide: false, removeBrandingBanner: true, removeBrandingBackground: true, removeBrandingWatermark: true, fixGuideNotVisible: false, hideFeedbackButton: false, bgcolor: "default", embed_bgcolor: "default", channel_bgcolor: "default", player_wide: false, "resize-default-playersize": "default", "resize-small-button": "default_fit_to_content", "resize-large-button": "default_720", "playerSizeAspect": "16:9", // default, 4:3, 3:2, 5:4, 16:9, 16:10, 24:10 "resize-playersizes": [ { id: "default_small", config: { width: "", height: "", large: false, align: true, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_large", config: { width: "", height: "", large: true, align: true, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_fit_to_content", config: { customName: "Fit to Content", width: "1040px", height: "", large: true, align: true, scrollToPlayer: false, scrollToPlayerButton: false, } }, { id: "default_collapse_player", config: { customName: "Collapse The Player", width: "640px", height: "0px", large: false, align: true, scrollToPlayer: false, scrollToPlayerButton: false, } }, { id: "default_720", config: { customName: "720p", width: "1280px", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_1080", config: { customName: "1080p", width: "1920px", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_70_percent", config: { customName: "70%", width: "70%", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_80_percent", config: { customName: "80%", width: "80%", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_90_percent", config: { customName: "90%", width: "90%", height: "", large: true, align: false, scrollToPlayer: false, scrollToPlayerButton: false } }, { id: "default_100_percent", config: { customName: "Fill", width: "100%", height: "100%", large: true, align: false, scrollToPlayer: true, scrollToPlayerButton: true } } ] }; ytcenter.settings = $Clone(ytcenter._settings); ytcenter.doRepeat = false; ytcenter.html5 = false; ytcenter.html5flash = false; ytcenter.watch7 = true; ytcenter.redirect = function(url, newWindow){ con.log("Redirecting" + (newWindow ? " in new window" : "") + " to " + url); if (typeof newWindow != "undefined") { window.open(ytcenter.utils.replaceTextAsString(url, { title: ytcenter.video.title, videoid: ytcenter.video.id, author: ytcenter.video.author, url: loc.href })); } else { loc.href = ytcenter.utils.replaceTextAsString(url, { title: ytcenter.video.title, videoid: ytcenter.video.id, author: ytcenter.video.author, url: loc.href }); } }; ytcenter.discardElement = function(element){ if (element.parentNode && typeof element.parentNode.removeChild === "function") { element.parentNode.removeChild(element); } }; ytcenter.callback_db = []; if (identifier === 3) { // Firefox Extension self.port.on("xhr onreadystatechange", function(data){ var data = JSON.parse(data); if (ytcenter.callback_db[data.id].onreadystatechange) ytcenter.callback_db[data.id].onreadystatechange({responseText: data.responseText}); }); self.port.on("xhr onload", function(data){ var data = JSON.parse(data); if (ytcenter.callback_db[data.id].onload) ytcenter.callback_db[data.id].onload({responseText: data.responseText}); }); self.port.on("xhr onerror", function(data){ var data = JSON.parse(data); if (ytcenter.callback_db[data.id].onerror) ytcenter.callback_db[data.id].onerror({responseText: data.responseText}); }); self.port.on("load callback", function(data){ data = JSON.parse(data); ytcenter.callback_db[data.id](data.storage); }); self.port.on("save callback", function(data){ data = JSON.parse(data); ytcenter.callback_db[data.id](); }); } ytcenter.storageName = "YouTubeCenterSettings"; ytcenter.loadSettings = function(callback){ if (preloadedSettings) { for (var key in preloadedSettings) { if (preloadedSettings.hasOwnProperty(key)) { ytcenter.settings[key] = preloadedSettings[key]; } } preloadedSettings = undefined; callback && callback(); } ytcenter.unsafeCall("load", [ytcenter.storageName], function(storage){ if (storage === "[object Object]") storage = {}; if (typeof storage === "string") storage = JSON.parse(storage); for (var key in storage) { if (storage.hasOwnProperty(key)) { ytcenter.settings[key] = storage[key]; } } if (callback) callback(); }); }; ytcenter.__settingsLoaded = false; ytcenter.loadSettings(function(){ ytcenter.__settingsLoaded = true; var page = ytcenter.getPage(); if ((ytcenter.settings.forcePlayerType === "aggressive_flash" && page === "watch") || (ytcenter.settings.embed_forcePlayerType === "aggressive_flash" && page === "embed") || (ytcenter.settings.channel_forcePlayerType === "aggressive_flash" && page === "channel")) { // Try to prevent the html5 player from having any effect on the page to increase the load time of the flash player. uw.yt = uw.yt || {}; uw.yt.player = uw.yt.player || {}; uw.yt.player.Application = uw.yt.player.Application || {}; uw.yt.player.Application.create = uw.yt.player.Application.create || null; freeze(uw, "yt.player.Application.create"); } settingsInit(); if ((ytcenter.getPage() === "embed" && ytcenter.settings.embed_enabled) || ytcenter.getPage() !== "embed") { ytcenter.tabEvents.addEventListener("settings", function(settings){ con.log("[Tab Events] Received updated settings from another tab."); var player_wide = ytcenter.settings.player_wide; // We don't want this to be updated. ytcenter.settings = JSON.parse(JSON.stringify(settings)); ytcenter.settings.player_wide = player_wide; ytcenter.language.update(); /*ytcenter.events.performEvent("settings-update"); ytcenter.title.update(); ytcenter.classManagement.applyClasses();*/ }); } }); ytcenter.saveSettings_timeout_obj = null; ytcenter.saveSettings_timeout = 300; ytcenter.saveSettings = (function(){ function save(throttle, callback) { if (typeof throttle !== "boolean") throttle = true; ytcenter.events.performEvent("save"); if (throttle) { throttleStoreSettings(callback); } else { storeSettings(callback); } } function saveComplete(callback) { ytcenter.events.performEvent("save-complete"); throttleAnnounceSettingStored(); // This should not be spammed! var args = Array.prototype.splice.call(arguments, 1, arguments.length); if (typeof callback === "function") callback.apply(null, args); } function storeSettings(callback) { con.log("[Storage] Saving Settings"); ytcenter.unsafeCall("save", [ytcenter.storageName, JSON.stringify(ytcenter.settings)], ytcenter.utils.bind(null, saveComplete, callback)); } function announceSettingStored() { con.log("[Tab Events] Sending new settings to other open tabs."); ytcenter.tabEvents.fireEvent("settings", ytcenter.settings); } var throttleStoreSettings = ytcenter.utils.throttle(storeSettings, 5000); var throttleAnnounceSettingStored = ytcenter.utils.throttle(announceSettingStored, 7500); return save; })(); ytcenter.checkForUpdatesDev = (function(){ var updElement; return function(success, error, disabled){ // We check if this build is a dev build. if (!devbuild) { con.log("[Update] This is not a dev build!"); return; } else { con.log("Checking for updates..."); if (typeof error == "undefined") { error = function(){}; } ytcenter.utils.xhr({ method: "GET", url: "https://raw.github.com/YePpHa/YouTubeCenter/master/devbuild.number", ignoreCache: true, headers: { "Content-Type": "text/plain" }, onload: (function(success){ return function(response){ con.log("Got Update Response"); var buildnumber = -1; if (response && response.responseText) { buildnumber = parseInt(/build\.number=([0-9]+)/m.exec(response.responseText)[1], 10); con.log("[Update] Current dev build #" + buildnumber + ". Your build number #" + devnumber); } else { con.log("Couldn't parse the build number"); } if (buildnumber > devnumber) { con.log("New update available"); if (typeof updElement != "undefined") { ytcenter.discardElement(updElement); } updElement = document.createElement("div"); updElement.className = "yt-alert yt-alert-default yt-alert-warn"; updElement.style.margin = "0 auto"; var ic = document.createElement("div"); ic.className = "yt-alert-icon"; var icon = document.createElement("img"); icon.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; icon.className = "icon master-sprite"; icon.setAttribute("alt", "Alert icon"); ic.appendChild(icon); updElement.appendChild(ic); var c = document.createElement("div"); c.className = "yt-alert-buttons"; var cbtn = document.createElement("button"); cbtn.setAttribute("type", "button"); cbtn.setAttribute("role", "button"); cbtn.setAttribute("onclick", ";return false;"); cbtn.className = "close yt-uix-close yt-uix-button yt-uix-button-close"; ytcenter.utils.addEventListener(cbtn, "click", (function(updElement){ return function(){ ytcenter.utils.addClass(updElement, 'hid'); }; })(updElement)); var cbtnt = document.createElement("span"); cbtnt.className = "yt-uix-button-content"; cbtnt.textContent = "Close "; cbtn.appendChild(cbtnt); c.appendChild(cbtn); updElement.appendChild(c); var cn = document.createElement("div"); cn.className = "yt-alert-content"; var cnt = document.createElement("span"); cnt.className = "yt-alert-vertical-trick"; var cnme = document.createElement("div"); cnme.className = "yt-alert-message"; var f1 = ytcenter.utils.replaceText(ytcenter.language.getLocale("UPDATER_DEV_NEWBUILD"), { "{lb}": function(){ return document.createElement("br"); }, "{url}": function(){ var a = document.createElement("a"); a.href = "https://github.com/YePpHa/YouTubeCenter/wiki/Developer-Version"; a.setAttribute("target", "_blank"); a.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("DEV_BUILD"), { "{n}": document.createTextNode(buildnumber) })); return a; } } ); ytcenter.events.addEvent("language-refresh", function(){ f1 = ytcenter.utils.replaceText(ytcenter.language.getLocale("UPDATER_DEV_NEWBUILD"), { "{lb}": function(){ return document.createElement("br"); }, "{url}": function(){ var a = document.createElement("a"); a.href = "https://github.com/YePpHa/YouTubeCenter/wiki/Developer-Version"; a.setAttribute("target", "_blank"); a.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("DEV_BUILD"), { "{n}": document.createTextNode(buildnumber) })); return a; } } ); cnme.innerHTML = ""; cnme.appendChild(f1); }); cnme.appendChild(f1); cn.appendChild(cnt); cn.appendChild(cnme); updElement.appendChild(cn); document.getElementById("alerts").appendChild(updElement); } else { con.log("No new updates available"); } if (success) { con.log("Calling update callback"); success(response); } }; })(success), onerror: error }); } }; })(); ytcenter.checkForUpdates = (function(){ var updElement; return function(success, error, disabled){ if (devbuild) { con.log("[Update] This is a dev build."); ytcenter.checkForUpdatesDev(success, error, disabled); // This is only called when it's a developer build. return; } // If it's the Chrome/Opera addon and the browser is Opera, or if it's the Firefox addon it will not check for updates! if ((identifier === 1 && (uw.navigator.userAgent.indexOf("Opera") !== -1 || uw.navigator.userAgent.indexOf("OPR/") !== -1)) || identifier === 6 || identifier === 8) { con.log("[UpdateChecker] UpdateChecker has been disabled!"); if (typeof disabled == "function") disabled(); } else { con.log("Checking for updates..."); if (typeof error == "undefined") { error = function(){}; } ytcenter.utils.xhr({ method: "GET", url: "https://yeppha.github.io/downloads/YouTubeCenter.meta.js", headers: { "Content-Type": "text/plain" }, onload: (function(success){ return function(response){ con.log("Got Update Response"); var rev = -1, ver = "-1" if (response && response.responseText) { rev = parseInt(/^\/\/ @updateVersion\s+([0-9]+)$/m.exec(response.responseText)[1], 10); ver = /^\/\/ @version\s+([a-zA-Z0-9.,-_]+)$/m.exec(response.responseText)[1]; } else { con.log("Couldn't parse revision and version from the update page."); } if (rev > ytcenter.revision) { con.log("New update available"); if (typeof updElement != "undefined") { ytcenter.discardElement(updElement); } updElement = document.createElement("div"); updElement.className = "yt-alert yt-alert-default yt-alert-warn"; updElement.style.margin = "0 auto"; var ic = document.createElement("div"); ic.className = "yt-alert-icon"; var icon = document.createElement("img"); icon.src = "//s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif"; icon.className = "icon master-sprite"; icon.setAttribute("alt", "Alert icon"); ic.appendChild(icon); updElement.appendChild(ic); var c = document.createElement("div"); c.className = "yt-alert-buttons"; var cbtn = document.createElement("button"); cbtn.setAttribute("type", "button"); cbtn.setAttribute("role", "button"); cbtn.setAttribute("onclick", ";return false;"); cbtn.className = "close yt-uix-close yt-uix-button yt-uix-button-close"; ytcenter.utils.addEventListener(cbtn, "click", (function(updElement){ return function(){ ytcenter.utils.addClass(updElement, 'hid'); }; })(updElement)); var cbtnt = document.createElement("span"); cbtnt.className = "yt-uix-button-content"; cbtnt.textContent = "Close "; cbtn.appendChild(cbtnt); c.appendChild(cbtn); updElement.appendChild(c); var cn = document.createElement("div"); cn.className = "yt-alert-content"; var cnt = document.createElement("span"); cnt.className = "yt-alert-vertical-trick"; var cnme = document.createElement("div"); cnme.className = "yt-alert-message"; var f1 = document.createTextNode(ytcenter.language.getLocale("UPDATE_NOTICE")); ytcenter.language.addLocaleElement(f1, "UPDATE_NOTICE", "@textContent", {}); var f2 = document.createElement("br"); var f3 = document.createTextNode(ytcenter.language.getLocale("UPDATE_INSTALL")); ytcenter.language.addLocaleElement(f3, "UPDATE_INSTALL", "@textContent", {}); var f4 = document.createTextNode(" "); var f5 = document.createElement("a"); if (identifier === 0) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.user.js"; } else if (identifier === 1) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.crx"; } else if (identifier === 2) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.mxaddon"; } else if (identifier === 3) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.xpi"; } else if (identifier === 4) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.safariextz"; } else if (identifier === 5) { f5.href = "https://yeppha.github.io/downloads/YouTubeCenter.oex"; } f5.setAttribute("target", "_blank"); f5.textContent = "YouTube Center v" + ver; var f6 = document.createTextNode(" "); var f7 = document.createTextNode(ytcenter.language.getLocale("UPDATE_OR")); ytcenter.language.addLocaleElement(f7, "UPDATE_OR", "@textContent", {}); var f8 = document.createTextNode(" "); var f9 = document.createElement("a"); f9.setAttribute("target", "_blank"); if (identifier === 6) { f9.href = "https://addons.mozilla.org/en-us/firefox/addon/youtube-center/"; f9.textContent = "addons.mozilla.org"; } else { f9.href = "https://github.com/YePpHa/YouTubeCenter/wiki"; f9.textContent = "github.com/YePpHa/YouTubeCenter/"; } cnme.appendChild(f1); cnme.appendChild(f2); cnme.appendChild(f3); cnme.appendChild(f4); cnme.appendChild(f5); cnme.appendChild(f6); cnme.appendChild(f7); cnme.appendChild(f8); cnme.appendChild(f9); cn.appendChild(cnt); cn.appendChild(cnme); updElement.appendChild(cn); document.getElementById("alerts").appendChild(updElement); } else { con.log("No new updates available"); } if (success) { con.log("Calling update callback"); success(response); } }; })(success), onerror: error }); } }; })(); ytcenter.mp3services = [ { label: 'SETTINGS_MP3SERVICES_VIDEO2MP3', value: 'http://www.video2mp3.net/index.php?url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&hq=0' }, { label: 'SETTINGS_MP3SERVICES_VIDEO2MP3_HQ', value: 'http://www.video2mp3.net/index.php?url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&hq=1' }, { label: 'SETTINGS_MP3SERVICES_YOUTUBEINMP3_64', value: 'http://www.youtubeinmp3.com/download.php?youtubeURL=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&quality=64&submit=Download+MP3' }, { label: 'SETTINGS_MP3SERVICES_YOUTUBEINMP3_128', value: 'http://www.youtubeinmp3.com/download.php?youtubeURL=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&quality=128&submit=Download+MP3' }, { label: 'SETTINGS_MP3SERVICES_YOUTUBEINMP3_320', value: 'http://www.youtubeinmp3.com/download.php?youtubeURL=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&quality=320&submit=Download+MP3' }, { label: 'SETTINGS_MP3SERVICES_HDDOWNLOADER_128', value: 'http://www.hddownloader.com/index.php?act=do&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&dldtype=128&outFormat=mp3' }, { label: 'SETTINGS_MP3SERVICES_HDDOWNLOADER_192', value: 'http://www.hddownloader.com/index.php?act=do&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&dldtype=192&outFormat=mp3' }, { label: 'SETTINGS_MP3SERVICES_HDDOWNLOADER_256', value: 'http://www.hddownloader.com/index.php?act=do&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}&dldtype=256&outFormat=mp3' }, { label: 'SETTINGS_MP3SERVICES_YOUTUBEMP3PRO', value: 'http://www.youtubemp3pro.com/#{videoid}' }, { label: 'SETTINGS_MP3SERVICES_YOUTUBEMP3', value: 'http://www.youtube-mp3.org/#v={videoid}' }, { label: 'SETTINGS_MP3SERVICES_SNIPMP3', value: 'http://snipmp3.com/?url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}' }, { label: 'SETTINGS_MP3SERVICES_CLIPCONVERTER', value: 'http://www.clipconverter.cc/?url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D{videoid}' } ]; ytcenter.settingsPanel = (function(){ var a = {}, categories = [], subcategories = [], options = []; a.createCategory = function(label){ var id = categories.length; categories.push({ id: id, label: label, enabled: true, visible: true, subcategories: [] }); return a.getCategory(id); }; a.createSubCategory = function(label){ var id = subcategories.length; subcategories.push({ id: id, label: label, enabled: true, visible: true, options: [], listeners: {} }); return a.getSubCategory(id); }; a.createOption = function(defaultSetting, module, label, args, help){ var id = options.length; options.push({ id: id, label: label, args: args, defaultSetting: defaultSetting, module: module, help: help, enabled: true, visible: true, styles: {}, moduleStyles: {}, listeners: {} }); return a.getOption(id); }; a.getCategory = function(id){ if (categories.length <= id || id < 0) throw new Error("[Settings Category] Category with specified id doesn't exist (" + id + ")!"); var cat = categories[id]; return { getId: function(){ return id; }, setVisibility: function(visible){ if (cat.visible === visible) return; cat.visible = visible; if (cat._visible) cat._visible(visible); }, setEnabled: function(enabled){ cat.enabled = enabled; }, addSubCategory: function(subcategory){ cat.subcategories.push(subcategories[subcategory.getId()]); }, select: function(){ if (cat.select) cat.select(); } }; }; a.getSubCategory = function(id){ if (subcategories.length <= id || id < 0) throw new Error("[Settings SubCategory] Category with specified id doesn't exist (" + id + ")!"); var subcat = subcategories[id]; return { getId: function(){ return id; }, setVisibility: function(visible){ if (subcat.visible === visible) return; subcat.visible = visible; if (subcat._visible) subcat._visible(visible); }, setEnabled: function(enabled){ subcat.enabled = enabled; }, addOption: function(option){ subcat.options.push(options[option.getId()]); }, select: function(){ if (subcat.select) subcat.select(); }, addEventListener: function(event, callback){ if (!subcat.listeners[event]) subcat.listeners[event] = []; subcat.listeners[event].push(callback); } }; }; a.getOption = function(id){ if (options.length <= id || id < 0) throw new Error("[Settings Options] Option with specified id doesn't exist (" + id + ")!"); var option = options[id]; return { getId: function(){ return id; }, getLabel: function(){ return option.label; }, getDefaultSetting: function(){ return option.defaultSetting; }, getModule: function(){ return option.module; }, getHelp: function(){ return option.help; }, setVisibility: function(visible){ if (option.visible === visible) return; option.visible = visible; if (option._visible) option._visible(visible); }, setEnabled: function(enabled){ option.enabled = enabled; }, setStyle: function(key, value){ option.styles[key] = value; }, getStyle: function(key){ return option.styles[key]; }, setModuleStyle: function(key, value){ option.moduleStyles[key] = value; }, getModuleStyle: function(key){ return option.moduleStyles[key]; }, addModuleEventListener: function(event, callback, bubble){ if (!option.moduleListeners) option.moduleListeners = []; option.moduleListeners.push([event, callback, bubble]); }, removeModuleEventListener: function(event, callback, bubble){ throw new Error("Not implemented!"); }, addEventListener: function(event, callback, bubble){ if (!option.listeners) option.listeners = {}; if (!option.listeners[event]) option.listeners[event] = []; option.listeners[event].push(callback); }, removeEventListener: function(event, callback, bubble){ if (!option.listeners) return; if (!option.listeners[event]) return; var i; for (i = 0; i < option.listeners[event].length; i++) { if (option.listeners[event][i] === callback) { option.listeners[event].splice(i, 1); return; } } }, getLiveModule: function(){ return option.liveModule; } }; }; a.createOptionsForLayout = function(subcat){ var frag = document.createDocumentFragment(); subcat.options.forEach(function(option){ var optionWrapper = document.createElement("div"), label, module, moduleContainer, labelText, help, replaceHelp, i; optionWrapper.className = "ytcenter-settings-subcat-option" + (option.visible ? "" : " hid"); option._visible = function(visible){ if (visible) { ytcenter.utils.removeClass(optionWrapper, "hid"); } else { ytcenter.utils.addClass(optionWrapper, "hid"); } }; if (option.label && option.label !== "") { labelText = document.createTextNode(ytcenter.language.getLocale(option.label)); ytcenter.language.addLocaleElement(labelText, option.label, "@textContent"); if (option.styles) { ytcenter.utils.each(option.styles, function(key, value){ optionWrapper.style.setProperty(key, value); }); } label = document.createElement("span"); label.className = "ytcenter-settings-option-label"; label.appendChild(labelText); if (option.help && option.help !== "") { help = document.createElement("a"); help.className = "ytcenter-settings-help"; help.setAttribute("target", "_blank"); help.setAttribute("href", option.help); help.appendChild(document.createTextNode('?')); replaceHelp = { "{option}": function() { return ytcenter.language.getLocale(option.label); } }; help.setAttribute("title", ytcenter.utils.replaceTextToText(ytcenter.language.getLocale("SETTINGS_HELP_ABOUT"), replaceHelp)); ytcenter.language.addLocaleElement(help, "SETTINGS_HELP_ABOUT", "title", replaceHelp); label.appendChild(help); } optionWrapper.appendChild(label); } if (option.defaultSetting && !(option.defaultSetting in ytcenter._settings)) { con.warn("[SettingsPanel] An option was registered, which doesn't have a default option (" + option.defaultSetting + ")."); } if (!option.module) { } else { if (!ytcenter.modules[option.module]) throw new Error("[Settings createOptionsForLayout] Option (" + option.id + ", " + option.label + ", " + option.module + ") are using an non existing module!"); moduleContainer = document.createElement("div"); moduleContainer.className = "ytcenter-module-container"; if (!option.label || option.label === "") { moduleContainer.style.width = "100%"; } if (option.moduleStyles) { ytcenter.utils.each(option.moduleStyles, function(key, value){ moduleContainer.style.setProperty(key, value); }); } option.parent = a.getSubCategory(subcat.id); module = ytcenter.modules[option.module](option); option.liveModule = module; moduleContainer.appendChild(module.element); module.bind(function(value){ if (typeof option.defaultSetting !== "undefined" && typeof ytcenter.settings[option.defaultSetting] !== "undefined") { ytcenter.settings[option.defaultSetting] = value; ytcenter.saveSettings(); } //ytcenter.events.performEvent("ui-refresh"); if (option.listeners && option.listeners["update"]) { for (i = 0; i < option.listeners["update"].length; i++) { option.listeners["update"][i](value); } } ytcenter.events.performEvent("settings-update", option.id); }); ytcenter.events.addEvent("settings-update", function(id){ if (module && id !== option.id && option.defaultSetting && ytcenter.settings[option.defaultSetting]) { module.update(ytcenter.settings[option.defaultSetting]); } }); if (module && option.defaultSetting && ytcenter.settings[option.defaultSetting]) { module.update(ytcenter.settings[option.defaultSetting]); } if (option.moduleListeners) { if (module.addEventListener) { for (i = 0; i < option.moduleListeners.length; i++) { module.addEventListener(option.moduleListeners[i][0], option.moduleListeners[i][1], option.moduleListeners[i][2]); } } else { throw new Error(option.module + " do not support listeners!"); } } optionWrapper.appendChild(moduleContainer); } frag.appendChild(optionWrapper); }); return frag; }; a.createLayout = function(){ var frag = document.createDocumentFragment(), categoryList = document.createElement("ul"), subcatList = [], sSelectedList = [], leftPanel = document.createElement("div"), rightPanel = document.createElement("div"), rightPanelContent = document.createElement("div"), productVersion = document.createElement("div"), subcatTop = document.createElement("div"), subcatContent = document.createElement("div"), panelWrapper = document.createElement("div"), categoryHide = false; subcatTop.className = "ytcenter-settings-subcat-header-wrapper"; subcatContent.className = "ytcenter-settings-subcat-content-wrapper"; leftPanel.className = "ytcenter-settings-panel-left clearfix"; rightPanel.className = "ytcenter-settings-panel-right clearfix"; productVersion.className = "ytcenter-settings-version"; if (devbuild) { ytcenter.events.addEvent("language-refresh", function(){ productVersion.innerHTML = ""; productVersion.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("DEV_BUILD"), { "{n}": document.createTextNode(devnumber) })); }); productVersion.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("DEV_BUILD"), { "{n}": document.createTextNode(devnumber) })); } else { productVersion.textContent = "YouTube Center v" + ytcenter.version; } categoryList.className = "ytcenter-settings-category-list"; categories.forEach(function(category){ var li = document.createElement("li"), acat = document.createElement("a"), valign = document.createElement("span"), text = document.createElement("span"), subcatLinkList = [], subcatContentList = [], topheader = document.createElement("div"), topheaderList = document.createElement("ul"), categoryContent = document.createElement("div"), hideContent = false; if (li && !category.visible) li.className = "hid"; sSelectedList.push(acat); acat.setAttribute("onclick", ";return false;"); acat.href = "#"; acat.className = "ytcenter-settings-category-item yt-valign" + (categoryHide || !category.visible ? "" : " ytcenter-selected"); ytcenter.utils.addEventListener(acat, "click", function(e){ category.select(); if (category.subcategories.length > 0 && category.subcategories[0] && category.subcategories[0].select) category.subcategories[0].select(); //ytcenter.events.performEvent("ui-refresh"); e.preventDefault(); e.stopPropagation(); return false; }, false); valign.className = "yt-valign-container"; text.textContent = ytcenter.language.getLocale(category.label); ytcenter.language.addLocaleElement(text, category.label, "@textContent"); valign.appendChild(text); acat.appendChild(valign); li.appendChild(acat); categoryList.appendChild(li); topheaderList.className = "ytcenter-settings-subcat-header clearfix"; category.subcategories.forEach(function(subcat){ var content = document.createElement("div"), liItem = document.createElement("li"), liItemLink = document.createElement("a"), itemTextContent = document.createElement("span"); content.className = "ytcenter-settings-subcat-content" + (hideContent ? " hid" : ""); liItem.className = "clearfix"; liItemLink.className = "yt-uix-button ytcenter-settings-subcat-header-item" + (hideContent ? "" : " ytcenter-selected"); itemTextContent.className = "ytcenter-settings-subcat-header-item-content"; itemTextContent.textContent = ytcenter.language.getLocale(subcat.label); ytcenter.language.addLocaleElement(itemTextContent, subcat.label, "@textContent"); content.appendChild(a.createOptionsForLayout(subcat)); liItemLink.appendChild(itemTextContent); liItem.appendChild(liItemLink); topheaderList.appendChild(liItem); ytcenter.utils.addEventListener(liItemLink, "click", function(e){ subcat.select(); //ytcenter.events.performEvent("ui-refresh"); e.preventDefault(); e.stopPropagation(); return false; }, false); subcatLinkList.push(liItemLink); subcatContentList.push(content); subcat.select = function(){ if (!subcat.visible) return; subcatLinkList.forEach(function(item){ ytcenter.utils.removeClass(item, "ytcenter-selected"); }); subcatContentList.forEach(function(item){ ytcenter.utils.addClass(item, "hid"); }); ytcenter.utils.removeClass(content, "hid"); ytcenter.utils.addClass(liItemLink, "ytcenter-selected"); if (subcat.listeners.click) { subcat.listeners.click.forEach(function(callback){ callback(); }); } }; subcat._visible = function(visible){ if (visible) { try { category.subcategories.forEach(function(subcat2){ if (subcat2.visible && subcat2 !== subcat) { throw "SelectedException"; } }); if (subcat.select) subcat.select(); } catch (e) { if (e !== "SelectedException") throw e; } ytcenter.utils.removeClass(liItem, "hid"); } else { ytcenter.utils.addClass(liItem, "hid"); ytcenter.utils.addClass(content, "hid"); if (ytcenter.utils.hasClass(liItemLink, "ytcenter-selected")) { try { category.subcategories.forEach(function(subcat2){ if (subcat2.visible && subcat2.select) { if (subcat2.select()) throw "SelectedException"; } }); } catch (e) { if (e !== "SelectedException") throw e; } } ytcenter.utils.removeClass(liItemLink, "ytcenter-selected"); } }; categoryContent.appendChild(content); hideContent = true; }); topheader.appendChild(topheaderList); topheader.className = (categoryHide || !category.visible ? "hid" : ""); categoryContent.className = (categoryHide || !category.visible ? "hid" : ""); subcatList.push(topheader); subcatList.push(categoryContent); subcatTop.appendChild(topheader); subcatContent.appendChild(categoryContent); category.select = function(){ if (!category.visible) return false; sSelectedList.forEach(function(item){ ytcenter.utils.removeClass(item, "ytcenter-selected"); }); subcatList.forEach(function(item){ ytcenter.utils.addClass(item, "hid"); }); ytcenter.utils.addClass(acat, "ytcenter-selected"); ytcenter.utils.removeClass(topheader, "hid"); ytcenter.utils.removeClass(categoryContent, "hid"); return true; }; category._visible = function(visible){ if (visible) { ytcenter.utils.removeClass(li, "hid"); } else { ytcenter.utils.addClass(li, "hid"); ytcenter.utils.addClass(topheader, "hid"); ytcenter.utils.addClass(categoryContent, "hid"); if (ytcenter.utils.hasClass(acat, "ytcenter-selected")) { try { categories.forEach(function(category2){ if (category2.visible && category2.select) { if (category2.select()) throw "SelectedException"; } }); } catch (e) { if (e !== "SelectedException") throw e; } } ytcenter.utils.removeClass(acat, "ytcenter-selected"); } }; if (category.visible) categoryHide = true; }); leftPanel.appendChild(categoryList); leftPanel.appendChild(productVersion); rightPanelContent.appendChild(subcatTop); rightPanelContent.appendChild(subcatContent); var statusbar = document.createElement("div"); statusbar.className = "ytcenter-settings-subcat-statusbar-wrapper"; statusbar.textContent = ""; (function(){ var savedTimeout = null, mode = 0; ytcenter.events.addEvent("language-refresh", function(){ if (mode === 0) { statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_SAVING"); } else if (mode === 1) { statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_SAVED"); } else if (mode === -1) { statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_ERROR"); } }); ytcenter.events.addEvent("save", function(){ if (savedTimeout) { uw.clearTimeout(savedTimeout); savedTimeout = null; } mode = 0; statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_SAVING"); ytcenter.utils.addClass(statusbar, "visible"); }); ytcenter.events.addEvent("save-complete", function(){ mode = 1; statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_SAVED"); if (savedTimeout) { uw.clearTimeout(savedTimeout); savedTimeout = null; } savedTimeout = uw.setTimeout(function(){ ytcenter.utils.removeClass(statusbar, "visible"); savedTimeout = null; }, ytcenter.settings.saveStatusTimeout); }); ytcenter.events.addEvent("save-error", function(){ mode = -1; statusbar.textContent = ytcenter.language.getLocale("STATUSBAR_SETTINGS_ERROR"); if (savedTimeout) { uw.clearTimeout(savedTimeout); savedTimeout = null; } savedTimeout = uw.setTimeout(function(){ ytcenter.utils.removeClass(statusbar, "visible"); savedTimeout = null; }, ytcenter.settings.saveErrorStatusTimeout); }); })(); rightPanelContent.appendChild(statusbar); rightPanel.appendChild(rightPanelContent); rightPanelContent.className = "ytcenter-settings-panel-right-content"; panelWrapper.className = "ytcenter-settings-content"; panelWrapper.appendChild(leftPanel); panelWrapper.appendChild(rightPanel); frag.appendChild(panelWrapper); return frag; }; a.createDialog = function(){ var dialog = ytcenter.dialog("SETTINGS_TITLE", a.createLayout(), [], "top"), closeButton = document.createElement("div"), closeIcon = document.createElement("img"); closeIcon.className = "close"; closeIcon.setAttribute("src", "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"); closeButton.className = "ytcenter-alert ytcenter-settings-close-button"; closeButton.appendChild(closeIcon); ytcenter.utils.addEventListener(closeButton, "click", function(){ dialog.setVisibility(false); }, false); dialog.getRoot().id = "ytcenter-settings"; dialog.getHeader().appendChild(closeButton); dialog.getHeader().style.margin = "0 -20px 0px"; dialog.getBase().style.overflowY = "scroll"; dialog.getFooter().style.display = "none"; dialog.getContent().className += " clearfix"; return dialog; }; return a; })(); var _settingsInit = false; function settingsInit(){ var cat, subcat, option; if (_settingsInit || !ytcenter.settingsPanel || !ytcenter.__settingsLoaded) return; _settingsInit = true; /* Category:General */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_TAB_GENERAL"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "language", // defaultSetting "list", // Module "SETTINGS_LANGUAGE", // label { // Args "list": function(){ function sortCompare(a, b) { if (a === "en-US") return -1; if (b === "en-US") return 1; if (ytcenter.languages[a].LANGUAGE < ytcenter.languages[b].LANGUAGE) return -1; if (ytcenter.languages[a].LANGUAGE > ytcenter.languages[b].LANGUAGE) return 1; return 0; } var sortList = []; for (var key in ytcenter.languages) { if (ytcenter.languages.hasOwnProperty(key)) { sortList.push(key); } } sortList.sort(sortCompare); var a = []; a.push({ "label": "LANGUAGE_AUTO", "value": "auto" }); for (var i = 0, len = sortList.length; i < len; i++) { a.push({ "value": sortList[i], "label": (function(key){ return function(){ return ytcenter.languages[key].LANGUAGE; }; })(sortList[i]) }); } return a; }, "listeners": [ { "event": "update", "callback": function(){ ytcenter.language.update(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Multiple_Languages" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "useSecureProtocol", // defaultSetting "bool", // module "SETTINGS_USESECUREPROTOCOL_LABEL", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Use_Secure_Protocol" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "removeAdvertisements", // defaultSetting "bool", // module "SETTINGS_REMOVEADVERTISEMENTS_LABEL", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_Advertisements" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "ytspf", // defaultSetting "bool", // module "SETTINGS_YTSPF", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-SPF" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "expandDescription", // defaultSetting "bool", // module "SETTINGS_AUTOEXPANDDESCRIPTION_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Expand_Description" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "headlineTitleExpanded", // defaultSetting "bool", // module "SETTINGS_AUTOEXPANDTITLE_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Expand_Title" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channelUploadedVideosPlaylist", // defaultSetting "bool", // module "SETTINGS_CHANNELUPLOADVIDEOSPLAYLIST_LABEL" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "removeYouTubeTitleSuffix", // defaultSetting "bool", // module "SETTINGS_TITLE_REMOVE_YOUTUBE_SUFFIX", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.title.update(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_YouTube_Title_Suffix" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerPlayingTitleIndicator", // defaultSetting "bool", // module "SETTINGS_PLAYER_PLAYING_INDICATOR", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.title.update(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_Player_Playing_Icon_In_Title" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerOnlyOneInstancePlaying", // defaultSetting "bool", // module "SETTINGS_PLAYER_ONLY_ONE_INSTANCE_PLAYING", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Only_One_Player_Instance_Playing" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "importexport" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "button", null, { "text": "SETTINGS_RESETSETTINGS_LABEL", "listeners": [ { "event": "click", "callback": function(){ var msgElm = document.createElement("h3"); msgElm.style.fontWeight = "normal"; msgElm.textContent = ytcenter.language.getLocale("SETTINGS_RESETSETTINGS_TEXT"); ytcenter.language.addLocaleElement(msgElm, "SETTINGS_RESETSETTINGS_TEXT", "@textContent"); var dialog = ytcenter.dialog("SETTINGS_RESETSETTINGS_LABEL", msgElm, [ { label: "CONFIRM_CANCEL", primary: false, callback: function(){ dialog.setVisibility(false); } }, { label: "CONFIRM_RESET", primary: true, callback: function(){ ytcenter.settings = ytcenter._settings; ytcenter.saveSettings(false); uw.setTimeout(function(){ loc.reload(); dialog.setVisibility(false); }, 500); } } ]); dialog.setVisibility(true); } } ] } ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_WATCHEDVIDEOS"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "watchedVideosIndicator", // defaultSetting "bool", // module "SETTINGS_WATCHEDVIDEOS_INDICATOR", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Watched_Videos" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "hideWatchedVideos", // defaultSetting "bool", // module "SETTINGS_HIDEWATCHEDVIDEOS", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["hide-watched-videos"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Watched_Videos" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "button", // module null, { "text": "SETTINGS_WATCHEDVIDEOS_CLEAN_VIDEO_HISTORY", "listeners": [ { "event": "click", "callback": function(){ var msgElm = document.createElement("h3"); msgElm.style.fontWeight = "normal"; msgElm.textContent = ytcenter.language.getLocale("SETTINGS_WATCHEDVIDEOS_CLEAN_VIDEO_HISTORY_CONTENT"); ytcenter.language.addLocaleElement(msgElm, "SETTINGS_WATCHEDVIDEOS_CLEAN_VIDEO_HISTORY_CONTENT", "@textContent"); var dialog = ytcenter.dialog("SETTINGS_WATCHEDVIDEOS_CLEAN_VIDEO_HISTORY", msgElm, [ { label: "CONFIRM_CANCEL", primary: false, callback: function(){ dialog.setVisibility(false); } }, { label: "CONFIRM_CLEAN", primary: true, callback: function(){ ytcenter.settings.watchedVideos = []; ytcenter.settings.notwatchedVideos = []; ytcenter.saveSettings(false, function(){ loc.reload(); dialog.setVisibility(false); }); } } ]); dialog.setVisibility(true); } } ] } ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_LAYOUT"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "flexWidthOnPage", // defaultSetting "bool", // module "SETTINGS_FLEXWIDTHONPAGE_LABEL", // label { // args "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["flex"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flex_Width_on_Page" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "flexWidthOnChannelPage", // defaultSetting "bool", // module "SETTINGS_FLEXWIDTHONCHANNELPAGE_LABEL", // label { // args "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["flex"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flex_Width_on_Channel" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "gridSubscriptionsPage", // defaultSetting "bool", // module "SETTINGS_GRIDSUBSCRIPTIONS", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Grid_Subscriptions" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["gridview"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "gridCollectionPage", // defaultSetting "bool", // module "SETTINGS_GRIDCOLLECTIONS", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Grid_Collections" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["gridview"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "hideTicker", // defaultSetting "bool", // module "SETTINGS_HIDE_TICKER", "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Ticker" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["hide-ticker"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "hideLangAlert", // defaultSetting "bool", // module "SETTINGS_HIDE_LANG_ALERT" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["hide-lang"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "staticHeader", // defaultSetting "bool", // module "SETTINGS_STATIC_HEADER" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["header"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "staticHeader_scrollToPlayer", // defaultSetting "bool", // module "SETTINGS_SCROLLTOPLAYER_LABEL" ); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ opt.setVisibility(ytcenter.settings.staticHeader); }; })(option)); option.setVisibility(ytcenter.settings.staticHeader); subcat.addOption(option); /*option = ytcenter.settingsPanel.createOption( "yonezCleanYT", // defaultSetting "bool", // module "SETTINGS_LAYOUT_YONEZ_CLEAN_YT" ); option.addEventListener("update", function(){ if (ytcenter.settings.yonezCleanYT) { ytcenter.cssElements.yonez.add(); } else { ytcenter.cssElements.yonez.remove(); } }); subcat.addOption(option);*/ /* Category:Player */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_PLAYER"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "removeRelatedVideosEndscreen", // defaultSetting "bool", // module "SETTINGS_REMOVE_RELATED_VIDEOS_ENDSCREEN", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_Endscreen" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "enableEndscreenAutoplay", // defaultSetting "bool", // module "SETTINGS_ENDSCREEN_AUTOPLAY", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Play_First_Video_in_Endscreen" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likeSwitchToTab", "list", "SETTINGS_SWITCHTOTAB_LIKE", { "list": [ { "value": "none", "label": "SETTINGS_SWITCHTOTAB_NONE" }, { "value": "share", "label": "SETTINGS_SWITCHTOTAB_SHARE" }/*, { "value": "stats", "label": "SETTINGS_SWITCHTOTAB_STATS" }, { "value": "report", "label": "SETTINGS_SWITCHTOTAB_REPORT" }, { "value": "ratings-disabled", "label": "SETTINGS_SWITCHTOTAB_RATINGS_DISABLED" }, { "value": "rental-required", "label": "SETTINGS_SWITCHTOTAB_RENTAL_REQUIRED" }, { "value": "error", "label": "SETTINGS_SWITCHTOTAB_ERROR" }*/ ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Switch_To_Tab_At_Like_of_Video" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "endOfVideoAutoSwitchToTab", "list", "SETTINGS_SWITCHTOTAB_ENDOFVIDEO", { "list": [ { "value": "none", "label": "SETTINGS_SWITCHTOTAB_NONE" }, { "value": "share", "label": "SETTINGS_SWITCHTOTAB_SHARE" }, { "value": "stats", "label": "SETTINGS_SWITCHTOTAB_STATS" }, { "value": "report", "label": "SETTINGS_SWITCHTOTAB_REPORT" }, { "value": "ratings-disabled", "label": "SETTINGS_SWITCHTOTAB_RATINGS_DISABLED" }, { "value": "rental-required", "label": "SETTINGS_SWITCHTOTAB_RENTAL_REQUIRED" }, { "value": "error", "label": "SETTINGS_SWITCHTOTAB_ERROR" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Switch_To_Tab_At_End_of_Video" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dashPlayback", // defaultSetting "bool", // module "SETTINGS_DASHPLAYBACK", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-DASH_Playback" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "forcePlayerType", // defaultSetting "list", // module "SETTINGS_FORCEPLAYERTYPE", { "list": [ { "value": "default", "label": "SETTINGS_FORCEPLAYERTYPE_DEFAULT" }, { "value": "flash", "label": "SETTINGS_FORCEPLAYERTYPE_FLASH" }, { "value": "html5", "label": "SETTINGS_FORCEPLAYERTYPE_HTML5" }, { "value": "aggressive_flash", "label": "SETTINGS_FORCEPLAYERTYPE_AGGRESSIVE_FLASH" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Type" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "autohide", // defaultSetting "list", // module "SETTINGS_AUTOHIDECONTROLBAR_LABEL", { "list": [ { "value": "-1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_DEFAULT" }, { "value": "0", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_NONE" }, { "value": "1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_BOTH" }, { "value": "2", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_PROGRESSBAR" }, { "value": "3", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_CONTROLBAR" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.page === "watch") { ytcenter.player.setAutoHide(ytcenter.settings.autohide); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Hide_Bar" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerTheme", // defaultSetting "list", // module "SETTINGS_PLAYERTHEME_LABEL", { "list": [ { "value": "dark", "label": "SETTINGS_PLAYERTHEME_DARK" }, { "value": "light", "label": "SETTINGS_PLAYERTHEME_LIGHT" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.page === "watch") { ytcenter.player.setTheme(ytcenter.settings.playerTheme); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Theme" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerColor", // defaultSetting "list", // module "SETTINGS_PLAYERCOLOR_LABEL", { "list": [ { "value": "red", "label": "SETTINGS_PLAYERCOLOR_RED" }, { "value": "white", "label": "SETTINGS_PLAYERCOLOR_WHITE" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.page === "watch") { ytcenter.player.setProgressColor(ytcenter.settings.playerColor); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Color" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "flashWMode", // defaultSetting "list", // module "SETTINGS_WMODE_LABEL", { "list": [ { "value": "none", "label": "SETTINGS_WMODE_NONE" }, { "value": "window", "label": "SETTINGS_WMODE_WINDOW" }, { "value": "direct", "label": "SETTINGS_WMODE_DIRECT" }, { "value": "opaque", "label": "SETTINGS_WMODE_OPAQUE" }, { "value": "transparent", "label": "SETTINGS_WMODE_TRANSPARENT" }, { "value": "gpu", "label": "SETTINGS_WMODE_GPU" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flash_WMode" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "enableAnnotations", // defaultSetting "bool", // module "SETTINGS_ENABLEANNOTATIONS_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Annotations" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "bufferEnabled", // defaultSetting "bool", // module "SETTINGS_BUFFER_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Enable_custom_buffer" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "bufferSize", // defaultSetting "rangetext", // module "SETTINGS_BUFFER_SIZE", { "min": 0, /* 0 bytes - I have no idea if this will break something */ "max": 1099511627776, /* 1 TB - Why not... */ "suffix": " B", "text-width": "135px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Custom_buffer_size" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "line" ); subcat.addOption(option); /*option = ytcenter.settingsPanel.createOption( "removeBrandingBanner", // defaultSetting "bool", // module "SETTINGS_BRANDING_BANNER_REMOVE", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_Branding_Banner" ); subcat.addOption(option);*/ /*option = ytcenter.settingsPanel.createOption( "removeBrandingBackground", // defaultSetting "bool", // module "SETTINGS_BRANDING_BACKGROUND_REMOVE", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_Branding_Background" ); subcat.addOption(option);*/ option = ytcenter.settingsPanel.createOption( "removeBrandingWatermark", // defaultSetting "bool", // module "SETTINGS_BRANDING_WATERMARK_REMOVE", // label { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_Branding_Watermark" ); subcat.addOption(option); if (devbuild) { option = ytcenter.settingsPanel.createOption( null, // defaultSetting "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "enable_custom_fexp", // defaultSetting "bool", // module "SETTINGS_ENABLE_CUSTOM_FEXP" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "custom_fexp", // defaultSetting "textfield", // module "SETTINGS_CUSTOM_FEXP" ); subcat.addOption(option); } subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_AUTOPLAY"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "preventAutoPlay", // defaultSetting "bool", // module "SETTINGS_PREVENTAUTOPLAY_LABEL", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoPlay" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventAutoBuffer", // defaultSetting "bool", // module "SETTINGS_PREVENTAUTOBUFFERING_LABEL", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoBuffering" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "newline" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventPlaylistAutoPlay", // defaultSetting "bool", // module "SETTINGS_PLAYLIST_PREVENT_AUTOPLAY", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Playlist_AutoPlay" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventPlaylistAutoBuffer", // defaultSetting "bool", // module "SETTINGS_PLAYLIST_PREVENT_AUTOBUFFERING", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Playlist_AutoBuffering" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "newline" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventTabAutoPlay", // defaultSetting "bool", // module "SETTINGS_PREVENTTABAUTOPLAY_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Tab_AutoPlay" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventTabAutoBuffer", // defaultSetting "bool", // module "SETTINGS_PREVENTTABAUTOBUFFERING_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Tab_AutoBuffering" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "newline" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventTabPlaylistAutoPlay", // defaultSetting "bool", // module "SETTINGS_PREVENTTABPLAYLISTAUTOPLAY_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Tab_Playlist_AutoPlay" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "preventTabPlaylistAutoBuffer", // defaultSetting "bool", // module "SETTINGS_PREVENTTABPLAYLISTAUTOBUFFERING_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_Tab_Playlist_AutoBuffering" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "newline" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playlistAutoPlay", // defaultSetting "bool", // module "SETTINGS_PLAYLIST_AUTOPLAY", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Playlist_auto_play" ); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ var module = opt.getLiveModule(); if (module) { module.update(ytcenter.settings.playlistAutoPlay); } }; })(option)); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playlistAutoPlayFreeze", // defaultSetting "bool", // module "SETTINGS_PLAYLIST_AUTOPLAY_FREEZE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Playlist_auto_play_freeze" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_RESOLUTION"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableAutoVideoQuality", // defaultSetting "bool", // module "SETTINGS_ENABLEAUTORESOLUTION_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Auto_Resolution" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "autoVideoQuality", // defaultSetting "list", // module "SETTINGS_AUTORESOLUTION_LABEL", { "list": [ { "value": "highres", "label": "SETTINGS_HIGHRES" }, { "value": "hd1440", "label": "SETTINGS_HD1440" }, { "value": "hd1080", "label": "SETTINGS_HD1080" }, { "value": "hd720", "label": "SETTINGS_HD720" }, { "value": "large", "label": "SETTINGS_LARGE" }, { "value": "medium", "label": "SETTINGS_MEDIUM" }, { "value": "small", "label": "SETTINGS_SMALL" }, { "value": "tiny", "label": "SETTINGS_TINY" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Resolution" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_PLAYERSIZE"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableResize", // defaultSetting "bool", // module "SETTINGS_RESIZE_FEATURE_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Size" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "resize-default-playersize", // defaultSetting "defaultplayersizedropdown", // module "SETTINGS_RESIZE_DEFAULT", { "bind": "resize-playersizes" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Default_Player_Size" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "resize-small-button", // defaultSetting "defaultplayersizedropdown", // module "SETTINGS_RESIZE_SMALL_BUTTON", { "bind": "resize-playersizes" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Small_Resize_Button" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "resize-large-button", // defaultSetting "defaultplayersizedropdown", // module "SETTINGS_RESIZE_LARGE_BUTTON", { "bind": "resize-playersizes" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Large_Resize_Button" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerSizeAspect", // defaultSetting "list", // module "SETTINGS_RESIZE_ASPECT_LABEL", { "list": [ { "value": "default", "label": "SETTINGS_RESIZE_ASPECT_DEFAULT" }, { "value": "4:3", // 1.33333 "label": "SETTINGS_RESIZE_ASPECT_4:3" }, { "value": "3:2", // 1.33333 "label": "SETTINGS_RESIZE_ASPECT_3:2" }, { "value": "5:4", // 1.25 "label": "SETTINGS_RESIZE_ASPECT_5:4" }, { "value": "16:9", // 1.7778 "label": "SETTINGS_RESIZE_ASPECT_16:9" }, { "value": "16:10", // 1.6 "label": "SETTINGS_RESIZE_ASPECT_16:10" }, { "value": "24:10", // 2.4 "label": "SETTINGS_RESIZE_ASPECT_24:10" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.player.setRatio(ytcenter.player.calculateRatio(ytcenter.player.getConfig().args.dash === "1" && ytcenter.player.getConfig().args.adaptive_fmts)); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Aspect" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "ytOnlyStageMode", // defaultSetting "bool", // module "SETTINGS_RESIZE_ONLY_STAGE_MODE", { "listeners" : [ { "event": "click", "callback": function(){ ytcenter.player.resizeUpdater(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Only_stage_mode" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting null, // module "SETTINGS_RESIZE_LIST", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Size_Editor" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "resize-playersizes", // defaultSetting "resizeItemList" // module ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_VOLUME"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableVolume", // defaultSetting "bool", // module "SETTINGS_VOLUME_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Volume_Control" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "volume", // defaultSetting "rangetext", // module "SETTINGS_VOLUME_LABEL", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Volume-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "mute", // defaultSetting "bool", // module "SETTINGS_MUTE_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Mute" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_SHORTCUTS"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableYouTubeShortcuts", // defaultSetting "bool", // module "SETTINGS_ENABLEYTSHORTCUTS_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_YouTube_Player_Shortcuts" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "enableShortcuts", // defaultSetting "bool", // module "SETTINGS_ENABLESHORTCUTS_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Shortcuts_on_Page" ); subcat.addOption(option); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ opt.setVisibility(ytcenter.settings.enableYouTubeShortcuts); }; })(option)); option.setVisibility(ytcenter.settings.enableYouTubeShortcuts); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_TOPSCROLLPLAYER"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "topScrollPlayerEnabled", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_ENABLED", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Fullscreen_Top_Player" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerActivated", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_ACTIVATED", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Activated_by_Default" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerEnabledOnlyVideoPlaying", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_ONLYVIDEOPLAYING", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Only_when_Video_is_Playing" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerEnterOnVideoPlay", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_ENTERONVIDEOPLAY", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enter_On_Video_Play" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerExitOnVideoPause", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_EXITONVIDEOPAUSE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Exit_On_Video_Pause" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerExitOnVideoEnd", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_EXITONVIDEOEND", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Exit_On_Video_End" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerScrollUpToExit", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_SCROLLUPEXIT", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Scroll_Up_To_Exit_Mode" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerAnimation", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_ANIMATION", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Animations" ); subcat.addOption(option); /*option = ytcenter.settingsPanel.createOption( "topScrollPlayerHideScrollbar", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_HIDESCROLLBAR", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#hide-scrollbar" ); subcat.addOption(option);*/ option = ytcenter.settingsPanel.createOption( "topScrollPlayerCountIncreaseBefore", // defaultSetting "bool", // module "SETTINGS_TOPSCROLLPLAYER_COUNTINCREASEBEFORE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Increase_Counter_by_Scrolling_To_The_Top_of_The_Page" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerTimesToEnter", // defaultSetting "rangetext", // module "SETTINGS_TOPSCROLLPLAYER_TIMESTOENTER", // label { "min": 0, "max": 20 }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Amount_To_Enter" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerTimesToExit", // defaultSetting "rangetext", // module "SETTINGS_TOPSCROLLPLAYER_TIMESTOEXIT", // label { "min": 0, "max": 20 }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Amount_To_Exit" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "topScrollPlayerBumpTimer", // defaultSetting "rangetext", // module "SETTINGS_TOPSCROLLPLAYER_BUMPTIMER", // label { "min": 0, "max": 10000, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Counter_Reset_After" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_PLAYERGLOW"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "playerGlowEnabled", // defaultSetting "bool", // module "SETTINGS_PLAYERGLOW_ENABLED", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Enabled" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setEnabled(ytcenter.settings.playerGlowEnabled); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowFactor", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_FACTOR", // label { "min": 1, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Quality" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("factor", ytcenter.settings.playerGlowFactor); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowPixelInterval", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_PIXEL_INTERVAL", // label { "min": 1, "max": 10000000 }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Pixel_interval" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("pixelInterval", ytcenter.settings.playerGlowPixelInterval); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowRequestAnimationFrame", // defaultSetting "bool", // module "SETTINGS_PLAYERGLOW_USE_REQUEST_ANIMATION_FRAME", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Use_request_animation_frame" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowUpdateInterval", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_UPDATE_INTERVAL", // label { "min": 0, "max": 10000, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Update_interval" ); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ ytcenter.effects.playerGlow.setOption("interval", (ytcenter.settings.playerGlowRequestAnimationFrame ? -1 : ytcenter.settings.playerGlowUpdateInterval)); opt.setVisibility(!ytcenter.settings.playerGlowRequestAnimationFrame); }; })(option)); option.setVisibility(!ytcenter.settings.playerGlowRequestAnimationFrame); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowTransition", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_TRANSITION", // label { "min": 0, "max": 10000, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Transition" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("transition", ytcenter.settings.playerGlowTransition); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowBlur", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_BLUR", // label { "min": 0, "max": 200, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Blur" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("blur", ytcenter.settings.playerGlowBlur); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowSpread", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_SPREAD", // label { "min": 0, "max": 200, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Spread" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("spread", ytcenter.settings.playerGlowSpread); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowOpacity", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_OPACITY", // label { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Opacity" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("opacity", ytcenter.settings.playerGlowOpacity/100); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerMultiGlowEffect", // defaultSetting "bool", // module "SETTINGS_PLAYERGLOW_MULTI_ENABLED", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Multi_glow_enabled" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("multiglow", ytcenter.settings.playerMultiGlowEffect); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerMultiGlowEffectDepth", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_MULTI_DEPTH", // label { "min": 1, "max": 500, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Depth" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("depth", ytcenter.settings.playerMultiGlowEffectDepth); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerMultiGlowEffectBlockInterval", // defaultSetting "rangetext", // module "SETTINGS_PLAYERGLOW_MULTI_BLOCK_INTERVAL", // label { "min": 1, "max": 200, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Block_interval" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("blockInterval", ytcenter.settings.playerMultiGlowEffectBlockInterval); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerGlowEffectOnPlayer", "list", "SETTINGS_PLAYERGLOW_APPLIED", { "list": [ { "value": "both", "label": "SETTINGS_PLAYERGLOW_LIGHTS_OFF_BOTH" }, { "value": "only-lights-off", "label": "SETTINGS_PLAYERGLOW_LIGHTS_OFF_ONLY_LIGHTS_OFF" }, { "value": "only-without-lights-off", "label": "SETTINGS_PLAYERGLOW_LIGHTS_OFF_ONLY_WITHOUT_LIGHTS_OFF" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Glow_on" ); ytcenter.events.addEvent("settings-update", function(){ ytcenter.effects.playerGlow.setOption("glowEffectOnPlayer", ytcenter.settings.playerGlowEffectOnPlayer); }); subcat.addOption(option); /* Category:External Players */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_EXTERNAL_PLAYERS"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_EMBED"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "embed_enabled", "bool", "SETTINGS_EMBEDS_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Embeds" ); subcat.addOption(option); // Only needed in the developer version for testing. if (devbuild) { option = ytcenter.settingsPanel.createOption( "embedWriteEmbedMethod", "list", "SETTINGS_EMBEDS_WRITEMETHOD", { "list": [ { "value": "standard", "label": "SETTINGS_EMBEDS_WRITEMETHOD_STANDARD" }, { "value": "test1", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST1" }, { "value": "test2", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST2" }, { "value": "test3", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST3" }, { "value": "standard+reload", "label": "SETTINGS_EMBEDS_WRITEMETHOD_STANDARDRELOAD" }, { "value": "test1+reload", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST1RELOAD" }, { "value": "test2+reload", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST2RELOAD" }, { "value": "test3+reload", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST3RELOAD" }, { "value": "test4", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST4" }, { "value": "test5", "label": "SETTINGS_EMBEDS_WRITEMETHOD_TEST5" } ] } ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embedWriteEmbedMethodReloadDelay", "rangetext", "SETTINGS_EMBEDS_WRITEMETHOD_RELOADDELAY", { "min": 0, "max": 10000, "suffix": " ms" } ); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ opt.setVisibility(ytcenter.settings.embedWriteEmbedMethod.indexOf("+reload") !== -1); }; })(option)); option.setVisibility(ytcenter.settings.embedWriteEmbedMethod.indexOf("+reload") !== -1); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); } option = ytcenter.settingsPanel.createOption( "embed_dashPlayback", "bool", "SETTINGS_DASHPLAYBACK", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-DASH_Playback-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_forcePlayerType", "list", "SETTINGS_FORCEPLAYERTYPE", { "list": [ { "value": "default", "label": "SETTINGS_FORCEPLAYERTYPE_DEFAULT" }, { "value": "flash", "label": "SETTINGS_FORCEPLAYERTYPE_FLASH" }, { "value": "html5", "label": "SETTINGS_FORCEPLAYERTYPE_HTML5" }, { "value": "aggressive_flash", "label": "SETTINGS_FORCEPLAYERTYPE_AGGRESSIVE_FLASH" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Type-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_autohide", "list", "SETTINGS_AUTOHIDECONTROLBAR_LABEL", { "list": [ { "value": "-1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_DEFAULT" }, { "value": "0", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_NONE" }, { "value": "1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_BOTH" }, { "value": "2", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_PROGRESSBAR" }, { "value": "3", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_CONTROLBAR" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setAutoHide(ytcenter.settings.embed_autohide); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Hide_Bar-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_playerTheme", "list", "SETTINGS_PLAYERTHEME_LABEL", { "list": [ { "value": "dark", "label": "SETTINGS_PLAYERTHEME_DARK" }, { "value": "light", "label": "SETTINGS_PLAYERTHEME_LIGHT" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setTheme(ytcenter.settings.embed_playerTheme); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Theme-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_playerColor", "list", "SETTINGS_PLAYERCOLOR_LABEL", { "list": [ { "value": "red", "label": "SETTINGS_PLAYERCOLOR_RED" }, { "value": "white", "label": "SETTINGS_PLAYERCOLOR_WHITE" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setProgressColor(ytcenter.settings.embed_playerColor); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Color-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_flashWMode", "list", "SETTINGS_WMODE_LABEL", { "list": [ { "value": "none", "label": "SETTINGS_WMODE_NONE" }, { "value": "window", "label": "SETTINGS_WMODE_WINDOW" }, { "value": "direct", "label": "SETTINGS_WMODE_DIRECT" }, { "value": "opaque", "label": "SETTINGS_WMODE_OPAQUE" }, { "value": "transparent", "label": "SETTINGS_WMODE_TRANSPARENT" }, { "value": "gpu", "label": "SETTINGS_WMODE_GPU" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flash_WMode-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_enableAnnotations", "bool", "SETTINGS_ENABLEANNOTATIONS_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Annotations-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embedBufferEnabled", // defaultSetting "bool", // module "SETTINGS_BUFFER_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Enable_custom_buffer" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embedBufferSize", // defaultSetting "rangetext", // module "SETTINGS_BUFFER_SIZE", { "min": 0, /* 0 bytes - I have no idea if this will break something */ "max": 1099511627776, /* 1 TB - Why not... */ "suffix": " B", "text-width": "135px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Custom_buffer_size" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_enableAutoVideoQuality", "bool", "SETTINGS_ENABLEAUTORESOLUTION_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Auto_Resolution-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_autoVideoQuality", "list", "SETTINGS_AUTORESOLUTION_LABEL", { "list": [ { "value": "highres", "label": "SETTINGS_HIGHRES" }, { "value": "hd1440", "label": "SETTINGS_HD1440" }, { "value": "hd1080", "label": "SETTINGS_HD1080" }, { "value": "hd720", "label": "SETTINGS_HD720" }, { "value": "large", "label": "SETTINGS_LARGE" }, { "value": "medium", "label": "SETTINGS_MEDIUM" }, { "value": "small", "label": "SETTINGS_SMALL" }, { "value": "tiny", "label": "SETTINGS_TINY" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Resolution-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_defaultAutoplay", "bool", "SETTINGS_DEFAULT_AUTOPLAY", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Use_Default_AutoPlay" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_preventAutoPlay", "bool", "SETTINGS_PREVENTAUTOPLAY_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoPlay-2" ); option.setVisibility(!ytcenter.settings.embed_defaultAutoplay); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ opt.setVisibility(!ytcenter.settings.embed_defaultAutoplay); }; })(option)); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_preventAutoBuffer", "bool", "SETTINGS_PREVENTAUTOBUFFERING_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoBuffering-2" ); option.setVisibility(!ytcenter.settings.embed_defaultAutoplay); ytcenter.events.addEvent("settings-update", (function(opt){ return function(){ opt.setVisibility(!ytcenter.settings.embed_defaultAutoplay); }; })(option)); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_enableVolume", "bool", "SETTINGS_VOLUME_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Volume_Control-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_volume", "rangetext", "SETTINGS_VOLUME_LABEL", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Volume-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "embed_mute", "bool", "SETTINGS_MUTE_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Mute-2" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_CHANNEL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "embed_dashPlayback", "bool", "SETTINGS_DASHPLAYBACK", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-DASH_Playback-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_forcePlayerType", "list", "SETTINGS_FORCEPLAYERTYPE", { "list": [ { "value": "default", "label": "SETTINGS_FORCEPLAYERTYPE_DEFAULT" }, { "value": "flash", "label": "SETTINGS_FORCEPLAYERTYPE_FLASH" }, { "value": "html5", "label": "SETTINGS_FORCEPLAYERTYPE_HTML5" }, { "value": "aggressive_flash", "label": "SETTINGS_FORCEPLAYERTYPE_AGGRESSIVE_FLASH" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Type-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_autohide", "list", "SETTINGS_AUTOHIDECONTROLBAR_LABEL", { "list": [ { "value": "-1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_DEFAULT" }, { "value": "0", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_NONE" }, { "value": "1", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_BOTH" }, { "value": "2", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_PROGRESSBAR" }, { "value": "3", "label": "SETTINGS_AUTOHIDECONTROLBAR_LIST_CONTROLBAR" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setAutoHide(ytcenter.settings.channel_autohide); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Hide_Bar-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_playerTheme", "list", "SETTINGS_PLAYERTHEME_LABEL", { "list": [ { "value": "dark", "label": "SETTINGS_PLAYERTHEME_DARK" }, { "value": "light", "label": "SETTINGS_PLAYERTHEME_LIGHT" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setTheme(ytcenter.settings.channel_playerTheme); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Theme-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_playerColor", "list", "SETTINGS_PLAYERCOLOR_LABEL", { "list": [ { "value": "red", "label": "SETTINGS_PLAYERCOLOR_RED" }, { "value": "white", "label": "SETTINGS_PLAYERCOLOR_WHITE" } ], "listeners" : [ { "event": "update", "callback": function(){ if (ytcenter.getPage() === "embed") { ytcenter.player.setProgressColor(ytcenter.settings.channel_playerColor); } } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Player_Color-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_flashWMode", "list", "SETTINGS_WMODE_LABEL", { "list": [ { "value": "none", "label": "SETTINGS_WMODE_NONE" }, { "value": "window", "label": "SETTINGS_WMODE_WINDOW" }, { "value": "direct", "label": "SETTINGS_WMODE_DIRECT" }, { "value": "opaque", "label": "SETTINGS_WMODE_OPAQUE" }, { "value": "transparent", "label": "SETTINGS_WMODE_TRANSPARENT" }, { "value": "gpu", "label": "SETTINGS_WMODE_GPU" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flash_WMode-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_enableAnnotations", "bool", "SETTINGS_ENABLEANNOTATIONS_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Annotations-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channelBufferEnabled", // defaultSetting "bool", // module "SETTINGS_BUFFER_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Enable_custom_buffer" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channelBufferSize", // defaultSetting "rangetext", // module "SETTINGS_BUFFER_SIZE", { "min": 0, /* 0 bytes - I have no idea if this will break something */ "max": 1099511627776, /* 1 TB - Why not... */ "suffix": " B", "text-width": "135px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Custom_buffer_size" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_enableAutoVideoQuality", "bool", "SETTINGS_ENABLEAUTORESOLUTION_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Auto_Resolution-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_autoVideoQuality", "list", "SETTINGS_AUTORESOLUTION_LABEL", { "list": [ { "value": "highres", "label": "SETTINGS_HIGHRES" }, { "value": "hd1440", "label": "SETTINGS_HD1440" }, { "value": "hd1080", "label": "SETTINGS_HD1080" }, { "value": "hd720", "label": "SETTINGS_HD720" }, { "value": "large", "label": "SETTINGS_LARGE" }, { "value": "medium", "label": "SETTINGS_MEDIUM" }, { "value": "small", "label": "SETTINGS_SMALL" }, { "value": "tiny", "label": "SETTINGS_TINY" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Resolution-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_preventAutoPlay", "bool", "SETTINGS_PREVENTAUTOPLAY_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoPlay-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_preventAutoBuffer", "bool", "SETTINGS_PREVENTAUTOBUFFERING_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Prevent_AutoBuffering-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_enableVolume", "bool", "SETTINGS_VOLUME_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Volume_Control-3" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_volume", "rangetext", "SETTINGS_VOLUME_LABEL", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Volume-4" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "channel_mute", "bool", "SETTINGS_MUTE_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Mute-3" ); subcat.addOption(option); /* Category:Download */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_DOWNLOAD"); if (identifier === 8) cat.setVisibility(false); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "downloadQuality", "list", "SETTINGS_DOWNLOADQUALITY_LABEL", { "list": [ { "value": "highres", "label": "SETTINGS_HIGHRES" }, { "value": "hd1440", "label": "SETTINGS_HD1440" }, { "value": "hd1080", "label": "SETTINGS_HD1080" }, { "value": "hd720", "label": "SETTINGS_HD720" }, { "value": "large", "label": "SETTINGS_LARGE" }, { "value": "medium", "label": "SETTINGS_MEDIUM" }, { "value": "small", "label": "SETTINGS_SMALL" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Quality" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "downloadFormat", "list", "SETTINGS_DOWNLOADFORMAT_LABEL", { "list": [ { "value": "mp4", "label": "SETTINGS_DOWNLOADFORMAT_LIST_MP4" }, { "value": "webm", "label": "SETTINGS_DOWNLOADFORMAT_LIST_WEBM" }, { "value": "flv", "label": "SETTINGS_DOWNLOADFORMAT_LIST_FLV" }, { "value": "3gp", "label": "SETTINGS_DOWNLOADFORMAT_LIST_3GP" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Format" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "downloadAsLinks", "bool", "SETTINGS_DOWNLOADASLINKS_LABEL", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Download_as_links" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "show3DInDownloadMenu", "bool", "SETTINGS_SHOW3DINDOWNLOADMENU_LABEL", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_3D_in_Download_Menu" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "filename", "textfield", "SETTINGS_FILENAME_LABEL", { "listeners": [ { "event": "change", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Filename" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "fixfilename", "bool", "SETTINGS_FIXDOWNLOADFILENAME_LABEL", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Remove_NonAlphanumeric_Characters" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_MP3SERVICES"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "mp3Services", "multilist", "SETTINGS_MP3SERVICES_LABEL", { "list": ytcenter.mp3services, "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-MP3_Services" ); option.setModuleStyle("display", "block"); subcat.addOption(option); /* Category:Repeat */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_REPEAT"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "autoActivateRepeat", "bool", "SETTINGS_AUTOACTIVATEREPEAT_LABEL", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Auto_Activate_Repeat" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "repeatShowIcon", "bool", "SETTINGS_REPEAT_SHOW_ICON", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_Icon" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "repeatShowText", "bool", "SETTINGS_REPEAT_SHOW_TEXT", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_Text" ); subcat.addOption(option); /* Category:UI */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_UI"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "guideMode", "list", "SETTINGS_GUIDEMODE", { "list": [ { "value": "default", "label": "SETTINGS_GUIDEMODE_DEFAULT" }, { "value": "always_open", "label": "SETTINGS_GUIDEMODE_ALWAYS_OPEN" }, { "value": "always_closed", "label": "SETTINGS_GUIDEMODE_ALWAYS_CLOSED" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Guide_Mode" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "watch7playerguidealwayshide", "bool", "SETTINGS_GUIDE_ALWAYS_HIDE", { "listeners": [ { "event": "click", "callback": function(){ /*ytcenter.guide.hidden = ytcenter.settings.watch7playerguidealwayshide; ytcenter.guide.update();*/ ytcenter.player._updateResize(); ytcenter.classManagement.updateClassesByGroup(["hide-guide"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Always_Hide_The_Guide" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "watch7playerguidehide", "bool", "SETTINGS_WATCH7_PLAYER_GUIDE_HIDE", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.player._updateResize(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Guide_When_Resizing" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "disableGuideCount", "bool", "SETTINGS_HIDE_GUIDE_COUNT", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["hide-guide-count"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Guide_Count" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line", null ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "logoLink", "textfield", "SETTINGS_LOGO_LINK", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.updateLogoLink(); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-YouTube_Logo_Link" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "disableFeedItemActionMenu", "bool", "SETTINGS_HIDE_FEED_ITEM_ACTION_MENU", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["hide-feed-item-action-menu"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Feed_Item_Action_Menu_Button" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "hideRecommendedChannels", "bool", "SETTINGS_HIDE_RECOMMENDED_CHANNELS", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["hide-recommended-channels"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Hide_Recommended_Channels" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line", null ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerDarkSideBG", "bool", "SETTINGS_PLAYER_DARK_SIDE", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["darkside"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Dark_Player_Background" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerDarkSideBGRetro", "bool", "SETTINGS_PLAYER_DARK_SIDE_RETRO", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Dark_player_background_retro" ); var playerDarkSideBGRetroOption = option; subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "playerDarkSideBGColor", "colorpicker", "SETTINGS_PLAYER_DARK_SIDE_COLOR", { "presetColors": ["#1b1b1b", "#444444"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["darkside"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Dark_Player_Background_Color" ); var playerDarkSideBGColorOption = option; playerDarkSideBGRetroOption.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["darkside"]); playerDarkSideBGColorOption.setVisibility(!ytcenter.settings.playerDarkSideBGRetro); }); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["darkside"]); }); if (ytcenter.settings.playerDarkSideBGRetro) option.setVisibility(false); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "line", null ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "uploaderCountryEnabled", // defaultSetting "bool", // module "SETTINGS_UPLOADER_COUNTRY_FLAG_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Country_Flag_for_Uploader" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "uploaderCountryShowFlag", // defaultSetting "bool", // module "SETTINGS_UPLOADER_COUNTRY_FLAG_SHOW_FLAG", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_Country_Flag" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "uploaderCountryUseNames", // defaultSetting "bool", // module "SETTINGS_UPLOADER_COUNTRY_FLAG_USE_NAME", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Use_Country_Names" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "uploaderCountryPosition", // defaultSetting "list", // module "SETTINGS_UPLOADER_COUNTRY_FLAG_POSITION", // label { "list": [ { "value": "before_username", "label": "SETTINGS_UPLOADER_COUNTRY_FLAG_POSITION_BEFORE_USERNAME" }, { "value": "after_username", "label": "SETTINGS_UPLOADER_COUNTRY_FLAG_POSITION_AFTER_USERNAME" }, { "value": "last", "label": "SETTINGS_UPLOADER_COUNTRY_FLAG_POSITION_LAST" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Flag_Country_Position" ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_LIKEDISLIKEBUTTON"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "likeButtonColor", "colorpicker", "SETTINGS_LIKEBUTTON_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttoncolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Like_button_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttoncolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likeButtonHoverColor", "colorpicker", "SETTINGS_LIKEBUTTON_HOVER_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttonhovercolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Like_button_hover_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttonhovercolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likeButtonOpacity", "rangetext", "SETTINGS_LIKEBUTTON_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Like_button_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likeButtonHoverOpacity", "rangetext", "SETTINGS_LIKEBUTTON_HOVER_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Like_button_hover_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likebuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikeButtonColor", "colorpicker", "SETTINGS_DISLIKEBUTTON_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttoncolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Dislike_button_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttoncolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikeButtonHoverColor", "colorpicker", "SETTINGS_DISLIKEBUTTON_HOVER_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttonhovercolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Dislike_button_hover_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttonhovercolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikeButtonOpacity", "rangetext", "SETTINGS_DISLIKEBUTTON_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Dislike_button_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikeButtonHoverOpacity", "rangetext", "SETTINGS_DISLIKEBUTTON_HOVER_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Dislike_button_hover_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikebuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likedButtonColor", "colorpicker", "SETTINGS_LIKEDBUTTON_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttoncolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Liked_button_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttoncolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likedButtonHoverColor", "colorpicker", "SETTINGS_LIKEDBUTTON_HOVER_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttonhovercolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Liked_button_hover_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttonhovercolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likedButtonOpacity", "rangetext", "SETTINGS_LIKEDBUTTON_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Liked_button_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "likedButtonHoverOpacity", "rangetext", "SETTINGS_LIKEDBUTTON_HOVER_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Liked_button_hover_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["likedbuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikedButtonColor", "colorpicker", "SETTINGS_DISLIKEDBUTTON_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttoncolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Disliked_button_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttoncolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikedButtonHoverColor", "colorpicker", "SETTINGS_DISLIKEDBUTTON_HOVER_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff", "#000"], "listeners": [ { "event": "click", "callback": function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttonhovercolor"]); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Disliked_button_hover_color" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttonhovercolor"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikedButtonOpacity", "rangetext", "SETTINGS_DISLIKEDBUTTON_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Disliked_button_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttonopacity"]); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "dislikedButtonHoverOpacity", "rangetext", "SETTINGS_DISLIKEDBUTTON_HOVER_OPACITY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Disliked_button_hover_opacity" ); option.addEventListener("update", function(){ ytcenter.classManagement.updateClassesByGroup(["dislikedbuttonopacity"]); }); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_RATINGBAR"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "sparkbarLikesColor", // defaultSetting "colorpicker", // module "SETTINGS_SPARKBAR_LIKES_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff"] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Rating_Bar_Likes_Color" ); option.addEventListener("update", function(){ var wvi = document.getElementById("watch7-views-info"), sl = document.getElementsByClassName("video-extras-sparkbar-likes"); if (sl && sl.length > 0 && sl[0]) { sl[0].style.background = ytcenter.settings.sparkbarLikesColor; } }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "sparkbarDislikesColor", // defaultSetting "colorpicker", // module "SETTINGS_SPARKBAR_DISLIKES_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff"] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Rating_Bar_Dislikes_Color" ); option.addEventListener("update", function(){ var wvi = document.getElementById("watch7-views-info"), sd = document.getElementsByClassName("video-extras-sparkbar-dislikes"); if (sd && sd.length > 0 && sd[0]) { sd[0].style.background = ytcenter.settings.sparkbarDislikesColor; } }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "sparkbarHeight", // defaultSetting "rangetext", // module "SETTINGS_SPARKBAR_HEIGHT", // label { "min": 1, "max": 100, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Height" ); option.addEventListener("update", function(){ var wvi = document.getElementById("watch7-views-info"), sl = document.getElementsByClassName("video-extras-sparkbar-likes"), sd = document.getElementsByClassName("video-extras-sparkbar-dislikes"); if (sl && sd && sl.length > 0 && sd.length > 0 && sl[0] && sd[0]) { sl[0].style.height = ytcenter.settings.sparkbarHeight + "px"; sd[0].style.height = ytcenter.settings.sparkbarHeight + "px"; sd[0].parentNode.style.height = ytcenter.settings.sparkbarHeight + "px"; } }); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_PLACEMENT"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableDownload", "bool", "SETTINGS_ENABLEDOWNLOAD_LABEL", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Placement" ); if (identifier === 8) option.setVisibility(false); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "enableRepeat", "bool", "SETTINGS_ENABLEREPEAT_LABEL", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Placement" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "lightbulbEnable", "bool", "SETTINGS_LIGHTBULB_ENABLE", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Placement" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "resizeEnable", "bool", "SETTINGS_RESIZE_ENABLE", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Placement" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "aspectEnable", "bool", "SETTINGS_ASPECT_ENABLE", { "listeners": [ { "event": "click", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Placement" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "newline" ); option.setVisibility(ytcenter.getPage() === "watch"); ytcenter.events.addEvent("ui-refresh", function(){ this.setVisibility(ytcenter.getPage() === "watch"); }.bind(option)); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "button", null, { "text": "SETTINGS_PLACEMENTSYSTEM_MOVEELEMENTS_LABEL" } ); var placementsystemToggler = false; var focus = null; option.addModuleEventListener("click", function placementToggleFunction(){ function save() { // Retrive the changed sort list and update the settings accordingly. var sortList = ytcenter.placementsystem.getSortList(ytcenter.placementsystem.placementGroupsReferenceList); //ytcenter.placementsystem.setSortList(sortList); ytcenter.settings.placementGroups = sortList; ytcenter.saveSettings(); placementToggleFunction(); } function cancel() { ytcenter.placementsystem.setSortList(ytcenter.settings.placementGroups, ytcenter.placementsystem.placementGroupsReferenceList); placementToggleFunction(); } placementsystemToggler = !placementsystemToggler; if (focus !== null) { focus(); focus = null; } ytcenter.placementsystem.setMoveable(placementsystemToggler); if (placementsystemToggler) { ytcenter.utils.addClass(document.body, "ytcenter-placementsystem-activated"); ytcenter.settingsPanelDialog.setVisibility(false); ytcenter.cssElements.elementFocus.add(); focus = ytcenter.elementfocus.focus(document.getElementById("watch8-action-buttons"), save, cancel); } else { ytcenter.cssElements.elementFocus.remove(); ytcenter.utils.removeClass(document.body, "ytcenter-placementsystem-activated"); ytcenter.settingsPanelDialog.setVisibility(true); } }); option.setVisibility(ytcenter.getPage() === "watch"); ytcenter.events.addEvent("ui-refresh", function(){ this.setVisibility(ytcenter.getPage() === "watch"); }.bind(option)); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "textContent", null, { "textlocale": "SETTINGS_PLACEMENTSYSTEM_MOVEELEMENTS_INSTRUCTIONS", "styles": { "margin-left": "20px" } } ); option.setVisibility(ytcenter.getPage() === "watch"); ytcenter.events.addEvent("ui-refresh", function(){ this.setVisibility(ytcenter.getPage() === "watch"); }.bind(option)); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_LIGHTSOFF"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "lightbulbAutoOff", // defaultSetting "bool", // module "SETTINGS_LIGHTBULB_AUTO", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Lights_Off" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "lightbulbClickThrough", // defaultSetting "bool", // module "SETTINGS_LIGHTBULB_CLICK_THROUGH", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Click_Through" ); option.addEventListener("update", function(){ ytcenter.tmp.lightoffwarning(); }); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "lightbulbBackgroundColor", // defaultSetting "colorpicker", // module "SETTINGS_LIGHTBULB_COLOR", { "presetColors": ["#000", "#fff", "#590", "#ccc", "#f00", "#2793e6", "#ff8f00"] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Light_Off_Color" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "lightbulbBackgroundOpaque", // defaultSetting "rangetext", // module "SETTINGS_LIGHTBULB_TRANSPARENCY", { "min": 0, "max": 100, "suffix": "%" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Light_Off_Opacity" ); subcat.addOption(option); (function(opt){ option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module null, { "textlocale": "SETTINGS_LIGHTBULB_WARNING", "styles": { "color": "#ff0000" } } ); if (ytcenter.settings.lightbulbBackgroundOpaque > 90 && ytcenter.settings.lightbulbClickThrough) { option.setVisibility(true); } else { option.setVisibility(false); } opt.addEventListener("update", (function(o){ ytcenter.tmp = ytcenter.tmp || {}; ytcenter.tmp.lightoffwarning = function(){ if (ytcenter.settings.lightbulbBackgroundOpaque > 90 && ytcenter.settings.lightbulbClickThrough) { o.setVisibility(true); } else { o.setVisibility(false); } }; return ytcenter.tmp.lightoffwarning; })(option), false); subcat.addOption(option); })(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_VIDEO_THUMBNAIL"); cat.addSubCategory(subcat); // Animation option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBNAIL_ANIMATION", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Animation" ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailAnimationEnabled", // defaultSetting "bool", // module "SETTINGS_THUMBNAIL_ANIMATION_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Animation" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailAnimationShuffle", // defaultSetting "bool", // module "SETTINGS_THUMBNAIL_ANIMATION_SHUFFLE", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Shuffle" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailAnimationDelay", // defaultSetting "rangetext", // module "SETTINGS_THUMBNAIL_ANIMATION_DELAY", // label { "min": 250, "max": 5250, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Delay" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailAnimationInterval", // defaultSetting "rangetext", // module "SETTINGS_THUMBNAIL_ANIMATION_INTERVAL", // label { "min": 0, "max": 5000, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Interval" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailAnimationFallbackInterval", // defaultSetting "rangetext", // module "SETTINGS_THUMBNAIL_ANIMATION_FALLBACK_INTERVAL", // label { "min": 0, "max": 5000, "suffix": " ms" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Fallback_Interval" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); // Quality option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBVIDEO_QUALITY", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Quality-2" // help ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualityBar", // defaultSetting "bool", // module "SETTINGS_THUMBVIDEO_QUALITY_ENABLE" // label ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualitySeparated", // defaultSetting "bool", // module "SETTINGS_THUMBVIDEO_QUALITY_DASHNONDASHSEPARATED", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Separate_DASH_and_nonDASH_formats" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualityFPS", // defaultSetting "bool", // module "SETTINGS_THUMBVIDEO_QUALITY_FPS" // label ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualityPosition", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_POSITION", // label { // args "list": [ { "value": "topleft", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPLEFT" }, { "value": "topright", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPRIGHT" }, { "value": "bottomleft", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMLEFT" }, { "value": "bottomright", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMRIGHT" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualityDownloadAt", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_DOWNLOAD", // label { // args "list": [ { "value": "page_start", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONSTART" }, { "value": "scroll_into_view", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_INVIEW" }, { "value": "hover_thumbnail", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailQualityVisible", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_VISIBLE", // label { // args "list": [ { "value": "always", "label": "SETTINGS_THUMBVIDEO_ALWAYSVISIBLE" }, { "value": "show_hover", "label": "SETTINGS_THUMBVIDEO_SHOWONHOVER" }, { "value": "hide_hover", "label": "SETTINGS_THUMBVIDEO_HIDEONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); // Rating bar option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBVIDEO_RATING_BAR", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#rating-bar" // help ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBar", // defaultSetting "bool", // module "SETTINGS_THUMBVIDEO_RATING_BAR_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Rating_Bar-2" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarPosition", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_POSITION", // label { // args "list": [ { "value": "top", "label": "SETTINGS_THUMBVIDEO_POSITION_TOP" }, { "value": "bottom", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOM" }, { "value": "left", "label": "SETTINGS_THUMBVIDEO_POSITION_LEFT" }, { "value": "right", "label": "SETTINGS_THUMBVIDEO_POSITION_RIGHT" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarDownloadAt", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_DOWNLOAD", // label { // args "list": [ { "value": "page_start", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONSTART" }, { "value": "scroll_into_view", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_INVIEW" }, { "value": "hover_thumbnail", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarVisible", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_VISIBLE", // label { // args "list": [ { "value": "always", "label": "SETTINGS_THUMBVIDEO_ALWAYSVISIBLE" }, { "value": "show_hover", "label": "SETTINGS_THUMBVIDEO_SHOWONHOVER" }, { "value": "hide_hover", "label": "SETTINGS_THUMBVIDEO_HIDEONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarLikesColor", // defaultSetting "colorpicker", // module "SETTINGS_THUMBNAIL_SPARKBAR_LIKES_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff"] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Likes_Color" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarDislikesColor", // defaultSetting "colorpicker", // module "SETTINGS_THUMBNAIL_SPARKBAR_DISLIKES_COLOR", { "presetColors": ["#590", "#ccc", "#f00", "#2793e6", "#ff8f00", "#fff"] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Disikes_Color" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsBarHeight", // defaultSetting "rangetext", // module "SETTINGS_SPARKBAR_HEIGHT", // label { "min": 1, "max": 100, "suffix": "px" }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Height-2" ); option.setStyle("margin-left", "12px"); subcat.addOption(option); // Rating count option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBVIDEO_RATING_COUNT", // label null, // args "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Rating_Count" // help ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsCount", // defaultSetting "bool", // module "SETTINGS_THUMBVIDEO_RATING_COUNT_ENABLE" // label ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsCountPosition", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_POSITION", // label { // args "list": [ { "value": "topleft", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPLEFT" }, { "value": "topright", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPRIGHT" }, { "value": "bottomleft", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMLEFT" }, { "value": "bottomright", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMRIGHT" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsCountDownloadAt", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_DOWNLOAD", // label { // args "list": [ { "value": "page_start", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONSTART" }, { "value": "scroll_into_view", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_INVIEW" }, { "value": "hover_thumbnail", "label": "SETTINGS_THUMBVIDEO_DOWNLOAD_ONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailRatingsCountVisible", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_VISIBLE", // label { // args "list": [ { "value": "always", "label": "SETTINGS_THUMBVIDEO_ALWAYSVISIBLE" }, { "value": "show_hover", "label": "SETTINGS_THUMBVIDEO_SHOWONHOVER" }, { "value": "hide_hover", "label": "SETTINGS_THUMBVIDEO_HIDEONHOVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); // Watch later button option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBVIDEO_WATCH_LATER", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Watch_Later_Button" ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailWatchLaterPosition", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_POSITION", // label { "list": [ { "value": "topleft", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPLEFT" }, { "value": "topright", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPRIGHT" }, { "value": "bottomleft", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMLEFT" }, { "value": "bottomright", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMRIGHT" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailWatchLaterVisible", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_VISIBLE", // label { // args "list": [ { "value": "always", "label": "SETTINGS_THUMBVIDEO_ALWAYSVISIBLE" }, { "value": "show_hover", "label": "SETTINGS_THUMBVIDEO_SHOWONHOVER" }, { "value": "hide_hover", "label": "SETTINGS_THUMBVIDEO_HIDEONHOVER" }, { "value": "never", "label": "SETTINGS_THUMBVIDEO_NEVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); // Time code option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module "SETTINGS_THUMBVIDEO_TIME_CODE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Time_Code" ); option.setStyle("font-weight", "bold"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailTimeCodePosition", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_POSITION", // label { // args "list": [ { "value": "topleft", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPLEFT" }, { "value": "topright", "label": "SETTINGS_THUMBVIDEO_POSITION_TOPRIGHT" }, { "value": "bottomleft", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMLEFT" }, { "value": "bottomright", "label": "SETTINGS_THUMBVIDEO_POSITION_BOTTOMRIGHT" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "videoThumbnailTimeCodeVisible", // defaultSetting "list", // module "SETTINGS_THUMBVIDEO_VISIBLE", // label { // args "list": [ { "value": "always", "label": "SETTINGS_THUMBVIDEO_ALWAYSVISIBLE" }, { "value": "show_hover", "label": "SETTINGS_THUMBVIDEO_SHOWONHOVER" }, { "value": "hide_hover", "label": "SETTINGS_THUMBVIDEO_HIDEONHOVER" }, { "value": "never", "label": "SETTINGS_THUMBVIDEO_NEVER" } ], "listeners": [ { "event": "update", "callback": function(){ ytcenter.events.performEvent("ui-refresh"); } } ] } ); option.setStyle("margin-left", "12px"); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_COMMENTS"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableComments", "bool", "SETTINGS_COMMENTS_ENABLE" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryEnabled", // defaultSetting "bool", // module "SETTINGS_COMMENTS_COUNTRY_ENABLE", // label null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Country_For_Comments" // help ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryShowFlag", // defaultSetting "bool", // module "SETTINGS_COMMENTS_COUNTRY_SHOW_FLAG", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Show_Country_Flag-2" // label ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryUseNames", // defaultSetting "bool", // module "SETTINGS_COMMENTS_COUNTRY_USE_NAME", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Use_Country_Names-2" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryLazyLoad", // defaultSetting "bool", // module "SETTINGS_COMMENTS_COUNTRY_LAZY_LOAD", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Lazy_Load" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryButtonLoad", // defaultSetting "bool", // module "SETTINGS_COMMENTS_COUNTRY_BUTTON_LOAD", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#Load_by_button" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "commentCountryPosition", // defaultSetting "list", // module "SETTINGS_COMMENTS_COUNTRY_POSITION", // label { "list": [ { "value": "before_username", "label": "SETTINGS_COMMENTS_COUNTRY_POSITION_BEFORE_USERNAME" }, { "value": "after_username", "label": "SETTINGS_COMMENTS_COUNTRY_POSITION_AFTER_USERNAME" }, { "value": "last", "label": "SETTINGS_COMMENTS_COUNTRY_POSITION_LAST" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Comment_Country_Position" ); subcat.addOption(option); /* Not needed as of now subcat = ytcenter.settingsPanel.createSubCategory("Subscriptions"); cat.addSubCategory(subcat); */ /* Category:Update */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_UPDATE"); if (!devbuild) { if ((identifier === 1 && (uw.navigator.userAgent.indexOf("Opera") !== -1 || uw.navigator.userAgent.indexOf("OPR/") !== -1)) || identifier === 6 || identifier === 8) { cat.setVisibility(false); } ytcenter.events.addEvent("ui-refresh", function(){ if ((identifier === 1 && (uw.navigator.userAgent.indexOf("Opera") !== -1 || uw.navigator.userAgent.indexOf("OPR/") !== -1)) || identifier === 6 || identifier === 8) { this.setVisibility(false); } else { this.setVisibility(true); } }.bind(cat)); } subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_TAB_GENERAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "enableUpdateChecker", "bool", "SETTINGS_UPDATE_ENABLE", null, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Enable_Update_Checker" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( "updateCheckerInterval", "list", "SETTINGS_UPDATE_INTERVAL", { "list": [ { "value": "0", "label": "SETTINGS_UPDATE_INTERVAL_ALWAYS" }, { "value": "1", "label": "SETTINGS_UPDATE_INTERVAL_EVERYHOUR" }, { "value": "2", "label": "SETTINGS_UPDATE_INTERVAL_EVERY2HOUR" }, { "value": "12", "label": "SETTINGS_UPDATE_INTERVAL_EVERY12HOUR" }, { "value": "24", "label": "SETTINGS_UPDATE_INTERVAL_EVERYDAY" }, { "value": "48", "label": "SETTINGS_UPDATE_INTERVAL_EVERY2DAY" }, { "value": "168", "label": "SETTINGS_UPDATE_INTERVAL_EVERYWEEK" }, { "value": "336", "label": "SETTINGS_UPDATE_INTERVAL_EVERY2WEEK" }, { "value": "720", "label": "SETTINGS_UPDATE_INTERVAL_EVERYMONTH" } ] }, "https://github.com/YePpHa/YouTubeCenter/wiki/Features#wiki-Update_Interval" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, "button", null, { "text": "SETTINGS_UPDATE_CHECKFORNEWUPDATES", "listeners": [ { "event": "click", "callback": function(){ this.textContent = ytcenter.language.getLocale("SETTINGS_UPDATE_CHECKINGFORNEWUPDATES"); this.disabled = true; ytcenter.checkForUpdates((function(self){ return function(){ self.textContent = ytcenter.language.getLocale("SETTINGS_UPDATE_CHECKFORNEWUPDATESSUCCESS"); self.disabled = false; }; })(this), (function(self){ return function(){ self.textContent = ytcenter.language.getLocale("SETTINGS_UPDATE_CHECKINGFORNEWUPDATESERROR"); self.disabled = false; }; })(this), (function(self){ return function(){ self.textContent = ytcenter.language.getLocale("SETTINGS_UPDATE_CHECKINGFORNEWUPDATESDISABLED"); self.disabled = true; }; })(this)); } } ] } ); subcat.addOption(option); /* DISABLED until implemented subcat = ytcenter.settingsPanel.createSubCategory("Channel"); cat.addSubCategory(subcat); */ /* Category:Debug */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_DEBUG"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_LOG"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "debugConsole", // defaultSetting "bool", // module "SETTINGS_DEBUG_CONSOLE" ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textarea", null, { "styles": { "width": "100%", "height": "130px", "background-color": "#fff", "border": "1px solid #ccc" } } ); subcat.addOption(option); subcat.addEventListener("click", (function(opt){ return function(){ con.log("[Debug] Loading debug log..."); var module = opt.getLiveModule(); if (module) { module.setText(ytcenter.language.getLocale("SETTINGS_DEBUG_LOADING")); uw.setTimeout(function(){ module.setText(ytcenter.getDebug()); module.selectAll(); }, 100); } }; })(option)); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "button", null, { "text": "SETTINGS_DEBUG_CREATEGIST", "listeners": [ { "event": "click", "callback": function() { var content = document.createElement("div"); var data = { "description": null, "public": true, "files": { "debug.txt": { "content": ytcenter.getDebug() } } }; if (devbuild) { data.description = "YouTube Center v" + devnumber + " Debug Info"; } else { data.description = "YouTube Center ".concat(ytcenter.version, "-", ytcenter.revision, " Debug Info"); } var text = document.createElement("p"); text.appendChild(document.createTextNode(ytcenter.language.getLocale("GIST_TEXT"))); text.setAttribute("style", "margin-bottom: 10px"); content.appendChild(text); var gistURL = document.createElement("input"); gistURL.setAttribute("type", "text"); gistURL.setAttribute("class", "yt-uix-form-input-text"); gistURL.setAttribute("value", ytcenter.language.getLocale("GIST_LOADING")); gistURL.setAttribute("readonly", "readonly"); ytcenter.utils.addEventListener(gistURL, "focus", function() { this.select(); }, false); content.appendChild(gistURL); ytcenter.dialog("GIST_TITLE", content).setVisibility(true); ytcenter.utils.xhr({ method: "POST", url: "https://api.github.com/gists", headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: JSON.stringify(data), contentType: "application/x-www-form-urlencoded", // Firefox Addon content: JSON.stringify(data), // Firefox Addon onload: function(response) { var details = JSON.parse(response.responseText); gistURL.value = details.html_url; } }); } } ] } ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_EXPERIMENTS"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( "YouTubeExperiments", // defaultSetting "layoutExperiments" ); subcat.addEventListener("click", (function(opt){ return function(){ var module = opt.getLiveModule(); if (module && !module.hasLoadedOnce()) { module.loadExperiments(); } }; })(option)); subcat.addOption(option); //subcat = ytcenter.settingsPanel.createSubCategory("Options"); cat.addSubCategory(subcat); /* Category:Share DISABLED until I implement it*/ /*cat = ytcenter.settingsPanel.createCategory("Share"); subcat = ytcenter.settingsPanel.createSubCategory("Share"); cat.addSubCategory(subcat); */ /* Category:Donate */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_DONATE"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_DONATE"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module null, // label { "textlocale": "SETTINGS_DONATE_TEXT", "replace": { "{wiki-donate}": function(){ var a = document.createElement("a"); a.setAttribute("target", "_blank"); a.setAttribute("href", "https://github.com/YePpHa/YouTubeCenter/wiki/Donate"); a.textContent = ytcenter.language.getLocale("SETTINGS_DONATE_WIKI"); ytcenter.language.addLocaleElement(a, "SETTINGS_DONATE_WIKI", "@textContent"); return a; } } } ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_PAYPAL"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "textContent", // module null, // label { "textlocale": "SETTINGS_DONATE_PAYPAL_TEXT2", "replace": { "{page-link}": function(){ var a = document.createElement("a"); a.setAttribute("target", "_blank"); a.setAttribute("href", "https://dl.dropboxusercontent.com/u/13162258/YouTube%20Center/support/PayPal.html"); a.textContent = ytcenter.language.getLocale("SETTINGS_DONATE_PAYPAL_LINK2"); ytcenter.language.addLocaleElement(a, "SETTINGS_DONATE_PAYPAL_LINK2", "@textContent"); return a; } } } ); subcat.addOption(option); /* Category:About */ cat = ytcenter.settingsPanel.createCategory("SETTINGS_CAT_ABOUT"); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_ABOUT"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "aboutText", // module null // label ); subcat.addOption(option); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "link", // module null, // label { "titleLocale": "SETTINGS_ABOUT_LINKS", "links": [ {text: "Wiki", url: "https://github.com/YePpHa/YouTubeCenter/wiki"}, {text: "Facebook", url: "https://www.facebook.com/YouTubeCenter"}, {text: "Google+", url: "https://plus.google.com/111275247987213661483/posts"}, {text: "Firefox", url: "https://addons.mozilla.org/en-us/firefox/addon/youtube-center/"}, {text: "Opera", url: "https://addons.opera.com/en/extensions/details/youtube-center/"}, {text: "Maxthon", url: "http://extension.maxthon.com/detail/index.php?view_id=1201"}, {text: "Github", url: "https://github.com/YePpHa/YouTubeCenter/"} ] } ); subcat.addOption(option); subcat = ytcenter.settingsPanel.createSubCategory("SETTINGS_SUBCAT_TRANSLATORS"); cat.addSubCategory(subcat); option = ytcenter.settingsPanel.createOption( null, // defaultSetting "translators", // module null, // label { // args "translators": { "ar-BH": [ { name: "alihill381" } ], "bg-BG": [ { name: "Mani Farone" } ], "ca-ES": [ { name: "Joan Alemany" }, { name: "Raül Cambeiro" } ], "cs-CZ": [ { name: "Petr Vostřel", url: "http://petr.vostrel.cz/" }, { name: "R3gi", url: "mailto:regiprogi@gmail.com" } ], "da-DK": [ { name: "Lasse Olsen" }, { name: "Jeppe Rune Mortensen", url: "https://github.com/YePpHa/" } ], "de-DE": [ { name: "Simon Artmann" }, { name: "Sven \"Hidden\" W" } ], "en-US": [], "es-ES": [ { name: "Roxz" } ], "fa-IR": [], "fr-FR": [ { name: "ThePoivron", url: "http://www.twitter.com/DaPavron" } ], "he-IL": [ { name: "baryoni" } ], "hu-HU": [ { name: "Eugenox" }, { name: "Mateus" } ], "it-IT": [ { name: "Pietro De Nicolao" } ], "ja-JP": [ { name: "Lightning-Natto" } ], "ko-KR": [ { name: "Hyeongi Min", url: "https://www.facebook.com/MxAiNM" }, { name: "U Bless", url: "http://userscripts.org/users/ubless" } ], "no-NO": [ { name: "master3395", url: "https://www.youtube.com/user/master33951" }, { name: "Mathias Solheim", url: "http://mathias.ocdevelopment.net/" } ], "nl-NL": [ { name: "Marijn Roes" } ], "pl-PL": [ { name: "Piotr" }, { name: "kasper93" }, { name: "Piter432" } ], "pt-BR": [ { name: "Thiago R. M. Pereira" }, { name: "José Junior" }, { name: "Igor Rückert" } ], "pt-PT": [ { name: "Rafael Damasceno", url: "http://userscripts.org/users/264457" }, { name: "João P. Moutinho Barbosa" } ], "ro-RO": [ { name: "BlueMe", url: "http://www.itinerary.ro/" } ], "ru-RU": [ { name: "KDASOFT", url: "http://kdasoft.narod.ru/" } ], "sk-SK": [ { name: "ja1som" } ], "sv-SE": [ { name: "Christian Eriksson" } ], "tr-TR": [ { name: "Ismail Aksu" } ], "uk-UA": [ { name: "SPIDER-T1" }, { name: "Petro Lomaka", url: "https://plus.google.com/103266219992558963899/" } ], "vi-VN": [ { name: "Tuấn Phạm" } ], "zh-CN": [ { name: "雅丶涵", url: "http://www.baidu.com/p/%E9%9B%85%E4%B8%B6%E6%B6%B5" }, { name: "MatrixGT" } ], "zh-TW": [ { name: "泰熊" } ] } } ); subcat.addOption(option); }; settingsInit(); ytcenter.video = {}; uw.ytcenter._video = ytcenter.video; ytcenter.video.format = [ { type: 'video/mp4', name: 'SETTINGS_DOWNLOADFORMAT_LIST_MP4', key: 'mp4' }, { type: 'video/webm', name: 'SETTINGS_DOWNLOADFORMAT_LIST_WEBM', key: 'webm' }, { type: 'video/x-flv', name: 'SETTINGS_DOWNLOADFORMAT_LIST_FLV', key: 'flv' }, { type: 'video/3gpp', name: 'SETTINGS_DOWNLOADFORMAT_LIST_3GP', key: '3gp' }, { type: 'audio/mp4', name: 'SETTINGS_DOWNLOADFORMAT_LIST_AUDIO', key: 'm4a', help: 'https://github.com/YePpHa/YouTubeCenter/wiki/Download:Audio' } ]; ytcenter.video.resolutions = { 'tiny': '144p', 'small': '240p', 'medium': '360p', 'large': '480p', 'hd720': '720p', 'hd1080': '1080p', 'hd1440': '1440p', 'highres': 'Original' }; ytcenter.video.id = ""; ytcenter.video.title = ""; ytcenter.video.author = ""; ytcenter.video.channelname = ""; ytcenter.video._channel = {}; ytcenter.video.mimetypes = [ { mimetype: "video/webm", extension: ".webm" }, { mimetype: "video/x-flv", extension: ".flv" }, { mimetype: "video/mp4", extension: ".mp4" }, { mimetype: "video/3gpp", extension: ".3gp" }, { mimetype: "audio/mp4", extension: ".m4a" }, { mimetype: "audio/mp4", extension: ".m4a" } ]; ytcenter.video.getFilenameExtension = function(stream){ if (!stream || !stream.type || stream.type.indexOf(";") === -1) return ""; var mt = stream.type.split(";")[0], i; for (i = 0; i < ytcenter.video.mimetypes.length; i++) { if (ytcenter.video.mimetypes[i].mimetype === mt) return ytcenter.video.mimetypes[i].extension; } return ""; }; ytcenter.video.removeNonAlphanumericCharacters = function(text){ if (ytcenter.settings.fixfilename) { var buffer = ""; for (var i = 0, len = text.length; i < len; i++) { if (text.charAt(i).match(/[0-9a-zA-Z ]/i)) { buffer += text.charAt(i); } } return buffer; } else { return text; } }; ytcenter.video.getFilename = function(stream){ if (stream == null) return ""; var duration = 0; var pubtimestamp = 0, pubsecs = 0, pubmins = 0, pubhours = 0, pubdays = 0, pubmonth = 0, pubyear = 0; var nowtimestamp = 0, nowsecs = 0, nowmins = 0, nowhours = 0, nowdays = 0, nowmonth = 0, nowyear = 0; var durmin = 0; var dursec = 0; try { duration = ytcenter.player.getConfig().args.length_seconds; durmin = Math.floor(duration/60); dursec = duration - durmin*60; } catch (e) { duration = 0; durmin = 0; dursec = 0; } try { pubtimestamp = Math.floor(ytcenter.video.published.getTime()/1000); pubsecs = ytcenter.video.published.getSeconds(); pubmins = ytcenter.video.published.getMinutes(); pubhours = ytcenter.video.published.getHours(); pubdays = ytcenter.video.published.getDate(); pubmonth = ytcenter.video.published.getMonth() + 1; pubyear = ytcenter.video.published.getFullYear(); } catch (e) { pubtimestamp = 0; pubsecs = 0; pubmins = 0; pubhours = 0; pubdays = 0; pubmonth = 0; pubyear = 0; } try { var now = new Date(); nowtimestamp = Math.floor(now.getTime()/1000); nowsecs = now.getSeconds(); nowmins = now.getMinutes(); nowhours = now.getHours(); nowdays = now.getDate(); nowmonth = now.getMonth() + 1; nowyear = now.getFullYear(); } catch (e) { con.error(e); nowtimestamp = 0; nowsecs = 0; nowmins = 0; nowhours = 0; nowdays = 0; nowmonth = 0; nowyear = 0; } var filename = ytcenter.utils.replaceTextAsString(ytcenter.settings.filename, { title: ytcenter.video.removeNonAlphanumericCharacters(ytcenter.video.title), videoid: ytcenter.video.id, author: ytcenter.video.removeNonAlphanumericCharacters(ytcenter.video.author), channelname: ytcenter.video.removeNonAlphanumericCharacters(ytcenter.video.channelname), resolution: (ytcenter.video.resolutions.hasOwnProperty(stream.quality) ? ytcenter.video.resolutions[stream.quality] : ''), itag: stream.itag, dimension: (stream.dimension ? stream.dimension : stream.size), bitrate: stream.bitrate, width: (stream.dimension ? stream.dimension.split("x")[0] : (stream.size ? stream.size.split("x")[0] : 0)), height: (stream.dimension ? stream.dimension.split("x")[1] : (stream.size ? stream.size.split("x")[1] : 0)), format: (function(){ for (var i = 0; i < ytcenter.video.format.length; i++) { if (stream.type.indexOf(ytcenter.video.format[i].type) == 0) { return ytcenter.language.getLocale(ytcenter.video.format[i].name); } } return ""; })(), quality: stream.quality, type: stream.type, dur: duration, durmins: ytcenter.utils.prefixText(durmin, "0", 2), dursecs: ytcenter.utils.prefixText(dursec, "0", 2), nowtimestamp: nowtimestamp, nowsecs: ytcenter.utils.prefixText(nowsecs, "0", 2), nowmins: ytcenter.utils.prefixText(nowmins, "0", 2), nowhours: ytcenter.utils.prefixText(nowhours, "0", 2), nowdays: ytcenter.utils.prefixText(nowdays, "0", 2), nowmonth: ytcenter.utils.prefixText(nowmonth, "0", 2), nowyear: nowyear, pubtimestamp: pubtimestamp, pubsecs: ytcenter.utils.prefixText(pubsecs, "0", 2), pubmins: ytcenter.utils.prefixText(pubmins, "0", 2), pubhours: ytcenter.utils.prefixText(pubhours, "0", 2), pubdays: ytcenter.utils.prefixText(pubdays, "0", 2), pubmonth: ytcenter.utils.prefixText(pubmonth, "0", 2), pubyear: pubyear }); // Removing illegal characters for filename for OS if (uw.navigator.appVersion.toLowerCase().indexOf("win") != -1) { filename = filename.replace(new RegExp('[\\\\/:|]+', 'g'), "-"); filename = filename.replace(new RegExp('["*?<>]+', 'g'), "_"); } else if (uw.navigator.appVersion.toLowerCase().indexOf("mac") != -1) { filename = filename.replace(new RegExp('^\\.'), "_"); filename = filename.replace(":", "-"); } else if (uw.navigator.appVersion.toLowerCase().indexOf("linux") != -1) { filename = filename.replace(new RegExp('[/\0]+', 'g'), "-"); } return filename; }; ytcenter.video.filename = function(stream){ if (stream == null) return ""; return stream.url + "&title=" + encodeURIComponent(ytcenter.video.getFilename(stream)); }; ytcenter.video.downloadLink = function(stream){ return ytcenter.video.filename(stream) + "&cpn=" + encodeURIComponent(ytcenter.utils.crypt()) + (stream.s || stream.sig ? "&signature=" + encodeURIComponent(stream.sig || ytcenter.utils.signatureDecipher(stream.s)) : ""); }; ytcenter.video.download = (function(){ var _download_iframe = null; return function(itag){ con.log("Downloading format " + itag + "..."); var stream = null; for (var i = 0; i < ytcenter.video.streams.length; i++) { if (ytcenter.video.streams[i].itag === itag && typeof ytcenter.video.streams[i].url != "undefined") { stream = ytcenter.video.streams[i]; break; } } if (stream) { if (!_download_iframe) { // Initalize iframe if it doesn't exist _download_iframe = document.createElement("iframe"); _download_iframe.style.position = "absolute"; _download_iframe.style.top = "-1000px"; _download_iframe.style.left = "-1000px"; _download_iframe.style.width = "1px"; _download_iframe.style.height = "1px"; document.body.appendChild(_download_iframe); } _download_iframe.setAttribute("src", ytcenter.video.downloadLink(stream)); } else { con.log("Format (" + itag + ") not found and therefore couldn't start downloading"); throw "Stream (" + itag + ") not found!"; } }; })(); ytcenter.video.streams = []; ytcenter.site = {}; ytcenter.site.removeAdvertisement = function(cfg){ cfg = cfg || ytcenter.player.getConfig(); var _ads = [ "supported_without_ads", "ad3_module", "adsense_video_doc_id", "allowed_ads", "baseUrl", "cafe_experiment_id", "afv_inslate_ad_tag", "advideo", "ad_device", "ad_channel_code_instream", "ad_channel_code_overlay", "ad_eurl", "ad_flags", "ad_host", "ad_host_tier", "ad_logging_flag", "ad_preroll", "ad_slots", "ad_tag", "ad_video_pub_id", "aftv", "afv", "afv_ad_tag", "afv_instream_max", "afv_ad_tag_restricted_to_instream", "afv_video_min_cpm", "dynamic_allocation_ad_tag", "pyv_ad_channels", "max_dynamic_allocation_ad_tag_length", "midroll_freqcap", "invideo", "instream", "pyv_in_related_cafe_experiment_id" ]; for (var i = 0; i < _ads.length; i++) { try { delete cfg.args[_ads[i]]; } catch (e) { con.error(e); } } try { if (cfg.args.csi_page_type) { con.log("Chaning csi_page_type from " + cfg.args.csi_page_type + " to watch, watch7"); if (ytcenter.watch7) { if (ytcenter.html5) { cfg.args.csi_page_type = "watch, watch7_html5"; } else { cfg.args.csi_page_type = "watch, watch7"; } } else { cfg.args.csi_page_type = "watch"; } } } catch (e) { con.error(e); } try { if (document.getElementById("watch-channel-brand-div")) { ytcenter.discardElement(document.getElementById("watch-channel-brand-div")); } } catch (e) { con.error(e); } try { var adBadges = ytcenter.utils.toArray(document.getElementsByClassName("yt-badge-ad")); for (var i = 0, len = adBadges.length; i < len; i++) { var parent = adBadges; while ((parent = parent.parentNode) !== null) { if (parent.tagName === "LI") { parent.parentNode.removeChild(parent); break; } } } } catch (e) { con.error(e); } return cfg; }; ytcenter.user = {}; ytcenter.user.callChannelFeed = function(username, callback){ ytcenter.utils.xhr({ method: "GET", url: 'https://gdata.youtube.com/feeds/api/channels?q=' + encodeURIComponent("\"" + username + "\"") + '&start-index=1&max-results=1&v=2&alt=json', headers: { "Content-Type": "text/plain" }, onload: function(response){ if (response.responseText) { var j = JSON.parse(response.responseText); if (j.feed && j.feed.entry && j.feed.entry.length > 0) { callback.apply(j.feed.entry[0]); } } } }); }; ytcenter.gridview = (function(){ function getFeed() { return document.getElementById("feed") || document.getElementById("browse-items-primary"); } function getIndividualFeed(feed) { if (feed && feed.children && feed.children.length > 0 && feed.children[0]) { return feed.children[0]; } return null; } function getFeedName(feed) { var individualFeed = getIndividualFeed(feed); if (individualFeed && individualFeed.getAttribute) { return individualFeed.getAttribute("data-feed-name"); } return null; } function getFeedType(feed) { var individualFeed = getIndividualFeed(feed), type = null; if (individualFeed && individualFeed.getAttribute) { type = individualFeed.getAttribute("data-feed-type"); } return type; } function getFeedItems(feed) { var items = []; if (feed && feed.getElementsByClassName) { var feedContainer = feed.getElementsByClassName("feed-item-container"); for (var i = 0, len = feedContainer.length; i < len; i++) { items.push(parseFeedItem(feedContainer[i])); } } return items; } function parseFeedItem(item) { var details = {}, aElm = item.getElementsByTagName("a"); if (aElm && aElm[0] && aElm[0].getAttribute) { var images = aElm[0].getElementsByTagName("img"); details.channelURL = aElm[0].getAttribute("href"); if (images && images.length > 0 && images[0] && images[0].getAttribute) { details.channelName = images[0].getAttribute("alt"); } } else { details.channelURL = null; details.channelName = null; } details.wrapper = item; details.metadata = item.getElementsByClassName("yt-lockup-meta")[0]; details.channelVerified = (item.getElementsByClassName("yt-user-name-icon-verified").length > 0); details.bubbleContainer = item.getElementsByClassName("feed-author-bubble-container")[0]; details.bubbleElement = item.getElementsByClassName("feed-author-bubble")[0]; if (item.getElementsByClassName("yt-user-name").length > 0) { details.usernameElement = item.getElementsByClassName("yt-user-name")[0]; details.ownerElement = details.usernameElement.parentNode; details.ownerElementListItem = (details.ownerElement.tagName === "LI"); details.usernamePrefixNode = null; if (details.usernameElement.previousSibling && details.usernameElement.previousSibling.nodeType === 3) { details.usernamePrefixNode = details.usernameElement.previousSibling; } } else { details.usernameElement = null; details.ownerElement = null; details.usernamePrefixNode = null; } return details; } function createOwnerElement(details) { var b = details.bubbleElement.cloneNode(false); b.textContent = details.channelName; b.className = b.className.replace("feed-author-bubble", ""); return b; } function isEnabled(feed) { feed = feed || getFeed(); return (loc.pathname.indexOf("/feed/subscriptions") === 0 && ytcenter.settings.gridSubscriptionsPage) || (getFeedType(feed) === "collection" && ytcenter.settings.gridCollectionPage); } function delayedUpdate() { con.log("[GridView] delayedUpdate called..."); if (loc.pathname.indexOf("/feed/") === 0) { var feed = getFeed(), observer = ytcenter.mutation.observe(feed, { childList: true, subtree: true }, function(){ con.log("[GridView] Mutation Observed... disconnecting!"); update(); observer.disconnect(); }); } } function update() { if (loc.pathname.indexOf("/feed/") === 0) { var feed = getFeed(); if (isEnabled(feed)) { var items = getFeedItems(feed); var ownerElm = null; var ownerWrapper = null; var details = null; for (var i = 0; i < items.length; i++) { details = items[i]; if (!ytcenter.utils.inArray(feedItems, details.wrapper)) { feedItems.push(details.wrapper); if (details.ownerElement) { ownerElm = details.ownerElement.cloneNode(true); if (details.ownerElementListItem) { details.ownerElement.parentNode.removeChild(details.ownerElement); } if (details.usernamePrefixNode) { ownerElm.removeChild(ownerElm.firstChild); } } else { ownerElm = createOwnerElement(items[i]); } ownerWrapper = document.createElement("div"); ownerWrapper.className = "ytcenter-grid-subscriptions-username"; var ownerElmChildren = null; if (details.ownerElementListItem) { var frag = document.createDocumentFragment(); ownerElmChildren = ytcenter.utils.toArray(ownerElm.children); var j; for (j = 0; j < ownerElmChildren.length; j++) { frag.appendChild(ownerElmChildren[j]); } ownerElm = frag; } ownerWrapper.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("SUBSCRIPTIONSGRID_BY_USERNAME"), {"{username}": ownerElm})); ytcenter.events.addEvent("language-refresh", (function(oW, oE, oEC){ return function(){ if (oEC) { var frag = document.createDocumentFragment(); var j; for (j = 0; j < oEC.length; j++) { frag.appendChild(oEC[j]); } oE = frag; } oW.innerHTML = ""; oW.appendChild(ytcenter.utils.replaceText(ytcenter.language.getLocale("SUBSCRIPTIONSGRID_BY_USERNAME"), {"{username}": oE})); }; })(ownerWrapper, ownerElm, ownerElmChildren)); details.ownerWrapper = ownerWrapper; details.metadata.parentNode.insertBefore(ownerWrapper, details.metadata); } } } } } var feedItems = []; return { update: update, delayedUpdate: delayedUpdate, isEnabled: isEnabled }; })(); ytcenter.playlistAutoPlay = (function(){ /* We want the toggle button */ function getToggleAutoPlayButton() { var playlist = document.getElementById("watch-appbar-playlist"); if (playlist) { var playlistToggleButton = playlist.getElementsByClassName("toggle-autoplay"); if (playlistToggleButton && playlistToggleButton.length > 0 && playlistToggleButton[0]) { playlistToggleButton = playlistToggleButton[0]; } else { playlistToggleButton = null; } return playlistToggleButton; } return null; } function setInitialAutoPlayState(state) { var playlist = document.getElementById("watch-appbar-playlist"); if (playlist) { var content = playlist.getElementsByClassName("playlist-header-content"); if (content.length > 0 && content[0]) { content[0].setAttribute("data-initial-autoplay-state", (state ? "true" : "false")); content[0].setAttribute("initial-autoplay-state", (state ? "true" : "false")); } } toggled = state; } function onToggleButtonClick() { toggled = !toggled; if (ytcenter.settings.playlistAutoPlayFreeze) return; ytcenter.settings.playlistAutoPlay = toggled; ytcenter.saveSettings(); ytcenter.events.performEvent("settings-update"); } function init() { if (ytcenter.playlist) { setInitialAutoPlayState(ytcenter.settings.playlistAutoPlay); var toggleButton = getToggleAutoPlayButton(); if (toggleButton) { ytcenter.utils.addEventListener(toggleButton, "click", onToggleButtonClick, false); } initState(); } } function initState() { var playlist = document.getElementById("watch-appbar-playlist"); if (playlist) { var toggleAutoplayButton = getToggleAutoPlayButton(); if (toggleAutoplayButton) { if (toggled) { ytcenter.utils.addClass(toggleAutoplayButton, "yt-uix-button-toggled"); } else { ytcenter.utils.removeClass(toggleAutoplayButton, "yt-uix-button-toggled"); } toggleAutoplayButton.setAttribute("data-button-toggle", (toggled ? "true" : "false")); } else { toggleAutoplayButton = document.createElement("button"); toggleAutoplayButton.className = "yt-uix-button yt-uix-button-size-default yt-uix-button-player-controls yt-uix-button-empty yt-uix-button-has-icon toggle-autoplay yt-uix-button-opacity yt-uix-tooltip yt-uix-tooltip" + (toggled ? " yt-uix-button-toggled" : ""); toggleAutoplayButton.setAttribute("type", "button"); toggleAutoplayButton.setAttribute("onclick", ";return false;"); toggleAutoplayButton.setAttribute("title", uw.yt.msgs_.YTP_AUTOPLAY); toggleAutoplayButton.setAttribute("data-button-toggle", (toggled ? "true" : "false")); toggleAutoplayButton.addEventListener("click", onToggleButtonClick, false); var iconWrapper = document.createElement("span"); iconWrapper.className = "yt-uix-button-icon-wrapper"; var icon = document.createElement("img"); icon.className = "yt-uix-button-icon yt-uix-button-icon-watch-appbar-autoplay yt-sprite"; icon.setAttribute("src", "//s.ytimg.com/yts/img/pixel-vfl3z5WfW.gif"); icon.setAttribute("title", uw.yt.msgs_.YTP_AUTOPLAY); iconWrapper.appendChild(icon); toggleAutoplayButton.appendChild(iconWrapper); var controls = playlist.getElementsByClassName("playlist-nav-controls"); controls && controls[0] && controls[0].appendChild && controls[0].appendChild(toggleAutoplayButton); } if (uw.yt && uw.yt.www && uw.yt.www.watch && uw.yt.www.watch.lists && uw.yt.www.watch.lists.getState) { if (uw.yt.www.watch.lists.getState !== getState) { getStateFunction = uw.yt.www.watch.lists.getState; uw.yt.www.watch.lists.getState = getState; } } else { con.log("[Playlist] getState not found!"); setTimeout(initState, 1000); } } } function getState() { var state = getStateFunction(); state.autoPlay = toggled; return state; } var getStateFunction = null; var timer = null; var toggled = false; return { init: init }; })(); ytcenter.player = {}; ytcenter.player.setPlaybackState = (function(){ function updateState(state, s) { con.log("[Player:setPlaybackState] Preferred state: " + state + ", current state: " + s); var api = ytcenter.player.getAPI(); var muted = false; if (s === 1) { if (state === 0) { api.mute(); api.stopVideo(); !ytcenter.settings.mute && api.isMuted && api.unMute(); } else if (state === 1) { api.playVideo(); } else if (state === 2) { api.mute(); api.pauseVideo(); !ytcenter.settings.mute && api.isMuted && api.unMute(); } ytcenter.player.listeners.removeEventListener("onStateChange", listener); if (!ytcenter.html5) { setState.preferredState = null; } } else if (s <= 0 && state === 2) { api.mute(); api.playVideo(); api.pauseVideo(); !ytcenter.settings.mute && api.isMuted && api.unMute(); ytcenter.player.listeners.removeEventListener("onStateChange", listener); if (!ytcenter.html5) { setState.preferredState = null; } } if (ytcenter.html5) { ytcenter.utils.asyncCall(function(){ var newState = api.getPlayerState(); if (newState !== state && (newState !== -1 && newState !== 5) && typeof newState === "number") { updateState(state, newState); } else { setState.preferredState = null; } }); } } function setState(state) { setState.preferredState = state; var api = ytcenter.player.getAPI(); con.log("[Player:setPlaybackState] State is changed to " + state); if (listener !== null) { ytcenter.player.listeners.removeEventListener("onStateChange", listener); } listener = ytcenter.utils.bindArgument(updateState, state); ytcenter.player.listeners.addEventListener("onStateChange", listener); updateState(state, api.getPlayerState()); } var listener = null; setState.preferredState = null; return setState; })(); ytcenter.player.setQuality = (function(){ function stateChange(vq, state) { api = ytcenter.player.getAPI(); if (api) { if (state === 1 && step === 0) { step = 1; api.setPlaybackQuality(vq); api.seekTo(api.getCurrentTime()); api.pauseVideo(); } else if (state === 2 && step === 1) { step = 2; api.setPlaybackQuality(vq); api.seekTo(api.getCurrentTime()); api.playVideo(); } else if (state === 1 && step === 2) { step = -1; api.setPlaybackQuality(vq); api.seekTo(api.getCurrentTime()); removeStateListener(); } } } function addStateListener(vq) { listener = ytcenter.utils.bindArgument(stateChange, vq); ytcenter.player.listeners.addEventListener("onStateChange", listener); addedListener = true; } function removeStateListener(vq) { ytcenter.player.listeners.removeEventListener("onStateChange", listener); listener = null; addedListener = false; } function reloadQuality(vq) { api = ytcenter.player.getAPI(); /* Forcing the quality */ step = 0; /* Starting the hack */ if (!addedListener) { addStateListener(); } /* Checking if the player is already playing the video. If that's the case then execute the stateChange with state set to 1 */ if (api.getPlayerState() === 1) { stateChange(vq, 1); } } function setQuality(vq) { api = ytcenter.player.getAPI(); if (api && typeof api.setPlaybackQuality === "function") { con.log("[Player:SetQuality] Setting quality to " + vq); api.setPlaybackQuality(vq); /* Setting the preferred quality. */ //reloadQuality(vq); } else { con.log("[Player:SetQuality] API not ready!"); } } var addedListener = false; var listener = null; var step = -1; var api = null; return setQuality; })(); ytcenter.player.isPreventAutoPlay = function(){ var notFocused = document && document.hasFocus && typeof document.hasFocus === "function" && !document.hasFocus(), preventAutoPlay = false, autoPlay = false; if (ytcenter.page === "watch") { autoPlay = ytcenter.settings.preventAutoPlay; } else if (ytcenter.page === "embed") { autoPlay = ytcenter.settings.embed_preventAutoPlay; } else if (ytcenter.page === "channel") { autoPlay = ytcenter.settings.channel_preventAutoPlay; } if (ytcenter.page === "watch" && notFocused && ((ytcenter.playlist && ytcenter.settings.preventTabPlaylistAutoPlay) || (!ytcenter.playlist && ytcenter.settings.preventTabAutoPlay))) { preventAutoPlay = true; } else { if (ytcenter.playlist && ytcenter.page === "watch") { preventAutoPlay = ytcenter.settings.preventPlaylistAutoPlay; } else { preventAutoPlay = autoPlay; } } return preventAutoPlay; }; ytcenter.player.isPreventAutoBuffering = function(){ var notFocused = document && document.hasFocus && typeof document.hasFocus === "function" && !document.hasFocus(), preventAutoBuffering = false, autoBuffering = false; if (ytcenter.page === "watch") { autoBuffering = ytcenter.settings.preventAutoBuffer; } else if (ytcenter.page === "embed") { autoBuffering = ytcenter.settings.embed_preventAutoBuffer; } else if (ytcenter.page === "channel") { autoBuffering = ytcenter.settings.channel_preventAutoBuffer; } if (ytcenter.page === "watch" && notFocused && ((ytcenter.playlist && ytcenter.settings.preventTabPlaylistAutoBuffer) || (!ytcenter.playlist && ytcenter.settings.preventTabAutoBuffer))) { preventAutoBuffering = true; } else { if (ytcenter.playlist && ytcenter.page === "watch") { preventAutoBuffering = ytcenter.settings.preventPlaylistAutoBuffer; } else { preventAutoBuffering = autoBuffering; } } return preventAutoBuffering; }; ytcenter.player.darkside = function(){ var player = document.getElementById("player"); var playlistTray = document.getElementById("playlist-tray"); var theaterBackground = document.getElementById("theater-background"); if (!theaterBackground && player) { theaterBackground = document.createElement("div"); theaterBackground.setAttribute("id", "theater-background"); player.insertBefore(theaterBackground, player.children[0]); } if (ytcenter.getPage() === "watch" && ytcenter.player.getCurrentPlayerSize().large) { if (ytcenter.settings.playerDarkSideBG) { if (theaterBackground && !ytcenter.settings.playerDarkSideBGRetro) { theaterBackground.style.backgroundColor = ytcenter.settings.playerDarkSideBGColor; } if (playlistTray) { playlistTray.style.top = "-" + ytcenter.player.getCurrentPlayerSize().playerHeight + "px"; } return true; } } if (theaterBackground) { theaterBackground.style.backgroundColor = ""; } if (playlistTray) { playlistTray.style.top = ""; } return false; }; ytcenter.player.network = {}; ytcenter.player.network.pause = function(){ con.log("[Tab Event] Calling player.pauseVideo();"); ytcenter.tabEvents.fireEvent("player", "pauseVideo"); }; ytcenter.player.setPlaybackQuality = function(preferredQuality){ function recall(vq){ if (vq === 1) { ytcenter.player.listeners.removeEventListener("onStateChange", recall); ytcenter.player.setPlaybackQuality(preferredQuality); } } var api = ytcenter.player.getAPI(), config = ytcenter.player.getConfig(); if (config && config.args) { config.args.vq = preferredQuality; } if (!api) { ytcenter.player.listeners.addEventListener("onStateChange", recall); } else { /*if (api.getPlaybackQuality() === preferredQuality && preferredQuality !== "small") api.setPlaybackQuality("small"); else if (api.getPlaybackQuality() === preferredQuality && preferredQuality !== "medium") api.setPlaybackQuality("medium");*/ ytcenter.player.setQuality(preferredQuality); } }; ytcenter.player.config = {}; ytcenter.player.cpn = ytcenter.utils.crypt(); ytcenter.player.getVideoDataRequest = function(){ /* Making sure that the require configuration is available */ if (uw.yt && uw.yt.config_ && uw.yt.config_.PLAYER_CONFIG) ytcenter.player.config = uw.yt.config_.PLAYER_CONFIG; if (!ytcenter.player.config || !ytcenter.player.config.args) ytcenter.player.config = ytcenter.player.getRawPlayerConfig(); var emvid = loc.pathname.match(/\/embed\/([0-9a-zA-Z_-]+)/); if (emvid && emvid.length > 1 && emvid[1]) emvid = emvid[1]; /* Creating URL */ var a = { html5: (ytcenter.player.config && ytcenter.player.config.html5 ? "1" : "0"), video_id: ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.video_id || emvid, cpn: ytcenter.player.cpn, eurl: loc.href, ps: null, el: "embedded", hl: (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.hl ? ytcenter.player.config.args.hl : null), sts: 15973, c: "web", cver: (ytcenter.player.config.html5 ? "html5" : "flash") }, b = [], k; if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.list) { a.list = ytcenter.player.config.args.list; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.cr) { a.cr = ytcenter.player.config.args.cr; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.access_token) { a.access_token = ytcenter.player.config.args.access_token; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.adformat) { a.adformat = ytcenter.player.config.args.adformat; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.iv_load_policy) { a.iv_load_policy = ytcenter.player.config.args.iv_load_policy; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.autoplay) { a.autoplay = ytcenter.player.config.args.autoplay; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.mdx) { a.mdx = ytcenter.player.config.args.mdx; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.utpsa) { a.utpsa = ytcenter.player.config.args.utpsa; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.is_fling) { a.is_fling = ytcenter.player.config.args.is_fling; } if (window.clientWidth) { a.width = window.clientWidth; } if (window.clientHeight) { a.width = window.clientHeight; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.ypc_preview) { a.ypc_preview = ytcenter.player.config.args.ypc_preview; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.splay) { a.splay = ytcenter.player.config.args.splay; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.content_v) { a.content_v = ytcenter.player.config.args.content_v; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.livemonitor) { a.livemonitor = ytcenter.player.config.args.livemonitor; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.authuser) { a.authuser = ytcenter.player.config.args.authuser; } if (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.pageid) { a.pageid = ytcenter.player.config.args.pageid; } for (k in a) { if (a.hasOwnProperty(k)) { if (a[k] !== null) { b.push(encodeURIComponent(k) + "=" + encodeURIComponent(a[k])); } } } return ytcenter.utils.getLocationOrigin() + "/get_video_info?" + b.join("&"); }; ytcenter.player.isLiveStream = function(){ return (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.live_playback === 1); }; ytcenter.player.isOnDemandStream = function(){ return (ytcenter.player.config && ytcenter.player.config.args && ytcenter.player.config.args.ypc_module && ytcenter.player.config.args.ypc_vid); }; ytcenter.player.getRawPlayerConfig = function(){ function loadMethod1() { try { var a = document.body.innerHTML; a = a.split("