Syntax-Highlight-Style

Adds extra code highlighting frormating options ot syntaxhighlight.in

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Syntax-Highlight-Style
// @namespace       https://github.com/Amourspirit/Syntax-Highlight-Style
// @version         1.1.2
// @description     Adds extra code highlighting frormating options ot syntaxhighlight.in
// @author          Paul Moss
// @match           http://syntaxhighlight.in/
// @license         MIT
// @homepageURL     http://amourspirit.github.io/Syntax-Highlight-Style/
// @update          https://github.com/Amourspirit/Syntax-Highlight-Style/raw/master/syntax-highlight-style.user.js
// @contributionURL http://amourspirit.github.io/Syntax-Highlight-Style/#donate
// @grant           none
// ==/UserScript==
/* jshint -W097 */
'use strict';
// #nsregion BIGBYTE
var BIGBYTE = BIGBYTE || {};
if (typeof(BIGBYTE.createNS) == 'undefined') {
    BIGBYTE.createNS = function(namespace) {
        var nsparts = namespace.split(".");
        var parent = BIGBYTE;

        // we want to be able to include or exclude the root namespace so we strip
        // it if it's in the namespace))
        if (nsparts[0] === "BIGBYTE") {
            nsparts = nsparts.slice(1);
        }

        // loop through the parts and create a nested namespace if necessary
        for (var i = 0; i < nsparts.length; i++) {
            var partname = nsparts[i];
            // check if the current parent already has the namespace declared
            // if it isn't, then create it
            if (typeof parent[partname] === "undefined") {
                parent[partname] = {};
            }
            // get a reference to the deepest element in the hierarchy so far
            parent = parent[partname];
        }
        // the parent is now constructed with empty namespaces and can be used.
        // we return the outermost namespace
        return parent;
    };
}
if (typeof(BIGBYTE.isjquery) == 'undefined') {
    BIGBYTE.isjquery = function(data) {
        // If data is already a jQuery object
        if (data instanceof jQuery) {
            // Do nothing different
            data = data;
            // Otherwise            
        } else {
            // Convert to jQuery object
            data = jQuery(data);
        }
        // Return jQuery object     
        return data;
    };
}

// #endnsregion BIGBYTE
// #nsregion BIGBYTE.USERSCRIPT.DOCUMENT

var bbDoc = BIGBYTE.createNS("BIGBYTE.USERSCRIPT.DOCUMENT");
bbDoc.ns = 'BIGBYTE.USERSCRIPT.DOCUMENT';
// #region LoadScripts
if (typeof(bbDoc.loadScript) == 'undefined') {
    bbDoc.loadScript = function(scriptItm) {
        var lib = this;
        if (typeof(scriptItm.count) == 'undefined') {
            scriptItm.count = 0;
        }
        if (typeof(scriptItm.loaded) == 'undefined') {
            scriptItm.loaded = false;
        }
        if (typeof(scriptItm.text) == 'undefined') {
            scriptItm.text = ''; // timeout in seconds
        }
        if (typeof(scriptItm.timeout) == 'undefined') {
            scriptItm.timeout = 30; // timeout in seconds
        }

        var bbScriptLoadedEvent = new CustomEvent(
            "bbScriptLoaded", {
                detail: {
                    message: "Script Loaded",
                    time: new Date(),
                    scriptItm: scriptItm
                },
                bubbles: true,
                cancelable: false
            }
        );

        switch (scriptItm.type) {
            case 'linkedjs':
                var skipTest = false;
                if (typeof(scriptItm.testMethod) == 'undefined' || (scriptItm.testMethod.length == 0)) {
                    skipTest = true;
                }
                if (skipTest) {
                    // there is no test for this item so we will and assume
                    // all is fine/
                    scriptItm.loaded = true;
                    lib.addJS_Node(scriptItm.text, scriptItm.src);
                    // trigger event for loaded

                    //jQuery(document).trigger("bbScriptLoaded", scriptItm);
                    document.dispatchEvent(bbScriptLoadedEvent);
                    return;
                }
                scriptItm.count++;
                var maxCount = scriptItm.timeout * 10; // multply by 10 to convert into 10th of seconds

                if (scriptItm.count > maxCount) {
                    console.error('unable to load script, Aborting: ', scriptItm.src);
                    return;
                }
                var testmethod;
                try {
                    testmethod = eval(scriptItm.testMethod);
                } catch (e) {
                    testmethod = undefined;
                }
                if (typeof(testmethod) == 'undefined') {
                    if (!scriptItm.loaded) {
                        scriptItm.loaded = true;
                        lib.addJS_Node(scriptItm.text, scriptItm.src);
                    }
                    setTimeout(function() {
                        lib.loadScript(scriptItm);
                    }, 100);
                } else {
                    // script item is loaded trigger an evert
                    //jQuery(document).trigger("bbScriptLoaded", scriptItm);
                    document.dispatchEvent(bbScriptLoadedEvent);
                }
                break;
            case 'css':
                if (typeof(scriptItm.tag) == 'undefined') {
                    scriptItm.tag = 'body'; // timeout in seconds
                }
                lib.addCss_Node(scriptItm.src, scriptItm.tag);
                //jQuery(document).trigger("bbScriptLoaded", scriptItm);
                document.dispatchEvent(bbScriptLoadedEvent);
                break;
            case 'csslink':
                lib.addLink_Node(scriptItm.src);
                //jQuery(document).trigger("bbScriptLoaded", scriptItm);
                document.dispatchEvent(bbScriptLoadedEvent);
                break;
            default:
                // statements_def
                break;
        }


    }
}

// #endregion LoadScripts
// #region BIGBYTE.USERSCRIPT.DOCUMENT Methods
// gneric document related
if (typeof(bbDoc.addJS_Node) == 'undefined') {
    bbDoc.addJS_Node = function(text, s_URL, funcToRun, runOnLoad) {
        var D = document;
        var scriptNode = D.createElement('script');
        if (runOnLoad) {
            scriptNode.addEventListener("load", runOnLoad, false);
        }
        scriptNode.type = "text/javascript";
        if (text) scriptNode.textContent = text;
        if (s_URL) scriptNode.src = s_URL;
        if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';

        var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
        targ.appendChild(scriptNode);
    };
}
if (typeof(bbDoc.addJS_NodeToBody) == 'undefined') {
    bbDoc.addJS_NodeToBody = function(text, s_URL, funcToRun, runOnLoad) {
        var D = document;
        var scriptNode = D.createElement('script');
        if (runOnLoad) {
            scriptNode.addEventListener("load", runOnLoad, false);
        }
        scriptNode.type = "text/javascript";
        if (text) scriptNode.textContent = text;
        if (s_URL) scriptNode.src = s_URL;
        if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';

        var targ = D.getElementsByTagName('body')[0] || D.body || D.documentElement;
        targ.appendChild(scriptNode);
    };
}
if (typeof(bbDoc.addCss_Node) == 'undefined') {
    bbDoc.addCss_Node = function(text, element) {
        element = typeof element !== 'undefined' ? element : 'head';
        var D = document;
        var scriptNode = D.createElement('style');
        scriptNode.type = "text/css";
        if (text) scriptNode.textContent = text;

        var targ = D.getElementsByTagName(element)[0] || D.body || D.documentElement;
        targ.appendChild(scriptNode);
    };
}
if (typeof(bbDoc.addLink_Node) == 'undefined') {
    bbDoc.addLink_Node = function(href, type, rel) {
        type = typeof type !== 'undefined' ? type : "text/css";
        rel = typeof rel !== 'undefined' ? rel : "stylesheet";
        var D = document;
        var scriptNode = D.createElement('link');
        scriptNode.type = type;
        scriptNode.href = href;
        if (rel) scriptNode.rel = rel;

        var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
        targ.appendChild(scriptNode);
    };
}

