var FoswikiImageDialog = {
    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>');
    },

    foswikiVars: null,

    getFoswikiVar: function(name) {
        if (this.foswikiVars == null) {
            var sets = tinyMCEPopup.getWindowArg("vars");
            this.foswikiVars = eval(sets);
        }
        return this.foswikiVars[name];
    },

    expandVariables: function(url) {
        this.getFoswikiVar(""); // make sure it's loaded
        for (var i in this.foswikiVars) {
            url = url.replace('%' + i + '%', this.foswikiVars[i], 'g');
        }
        return url;
    },

    foswikiURL: function(url) {
        url = this.expandVariables(url);
        if (url.indexOf('/') == -1) {
            var base = tinyMCEPopup.getWindowArg("attach_url");
            url = base + url;
        }
        return url;
    },

    init: function(ed) {
        var f = document.forms[0],
        nl = f.elements,
        ed = tinyMCEPopup.editor,
        dom = ed.dom,
        n = ed.selection.getNode();

        tinyMCEPopup.resizeToInnerSize();
        //this.fillFileList('src_list', 'tinyMCEImageList');
        //this.fillFileList('over_list', 'tinyMCEImageList');
        //this.fillFileList('out_list', 'tinyMCEImageList');
        this.fillAttachments(['src_list', 'over_list', 'out_list']);
        TinyMCE_EditableSelects.init();

        if (n.nodeName == 'IMG') {
            nl.src.value = dom.getAttrib(n, 'src');
            nl.width.value = dom.getAttrib(n, 'width');
            nl.height.value = dom.getAttrib(n, 'height');
            nl.alt.value = dom.getAttrib(n, 'alt');
            nl.title.value = dom.getAttrib(n, 'title');
            nl.vspace.value = this.getAttrib(n, 'vspace');
            nl.hspace.value = this.getAttrib(n, 'hspace');
            nl.border.value = this.getAttrib(n, 'border');
            selectByValue(f, 'align', this.getAttrib(n, 'align'));
            selectByValue(f, 'class_list',
                    dom.getAttrib(n, 'class'), true, true);
            nl.style.value = dom.getAttrib(n, 'style');
            nl.id.value = dom.getAttrib(n, 'id');
            nl.dir.value = dom.getAttrib(n, 'dir');
            nl.lang.value = dom.getAttrib(n, 'lang');
            nl.usemap.value = dom.getAttrib(n, 'usemap');
            nl.longdesc.value = dom.getAttrib(n, 'longdesc');
            nl.insert.value = ed.getLang('update');

            if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(
                dom.getAttrib(n, 'onmouseover'))) nl.onmouseoversrc.value = 
                    dom.getAttrib(n, 'onmouseover').replace(
                        /^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');

            if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(
                dom.getAttrib(n, 'onmouseout'))) nl.onmouseoutsrc.value = 
                    dom.getAttrib(n, 'onmouseout').replace(
                        /^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');

            if (ed.settings.inline_styles) {
                // Move attribs to styles
                if (dom.getAttrib(n, 'align')) this.updateStyle('align');

                if (dom.getAttrib(n, 'hspace')) this.updateStyle('hspace');

                if (dom.getAttrib(n, 'border')) this.updateStyle('border');

                if (dom.getAttrib(n, 'vspace')) this.updateStyle('vspace');
            }
        }

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

        // Setup browse button
        document.getElementById('onmouseoversrccontainer').innerHTML = 
            getBrowserHTML('overbrowser', 'onmouseoversrc', 
                    'image', 'theme_advanced_image');
        if (isVisible('overbrowser')) 
            document.getElementById('onmouseoversrc').style.width = '260px';

        // Setup browse button
        document.getElementById('onmouseoutsrccontainer').innerHTML = 
            getBrowserHTML('outbrowser', 'onmouseoutsrc', 
                    'image', 'theme_advanced_image');
        if (isVisible('outbrowser')) 
            document.getElementById('onmouseoutsrc').style.width = '260px';

        // If option enabled default contrain proportions to checked
        if (ed.getParam("advimage_constrain_proportions", true)) 
            f.constrain.checked = true;

        // Check swap image if valid data
        if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) 
            this.setSwapImage(true);
        else this.setSwapImage(false);

        this.changeAppearance();
        this.showPreviewImage(nl.src.value, 1);
    },

    insert: function(file, title) {
        var ed = tinyMCEPopup.editor,
        t = this,
        f = document.forms[0];

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

            tinyMCEPopup.close();
            return;
        }

        t.insertAndClose();
    },

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

        tinyMCEPopup.restoreSelection();

        // Fixes crash in Safari
        if (tinymce.isWebKit) ed.getWin().focus();

        if (!ed.settings.inline_styles) {
            args = {
                vspace: nl.vspace.value,
                hspace: nl.hspace.value,
                border: nl.border.value,
                align: getSelectValue(f, 'align')
            };
        } else {
            // Remove deprecated values
            args = {
                vspace: '',
                hspace: '',
                border: '',
                align: ''
            };
        }

        tinymce.extend(args, {
            src: this.foswikiURL(nl.src.value),
            width: nl.width.value,
            height: nl.height.value,
            alt: nl.alt.value,
            title: nl.title.value,
            'class': getSelectValue(f, 'class_list'),
            style: nl.style.value,
            id: nl.id.value,
            dir: nl.dir.value,
            lang: nl.lang.value,
            usemap: nl.usemap.value,
            longdesc: nl.longdesc.value
        });

        args.onmouseover = args.onmouseout = '';

        if (f.onmousemovecheck.checked) {
            if (nl.onmouseoversrc.value) args.onmouseover = "this.src='" + 
                this.foswikiURL(nl.onmouseoversrc.value) + "';";

            if (nl.onmouseoutsrc.value) args.onmouseout = "this.src='" + 
                this.foswikiURL(nl.onmouseoutsrc.value) + "';";
        }

        el = ed.selection.getNode();

        if (el && el.nodeName == 'IMG') {
            ed.dom.setAttribs(el, args);
        } 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();
    },

    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 '';
    },

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

        f.onmousemovecheck.checked = st;
        setBrowserDisabled('overbrowser', !st);
        setBrowserDisabled('outbrowser', !st);

        if (f.over_list) f.over_list.disabled = !st;

        if (f.out_list) f.out_list.disabled = !st;

        f.onmouseoversrc.disabled = !st;
        f.onmouseoutsrc.disabled = !st;
    },

    fillFileList: function(id, l) {
        // SMELL: get this from the topic attachments
        var dom = tinyMCEPopup.dom,
        lst = dom.get(id),
        v,
        cl;

        l = window[l];
        lst.options.length = 0;

        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'));
    },

    fillAttachments: function(ids) {
        var lsts = new Array();
        for (var i = 0; i < ids.length; i++) {
            var lst = tinyMCEPopup.dom.get(ids[i]);
            lst.options.length = 0;
            lsts.push(lst);
        }
        FoswikiTiny.getListOfAttachments(
        function(atts) {
            var select = document.getElementById("attachments_select");
            for (var i = 0; i < atts.length; i++) {
                for (var j = 0; j < ids.length; j++) {
                    /* +1 so as not to overwrite existing null option
                         * defined in the static HTML. Item2412 */
                    lsts[j].options[i + 1] = 
                        new Option(atts[i].name, atts[i].name);
                }
            }
        });
    },

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

        f.elements.width.value = f.elements.height.value = '';
    },

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

        if (!st) {
            f.elements.width.value = img.width;
            f.elements.height.value = img.height;
        }

        this.preloadImg = img;
    },

    changeAppearance: function() {
        var ed = tinyMCEPopup.editor,
        f = document.forms[0],
        img = document.getElementById('alignSampleImg');

        if (img) {
            if (ed.getParam('inline_styles')) {
                ed.dom.setAttrib(img, 'style', f.style.value);
            } else {
                img.align = f.align.value;
                img.border = f.border.value;
                img.hspace = f.hspace.value;
                img.vspace = f.vspace.value;
            }
        }
    },

    changeHeight: function() {
        var f = document.forms[0],
        tp,
        t = this;

        if (!f.constrain.checked || !t.preloadImg) {
            return;
        }

        if (f.width.value == "" || f.height.value == "") return;

        tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * 
            t.preloadImg.height;
        f.height.value = tp.toFixed(0);
    },

    changeWidth: function() {
        var f = document.forms[0],
        tp,
        t = this;

        if (!f.constrain.checked || !t.preloadImg) {
            return;
        }

        if (f.width.value == "" || f.height.value == "") return;

        tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * 
            t.preloadImg.width;
        f.width.value = tp.toFixed(0);
    },

    updateStyle: function(ty) {
        var dom = tinyMCEPopup.dom,
        st, v, f = document.forms[0],
        img = dom.create('img', {
            style: dom.get('style').value
        });

        if (tinyMCEPopup.editor.settings.inline_styles) {
            // Handle align
            if (ty == 'align') {
                dom.setStyle(img, 'float', '');
                dom.setStyle(img, 'vertical-align', '');

                v = getSelectValue(f, 'align');
                if (v) {
                    if (v == 'left' || v == 'right') 
                        dom.setStyle(img, 'float', v);
                    else img.style.verticalAlign = v;
                }
            }

            // Handle border
            if (ty == 'border') {
                dom.setStyle(img, 'border', '');

                v = f.border.value;
                if (v || v == '0') {
                    if (v == '0') img.style.border = '0';
                    else img.style.border = v + 'px solid black';
                }
            }

            // Handle hspace
            if (ty == 'hspace') {
                dom.setStyle(img, 'marginLeft', '');
                dom.setStyle(img, 'marginRight', '');

                v = f.hspace.value;
                if (v) {
                    img.style.marginLeft = v + 'px';
                    img.style.marginRight = v + 'px';
                }
            }

            // Handle vspace
            if (ty == 'vspace') {
                dom.setStyle(img, 'marginTop', '');
                dom.setStyle(img, 'marginBottom', '');

                v = f.vspace.value;
                if (v) {
                    img.style.marginTop = v + 'px';
                    img.style.marginBottom = v + 'px';
                }
            }

            // Merge
            dom.get('style').value = 
                dom.serializeStyle(dom.parseStyle(img.style.cssText));
        }
    },

    changeMouseMove: function() {},

    showPreviewImage: function(u, st) {
        if (!u) {
            tinyMCEPopup.dom.setHTML('prev', '');
            return;
        }

        if (!st && tinyMCEPopup.getParam(
            "advimage_update_dimensions_onchange", true)) this.resetImageData();

        u = this.foswikiURL(u);

        u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u);

        if (!st) tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + 
'" border="0" onload="FoswikiImageDialog.updateImageData(this);" onerror="FoswikiImageDialog.resetImageData();" />');
        else tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u +
'" border="0" onload="FoswikiImageDialog.updateImageData(this, 1);" />');
    }
};

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