Inspector&Editor

see full description here: https://openuserjs.org/users/pietro.giucastro/scripts

// ==UserScript==
// @name         Inspector&Editor
// @namespace    http://tampermonkey.net/
// @version      1.3.0
// @description  see full description here:  https://openuserjs.org/users/pietro.giucastro/scripts
// @author       Speep [email protected]
// @match        */*
// @grant        none
// @require      http://code.jquery.com/jquery-latest.js
// ==/UserScript==
/* jshint -W097 */
'use strict';

// Your code here...
$('head').append("<style> .inspect_selector_ { border: 1px solid black !important; background-color: rgba(0,100,255,0.2) !important; }</style>");

$('head').append("<style> .inspect_style_  { position:relative; }</style>");
$('head').append("<style> .console_style_  { position:relative; }</style>");
$('head').append("<style> .log_style_      { position:relative; margin-bottom:5px; }</style>");
$('head').append("<style> .shortcut_style_ { position:relative; width:24px; line-height:24px; background-color:rgba(50,50,50,0.8); color:white; padding:0px; border-radius:5px; border:0px; margin-left:5px; }</style>");
$('head').append("<style> .css_input_      { position:relative; }</style>");

$('head').append("<style> .log_box_html         { padding-left:5px; color:#fff !important; resize:none; width:500px; margin-left:1px; border-radius:3px; resize:vertical; font-size:13px; line-height:25px; word-wrap:break-word; }</style>");
$('head').append("<style> .console_box_textarea { padding-left:5px; color:#fff !important; resize:none; width:470px; border-radius:3px; resize:vertical; font-size:13px; word-wrap:break-word; float:left; margin-bottom:3px; }</style>");
$('head').append("<style> .inspect_box_textarea { padding-left:5px; color:#fff !important; resize:none; width:500px; border-radius:3px; resize:vertical; font-size:13px; word-wrap:break-word; }</style>");
$('head').append("<style> .css_box_textarea     { padding-left:5px; color:#fff !important; resize:none; width:485px; border-radius:3px; resize:vertical; font-size:13px; word-wrap:break-word; height:20px; }</style>");

$('head').append("<style> .box_container_ { position:fixed; bottom:10px; right:20px; z-index:1000000000000000000000; }</style>");

$('body').append("<div class='box_container_'></div>");

$('.box_container_').append("<div id = 'inspect_box' class='inspect_style_'><textarea class='inspect_box_textarea' style='background-color:rgba(50,50,50,0.6) !important;'></textarea></div>");
$('.box_container_').append("<div id = 'log_box' class='log_style_'><xmp class='log_box_html' style='background-color:rgba(255,0,0, 0.5) !important;'></xmp></div>");
$('.box_container_').append("<div id = 'console_box' class='console_style_'><textarea class='console_box_textarea' placeholder='console' style='background-color:rgba(100,30,0,0.6) !important;'></textarea></div>");
$('.box_container_').append("<button id = 'shortcut_button' class='shortcut_style_' type='button'>+</button>");

setHeight($('#console_box textarea'));

var key = false;
var selected;
var map = [];
$('#inspect_box, #log_box, #console_box, #shortcut_button').hide();
var err_iter = 0;
var hover_iter = 0;
var fadeTimeout;
var hover_interval;

$(document).keydown(function(e){
    if (e.which == 8) map[e.keyCode] = e.type == 'keydown';
    else if (e.which == 18) key = true;

    var canDelete = !(e.target == $('#inspect_box textarea')[0] ||
                      e.target == $('#console_box textarea')[0]);

    if (key && map[8] && canDelete ) deleteSelected();

});

$(document).keyup(function(e){
    if (e.which == 18) key = false;
    else if (e.which == 8 || e.which == 16 || e.which == 13) {
        map[e.keyCode] = e.type == 'keydown';
    }

});

$('#shortcut_button').click(function(){
    var css_value = $('#console_box textarea').val();
    if (!css_value) {fadeFunction('You must type in the console box the css property name!\n(e.g. "background-color")', 'err'); return;}
    $('#console_box textarea').val('');
    var tmp_css_input = $("<div class='css_input_'><textarea class='css_box_textarea' style='background-color:rgba(0,30,100,0.6) !important;' placeholder='"+css_value+"' data-css='"+css_value+"'></textarea><div class ='remove_btn_'  style='position:relative; margin-top:-2px; float:right; cursor:pointer;'>x</div></div>")[0];
    $('.box_container_').append(tmp_css_input);
    setHeight($(tmp_css_input).find('textarea'));
    $(tmp_css_input).mousemove(function(e){ if (key) return false;}).click(function(){return false;}).keydown(function(e){

        if (e.which == 16 || e.which == 13) {
            map[e.keyCode] = e.type == 'keydown';
        }
        if (map[16] && map[13]) {
            var css_text = $(this).find('textarea').data('css');
            var css_value = $(this).find('textarea').val();
            setElement(css_text, css_value);
            refreshSelected();
            return false;
        }

        setHeight($(this).find('textarea'));
    });

    $(tmp_css_input).find('.remove_btn_').click(function() {
        $(tmp_css_input).remove();
        return false;
    });

    $('body').click(function() { $('.css_input_').hide(); });
});