if (typeof(bbDoc.addHtml_Node) == 'undefined') {
    bbDoc.addHtml_Node = function(html) {
        var D = document;
        var targ = D.getElementsByTagName('body')[0] || D.body || D.documentElement;
        targ.insertAdjacentHTML('beforeend', html);
    };
}
// #endregion BIGBYTE.USERSCRIPT.DOCUMENT Methods

// #endnsregion BIGBYTE.USERSCRIPT.DOCUMENT"

// #nsregion BIGBYTE.USERSCRIPT.UTIL
var bbusu = BIGBYTE.createNS("BIGBYTE.USERSCRIPT.UTIL");
bbusu.ns = 'BIGBYTE.USERSCRIPT.UTIL';
// #region Methods
if(typeof(bbusu.extend) == 'undefined') {
    /**
     * Extends an object to contain new Properties
     * @return {[Object]} the new merged oject
     */
    bbusu.extend = function () {
        for (var i = 1; i < arguments.length; i++)
            for (var key in arguments[i])
                if (arguments[i].hasOwnProperty(key))
                    arguments[0][key] = arguments[i][key];
        return arguments[0];
    };
}

// #endregion Methods
// #endnsregion BIGBYTE.USERSCRIPT.UTIL

// #nsregion BIGBYTE.USERSCRIPT.CLIPBOARD
// #region Create NS
var bbClip = BIGBYTE.createNS("BIGBYTE.USERSCRIPT.CLIPBOARD");
bbClip.ns = 'BIGBYTE.USERSCRIPT.CLIPBOARD';
// #endregion Create NS
// #region Properties
bbClip.scriptOutputted = false;
// #endregion Properties
// #endnsregion BIGBYTE.USERSCRIPT.CLIPBOARD

// #nsregion BIGBYTE.STRING
// #region Create NS
var bbString = BIGBYTE.createNS("BIGBYTE.STRING");
bbString.ns = 'BIGBYTE.STRING';
// #endregion Create NS
// #region Init
if (typeof(bbString.pad) == 'undefined') {
    bbString.pad = function pad(str, max, padChar) {
        padChar = padChar || '0';
        str = str.toString();
        return str.length < max ? this.pad(padChar + str, max, padChar) : str;
    }
}
// #endregion Init
// #endnsregion BIGBYTE.STRING

// #nsregion BIGBYTE.USERSCRIPT.STHL
// #region Create NS
var sthl = BIGBYTE.createNS("BIGBYTE.USERSCRIPT.STHL");
sthl.ns = 'BIGBYTE.USERSCRIPT.STHL';
// #endregion Create ns
// #region Button methods

/**
 * Toggles Buttons enabled or disabled
 * @param  {[boolean]} enabled If true buttons will be enable; Otherwise disabled
 */
sthl.toggleButtons = function(enabled, forceRedraw) {
    enabled = (typeof(enabled) == 'undefined') ? false : enabled;
    forceRedraw = (typeof(forceRedraw) == 'undefined') ? false : forceRedraw;
    var $ = jQuery;
    if (enabled) {
        $('#gmconvert').attr("disabled", false);
        $('#gmcopy').attr("disabled", false);
        $('#gmcopytbl').attr("disabled", false);
        $('#gmtable').attr("disabled", false);
    } else {
        $('#gmconvert').attr("disabled", 'disabled');
        $('#gmcopy').attr("disabled", 'disabled');
        $('#gmcopytbl').attr("disabled", 'disabled');
        $('#gmtable').attr("disabled", 'disabled');
    }
    if (forceRedraw) {
        $('#gmconvert').hide().show(0);
        $('#gmcopy').hide().show(0);
        $('#gmcopytbl').hide().show(0);
        $('#gmtable').hide().show(0);
    }
};

sthl.getConvertedList = function() {
    var $ = jQuery;
    var $sourceCode = $('pre.snippet-formatted.sh_sourceCode');
    $sourceCode.makeCssInlineCode(false);
    var contentHtml = '';
    if ($sourceCode.length) {
        var $wrapper = $('<div />');
        $wrapper.assignStyleFrom($sourceCode).css({
            width: 'auto',
            height: 'auto',
            animation: '',
            clip: '',
            direction: '',
            fill: '',
            filter: '',
            flex: '',
            isolation: '',
            orphans: '',
            position: '',
            r: '',
            resize: '',
            rx: '',
            ry: '',
            speak: '',
            stroke: '',
            top: '',
            transform: '',
            transition: '',
            visibility: '',
            widows: '',
            x: '',
            y: '',
            zoom: '',
            //background: '',
            opacity: '',
            order: '',
            clear: '',
            cx: '',
            cy: '',
            float: '',
            mask: '',
            motion: ''
        });
        // $sourceCode.removeAttrib('class', true);
        $sourceCode.wrapInner($wrapper);
        contentHtml = $sourceCode.spaceReplace(true)[0].outerHTML;
    }
    return contentHtml;
};

sthl.getConvertedTable = function() {
    var $ = jQuery;

    var $sourceCode = $('pre.snippet-formatted.sh_sourceCode');

    $sourceCode.find('li').each(function(index, li) {
        // convert li spaces to \u00a0
        $(li).spaceReplace(false); // do not recurse
    });

    $sourceCode.makeCssInlineCode(true); // generates for html Table
    var contentHtml = '';
    if ($sourceCode.length) {
        contentHtml = this.toTable($sourceCode)[0].outerHTML;
    }
    return contentHtml;
};


/*
 * Button click to convert ordered list of the code output to inline styled ordered list
 */
sthl.convertClick = function(btn) {

    var $ = jQuery;
    var lib = BIGBYTE.USERSCRIPT.STHL;
    lib.toggleButtons(false, true);
    $.event.trigger({
        type: 'codeConversionStart',
        message: 'convert_list_start',
        time: new Date(),
        source: 'convertClick'
    });
    this.windowScrollPos = $('body').scrollTop();
    $('html, body').animate({
        scrollTop: 0
    }, 'slow');
    $(document).disableScroll('html, body');
    
    var $btn = BIGBYTE.isjquery(btn); // convert to jquery obj
    var libTmce = BIGBYTE.USERSCRIPT.STHL.TMCE;
    if ($btn.data('converted')) {
        $btn.data('converted', 0);
    } else {
        $btn.data('converted', 1);

    }
    var contentHtml = this.getConvertedList();
    if (libTmce.fullscreen) {
        tinyMCE.get('gminput').execCommand('mceFullScreen');
    }
    tinyMCE.get('gminput').setContent(contentHtml);
    $('.gmbackdrop, .gmbox').animate({
        'opacity': '.50'
    }, 300, 'linear');
    $('.gmbox').animate({
        'opacity': '1.00'
    }, 300, 'linear');
    $('.gmbackdrop, .gmbox').css('display', 'block');

    $.event.trigger({
        type: 'codeConversionFinish',
        message: 'convert_list_end',
        time: new Date(),
        source: 'convertClick',
        html: contentHtml
    });

};


