camdub/Internships

View on GitHub
public/javascripts/tinyeditor/themes/advanced/js/image.js

Summary

Maintainability
F
3 days
Test Coverage
var ImageDialog = {
    preInit : function() {
        var url;

        tinyMCEPopup.requireLangPack();

        if (url = tinyMCEPopup.getParam("external_image_list_url"))
            document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
    },

    init : function() {
        var f = document.forms[0], ed = tinyMCEPopup.editor;

        // Setup browse button
        document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
        if (isVisible('srcbrowser'))
            document.getElementById('src').style.width = '180px';

        e = ed.selection.getNode();

        this.fillFileList('image_list', 'tinyMCEImageList');

        if (e.nodeName == 'IMG') {
            f.src.value = ed.dom.getAttrib(e, 'src');
            f.alt.value = ed.dom.getAttrib(e, 'alt');
            f.border.value = this.getAttrib(e, 'border');
            f.vspace.value = this.getAttrib(e, 'vspace');
            f.hspace.value = this.getAttrib(e, 'hspace');
            f.width.value = ed.dom.getAttrib(e, 'width');
            f.height.value = ed.dom.getAttrib(e, 'height');
            f.insert.value = ed.getLang('update');
            this.styleVal = ed.dom.getAttrib(e, 'style');
            selectByValue(f, 'image_list', f.src.value);
            selectByValue(f, 'align', this.getAttrib(e, 'align'));
            this.updateStyle();
        }
    },

    fillFileList : function(id, l) {
        var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;

        l = window[l];

        if (l && l.length > 0) {
            lst.options[lst.options.length] = new Option('', '');

            tinymce.each(l, function(o) {
                lst.options[lst.options.length] = new Option(o[0], o[1]);
            });
        } else
            dom.remove(dom.getParent(id, 'tr'));
    },

    update : function() {
        var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el;

        tinyMCEPopup.restoreSelection();

        if (f.src.value === '') {
            if (ed.selection.getNode().nodeName == 'IMG') {
                ed.dom.remove(ed.selection.getNode());
                ed.execCommand('mceRepaint');
            }

            tinyMCEPopup.close();
            return;
        }

        if (!ed.settings.inline_styles) {
            args = tinymce.extend(args, {
                vspace : nl.vspace.value,
                hspace : nl.hspace.value,
                border : nl.border.value,
                align : getSelectValue(f, 'align')
            });
        } else
            args.style = this.styleVal;

        tinymce.extend(args, {
            src : f.src.value.replace(/ /g, '%20'),
            alt : f.alt.value,
            width : f.width.value,
            height : f.height.value
        });

        el = ed.selection.getNode();

        if (el && el.nodeName == 'IMG') {
            ed.dom.setAttribs(el, args);
            tinyMCEPopup.editor.execCommand('mceRepaint');
            tinyMCEPopup.editor.focus();
        } else {
            ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});
            ed.dom.setAttribs('__mce_tmp', args);
            ed.dom.setAttrib('__mce_tmp', 'id', '');
            ed.undoManager.add();
        }

        tinyMCEPopup.close();
    },

    updateStyle : function() {
        var dom = tinyMCEPopup.dom, st, v, f = document.forms[0];

        if (tinyMCEPopup.editor.settings.inline_styles) {
            st = tinyMCEPopup.dom.parseStyle(this.styleVal);

            // Handle align
            v = getSelectValue(f, 'align');
            if (v) {
                if (v == 'left' || v == 'right') {
                    st['float'] = v;
                    delete st['vertical-align'];
                } else {
                    st['vertical-align'] = v;
                    delete st['float'];
                }
            } else {
                delete st['float'];
                delete st['vertical-align'];
            }

            // Handle border
            v = f.border.value;
            if (v || v == '0') {
                if (v == '0')
                    st['border'] = '0';
                else
                    st['border'] = v + 'px solid black';
            } else
                delete st['border'];

            // Handle hspace
            v = f.hspace.value;
            if (v) {
                delete st['margin'];
                st['margin-left'] = v + 'px';
                st['margin-right'] = v + 'px';
            } else {
                delete st['margin-left'];
                delete st['margin-right'];
            }

            // Handle vspace
            v = f.vspace.value;
            if (v) {
                delete st['margin'];
                st['margin-top'] = v + 'px';
                st['margin-bottom'] = v + 'px';
            } else {
                delete st['margin-top'];
                delete st['margin-bottom'];
            }

            // Merge
            st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img');
            this.styleVal = dom.serializeStyle(st, 'img');
        }
    },

    getAttrib : function(e, at) {
        var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;

        if (ed.settings.inline_styles) {
            switch (at) {
                case 'align':
                    if (v = dom.getStyle(e, 'float'))
                        return v;

                    if (v = dom.getStyle(e, 'vertical-align'))
                        return v;

                    break;

                case 'hspace':
                    v = dom.getStyle(e, 'margin-left')
                    v2 = dom.getStyle(e, 'margin-right');
                    if (v && v == v2)
                        return parseInt(v.replace(/[^0-9]/g, ''));

                    break;

                case 'vspace':
                    v = dom.getStyle(e, 'margin-top')
                    v2 = dom.getStyle(e, 'margin-bottom');
                    if (v && v == v2)
                        return parseInt(v.replace(/[^0-9]/g, ''));

                    break;

                case 'border':
                    v = 0;

                    tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
                        sv = dom.getStyle(e, 'border-' + sv + '-width');

                        // False or not the same as prev
                        if (!sv || (sv != v && v !== 0)) {
                            v = 0;
                            return false;
                        }

                        if (sv)
                            v = sv;
                    });

                    if (v)
                        return parseInt(v.replace(/[^0-9]/g, ''));

                    break;
            }
        }

        if (v = dom.getAttrib(e, at))
            return v;

        return '';
    },

    resetImageData : function() {
        var f = document.forms[0];

        f.width.value = f.height.value = "";    
    },

    updateImageData : function() {
        var f = document.forms[0], t = ImageDialog;

        if (f.width.value == "")
            f.width.value = t.preloadImg.width;

        if (f.height.value == "")
            f.height.value = t.preloadImg.height;
    },

    getImageData : function() {
        var f = document.forms[0];

        this.preloadImg = new Image();
        this.preloadImg.onload = this.updateImageData;
        this.preloadImg.onerror = this.resetImageData;
        this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value);
    }
};

ImageDialog.preInit();
tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);