// ==UserScript==
// @name Video Framing Sliders - for YouTube
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Gives new tools for youtbe playback
// @author RGSoftware
// @include *.youtube.*/watch?v=*
// @grant none
// @runat document-body
// @locale en-us
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js
// ==/UserScript==
/*
.:Notes:.
I didn't want to use Jquery, but then I did a little. But too lazy to rewrite the vanilla javascript in jquery
*/
tools = {
createElement: function(parent, id, eletype, value, style, className, textClassName, onclickFunc){
parent = document.getElementById(parent);
var e = document.createElement(eletype);
e.className = className;
e.onclick = onclickFunc === null ? '' : onclickFunc;
parent.appendChild(e);
var label = document.createElement('span');
label.innerHTML = value;
label.className = textClassName;
e.setAttribute('style', style);
e.appendChild(label);
return e; // return handle
},
toggle: false,
toggleTools : function(motherEle, toolsDiv){
tools.toggle = !tools.toggle;
/*
var x = document.getElementById(e);
var z = document.getElementById(toolsDiv);
*/
var animSpeed = 500;
var e = $("#"+toolsDiv);
if (tools.toggle){
e.animate({height: "150px"}, animSpeed);
/*
$("#"+motherEle).animate({minHeight: "300px"}, animSpeed);
x.setAttribute("style", "min-height:300px");
z.style.height = "150px";
*/
}else{
e.animate({height: "0px"}, animSpeed);
/*
$("#"+motherEle).animate({minHeight: "150px"}, animSpeed);
z.style.height = "0px"
x.setAttribute("style", "min-height:150px");
*/
}
},
createElementAlt : function(elementType, data, type, className, style, id, parent){
var e = document.createElement(elementType);
parent = document.getElementById(parent);
switch (elementType.toUpperCase()){
case "INPUT":
e.setAttribute('type', type);
e.value = data;
break;
case "BUTTON":
e.value = data;
break;
case "SPAN":
e.innerHTML = data;
break;
}
e.id = id;
e.innerHTML = data;
e.value = data;
e.className = className;
e.setAttribute('style', style);
parent.appendChild(e);
},
};
/*Some constants, infos*/
var youtube = {
btnStyle1 : 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-button-has-icon no-icon-markup pause-resume-autoplay action-panel-trigger action-panel-trigger-share yt-uix-tooltip',
btnStyle2 : 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-button-has-icon no-icon-markup pause-resume-autoplay yt-uix-menu-trigger yt-uix-tooltip',
};
/* Main elements creation */
//div
tools.createElementAlt("div", '', '', '', 'height:0px; overflow:hidden;', 'myDiv', 'watch-header'); //watch8-secondary-actions //height:153px; width:843px;
var toolsDiv = document.getElementById('myDiv');
var toggleToolsBtn = tools.createElement("watch8-secondary-actions", "myBtn", "button", "Show Tools", "", youtube.btnStyle1, "t-uix-button-content", null);
toggleToolsBtn.onclick = function(){tools.toggleTools('watch-header','myDiv');};
/*
item 1 - label
tools.createElementAlt('span', 'Scale X', '', '', '', 'scaleXSliderLabel', 'myDiv');
item 1 - Scale X Slider
tools.createElementAlt('input', '1', 'range', '', '', 'scaleXSlider', 'myDiv');
item 2 - label
tools.createElementAlt('span', 'Scale Y', '', '', '', 'scaleYSliderLabel', 'myDiv');
item 2 - Scale Y Slider
tools.createElementAlt('input', '1', 'range', '', '', 'scaleYSlider', 'myDiv');
item 3 - lock Scale checkbox
tools.createElementAlt('input', '', 'checkbox', '', '', 'lockScaleCheckbox', 'myDiv');
item 3 - lock Scale checkbox label
tools.createElementAlt('label', 'Lock Scale X+Y', '', '', '', 'LabelForCheckbox', 'myDiv');
*/
function ElementWithLabel(elementType, text, type, className, style, id, parent){
this.elementType = elementType;
this.text = text;
this.type = type;
this.className = className;
this.style = style;
this.elementId = id;
this.labelId = id+'-container';
this.parent = parent;
//create elements first!
tools.createElementAlt('span', this.text, '', '', '', this.labelId, this.parent); //LABEL WRAP
tools.createElementAlt(this.elementType, '', this.type, this.className, this.style, this.elementId, this.labelId); //CHECKBOX
//now you can return the element 'handle'
this.labelElement = document.getElementById(this.labelId);
this.element = document.getElementById(this.elementId);
}
function slider(labeltext, id, parent, min, max, step, startValue){
this.id = id;
this.parent = parent;
this.labeltext = labeltext;
this.min = min;
this.max = max;
this.step = step;
this.startValue = startValue;
this.create = createSlider(this.labeltext, this.id, this.parent, this.startValue);
this.setDefaults = setDefaults(this.id, this.min, this.max, this.step);
this.element = document.getElementById(this.id);
this.getPercentLabel = this.id + "Percent";
this.percentage = this.element.value + "%";
this.updateLabel = function(){sliderSeeked(this.getPercentLabel, this.id);};
// this.resetValue = function(){resetValue(this.id);};
this.element.ondblclick = function(){
resetValue(this.id, startValue);
};
// setDefaults(this.id, -5, 5, 0.01);
}
function createSlider(labeltext, id, parent, startVal){
var cstyle = "position:relative; top:-6px; padding:5px;"; //middle align top:-11px;
var contParent = id+"-container";
tools.createElementAlt('div', '', '','', 'border: 1px solid black;', contParent, parent); //Container
tools.createElementAlt('span', labeltext, '', '', cstyle, id+"label", contParent); //Label
tools.createElementAlt('input', startVal, 'range', '', 'width:150px;', id, contParent); //Slider
tools.createElementAlt('span', startVal+"%", '', '', cstyle, id+"Percent", contParent); //PercentLabel
}
function sliderSeeked(percentlbl, sliderEle){
var slider = document.getElementById(sliderEle);
var sVal = parseFloat(slider.value).toFixed(2);
document.getElementById(percentlbl).innerHTML = + sVal + "%";
}
function resetValue(e, startVal){
var slider = document.getElementById(e);
slider.value = startVal;
}
function setDefaults(e, min, max, step){
var x = document.getElementById(e);
x.max = max;
x.min = min;
x.step = step;
}
//slider(labeltext, id, parent)
var sliderX = new slider("Scale X", "scaleXSlider", "myDiv", -5, 5, 0.01, 1);
sliderX.element.onmousemove = function(){
var sVal = parseFloat(sliderX.element.value).toFixed(2);
sliderX.updateLabel();
video.scaleX(sVal);
if (lockScaleCheckbox.element.checked === true){
video.scaleY(sVal);
sliderY.element.value = sVal;
sliderY.updateLabel();
}
};
var sliderY = new slider("Scale Y", "scaleYSlider", "myDiv", -5, 5, 0.01, 1);
sliderY.element.onmousemove = function(){
var sVal = parseFloat(sliderY.element.value).toFixed(2);
sliderY.updateLabel();
video.scaleY(sVal);
if (lockScaleCheckbox.element.checked === true){
video.scaleX(sVal);
sliderX.element.value = sVal;
sliderX.updateLabel();
}
};
//function ElementWithLabel(elementType, text, type, className, style, id, parent){
var lockScaleCheckbox = new ElementWithLabel('input', 'Lock Scale', 'checkbox', '','', 'scaleLock-checkbox', 'myDiv');
//if (lockScaleCheckbox.element.checked === true){
// video.scaleY(sVal); sliderY.element.value = sVal; sliderY.updateLabel(); //LOCKED TEST ONLY
//}
//tools.createCheckboxWithLabel('input', 'lock scale', 'checkbox', '', '', 'scaleLock-checkbox', 'myDiv');
var sliderTranslateX = new slider("Translate X", "translateXSlider", "myDiv", -1000, 1000, 1, 0);
sliderTranslateX.element.onmousemove = function(){
var sVal = parseFloat(sliderTranslateX.element.value).toFixed(2);
sliderTranslateX.updateLabel();
video.translateX(sVal);
};
var sliderTranslateY = new slider("Translate Y", "translateYSlider", "myDiv", -1000, 1000, 1, 0);
sliderTranslateY.element.onmousemove = function(){
var sVal = parseFloat(sliderTranslateY.element.value).toFixed(2);
sliderTranslateY.updateLabel();
video.translateY(sVal);
};
//matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY()):
var video = {
g_scaleX: 1,
g_scaleY: 1,
g_skewX: 0,
g_skewY: 0,
g_translateX: 0,
g_translateY: 0,
matrix2d: function(){
var vid = document.getElementsByClassName(video.className)[0];
vid.setAttribute('style', 'transform:matrix(' + this.g_scaleX +
"," + this.g_skewY +
"," + this.g_skewX +
"," + this.g_scaleY +
"," + this.g_translateX +
"," + this.g_translateY + ')');
},
className: 'html5-video-container',
scaleX : function(_scaleX){
this.g_scaleX = _scaleX;
video.matrix2d();
},
scaleY : function(_scaleY){
this.g_scaleY = _scaleY;
video.matrix2d();
},
translateX : function(_translateX){
this.g_translateX = _translateX;
video.matrix2d();
},
translateY : function(_translateY){
this.g_translateY = _translateY;
video.matrix2d();
},
};
//var lfchkbx = document.getElementById('LabelForCheckbox');
//lfchkbx.setAttribute('for', 'lockScaleCheckbox');
//var scaleChkbx = document.getElementById('lockScaleCheckbox');
//scaleChkbx.checked = true;