/*
 * Button click to convert ordered list of the code output to html table
 */
sthl.convertTable = function(btn) {
    var $ = jQuery;
    $.event.trigger({
        type: 'codeConversionStart',
        message: 'convert_table_start',
        time: new Date(),
        source: 'convertTable'
    });

    var libTmce = BIGBYTE.USERSCRIPT.STHL.TMCE;
    this.windowScrollPos = $('body').scrollTop();
    $('html, body').animate({
        scrollTop: 0
    }, 'slow');
    $(document).disableScroll('html, body');

    var contentHtml = this.getConvertedTable();
    if (libTmce.fullscreen) {
        tinyMCE.get('gminput').execCommand('mceFullScreen');
    }
    tinyMCE.get('gminput').setContent(contentHtml);
    $('.gmbackdrop, .gmbox').animate({
        'opacity': '.50'
    }, 300, 'linear');
    $('.gmbox').animate({
        'opacity': '1.00'
    }, 300, 'linear');
    $('.gmbackdrop, .gmbox').css('display', 'block');

    $.event.trigger({
        type: 'codeConversionFinish',
        message: 'convert_table_end',
        time: new Date(),
        source: 'convertTable',
        html: contentHtml
    });
};
// #endregion Button methods
// #region Init
/**
 * Init for the main script
 */
sthl.init = function(pluginSrc) {
    var tinyMceVer = BIGBYTE.USERSCRIPT.STHL.TMCE.version;
    //var tinyMceVer = '4.3.2';
    pluginSrc = typeof(pluginSrc) == 'undefined' ? '//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js' : pluginSrc;

    // no jquery at this point use pure javascript events
    if (document.addEventListener) { // For all major browsers, except IE 8 and earlier
        document.addEventListener("bbScriptLoaded", BIGBYTE.USERSCRIPT.STHL.onBbScriptLoaded);
    } else if (document.attachEvent) { // For IE 8 and earlier versions
        document.attachEvent("onbbScriptLoaded", BIGBYTE.USERSCRIPT.STHL.onBbScriptLoaded);
    }

    if (document.addEventListener) { // For all major browsers, except IE 8 and earlier
        document.addEventListener("allScriptsLoaded", BIGBYTE.USERSCRIPT.STHL.onAllScriptsLoaded);
    } else if (document.attachEvent) { // For IE 8 and earlier versions
        document.attachEvent("onallScriptsLoaded", BIGBYTE.USERSCRIPT.STHL.onAllScriptsLoaded);
    }

    // only add jquery if we need it.
    if (typeof(jQuery) == 'undefined') {
        this.addScript('jquery', pluginSrc, 'linkedjs', 'jQuery');
    }
    if ((typeof(jQuery) == 'undefined') || (typeof(jQuery.cookei) == 'undefined')) {
        this.addScript('cookie', '//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js', 'linkedjs', 'jQuery.cookie');
    }
    if (typeof(Clipboard) == 'undefined') {
        this.addScript('clipboard', '//cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.5/clipboard.min.js', 'linkedjs', 'Clipboard');
    }
    this.addScript('icons-css', '//cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.css', 'csslink');
    // tiny mce 
    this.addScript('tinyMceJs', '//cdnjs.cloudflare.com/ajax/libs/tinymce/' + tinyMceVer + '/tinymce.min.js', 'linkedjs', 'tinyMCE');
    this.addScript('tinyMceCss', '//cdnjs.cloudflare.com/ajax/libs/tinymce/' + tinyMceVer + '/skins/lightgray/skin.min.css', 'csslink');

    //this.addScript('tinymce_advanced_theme', '//cdnjs.cloudflare.com/ajax/libs/tinymce/' + tinyMceVer + '/themes/advanced/theme.min.js','linkedjs') // no checking required
    this.loadScripts();
};
/*
 * Load scripts will load one script only at a time.
 * When the script is loaded the next if any script will be
 * load via the onScripLoadeEvent
 * the onScriptLoaded Event calle this function over and over untll all the scripts are loaded
 */
sthl.loadScripts = function() {

    var count = 0;
    for (var key in this.scripts) {
        count++;
        if (count > 1) {
            return;
        }
        BIGBYTE.USERSCRIPT.DOCUMENT.loadScript(this.scripts[key]);
    }
};
/*
 * Array to hold all the scripts that are to be loaded
 */
sthl.scripts = [];
/*
 * Adds script item to the BIGBYTE.USERSCRIPT.STHL.scripts array
 * these are scripts tha will be loaded when the BIGBYTE.USERSCRIPT.STHL.init() is fired
 */
sthl.addScript = function(name, src, type, testMethod, args) {
    var newItm = {
        name: name,
        src: src,
        type: type,
        testMethod: testMethod
    };
    if(typeof(args) === undefined) {
        this.scripts[name] = newItm;
    } else {
        var extended = BIGBYTE.USERSCRIPT.UTIL.extend(newItm, args);
        this.scripts[name] = extended;
    }
};

/*
 * Function to check and see if there are any scripts left to be loaded
 * @returns boolean, true if all the scripts are loaded; Otherwise false
 */
sthl.isScriptsLoaded = function() {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    for (var key in lib.scripts) {
        if (!lib.scripts[key].loaded) {
            return false
        }
    }
    return true;
};



// #endregion init
// #region Properties
sthl.scriptOutputted = false;
sthl.windowScrollPos = 0;
sthl.includeLineNumbers = true;
/**
 * Property that is set to true if the code has had style added to it
 * @type {Boolean}
 */
sthl.isCodeStyled = false;

// light box related
sthl.lightBoxCss = '.gmbackdrop,.gmbox{position:absolute;display:none}.gmbackdrop{top:0;left:0;width:100%;height:100%;background:#000;opacity:0;';
sthl.lightBoxCss += 'filter:alpha(opacity=0);z-index:201}.gmbox{background:#fff;z-index:202;padding:10px;';
sthl.lightBoxCss += '-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-moz-box-shadow:0 0 5px #444;-webkit-box-shadow:0 0 5px #444;';
sthl.lightBoxCss += 'box-shadow:0 0 5px #444}.gmclose{float:right;margin-right:6px;cursor:pointer}.mce-panel{border:none}div.gmbox .mce-panel{border:';
sthl.lightBoxCss += ' 0 solid rgba(0,0,0,.2)}div.mce-tinymce.mce-container.mce-panel{margin-top:2em}div.mce-tinymce.mce-container.mce-panel.mce-fullscreen';
sthl.lightBoxCss += '{margin-top:0}#gm-edit-btn{font-size:1.6em;color:#ABABAB}#gm-edit-btn:hover{color:#2DBE60}';
sthl.lightBoxCss += '.gmbox-window{top:50%;left:50%;transform: translate(-50%, -50%);position: absolute;';
sthl.lightBoxCss += 'width:650px;height:450px;}';
// #endregion Properties
// #region Init Methods
/*
 * internal method to add buttons to the toolbar of the page.
 * method alos hooks up some of the buttons. Method is called on document.ready
 */
