Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
media.js 26.56 KiB
/**
 * JavaScript functionalitiy for the media management popup
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 */
var media_manager = {
    keepopen: false,
    hide: false,
    align: false,
    popup: false,
    id: false,
    display: false,
    link: false,
    size: false,
    ext: false,

    /**
     * Attach event handlers to all "folders" below the given element
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    treeattach: function(obj){
        if(!obj) return;

        var items = obj.getElementsByTagName('li');
        for(var i=0; i<items.length; i++){
            var elem = items[i];

            // attach action to make the +/- clickable
            var clicky = elem.getElementsByTagName('img')[0];
            clicky.style.cursor = 'pointer';
            addEvent(clicky,'click',function(event){ return media_manager.toggle(event,this); });

            // attach action load folder list via AJAX
            var link = elem.getElementsByTagName('a')[0];
            link.style.cursor = 'pointer';
            addEvent(link,'click',function(event){ return media_manager.list(event,this); });
        }
    },

    /**
     * Attach the image selector action to all links below the given element
     * also add the action to autofill the "upload as" field
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    selectorattach: function(obj){
        if(!obj) return;

        var items = getElementsByClass('select',obj,'a');
        for(var i=0; i<items.length; i++){
            var elem = items[i];
            elem.style.cursor = 'pointer';
            addEvent(elem,'click',function(event){ return media_manager.select(event,this); });
        }

        // hide syntax example
        items = getElementsByClass('example',obj,'div');
        for(var i=0; i<items.length; i++){
            elem = items[i];
            elem.style.display = 'none';
        }

        var file = $('upload__file');
        if(!file) return;
        addEvent(file,'change',media_manager.suggest);
    },

    /**
     * Attach deletion confirmation dialog to the delete buttons.
     *
     * Michael Klier <chi@chimeric.de>
     */
    confirmattach: function(obj){
        if(!obj) return;

        items = getElementsByClass('btn_media_delete',obj,'a');
        for(var i=0; i<items.length; i++){
            var elem = items[i];
            addEvent(elem,'click',function(e){
                if(e.target.tagName == 'IMG'){
                    var name = e.target.parentNode.title;
                }else{
                    var name = e.target.title;
                }
                if(!confirm(LANG['del_confirm'] + "\n" + name)) {
                    e.preventDefault();
                    return false;
                } else {
                    return true;
                }
            });
        }
    },

    /**
     * Creates checkboxes for additional options
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    attachoptions: function(obj){
        if(!obj) return;

        // keep open
        if(opener){
            var kobox  = document.createElement('input');
            kobox.type = 'checkbox';
            kobox.id   = 'media__keepopen';
            if(DokuCookie.getValue('keepopen')){
                kobox.checked  = true;
                kobox.defaultChecked = true; //IE wants this
                media_manager.keepopen = true;
            }
            addEvent(kobox,'click',function(event){ return media_manager.togglekeepopen(event,this); });

            var kolbl  = document.createElement('label');
            kolbl.htmlFor   = 'media__keepopen';
            kolbl.innerHTML = LANG['keepopen'];

            var kobr = document.createElement('br');

            obj.appendChild(kobox);
            obj.appendChild(kolbl);
            obj.appendChild(kobr);
        }

        // hide details
        var hdbox  = document.createElement('input');
        hdbox.type = 'checkbox';
        hdbox.id   = 'media__hide';
        if(DokuCookie.getValue('hide')){
            hdbox.checked = true;
            hdbox.defaultChecked = true; //IE wants this
            media_manager.hide    = true;
        }
        addEvent(hdbox,'click',function(event){ return media_manager.togglehide(event,this); });

        var hdlbl  = document.createElement('label');
        hdlbl.htmlFor   = 'media__hide';
        hdlbl.innerHTML = LANG['hidedetails'];

        var hdbr = document.createElement('br');

        obj.appendChild(hdbox);
        obj.appendChild(hdlbl);
        obj.appendChild(hdbr);
        media_manager.updatehide();
    },

    /**
     * Opens the searchfield
     *
     * @author Tobias Sarnowski <sarnowski@cosmocode.de>
     */
    showsearchfield: function(event,link){
        // prepare an AJAX call to fetch the search
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        cleanMsgArea();

        var content = $('media__content');
        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';

        ajax.elementObj = content;
        ajax.afterCompletion = function(){
            media_manager.selectorattach(content);
            media_manager.confirmattach(content);
            media_manager.updatehide();
        };
        ajax.runAJAX(link.search.substr(1)+'&call=mediasearchlist');
        return false;
    },

    /**
     * Toggles the keep open state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    togglekeepopen: function(event,cb){
        if(cb.checked){
            DokuCookie.setValue('keepopen',1);
            media_manager.keepopen = true;
        }else{
            DokuCookie.setValue('keepopen','');
            media_manager.keepopen = false;
        }
    },

    /**
     * Toggles the hide details state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    togglehide: function(event,cb){
        if(cb.checked){
            DokuCookie.setValue('hide',1);
            media_manager.hide = true;
        }else{
            DokuCookie.setValue('hide','');
            media_manager.hide = false;
        }
        media_manager.updatehide();
    },

    /**
     * Sets the visibility of the image details accordingly to the
     * chosen hide state
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    updatehide: function(){
        var obj = $('media__content');
        if(!obj) return;
        var details = getElementsByClass('detail',obj,'div');
        for(var i=0; i<details.length; i++){
            if(media_manager.hide){
                details[i].style.display = 'none';
            }else{
                details[i].style.display = '';
            }
        }
    },

    /**
     * shows the popup for a image link
     */
    select: function(event,link){
        var id = link.name.substr(2);

        media_manager.id = id;
        if(!opener){
            // if we don't run in popup display example
            var ex = $('ex_'+id.replace(/:/g,'_'));
            if(ex.style.display == ''){
                ex.style.display = 'none';
            } else {
                ex.style.display = '';
            }
            return false;
        }

        media_manager.ext = false;
        var dot = id.lastIndexOf(".");
        if (dot != -1) {
            var ext = id.substr(dot,id.length);

            if (ext != '.jpg' && ext != '.jpeg' && ext != '.png' && ext != '.gif' && ext != '.swf') {
                media_manager.insert(null);
                return false;
            }
        } else {
            media_manager.insert(null);
            return false;
        }

        media_manager.popup.style.display = 'inline';
        media_manager.popup.style.left = event.pageX + 'px';
        media_manager.popup.style.top = event.pageY + 'px';

        // set all buttons to outset
        media_manager.outSet('media__linkbtn1');
        media_manager.outSet('media__linkbtn2');
        media_manager.outSet('media__linkbtn3');
        media_manager.outSet('media__linkbtn4');

        media_manager.outSet('media__alignbtn0');
        media_manager.outSet('media__alignbtn1');
        media_manager.outSet('media__alignbtn2');
        media_manager.outSet('media__alignbtn3');

        media_manager.outSet('media__sizebtn1');
        media_manager.outSet('media__sizebtn2');
        media_manager.outSet('media__sizebtn3');
        media_manager.outSet('media__sizebtn4');


        if (ext == '.swf') {
            media_manager.ext = 'swf';

            // disable display buttons for detail and linked image
            $('media__linkbtn1').style.display = 'none';
            $('media__linkbtn2').style.display = 'none';

            // set the link button to default
            if (media_manager.link != false) {
                if ( media_manager.link == '2' || media_manager.link == '1')  {
                    media_manager.inSet('media__linkbtn3');
                    media_manager.link = '3';
                    DokuCookie.setValue('link','3');
                } else {
                    media_manager.inSet('media__linkbtn'+media_manager.link);
                }
            } else if (DokuCookie.getValue('link')) {
                if ( DokuCookie.getValue('link') == '2' ||  DokuCookie.getValue('link') == '1')  {
                    // this options are not availible
                    media_manager.inSet('media__linkbtn3');
                    media_manager.link = '3';
                    DokuCookie.setValue('link','3');
                } else {
                    media_manager.inSet('media__linkbtn'+DokuCookie.getValue('link'));
                    media_manager.link = DokuCookie.getValue('link');
                }
            } else {
                // default case
                media_manager.link = '3';
                media_manager.inSet('media__linkbtn3');
                DokuCookie.setValue('link','3');
            }

        } else {
            media_manager.ext = 'img';

            // ensure that the display buttens are there
            $('media__linkbtn1').style.display = 'inline';
            $('media__linkbtn2').style.display = 'inline';

            // set the link button to default
            if (media_manager.link != false) {
                media_manager.inSet('media__linkbtn'+media_manager.link);
            } else if (DokuCookie.getValue('link')) {
                media_manager.inSet('media__linkbtn'+DokuCookie.getValue('link'));
                media_manager.link = DokuCookie.getValue('link');
            } else {
                // default case
                media_manager.link = '1';
                media_manager.inSet('media__linkbtn1');
                DokuCookie.setValue('link','1');
            }
        }

        if (media_manager.link == '4') {
            media_manager.align = false;
            media_manager.size = false;
            $('media__align').style.display = 'none';
            $('media__size').style.display = 'none';
        } else {
            $('media__align').style.display = 'block';
            $('media__size').style.display = 'block';

            // set the align button to default
            if (media_manager.align != false) {
                media_manager.inSet('media__alignbtn'+media_manager.align);
            } else if (DokuCookie.getValue('align')) {
                media_manager.inSet('media__alignbtn'+DokuCookie.getValue('align'));
                media_manager.align = DokuCookie.getValue('align');
            } else {
                // default case
                media_manager.align = '0';
                media_manager.inSet('media__alignbtn0');
                DokuCookie.setValue('align','0');
            }

            // set the size button to default
            if (media_manager.size != false) {
                media_manager.inSet('media__sizebtn'+media_manager.size);
            } else if (DokuCookie.getValue('size')) {
                media_manager.inSet('media__sizebtn'+DokuCookie.getValue('size'));
                media_manager.size = DokuCookie.getValue('size');
            } else {
                // default case
                media_manager.size = '2';
                media_manager.inSet('media__sizebtn2');
                DokuCookie.setValue('size','2');
            }


            $('media__sendbtn').focus();
        }

       return false;
    },

    /**
     * build the popup window
     *
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    initpopup: function() {

        media_manager.popup = document.createElement('div');
        media_manager.popup.setAttribute('id','media__popup');

        var root = document.getElementById('media__manager');
        if (root == null) return;
        root.appendChild(media_manager.popup);

        var headline    = document.createElement('h1');
        headline.innerHTML = LANG.mediatitle;
        var headlineimg = document.createElement('img');
        headlineimg.src = DOKU_BASE + 'lib/images/close.png';
        headlineimg.id  = 'media__closeimg';
        addEvent(headlineimg,'click',function(event){ return media_manager.closePopup(event,this); });
        headline.insertBefore(headlineimg, headline.firstChild);
        media_manager.popup.appendChild(headline);
        drag.attach(media_manager.popup,headline);

        // link

        var linkp = document.createElement('p');

        linkp.id = "media__linkstyle";
        if (media_manager.display == "2") {
            linkp.style.display = "none";
        }

        var linkl = document.createElement('label');
        linkl.innerHTML = LANG.mediatarget;
        linkp.appendChild(linkl);

        var linkbtns = ['lnk', 'direct', 'nolnk', 'displaylnk'];
        for (var i = 0 ; i < linkbtns.length ; ++i) {
            var linkbtn = document.createElement('button');
            linkbtn.className = 'button';
            linkbtn.value = i + 1;
            linkbtn.id    = "media__linkbtn" + (i + 1);
            linkbtn.title = LANG['media' + linkbtns[i]];
            linkbtn.style.borderStyle = 'outset';
            addEvent(linkbtn,'click',function(event){ return media_manager.setlink(event,this); });

            var linkimg = document.createElement('img');
            linkimg.src = DOKU_BASE + 'lib/images/media_link_' + linkbtns[i] + '.png';

            linkbtn.appendChild(linkimg);
            linkp.appendChild(linkbtn);
        }

        media_manager.popup.appendChild(linkp);

        // align

        var alignp    = document.createElement('p');
        var alignl    = document.createElement('label');

        alignp.appendChild(alignl);
        alignp.id = 'media__align';
        if (media_manager.display == "2") {
            alignp.style.display = "none";
        }
        alignl.innerHTML = LANG['mediaalign'];

        var alignbtns = ['noalign', 'left', 'center', 'right'];
        for (var n = 0 ; n < alignbtns.length ; ++n) {
            var alignbtn = document.createElement('button');
            var alignimg = document.createElement('img');
            alignimg.src = DOKU_BASE + 'lib/images/media_align_' + alignbtns[n] + '.png';

            alignbtn.id    = "media__alignbtn" + n;
            alignbtn.value = n;
            alignbtn.title = LANG['media' + alignbtns[n]];
            alignbtn.className = 'button';
            alignbtn.appendChild(alignimg);
            alignbtn.style.borderStyle = 'outset';
            addEvent(alignbtn,'click',function(event){ return media_manager.setalign(event,this); });

            alignp.appendChild(alignbtn);
        }

        media_manager.popup.appendChild(alignp);

        // size

        var sizep    = document.createElement('p');
        var sizel    = document.createElement('label');

        sizep.id = 'media__size';
        if (media_manager.display == "2") {
            sizep.style.display = "none";
        }
        sizep.appendChild(sizel);
        sizel.innerHTML = LANG['mediasize'];

        var sizebtns = ['small', 'medium', 'large', 'original'];
        for (var size = 0 ; size < sizebtns.length ; ++size) {
            var sizebtn = document.createElement('button');
            var sizeimg = document.createElement('img');

            sizep.appendChild(sizebtn);
            sizeimg.src = DOKU_BASE + 'lib/images/media_size_' + sizebtns[size] + '.png';

            sizebtn.className = 'button';
            sizebtn.appendChild(sizeimg);
            sizebtn.value = size + 1;
            sizebtn.id    = 'media__sizebtn' + (size + 1);
            sizebtn.title = LANG['media' + sizebtns[size]];
            sizebtn.style.borderStyle = 'outset';
            addEvent(sizebtn,'click',function(event){ return media_manager.setsize(event,this); });
        }

        media_manager.popup.appendChild(sizep);

        // send and close button

        var btnp = document.createElement('p');
        media_manager.popup.appendChild(btnp);
        btnp.setAttribute('class','btnlbl');

        var cls = document.createElement('input');
        cls.type  = 'button';
        cls.setAttribute('class','button');
        cls.value = LANG['mediaclose'];
        btnp.appendChild(cls);
        addEvent(cls,'click',function(event){ return media_manager.closePopup(event,this); });

        var btn  = document.createElement('input');
        btn.type = 'button';
        btn.id   = 'media__sendbtn';
        btn.setAttribute('class','button');
        btn.value = LANG['mediainsert'];
        btnp.appendChild(btn);
        addEvent(btn,'click',function(event){ return media_manager.insert(event); });
    },

    /**
     * Insert the clicked image into the opener's textarea
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    insert: function(event){
        var id = media_manager.id;
        // set syntax options
        $('media__popup').style.display = 'none';

        var opts       = '';
        var optsstart  = '';
        var alignleft  = '';
        var alignright = '';

        if (media_manager.ext == 'img' || media_manager.ext == 'swf') {

            if (media_manager.link == '4') {
                    opts = '?linkonly';
            } else {

                if (media_manager.link == "3" && media_manager.ext == 'img') {
                    opts = '?nolink';
                    optsstart = true;
                } else if (media_manager.link == "2" && media_manager.ext == 'img') {
                    opts = '?direct';
                    optsstart = true;
                }

                var s = parseInt(media_manager.size);

                if (s && s >= 1) {
                    opts += (optsstart)?'&':'?';
                    if (s=="1") {
                        opts += '100';
                        if (media_manager.ext == 'swf') {
                            opts += 'x62';
                        }
                    } else if (s=="2") {
                        opts += '200';
                        if (media_manager.ext == 'swf') {
                            opts += 'x123';
                        }
                    } else if (s=="3"){
                        opts += '300';
                        if (media_manager.ext == 'swf') {
                            opts += 'x185';
                        }
                    } else if (s=="4") {
                        opts += '400';
                        if (media_manager.ext == 'swf') {
                            opts += 'x247';
                        }
                    }
                }
                if (media_manager.align == '1') {
                    alignleft = '';
                    alignright = ' ';
                }
                if (media_manager.align == '2') {
                    alignleft = ' ';
                    alignright = ' ';
                }
                if (media_manager.align == '3') {
                    alignleft = ' ';
                    alignright = '';
                }
            }
        }
        opener.insertTags('wiki__text','{{'+alignleft+id+opts+alignright+'|','}}','');

        if(!media_manager.keepopen) window.close();
        opener.focus();
        return false;
    },

    /**
     * list the content of a namespace using AJAX
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    list: function(event,link){
        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        cleanMsgArea();

        var content = $('media__content');
        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';

        ajax.elementObj = content;
        ajax.afterCompletion = function(){
            media_manager.selectorattach(content);
            media_manager.confirmattach(content);
            media_manager.updatehide();
            media_manager.initFlashUpload();
        };
        ajax.runAJAX(link.search.substr(1)+'&call=medialist');
        return false;
    },


    /**
     * Open or close a subtree using AJAX
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    toggle: function(event,clicky){
        var listitem = clicky.parentNode;

        // if already open, close by removing the sublist
        var sublists = listitem.getElementsByTagName('ul');
        if(sublists.length){
            listitem.removeChild(sublists[0]);
            clicky.src = DOKU_BASE+'lib/images/plus.gif';
            return false;
        }

        // get the enclosed link (is always the first one)
        var link = listitem.getElementsByTagName('a')[0];

        // prepare an AJAX call to fetch the subtree
        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
        ajax.AjaxFailedAlert = '';
        ajax.encodeURIString = false;
        if(ajax.failed) return true;

        //prepare the new ul
        var ul = document.createElement('ul');
        //fixme add classname here
        listitem.appendChild(ul);
        ajax.elementObj = ul;
        ajax.afterCompletion = function(){ media_manager.treeattach(ul); };
        ajax.runAJAX(link.search.substr(1)+'&call=medians');
        clicky.src = DOKU_BASE+'lib/images/minus.gif';
        return false;
    },

    /**
     * Prefills the wikiname.
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     */
    suggest: function(){
        var file = $('upload__file');
        var name = $('upload__name');
        if(!file || !name) return;

        var text = file.value;
        text = text.substr(text.lastIndexOf('/')+1);
        text = text.substr(text.lastIndexOf('\\')+1);
        name.value = text;
    },


    initFlashUpload: function(){
        if(!hasFlash(8)) return;
        var oform  = $('dw__upload');
        var oflash = $('dw__flashupload');
        if(!oform || !oflash) return;

        var clicky = document.createElement('img');
        clicky.src     = DOKU_BASE+'lib/images/multiupload.png';
        clicky.title   = LANG['mu_btn'];
        clicky.alt     = LANG['mu_btn'];
        clicky.style.cursor = 'pointer';
        clicky.onclick = function(){
                            oform.style.display  = 'none';
                            oflash.style.display = '';
                         };
        oform.appendChild(clicky);
    },

    /**
     * closes the link type popup
     */
    closePopup: function(event) {
        $('media__popup').style.display = 'none';
    },

    /**
     * set the align
     *
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    setalign: function(event,cb){
        if(cb.value){
            DokuCookie.setValue('align',cb.value);
            media_manager.align = cb.value;
            media_manager.outSet("media__alignbtn0");
            media_manager.outSet("media__alignbtn1");
            media_manager.outSet("media__alignbtn2");
            media_manager.outSet("media__alignbtn3");
            media_manager.inSet("media__alignbtn"+cb.value);
        }else{
            DokuCookie.setValue('align','');
            media_manager.align = false;
        }
    },
    /**
     * set the link type
     *
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    setlink: function(event,cb){
        if(cb.value){
            DokuCookie.setValue('link',cb.value);
            media_manager.link = cb.value;
            media_manager.outSet("media__linkbtn1");
            media_manager.outSet("media__linkbtn2");
            media_manager.outSet("media__linkbtn3");
            media_manager.outSet("media__linkbtn4");
            media_manager.inSet("media__linkbtn"+cb.value);
            var size = document.getElementById("media__size");
            var align = document.getElementById("media__align");
            if (cb.value != '4') {
                size.style.display  = "block";
                align.style.display = "block";
            } else {
                size.style.display  = "none";
                align.style.display = "none";
            }
        }else{
            DokuCookie.setValue('link','');
            media_manager.link = false;
        }
    },

    /**
     * set the display type
     *
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    setdisplay: function(event,cb){
        if(cb.value){
            DokuCookie.setValue('display',cb.value);
            media_manager.display = cb.value;
            media_manager.outSet("media__displaybtn1");
            media_manager.outSet("media__displaybtn2");
            media_manager.inSet("media__displaybtn"+cb.value);

        }else{
            DokuCookie.setValue('display','');
            media_manager.align = false;
        }
    },

    /**
     * sets the border to outset
     */
    outSet: function(id) {
        var ele = document.getElementById(id);
        if (ele == null) return;
        ele.style.borderStyle = "outset";
    },
    /**
     * sets the border to inset
     */
    inSet: function(id) {
        var ele = document.getElementById(id);
        if (ele == null) return;
        ele.style.borderStyle = "inset";
    },

    /**
     * set the image size
     *
     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
     */
    setsize: function(event,cb){
        if (cb.value) {
            DokuCookie.setValue('size',cb.value);
            media_manager.size = cb.value;
            for (var i = 1 ; i <= 4 ; ++i) {
                media_manager.outSet("media__sizebtn" + i);
            }
            media_manager.inSet("media__sizebtn"+cb.value);
        } else {
            DokuCookie.setValue('size','');
            media_manager.width = false;
        }
    }
};

addInitEvent(function(){
    media_manager.treeattach($('media__tree'));
    media_manager.selectorattach($('media__content'));
    media_manager.confirmattach($('media__content'));
    media_manager.attachoptions($('media__opts'));
    media_manager.initpopup();
    media_manager.initFlashUpload();
});