Your IP : 216.73.216.240


Current Path : /home/juvelize/www/media/sourcerer/js/
Upload File :
Current File : /home/juvelize/www/media/sourcerer/js/script.js

/**
 * @package         Sourcerer
 * @version         9.8.0
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            https://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         GNU General Public License version 2 or later
 */

var RegularLabsSourcererPopup = null;

(function($) {
    var $editor = null;
    var $form   = null;

    RegularLabsSourcererPopup = {
        init: function() {
            $editor = Joomla.editors.instances['code'];
            $form   = document.getElementById('sourcererForm');

            try {
                var test = $editor.getValue();
            } catch (err) {
                setTimeout('RegularLabsSourcererPopup.init();', 100);
                return;
            }

            var string = '';

            var editor_textarea = window.parent.document.getElementById(sourcerer_editorname);

            if (editor_textarea) {
                var iframes = editor_textarea.parentNode.getElementsByTagName('iframe');

                if ( ! iframes.length) {
                    $('.reglab-overlay').css('cursor', '').fadeOut();
                    return;
                }

                var editor_frame  = iframes[0];
                var contentWindow = editor_frame.contentWindow;
                var selection     = '';

                if (typeof contentWindow.getSelection !== 'undefined') {
                    var sel = contentWindow.getSelection();
                    if (sel.rangeCount) {
                        var container = contentWindow.document.createElement("div");
                        for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                            container.appendChild(sel.getRangeAt(i).cloneContents());
                        }
                        selection = container.innerHTML;
                    }
                } else if (typeof contentWindow.document.selection !== 'undefined') {
                    if (contentWindow.document.selection.type == "Text") {
                        selection = contentWindow.document.selection.createRange().htmlText;
                    }
                }

                string = this.cleanRange(selection);
            }

            if ( ! string) {
                $('.reglab-overlay').css('cursor', '').fadeOut();
                return;
            }

            // Handle indentation
            string = string.replace(/^\t/gm, '    ');

            this.setAttributes(string);
            var code = this.removeSourceTags(string);

            $editor.setValue(code);

            $('.reglab-overlay').css('cursor', '').fadeOut();
        },

        insertText: function() {
            var t_word  = sourcerer_syntax_word;
            var t_start = sourcerer_tag_characters[0];
            var t_end   = sourcerer_tag_characters[1];

            var code = $editor.getValue();
            code     = this.removeSourceTags(code);

            var pre_php = [];
            var codes   = [];


            if (code) {
                codes.push(code);
            }

            string = codes.join('\n');


            // convert to html entities
            string = this.htmlentities(string, 'ENT_NOQUOTES');

            // replace indentation with tab images
            string = string.indent2Images();

            // replace linebreaks with br tags
            string = string.nl2br();

            var attributes = [];

            if ($form['raw'].value == '1') {
                attributes.push('raw="true"');
            }

            if ($form['trim'].value == '1') {
                attributes.push('trim="true"');
            }


            if (string) {
                string = '<span style="font-family: courier new, courier, monospace;">'
                    + string
                    + '</span>';
            }

            string = t_start + (t_word + ' ' + attributes.join(' ')).trim() + t_end
                + string
                + t_start + '/' + t_word + t_end;

            window.parent.jInsertEditorText(string, sourcerer_editorname);

            return true;
        },

        setAttributes: function(string) {
            var t_word  = sourcerer_syntax_word;
            var t_start = sourcerer_tag_characters[0];
            var t_end   = sourcerer_tag_characters[1];

            var start_tag = this.preg_quote(t_start + t_word) + '( .*?)' + this.preg_quote(t_end);
            var regex     = new RegExp(start_tag, 'gim');

            if ( ! string.match(regex)) {
                return;
            }

            var attributes = this.getAttributes(regex.exec(string)[1].trim());

            if ('raw' in attributes) {
                this.setRadioOption('raw', attributes.raw.toString().toBoolean());
            }
            if ('trim' in attributes) {
                this.setRadioOption('trim', attributes.trim.toString().toBoolean());
            }
        },

        setPhpField: function(value, method) {
            this.setField('php_file', value);
            this.setSelectOption('php_include_method', method);
        },

        getAttributes: function(string) {
            var attributes = {};

            var t_word  = sourcerer_syntax_word;
            var t_start = sourcerer_tag_characters[0];
            var t_end   = sourcerer_tag_characters[1];

            var regex = new RegExp('^0 ?');
            if (string.match(regex)) {
                attributes.raw = true;
                string         = string.replace(/^0/, '').trim();
            }

            var start_tag = this.preg_quote(t_start + t_word) + '( .*?)' + this.preg_quote(t_end);
            var regex     = new RegExp('([a-z_-]+)="([^"]*)"', 'gim');

            if ( ! string.match(regex)) {
                return attributes;
            }

            while (match = regex.exec(string)) {
                attributes[match[1]] = match[2];
            }

            return attributes;
        },

        removeSourceTags: function(string) {
            var t_word  = sourcerer_syntax_word;
            var t_start = sourcerer_tag_characters[0];
            var t_end   = sourcerer_tag_characters[1];

            var start_tag = this.preg_quote(t_start + t_word) + '.*?' + this.preg_quote(t_end);
            var end_tag   = this.preg_quote(t_start + '/' + t_word + t_end);

            var regex = new RegExp('(' + start_tag + ')\\s*', 'gim');
            start_tag = t_start + t_word + t_end;
            if (string.match(regex)) {
                start_tag = regex.exec(string)[1];
                string    = string.replace(regex, '');
            }

            regex   = new RegExp('\\s*' + end_tag, 'gim');
            end_tag = t_start + '/' + t_word + t_end;
            string  = string.replace(regex, '');

            return string.trim();
        },

        cleanRange: function(string) {
            var regex = new RegExp('[\n\r]', 'gim');
            string    = string.replace(regex, '');
            regex     = new RegExp('(</p><p>|<p>|</p>|<br>|<br>)', 'gim');
            string    = string.replace(regex, '\n');
            string    = string.replace(/^\s+/, '').replace(/\s+$/, '');
            regex     = new RegExp('<img[^>]*src="[^"]*/tab.png"[^>]*>', 'gim');
            string    = string.replace(regex, '\t');
            regex     = new RegExp('</?[^>]*>', 'gim');
            string    = string.replace(regex, '');
            regex     = new RegExp('(&nbsp;|&#160;)', 'gim');
            string    = string.replace(regex, ' ');
            regex     = new RegExp('&lt;', 'gim');
            string    = string.replace(regex, '<');
            regex     = new RegExp('&gt;', 'gim');
            string    = string.replace(regex, '>');
            regex     = new RegExp('&amp;', 'gim');
            string    = string.replace(regex, '&');
            return string;
        },

        htmlentities: function(string, quote_style) {
            tmp_str = string.toString();

            if (false === (histogram = this.get_html_translation_table('HTML_ENTITIES', quote_style))) {
                return false;
            }

            for (symbol in histogram) {
                entity  = histogram[symbol];
                tmp_str = tmp_str.split(symbol).join(entity);
            }

            return tmp_str;
        },

        get_html_translation_table: function(table, quote_style) {
            var entities          = {}, histogram = {}, decimal = 0, symbol = '';
            var constMappingTable = {}, constMappingQuoteStyle = {};
            var useTable          = {}, useQuoteStyle = {};

            // Translate arguments
            constMappingTable[0]      = 'HTML_SPECIALCHARS';
            constMappingTable[1]      = 'HTML_ENTITIES';
            constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
            constMappingQuoteStyle[2] = 'ENT_COMPAT';
            constMappingQuoteStyle[3] = 'ENT_QUOTES';

            useTable      = ! isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
            useQuoteStyle = ! isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';

            if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
                throw Error('Table: ' + useTable + ' not supported');
                // return false;
            }

            // ascii decimals for better compatibility
            entities['38'] = '&amp;';
            if (useQuoteStyle !== 'ENT_NOQUOTES') {
                entities['34'] = '&quot;';
            }
            if (useQuoteStyle === 'ENT_QUOTES') {
                entities['39'] = '&#039;';
            }
            entities['60'] = '&lt;';
            entities['62'] = '&gt;';

            if (useTable === 'HTML_ENTITIES') {
                entities['160'] = '&nbsp;';
                entities['161'] = '&iexcl;';
                entities['162'] = '&cent;';
                entities['163'] = '&pound;';
                entities['164'] = '&curren;';
                entities['165'] = '&yen;';
                entities['166'] = '&brvbar;';
                entities['167'] = '&sect;';
                entities['168'] = '&uml;';
                entities['169'] = '&copy;';
                entities['170'] = '&ordf;';
                entities['171'] = '&laquo;';
                entities['172'] = '&not;';
                entities['173'] = '&shy;';
                entities['174'] = '&reg;';
                entities['175'] = '&macr;';
                entities['176'] = '&deg;';
                entities['177'] = '&plusmn;';
                entities['178'] = '&sup2;';
                entities['179'] = '&sup3;';
                entities['180'] = '&acute;';
                entities['181'] = '&micro;';
                entities['182'] = '&para;';
                entities['183'] = '&middot;';
                entities['184'] = '&cedil;';
                entities['185'] = '&sup1;';
                entities['186'] = '&ordm;';
                entities['187'] = '&raquo;';
                entities['188'] = '&frac14;';
                entities['189'] = '&frac12;';
                entities['190'] = '&frac34;';
                entities['191'] = '&iquest;';
                entities['192'] = '&Agrave;';
                entities['193'] = '&Aacute;';
                entities['194'] = '&Acirc;';
                entities['195'] = '&Atilde;';
                entities['196'] = '&Auml;';
                entities['197'] = '&Aring;';
                entities['198'] = '&AElig;';
                entities['199'] = '&Ccedil;';
                entities['200'] = '&Egrave;';
                entities['201'] = '&Eacute;';
                entities['202'] = '&Ecirc;';
                entities['203'] = '&Euml;';
                entities['204'] = '&Igrave;';
                entities['205'] = '&Iacute;';
                entities['206'] = '&Icirc;';
                entities['207'] = '&Iuml;';
                entities['208'] = '&ETH;';
                entities['209'] = '&Ntilde;';
                entities['210'] = '&Ograve;';
                entities['211'] = '&Oacute;';
                entities['212'] = '&Ocirc;';
                entities['213'] = '&Otilde;';
                entities['214'] = '&Ouml;';
                entities['215'] = '&times;';
                entities['216'] = '&Oslash;';
                entities['217'] = '&Ugrave;';
                entities['218'] = '&Uacute;';
                entities['219'] = '&Ucirc;';
                entities['220'] = '&Uuml;';
                entities['221'] = '&Yacute;';
                entities['222'] = '&THORN;';
                entities['223'] = '&szlig;';
                entities['224'] = '&agrave;';
                entities['225'] = '&aacute;';
                entities['226'] = '&acirc;';
                entities['227'] = '&atilde;';
                entities['228'] = '&auml;';
                entities['229'] = '&aring;';
                entities['230'] = '&aelig;';
                entities['231'] = '&ccedil;';
                entities['232'] = '&egrave;';
                entities['233'] = '&eacute;';
                entities['234'] = '&ecirc;';
                entities['235'] = '&euml;';
                entities['236'] = '&igrave;';
                entities['237'] = '&iacute;';
                entities['238'] = '&icirc;';
                entities['239'] = '&iuml;';
                entities['240'] = '&eth;';
                entities['241'] = '&ntilde;';
                entities['242'] = '&ograve;';
                entities['243'] = '&oacute;';
                entities['244'] = '&ocirc;';
                entities['245'] = '&otilde;';
                entities['246'] = '&ouml;';
                entities['247'] = '&divide;';
                entities['248'] = '&oslash;';
                entities['249'] = '&ugrave;';
                entities['250'] = '&uacute;';
                entities['251'] = '&ucirc;';
                entities['252'] = '&uuml;';
                entities['253'] = '&yacute;';
                entities['254'] = '&thorn;';
                entities['255'] = '&yuml;';
            }

            // ascii decimals to real symbols
            for (decimal in entities) {
                symbol            = String.fromCharCode(decimal);
                histogram[symbol] = entities[decimal];
            }

            return histogram;
        },

        preg_quote: function(str) {
            return (str + '').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!<>\|\:])/g, '\\$1');
        },

        setField: function(name, value) {
            $('input[name="' + name + '"]').val(value);
        },

        setRadioOption: function(name, value) {
            var inputs = $('input[name="' + name + '"]');
            var input  = $('input[name="' + name + '"][value="' + value + '"]');

            $('label[for="' + input.attr('id') + '"]').click();
            inputs.attr('checked', false);
            input.attr('checked', true).click();
        },

        setSelectOption: function(name, value) {
            var self = this;

            var select = $('select[name="' + name + '"]');
            var option = $('select[name="' + name + '"] option[value="' + value + '"]');

            if ( ! option.length) {
                return;
            }

            select.find('option').attr('selected', false);
            option.attr('selected', 'selected');
            select.trigger('liszt:updated');
        }
    };

    String.prototype.ltrim         = function() {
        return this.fixLineBreaks().replace(/^[\n ]*/, "");
    };
    String.prototype.rtrim         = function() {
        return this.fixLineBreaks().replace(/[\n ]*$/, "");
    };
    String.prototype.trim          = function() {
        return this.fixLineBreaks().ltrim().rtrim();
    };
    String.prototype.toBoolean     = function() {
        return this == 1 || this == '1' || this == 'true' ? 1 : 0;
    };
    String.prototype.fixLineBreaks = function() {
        return this.replace(/\r/, "");
    };
    String.prototype.escapeQuotes  = function() {
        return this.replace(/'/g, '\\\'');
    };
    String.prototype.hasLineBreaks = function() {
        var regex = new RegExp('\n', 'gm');
        return regex.test(this);
    };
    String.prototype.indent        = function() {
        var regex = new RegExp('\n', 'gm');

        return '\n    ' + this.replace(regex, '\n    ') + '\n';
    };
    String.prototype.nl2br         = function() {
        var regex = new RegExp('\n', 'gm');

        return this.replace(regex, '<br>');
    };

    String.prototype.indent2Images = function() {
        var string = this;
        var regex  = new RegExp('((^|\n)(    |\t)*)(   ? ?|\t)', 'gm');

        while (regex.test(string)) {
            string = string.replace(regex, '$1<img src="' + sourcerer_root + '/media/sourcerer/images/tab.png">');
        }

        return string.replace(regex, '<br>');
    };

})(jQuery);