sthl.initToolbar = function($) {
    var lib = this;
    var $btndiv = $('.buttons:first');
    $btndiv.append('<button id="gmconvert" type="button" data-clipboard-text="" data-converted="0" disabled="disabled">Popup List</button>');
    $btndiv.append('<button id="gmtable" type="button" disabled="disabled">Popup Table</button>');
    $btndiv.append('<button id="gmcopy" type="button" disabled="disabled">Copy List</button>');
    $btndiv.append('<button id="gmcopytbl" type="button" disabled="disabled">Copy Table</button>');


    $('button#gmconvert').click(function() {
        lib.convertClick(this);
    });
    $('#gmtable').click(function() {
        lib.convertTable(this);
    });
};
/*
 *
 * Inits the line number to hook page line number checkbox
 * @param $ optional jQuery object
 * @desc called from main init
 */

sthl.initLineNumbers = function($) {
    $ = $ || jQuery;
    //label#checkBox.bfc selected
    //includeLineNumbers
    var lib = this;
    $('input#lineNumber').click(function() {
        if ($(this).parent('label').hasClass('selected')) {
            lib.includeLineNumbers = true;
        } else {
            lib.includeLineNumbers = false;

        }
    });
};
// #endregion Init Methods
// #region Methods
/*
 * resets the lightbox back to hidden state
 */
sthl.lightBoxReset = function() {
    jQuery('.gmbackdrop, .gmbox').animate({
        'opacity': '0'
    }, 300, 'linear', function() {
        jQuery('.gmbackdrop, .gmbox').css('display', 'none');
    });
    jQuery('textarea#gminput').val(''); // clean up textarea
};

/**
 * Converts a list (ul, ol) elements into a table
 * @parm el an element containing the the ul or ol item
 * @parm includeNum optional, if true then line numnbers will be incldued; Otherwise false.
 * default value is the value the page is currently set to with the line numbers checkbox
 */