$('#inspect_box textarea').keydown(function(e){
    if (e.which == 16 || e.which == 13) {
        map[e.keyCode] = e.type == 'keydown';
    }
    if (map[16] && map[13]) {setElement(); return false;}
}).keyup(function(e){setHeight($(this));});

$('#console_box textarea').keydown(function(e){
    if (e.which == 16 || e.which == 13) {
        map[e.keyCode] = e.type == 'keydown';
    }
    if (map[16] && map[13]) {evaluate($(this).val()); return false;}
}).keyup(function(e){setHeight($(this));});

$('#log_box').mouseover(function(){
    clearFadeTime();
    logHover('in', 0.80);
}).mouseleave(function(){
    fadeFunction();
    logHover('out', 0.50);
});


$(document).mousemove(function(e){
    if (!key) return;
    else $('#inspect_box, #console_box, #shortcut_button, .css_input_').show();
    var text = $(e.target).clone().html('').wrap('<div/>').parent().html();
    if (selected != e.target){
        $(selected).removeClass('inspect_selector_');
        selected = e.target;
        $('#inspect_box textarea').val(text);
        setHeight($('#inspect_box textarea'));
        $(selected).addClass('inspect_selector_');
    }
}).find('#inspect_box, #console_box, #log_box, #shortcut_button, .box_container_').mousemove(function(e){ if (key) return false;});

$('body').click(function(e){$('#inspect_box, #console_box, #shortcut_button').hide(); $(selected).removeClass('inspect_selector_');}).find('#inspect_box, #console_box, #log_box, #shortcut_button, .css_input_').click(function(e){return false;});

function setElement(css_text, css_value) {
    try {
        var html_content = $(selected).html();
        var new_element = $($('#inspect_box textarea').val())[0];
        if (css_text && css_value) new_element = $(new_element).css(css_text, css_value)[0];
        $(selected).replaceWith(new_element);
        selected = new_element;
        if (!($(new_element).html())) selected = ($(new_element).html(html_content))[0];
    }
    catch(e) {
        var interval = setInterval(function(){
            var red = Math.floor(50+Math.sin(err_iter)*50);
            var gb = Math.floor(50-Math.sin(err_iter)*50);
            var alpha = 0.6+Math.sin(err_iter)*0.15;
            $('#inspect_box textarea').css('background-color', 'rgba('+red+','+gb+','+gb+','+alpha+')');
            err_iter+=0.1;
            if (err_iter>3.14) {
                err_iter = 0;
                clearInterval(interval);
                $('#inspect_box textarea').css('background-color', 'rgba(50,50,50,0.6)');
            }
        },5);
    }
}

function evaluate(js_evaluation_inner_text) {
    try {
        try {if ($(js_evaluation_inner_text).length) {fadeFunction('can\'t write dom elements here!', 'err'); return;}} //this try prevent from errors given by functions (log()) inside $ brackets.
        catch(e) {
            eval(js_evaluation_inner_text);
            refreshSelected();
        }
    }
    catch(e) {fadeFunction(e, 'err')}
}

function logHover(str, target) {

    clearInterval(hover_interval);
    var bgcolor = $('#log_box xmp').css('background-color');
    var std_alpha = Math.round(parseFloat(bgcolor.split(',')[3].replace(')','').trim())*100)/100;

    var sign = str=='in'? 1:-1;

    var str_bg = $('#log_box xmp').css('background-color').split(',')[0]
    +','+$('#log_box xmp').css('background-color').split(',')[1]
    +','+$('#log_box xmp').css('background-color').split(',')[2]+',';

    hover_interval = setInterval(function(){
        var alpha = Math.round(parseFloat(std_alpha + sign*Math.sin(hover_iter)*Math.abs(target - std_alpha))*100)/100;
        if (hover_iter >= 1.57) { $('#log_box xmp').css('background-color', str_bg+' '+target+')'); hover_iter = 0; clearInterval(hover_interval); }
        else {
            $('#log_box xmp').css('background-color', str_bg+' '+alpha+')');
            hover_iter+=0.05;
        }
    }, 5);

}

function fadeFunction(e_text, type) {
    if (type=='err') $('#log_box xmp').css('background-color', 'rgba(255,0,0,0.5');
    else if (type=='log') $('#log_box xmp').css('background-color', 'rgba(0,100,30,0.5');
    $('#log_box').fadeIn('fast').find('.log_box_html').html(e_text);
    clearFadeTime();
    fadeTimeout = setTimeout(function() {$('#log_box').fadeOut('fast')}, 2000);
}


function clearFadeTime() {
    clearTimeout(fadeTimeout);   
}

function deleteSelected() {
    $(selected).replaceWith('');
    selected = undefined;
    console.log(selected);
    $('#inspect_box textarea').html('');
}

function log(text) {
    if (!text) {fadeFunction ('undefined', 'err'); return;}
    if (text instanceof HTMLElement || text[0] instanceof HTMLElement) {text = $(text).clone().html('').wrap('<div/>').parent().html();}
    else if (text == []) text = 'null';
    fadeFunction(text, 'log');
}

function setHeight(e) {
    e.height(0);
    var newHeight = Math.min(e[0].scrollHeight, 400);
    e.height(newHeight);
}

function refreshSelected() {
    var new_text = $(selected).clone().html('').wrap('<div/>').parent().html();
    $('#inspect_box textarea').val(new_text);
    setHeight($('#inspect_box textarea'));   
}