/**
 * @author Moxiecode
 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
 *
 * @author          ralf57
 * @author          luciorota (lucio.rota@gmail.com)
 * @author          dugris (dugris@frxoops.fr)
 * @version         $Id: xoopsimagemanager.js 2812 2009-02-17 01:44:02Z dugris $
 */

tinyMCEPopup.requireLangPack();

var XoopsimagemanagerDialog = {
    preInit : function()
    {
        var url;
        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(ed)
    {
        var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode();

        tinyMCEPopup.resizeToInnerSize();
        this.fillClassList('class_list');
        this.fillFileList('src_list', 'tinyMCEImageList');
        this.fillFileList('over_list', 'tinyMCEImageList');
        this.fillFileList('out_list', 'tinyMCEImageList');

        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'));
            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("xoopsimagemanager_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;
        }

        if (tinyMCEPopup.getParam("accessibility_warnings", 1)) {
            if (!f.alt.value) {
                tinyMCEPopup.editor.windowManager.confirm(tinyMCEPopup.getLang('xoopsimagemanager_dlg.missing_alt'), function(s) {
                    if (s)
                        t.insertAndClose();
                });

                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 : 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='" + nl.onmouseoversrc.value + "';";

            if (nl.onmouseoutsrc.value)
                args.onmouseout = "this.src='" + 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" src="javascript:;" />', {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;
    },

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

        if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
            cl = [];

            tinymce.each(v.split(';'), function(v) {
                var p = v.split('=');

                cl.push({'title' : p[0], 'class' : p[1]});
            });
        } else
            cl = tinyMCEPopup.editor.dom.getClasses();

        if (cl.length > 0) {
            lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');

            tinymce.each(cl, function(o) {
                lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
            });
        } else
            dom.remove(dom.getParent(id, 'tr'));
    },

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

    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 = '';
                    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("xoopsimagemanager_update_dimensions_onchange", true))
            this.resetImageData();

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

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

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

function XoopsImageBrowser( input ) {
    var url = "xoopsimagebrowser.php?target=src";
    var type = "image";
    var win = window.self;


    var cmsURL = window.location.href;      // script URL
    var cmsURL = cmsURL.substring( 0, cmsURL.lastIndexOf("/") + 1 );

    var searchString = window.location.search;  // possible parameters
    if (searchString.length < 1) {
        // add "?" to the URL to include parameters (in other words: create a search string because there wasn't one before)
        searchString = "?";
    }

    tinyMCE.activeEditor.windowManager.open({
        file : cmsURL + url + searchString + "&type=" + type,
        title : 'Xoops Image Manager',
        width : 650,
        height : 440,
        resizable : "yes",
        scrollbars : "yes",
        inline : "yes",  // This parameter only has an effect if you use the inlinepopups plugin!
        close_previous : "no"
    }, {
        window : win,
        input_src : input,
        input_title : "title",
        input_alt : "alt",
        input_align : "align"
    });
    return false;
}