sthl.toTable = function(el, includeNum, tableClass) {
    var $ = jQuery;
    var lib = this;
    //debugger;
    tableClass = tableClass || '';
    includeNum = includeNum || this.includeLineNumbers;

    var $tbl;
    if (tableClass) {
        $tbl = $('<table />');
    } else {
        $tbl = $('<table class="' + tableClass + '" />');
    }
    var count = 0;
    el.find('li').each(function(index, li) {
        var $li = BIGBYTE.isjquery(li);
        var box = $li.hasClass('box');
        var boxTop = $li.hasClass('box-top');
        var boxMid = $li.hasClass('box-mid');
        var boxBot = $li.hasClass('box-bot');
        var boxBg = $li.hasClass('box-bg');
        count++;
        var $row = $('<tr/>');
        if (includeNum) {
            var $cellNum = $('<td/>').css({
                paddingLeft: '5px',
                width: '35px',
                textAlign: 'right',
                whiteSpace: 'nowrap',
                paddingRight: '5px'
            });
            if (box) {
                $cellNum.css({
                    border: $li.css('border'),
                    borderColor: $li.css('border-color'),
                    borderRight: '0'
                });
                if (boxTop) {
                    $cellNum.css({
                        borderTop: $li.css('border-top'),
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color')
                    });
                }
                if (boxMid) {
                    $cellNum.css({
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color')
                    });
                }
                if (boxBot) {
                    $cellNum.css({
                        borderBottom: $li.css('border-bottom'),
                        borderBottomColor: $li.css('border-bottom-color'),
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color')
                    });
                }
                if (boxBg) {
                    $cellNum.css({
                        backgroundColor: $li.css('background-color')
                    });
                }
            }
            $cellNum.html(BIGBYTE.STRING.pad(count, 2) + '.');
            $row.append($cellNum);

        }
        var $cellMain = $('<td/>');
        $cellMain = lib._copyCss($cellMain, li);
        $cellMain.css({
            listStyle: '',
            //wordWrap: 'normal',
            lineHeight: '',
            fontSize: '',
            fontFamily: '',
            'word-wrap': 'break-word'
        });
        if (includeNum) {
            $cellMain.css({
                width: '100%'
            });
        } else {
            $cellMain.css({
                width: '100%',
                paddingLeft: '10px'
            });
        }

        if (box) {
            $cellMain.css({
                border: $li.css('border'),
                borderColor: $li.css('border-color'),
                borderLeft: (includeNum ? '0' : $li.css('border-left'))
            });
            if (boxTop) {
                if (includeNum) {
                    $cellMain.css({
                        borderTop: $li.css('border-top'),
                        borderLeft: '0',
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                } else {
                    $cellMain.css({
                        borderTop: $li.css('border-top'),
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color'),
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                }

            }
            if (boxMid) {
                if (includeNum) {
                    $cellMain.css({
                        borderLeft: '0',
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                } else {
                    $cellMain.css({
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color'),
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                }

            }
            if (boxBot) {
                if (includeNum) {
                    $cellMain.css({
                        borderBottom: $li.css('border-bottom'),
                        borderBottomColor: $li.css('border-bottom-color'),
                        borderLeft: '0',
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                } else {
                    $cellMain.css({
                        borderBottom: $li.css('border-bottom'),
                        borderBottomColor: $li.css('border-bottom-color'),
                        borderLeft: $li.css('border-left'),
                        borderLeftColor: $li.css('border-left-color'),
                        borderRight: $li.css('border-right'),
                        borderRightColor: $li.css('border-Right-color')
                    });
                }
            }
            if (boxBg) {
                $cellMain.css({
                    backgroundColor: $li.css('background-color')
                });
            }
        }
        $cellMain.html($(this).html());
        $row.append($cellMain);
        $tbl.append($row);
    });
    // set the default css styles
    $tbl = this._copyCss($tbl, el);
    // corrected css styles
    $tbl.css({
        whiteSpace: 'nowrap',
        listStyle: '',
        wordWrap: 'normal',
        'border-collapse': 'collapse',
        'table-layout': 'fixed',
        width: '100%'
    });
    return $tbl;
}
sthl.createToggleButton = function() {
    var $ = jQuery;
    if ($('btncustomtoggle').length === 0) {
        $('<div id="customtoggle"><button id="btncustomtoggle" type="buton" style="display: none">Toggle</button></div>').insertBefore('#htmlToCopy');
        $('#btncustomtoggle').click(function() {
            tinyMCE.execCommand('mceToggleEditor', true, 'htmlToCopy');
        });
    }

};
/*
 * internal copies specifice class files from toEl to el.
 */

sthl._copyCss = function(toEl, el) {
    var $toEl = BIGBYTE.isjquery(toEl);
    var $el = BIGBYTE.isjquery(el);

    $toEl.css({
        paddingLeft: $el.css('padding-left'),
        listStyle: $el.css('list-style'),
        backgroundColor: $el.css('background-color'),
        lineHeight: $el.css('line-height'),
        borderLeft: $el.css('border-left'),
        color: $el.css('color'),
        fontWeight: $el.css('font-weight'),
        fontStyle: $el.css('font-style'),
        fontSize: $el.css('font-size'),
        fontFamily: $el.css('font-family'),
        textAlign: $el.css('text-align'),
        whiteSpace: $el.css('white-space'),
        wordWrap: $el.css('word-wrap')
    })
    return $toEl;
};

sthl.lightBoxAddCss = function() {
    var bdoc = BIGBYTE.USERSCRIPT.DOCUMENT;
    bdoc.addCss_Node(this.lightBoxCss, 'body');
};

sthl.getLightBoxHtml = function(id, title) {
    id = typeof id !== 'undefined' ? id : 'gminput';
    title = typeof title !== 'undefined' ? title : '';
    var h = '<div class="gmbackdrop"></div>';
    h += '<div id="tinybox" class="gmbox gmbox-window"><div class="gmclose"><i class="fi-x" style="color:black"></i></div>';
    h += title;
    h += '<textarea id="' + id + '" rows="18" cols="68"></textarea>';
    h += '</div></div>';
    return h;
}

sthl.writeLightBox = function(id, title) {
    var html = this.getLightBoxHtml(id, title);
    var bdoc = BIGBYTE.USERSCRIPT.DOCUMENT;
    bdoc.addHtml_Node(html);
};

/**
 * Init that fires when Clibporad Lib is loaded
 */
sthl.clipboardInit = function() {

    var clipboard = new Clipboard('#gmcopy', {
        text: function(trigger) {
            var $ = jQuery;
            $.event.trigger({
                type: 'codeConversionStart',
                message: 'convert_list_start',
                time: new Date(),
                source: 'gmcopy'
            });

            var contentHtml;
            try {
                contentHtml = BIGBYTE.USERSCRIPT.STHL.getConvertedList();
            } catch (e) {
                // statements
                console.log(e);
            }
            $.event.trigger({
                type: 'codeConversionFinish',
                message: 'convert_list_end',
                time: new Date(),
                source: 'gmcopy',
                html: contentHtml
            });
            return contentHtml;
        }
    });
    var clipboardTbl = new Clipboard('#gmcopytbl', {
        text: function(trigger) {
            var $ = jQuery;
            $.event.trigger({
                type: 'codeConversionStart',
                message: 'convert_table_start',
                time: new Date(),
                source: 'gmcopytbl'
            });
            var contentHtml;
            try {
                contentHtml = BIGBYTE.USERSCRIPT.STHL.getConvertedTable();
            } catch (e) {
                // statements
                console.log(e);
            }

            $.event.trigger({
                type: 'codeConversionFinish',
                message: 'convert_table_end',
                time: new Date(),
                source: 'gmcopytbl',
                html: contentHtml
            });
            return contentHtml;

        }
    });

    clipboard.on('success', function(e) {
        console.info('Action:', e.action);
        //console.info('Text:', e.text);
        console.info('Trigger:', e.trigger);
        alert('Data as been copied to the clipboard');
    });

    clipboard.on('error', function(e) {
        console.error('Action:', e.action);
        console.error('Trigger:', e.trigger);
        alert('Unable to copy data to the clipboard');
    });

    clipboardTbl.on('success', function(e) {
        console.info('Action:', e.action);
        console.info('Trigger:', e.trigger);
        alert('Data as been copied to the clipboard');
    });

    clipboardTbl.on('error', function(e) {
        console.error('Action:', e.action);
        console.error('Trigger:', e.trigger);
        alert('Unable to copy data to the clipboard');
    });
};

/**
 * Calls page like method to relaod the code from the origiona source
 * @return {[boolean]} returns true if the code was reset; Otherwise false
 */
sthl.reHighlight = function() {
    if ($("#dropZone").val() == "") {
        $(".doneButton").attr("disabled", true);
        return false;
    }
    $("#theWholeEnchilada").html('<pre class="shi_pre"></pre>');
    $("#theWholeEnchilada .shi_pre").text($("#dropZone").val());
    languageSelected = $("#language_selected option:selected").val();
    styleSelected = $("#style_selected option:selected").val();
    lineNumber = $("#lineNumber").is(":checked");
    collapsing = ($("#collapsing").is(":checked") || $("#startCollapsing").is(":checked"));
    startCollapsing = $("#startCollapsing").is(":checked");
    boxStyling = $("#boxStyling").val();
    boxColorStyling = $("#boxColorStyling").val();
    boxFillStyling = $("#boxFillStyling").val();
    $("pre.shi_pre").snippet(languageSelected, {
        style: styleSelected,
        showNum: lineNumber,
        collapse: collapsing,
        startCollapsed: startCollapsing,
        box: boxStyling,
        boxColor: boxColorStyling,
        boxFill: boxFillStyling
    })
    return true;
};

/**
 * Set the page control value select elements if there are cookie value
 * otherwise save the cookie values
 */
sthl.setFromCookies = function() {
    if (typeof($.cookie('language_selected_val')) == 'undefined') {
        $.cookie('language_selected_val', $("#language_selected option").filter(":selected").val(), {
            expires: 14
        });
    } else {
        $("#language_selected").val($.cookie('language_selected_val'));
    }

    if (typeof($.cookie('style_selected_val')) == 'undefined') {
        $.cookie('style_selected_val', $("#style_selected option").filter(":selected").val(), {
            expires: 14
        });
    } else {
        $("#style_selected").val($.cookie('style_selected_val'));
    }
};

// #endregion Methods
// #region ensure Methods
sthl.ensurePlugins = function($) {
    if (typeof($.fn.enableScroll) == 'undefined') {
        $.extend($.fn, {
            enableScroll: function(selector, height) {
                height = height || 'auto';
                if ((typeof(selector) == 'undefined') || (selector == null)) {
                    $(this).css({
                        'overflow': 'auto',
                        'height': height
                    });

                } else {
                    $(this).find(selector).css({
                        'overflow': 'auto',
                        'height': height
                    });
                }
            }
        });
    }
    if (typeof($.fn.disableScroll) == 'undefined') {
        $.extend($.fn, {
            disableScroll: function(selector, height) {
                height = height || '100%';
                if ((typeof(selector) == 'undefined') || (selector == null)) {
                    $(this).css({
                        'overflow': 'hidden',
                        'height': height
                    });

                } else {
                    $(this).find(selector).css({
                        'overflow': 'hidden',
                        'height': height
                    });
                }
            }
        });
    }
    if (typeof($.fn.spaceReplace) == 'undefined') {
        $.extend($.fn, {
            spaceReplace: function(recurse) {
                recurse = typeof(recurse) == 'undefined' ? false : recurse;

                if (recurse) {
                    return this.find('*').each(function(index, value) {
                        try {
                            if (typeof(value) == 'undefined') {
                                return;
                            }
                            $(value)._spaceRepaceSingle();
                        } catch (e) {
                            console.log('spaceReplace error:', e);
                        }

                    });
                } else {
                    return this._spaceRepaceSingle();
                }

            },
            _spaceRepaceSingle: function() {
                this.contents().filter(function() {
                    return this.nodeType == 3; // Text node
                }).each(function() {
                    this.data = this.data.replace(/ /g, '\u00a0');
                });
                return this;
            }
        });
    }
    if (typeof($.fn.removeAttrib) == 'undefined') {
        $.extend($.fn, {
            removeAttrib: function(attributeName, recurse) {
                recurse = typeof(recurse) == 'undefined' ? false : recurse;

                if (recurse) {
                    return $(this).find('*').each(function(index, value) {
                        try {
                            if (typeof(value) == 'undefined') {
                                return;
                            }
                            $(value).removeAttr(attributeName);
                        } catch (e) {
                            // statements
                            console.log('error:', e);
                        }

                    });
                } else {
                    return $(this).removeAttr(attributeName);
                }
            }
        });
    }
};

/*
 * internal method that creates/loads makeCssInlineCode jQuery plugin
 * this plugin converts specific the css style of the element and child elemets into inline css style
 */
sthl.ensureMakeCssInlineCodePlugin = function($) {
    if (typeof($.fn.makeCssInlineCode) == 'undefined') {
        $.extend($.fn, {
            makeCssInlineCode: function(forTable) {
                // forTable if true then will generate css a little diffferently for html table 
                forTable = typeof(forTable) == 'undefined' ? false : forTable;

                this.each(function(idx, el) {
                    var $this = $(el);
                    var tagName = $this.tagName(true);
                    if ($this.attr('class')) {
                        // if element has a class then set the styles
                        $this.css({
                            color: $this.css('color'),
                            fontWeight: $this.css('font-weight'),
                            fontStyle: $this.css('font-style'),
                            //fontSize: $this.css('font-size'),
                            //fontFamily: $this.css('font-family'),
                            textAlign: $this.css('text-align'),
                            //whiteSpace: $this.css('white-space'),
                            //wordWrap: $this.css('word-wrap')
                        });
                    }
                    // get tagname in lowercase format;
                    switch (tagName) {
                        case 'li':
                            $this.css({
                                paddingLeft: $this.css('padding-left'),
                                listStyle: $this.css('list-style'),
                                backgroundColor: $this.css('background-color'),
                                lineHeight: $this.css('line-height'),
                                //borderLeft: $this.css('border-left'),
                                borderTop: $this.css('border-top'),
                                borderRight: $this.css('border-right'),
                                borderBottom: $this.css('border-bottom'),
                                borderLeftColor: $this.css('border-left-color'),
                                borderTopColor: $this.css('border-top-color'),
                                borderRightColor: $this.css('border-right-color'),
                                borderBottomColor: $this.css('border-bottom-color'),
                                borderLeft: $this.css('border-left'),
                                color: $this.css('color'),
                                fontWeight: $this.css('font-weight'),
                                fontStyle: $this.css('font-style'),
                                //fontSize: $this.css('font-size'),
                                //fontFamily: $this.css('font-family'),
                                textAlign: $this.css('text-align'),
                                whiteSpace: $this.css('white-space'),
                                wordWrap: $this.css('word-wrap'),
                                margin: $this.css('margin'),
                                'list-style-position': $this.css('list-style-position')

                            });
                            break;
                        case 'ol': // line numbers
                            var padding = $this.css('-webkit-padding-start');
                            $this.css({
                                'list-style-type': 'decimal',
                                display: 'block',
                                '-webkit-margin-before': '1em',
                                '-moz-margin-before': '1em',
                                '-khtml-margin-before': '1em',
                                '-o-margin-before': '1em',

                                '-webkit-margin-after': '1em',
                                '-moz-margin-after': '1em',
                                '-khtml-margin-after': '1em',
                                '-o-margin-after': '1em',

                                '-webkit-margin-start': '0px',
                                '-moz-margin-start': '0px',
                                '-khtml-margin-start': '0px',
                                '-o-margin-start': '0px',

                                '-webkit-margin-end': '0px',
                                '-moz-margin-end': '0px',
                                '-khtml-margin-end': '0px',
                                '-o-margin-end': '0px',

                                '-moz-padding-start': padding,
                                '-khtml-padding-start': padding,
                                '-o-padding-start': padding,
                                'padding-start': padding,
                                'padding-left': padding
                            });

                            break;
                        case 'ul': // no line numbers
                            $this.css({
                                'list-style-type': 'decimal',
                                display: 'block',
                                '-webkit-margin-before': '1em',
                                '-moz-margin-before': '1em',
                                '-khtml-margin-before': '1em',
                                '-o-margin-before': '1em',

                                '-webkit-margin-after': '1em',
                                '-moz-margin-after': '1em',
                                '-khtml-margin-after': '1em',
                                '-o-margin-after': '1em',

                                '-webkit-margin-start': '0px',
                                '-moz-margin-start': '0px',
                                '-khtml-margin-start': '0px',
                                '-o-margin-start': '0px',
                                '-webkit-margin-end': '0px',
                                '-moz-margin-end': '0px',
                                '-khtml-margin-end': '0px',
                                '-o-margin-end': '0px',

                                '-moz-padding-start': '0',
                                '-khtml-padding-start': '0',
                                '-o-padding-start': '0',
                                'padding-start': '0',
                                'padding-left': '0'
                            });
                            break;
                        case 'span':
                            if ((!forTable) && ($this.hasClass('box-sp'))) {
                                $this.css({
                                    display: $this.css('display'),
                                    width: $this.css('width')
                                });
                            } else {
                                $this.css({
                                    display: '',
                                    width: ''
                                });
                            }
                            break;
                        default:
                            // statements_def
                            break;
                    }

                    //var style = el.style;
                    //$this.removeAttr('class'); // remove class from element
                    $this.children().makeCssInlineCode(forTable);
                });
            }
        });
    }
};
/*
 * internal method that creates/loads makeCssInline jQuery plugin
 * this plugin converts all the css style of the element and child elemets into inline css style
 */
sthl.ensureMakeCssInlinePlugin = function($) {
    if (typeof($.fn.makeCssInline) == 'undefined') {
        $.extend($.fn, {
            makeCssInline: function(recurse) {
                recurse = typeof(recurse) == 'undefined' ? false : recurse;
                if (recurse) {
                    return this.find('*').each(function(index, value) {
                        try {
                            if (typeof(value) == 'undefined') {
                                return;
                            }
                            $(value)._makeCssInlineSingle();
                        } catch (e) {
                            console.log('makeCssInline error:', e);
                        }

                    });
                } else {
                    return this.each(function(index, value) {
                        $(value)._makeCssInlineSingle();
                    })
                }
            },
            _makeCssInlineSingle: function() {

                var el = this[0];

                var style = el.style;
                var properties = [];
                for (var property in style) {
                    if (this.css(property)) {
                        properties.push(property + ':' + this.css(property));
                    }
                }

                el.style.cssText = properties.join(';');
                return this;
            }
        });
    }

    if (typeof($.fn.assignStyleFrom) == 'undefined') {
        /**
         * Assigns style of one jQuery Object to current object
         * @param  {[jQuery]} el) A jQuery object or dom element
         * @return {[jQuery]}     jQuery object with the new style assigned
         */
        $.extend($.fn, {
            assignStyleFrom: function(el) {
                if (typeof(el) == 'undefined') {
                    return this;
                }
                var $el;
                if (el instanceof jQuery) {
                    $el = el;
                } else {
                    $el = jQuery(el);
                }
                if ($el.length === 0) {
                    return this;
                }
                var style = $el[0].style;
                var properties = [];
                for (var property in style) {
                    if ($el.css(property)) {
                        properties.push(property + ':' + $el.css(property));
                    }
                }
                this[0].style.cssText = properties.join(';');
                return this;
            }
        });
    }
};

// #endregion enusre Methods
// #region Events
/*
 * Event Handler that is fired when a script is loaded
 * This event fires each time a script is loaded.
 */
sthl.onBbScriptLoaded = function(e) {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    // delete the added script

    delete lib.scripts[e.detail.scriptItm.name];
    var done = lib.isScriptsLoaded();
    if (done) {
        var allScriptsLoaded = new CustomEvent(
            "allScriptsLoaded", {
                detail: {
                    message: "All Scripts Loaded",
                    time: new Date(),
                },
                bubbles: true,
                cancelable: false
            }
        );
        document.dispatchEvent(allScriptsLoaded);
        //jQuery(document).trigger("allScriptsLoaded");
    } else {
        // add the next script
        lib.loadScripts();
    }
}

/*
 * Event Handler that fires when all scripts are loaded
 * this is main loading point for the script.
 */
sthl.onAllScriptsLoaded = function(e) {
    console.log('all scripts have been loaded.');
    jQuery(function($, undefined) {
        var lib = BIGBYTE.USERSCRIPT.STHL;

        if (typeof($.fn.tagName) == 'undefined') {
            // in older version of jquery tagname was retturned in uppercase but now is in lowercase
            $.fn.tagName = function(toLower) {
                var tn = this.prop("tagName");
                if (toLower) {
                    tn = tn.toLowerCase();
                }
                return tn;
            };
        }

        // hide the intro section of the webpage
        $('#intro').hide();

        $(document).on("tinymceInit", lib.onTinymceInit);
        $(document).on("tinymceCancel", lib.onTinymceCancel);
        $(document).on("codeConversionStart", lib.onCodeConversionStart);
        $(document).on("codeConversionFinish", lib.onCodeConversionFinish);
        // $(document).on("clipboardLoaded", lib.clipboardInit);
        lib.clipboardInit();
        $('button.startOver').on('click', lib.onStartOverClick);
        $('button.doneButton').unbind('click').on('click', lib.onDoneButtonClick);

        // load the values from cookies and set page controls
        lib.setFromCookies();

        // events for page change
        $('#dropZone').on('change', {
            source: 'dropZone',
            type: 'textarea'
        }, lib.onPageMainChanged);
        $('select#language_selected').on("change", {
            source: 'language_selected',
            type: 'dropdown'
        }, lib.onPageMainChanged);
        $('select#style_selected').on('change', {
            source: 'style_selected',
            type: 'dropdown'
        }, lib.onPageMainChanged);
        $('input#lineNumber').on('change', {
            source: 'lineNumber',
            type: 'checkbox'
        }, lib.onPageMainChanged);
        $('input#boxColorStyling').on('change', {
            source: 'boxColorStyling',
            type: 'input'
        }, lib.onPageMainChanged);
        $('input#boxFillStyling').on('change', {
            source: 'boxFillStyling',
            type: 'input'
        }, lib.onPageMainChanged);
        $('button.startOver').on('click', {
            source: 'button.startOver',
            type: 'button'
        }, lib.onPageReset);

        $(document).on('tinymceFullScreen', lib.onTinyMceFulllscreen);

        $('body').append('<input id="gmhidden" type="hidden" value="" />');

        lib.ensureMakeCssInlinePlugin($);
        lib.ensureMakeCssInlineCodePlugin($);
        lib.ensurePlugins($);
        lib.initToolbar($);
        lib.lightBoxAddCss();
        lib.writeLightBox();
        lib.createToggleButton(); // create the toggle button to toggle tinymce
        lib.TMCE.init();

        sthl.initLineNumbers($);

        $('.gmclose').click(function() {
            $.event.trigger({
                type: "tinymceCancel",
                message: 'cancel',
                time: new Date(),
                tinyMceId: 'gminput'
            });
        });


    });
};
/**
 * Event that fires when the page code elements have changed
 */
sthl.onPageMainChanged = function(e) {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    var $ = jQuery;
    if ($("#dropZone").val() == "") {
        lib.toggleButtons(false);
    } else {
        lib.toggleButtons(true);
    }

    switch (e.data.source) {
        case 'language_selected': // dropeown language has been changed
            $.cookie('language_selected_val', $("#language_selected option").filter(":selected").val(), {
                expires: 14
            });
            break;
        case 'style_selected':
            $.cookie('style_selected_val', $("#style_selected option").filter(":selected").val(), {
                expires: 14
            });
            break;
        default:
            // statements_def
            break;
    }
};

/**
 * Event that fire when the page reset takes place
 * @param  {[objece]} e event args
 */
sthl.onPageReset = function(e) {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    lib.toggleButtons(false);
    lib.isCodeStyled = false;
    // set elements from cookies
    lib.setFromCookies();
};

sthl.onDoneButtonClick = function(e) {

    if ($("#dropZone").val() == "") {
        return
    }
    var lib = BIGBYTE.USERSCRIPT.STHL;
    // highlight the code again if it has been styled
    if (lib.isCodeStyled == true) {

        lib.reHighlight();
        lib.isCodeStyled == false;
    }

    if ($("#step4:visible")) {
        $("#step4").slideToggle()
    }
    $("#step5").slideToggle();
    $(this).parents(".wrapper").slideToggle();
    $("#theWholeEnchilada").css("height", "0");
    $("#htmlToCopy").val($("#theWholeEnchilada").html());
    document.getElementById($("#style_selected").val()).style.display = "block"

    // add tiny mce toggle option on top of the 
    // formated source code window
    var nsTmce = BIGBYTE.USERSCRIPT.STHL.TMCE;
    jQuery('#btncustomtoggle').show();
    nsTmce.initHtmlTocopy();
    tinyMCE.execCommand('mceToggleEditor', true, 'htmlToCopy');

};
sthl.onStartOverClick = function(e) {
    var $ = jQuery;
    var lib = BIGBYTE.USERSCRIPT.STHL;
    tinyMCE.execCommand('mceRemoveEditor', true, 'htmlToCopy');
    $('btncustomtoggle').hide();
    // fixes issue with theWholeEnchilada have a height of auto after reset
    // this fix is only needed due to this script making a chnage somewhere
    // along the way
    $('#theWholeEnchilada').css({
        height: 'auto'
    });
    lib.isCodeStyled = false;

};
sthl.onCodeConversionStart = function(e) {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    if (lib.reHighlight()) {
        //console.log('code is rewritten');
    } else {
        //console.log('unable to rewrite code');
    }
};
sthl.onCodeConversionFinish = function(e) {
    var lib = BIGBYTE.USERSCRIPT.STHL;
    lib.toggleButtons(true);
    // set the property that indicates
    // if the colorized code has had syyles added to it
    lib.isCodeStyled = true;
};


/**
 * Event that fire when TinyMce is initiated
 */
sthl.onTinymceInit = function(e) {
    //console.log('Tiny Mce Init was triggered');
};
/**
 * Event that fire when TinyMce save is clicked
 */
sthl.onTinymceSave = function(e) {
    var $ = jQuery;
    if (e.tinyMceId == 'gminput') {
        //console.log('Tiny Mce save was triggered');
        BIGBYTE.USERSCRIPT.STHL.lightBoxReset();
        var libTmce = BIGBYTE.USERSCRIPT.STHL.TMCE;
        if ($('body').hasClass('mce-fullscreen')) {
            $('body').removeClass('mce-fullscreen');
        }
        $(document).enableScroll('html, body');
        // $('body').animate({ scrollTop: this.windowScrollPos}, 'slow');
        $('body').scrollTop(this.windowScrollPos);
    }

};
/**
 * Event that fire when TinyMce close is clicked
 */
sthl.onTinymceCancel = function(e) {
    var $ = jQuery;
    if (e.tinyMceId == 'gminput') {
        BIGBYTE.USERSCRIPT.STHL.lightBoxReset();
        tinymce.get('gminput').setContent(''); // clean up tinymce
        var libTmce = BIGBYTE.USERSCRIPT.STHL.TMCE;
        if ($('body').hasClass('mce-fullscreen')) {
            $('body').removeClass('mce-fullscreen');
        }
        $(document).enableScroll('html, body');
        $('body').scrollTop(this.windowScrollPos);
    }

};
sthl.onTinyMceFulllscreen = function(e) {
    var $ = jQuery;
    if (e.tinyMceId == 'gminput') {
        if (e.state) {
            if ($('#tinybox').hasClass('gmbox-window')) {
                $('#tinybox').removeClass('gmbox-window');
            }
        } else {
            if (!$('#tinybox').hasClass('gmbox-window')) {
                $('#tinybox').addClass('gmbox-window');
            }
        }
    }
};
// #endregion Events
// #endnsregion
// #nsregion BIGBYTE.USERSCRIPT.STHL.TMCE
// #region Create NS
var tmce = BIGBYTE.createNS("BIGBYTE.USERSCRIPT.STHL.TMCE");
tmce.ns = 'BIGBYTE.USERSCRIPT.STHL.TMCE';
// #endregion Create ns
// #region Properties
tmce.scriptOutputted = false;
tmce.fullscreen = false;
tmce.loopcount = 0;
tmce.version = '4.3.4';
// #endregion Properties
// #region init
if (typeof(tmce.init) == 'undefined') {
    tmce.init = function() {
        var ver = this.version;
        var id = 'gminput';
        tinyMCE.init({
            selector: 'textarea#' + id,
            visual: false, // turn off visual aids by default
            //entity_encoding: 'named',
            //entities: '160,nbsp',
            init_instance_callback: function() {
                jQuery('.mce-i-mysave').addClass('fi-save').css({
                    color: 'black'
                });
                // add x icon to button
                jQuery('.mce-i-myexit').addClass('fi-x').css({
                    color: 'black'
                });
                jQuery.event.trigger({
                    type: "tinymceInit",
                    message: 'init',
                    time: new Date(),
                    tinyMceId: id
                });
            },
            height: 260,
            // extended_valid_elements : "span[!class]",
            inline: false,
            browser_spellcheck: true,
            plugins: "",
            menubar: "edit insert format view tools table",
            toolbar1: 'mysave myexit insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link',
            toolbar2: 'fullscreen print preview media | forecolor backcolor | insertdatetime table searchreplace code',
            external_plugins: {
                'fullscreen': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/fullscreen/plugin.min.js',
                'textcolor': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/textcolor/plugin.min.js',
                'nonbreaking': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/nonbreaking/plugin.min.js',
                'insertdatetime': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/insertdatetime/plugin.min.js',
                'code': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/code/plugin.min.js',
                'hr': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/hr/plugin.min.js',
                'searchreplace': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/searchreplace/plugin.min.js',
                'table': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/table/plugin.min.js'
            },
            //valid_elements: 'ol ul',
            //extended_valid_elements: 'ol[|class|style] ul[class|style]',
            keep_styles: false,
            setup: function(ed) {
                // Add a custom button
                ed.on('FullscreenStateChanged', function(e) {
                    this.fullscreen = e.state;
                    jQuery.event.trigger({
                        type: "tinymceFullScreen",
                        message: 'fullscreen toogle',
                        time: new Date(),
                        state: e.state,
                        tinyMceId: id
                        
                    });

                });
                ed.addButton('myexit', {
                    title: 'Close',
                    onclick: function() {
                        jQuery.event.trigger({
                            type: "tinymceCancel",
                            message: 'cancel',
                            time: new Date(),
                            tinyMceId: id
                        });
                    }
                });

            }
        });

    };
}
if (typeof(tmce.initHtmlTocopy) == 'undefined') {
    tmce.initHtmlTocopy = function() {
        var ver = this.version;
        var id = 'htmlToCopy'
        tinyMCE.init({
            selector: 'textarea#' + id,
            visual: false, // turn off visual aids by default
            init_instance_callback: function() {
                jQuery.event.trigger({
                    type: "tinymceInit",
                    message: 'initHtmlTocopy',
                    time: new Date(),
                    tinyMceId: id
                });
            },
            height: 260,
            // extended_valid_elements : "span[!class]",
            inline: false,
            browser_spellcheck: true,
            plugins: "",
            menubar: "edit insert format view tools table",
            toolbar1: 'myexit insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link',
            toolbar2: 'fullscreen print preview media | forecolor backcolor | insertdatetime table searchreplace code',
            external_plugins: {
                'fullscreen': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/fullscreen/plugin.min.js',
                'textcolor': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/textcolor/plugin.min.js',
                'nonbreaking': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/nonbreaking/plugin.min.js',
                'insertdatetime': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/insertdatetime/plugin.min.js',
                'code': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/code/plugin.min.js',
                'hr': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/hr/plugin.min.js',
                'searchreplace': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/searchreplace/plugin.min.js',
                'table': 'https://cdnjs.cloudflare.com/ajax/libs/tinymce/' + ver + '/plugins/table/plugin.min.js'
            },
            //theme : "advanced",
            theme_advanced_toolbar_location: "top",
            theme_advanced_toolbar_align: "left",
            theme_advanced_statusbar_location: "bottom",
            theme_advanced_resizing: true,
            content_css: 'shi/css/shi_default.min.css',
            setup: function(ed) {
                // Add a custom button
                ed.on('FullscreenStateChanged', function(e) {

                    jQuery.event.trigger({
                        type: "tinymceFullScreen",
                        message: 'fullscreen toogle',
                        time: new Date(),
                        state: e.state,
                        tinyMceId: id
                    });

                });
            }
            //theme_advanced_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1"

        });
    };
}

// #endregion init
// #endnsregion BIGBYTE.USERSCRIPT.STHL.TMCE

// init the lib objects.
sthl.init();