xref: /dokuwiki/lib/scripts/media.js (revision 33225f5153fdf492cb988b63ff9a3d0ff92ec23d)
1/**
2 * JavaScript functionalitiy for the media management popup
3 *
4 * @author Andreas Gohr <andi@splitbrain.org>
5 */
6media = {
7    keepopen: false,
8    hide: false,
9
10    /**
11     * Attach event handlers to all "folders" below the given element
12     *
13     * @author Andreas Gohr <andi@splitbrain.org>
14     */
15    treeattach: function(obj){
16        if(!obj) return;
17
18        var items = obj.getElementsByTagName('li');
19        for(var i=0; i<items.length; i++){
20            var elem = items[i];
21
22            // attach action to make the +/- clickable
23            var clicky = elem.getElementsByTagName('img')[0];
24            clicky.style.cursor = 'pointer';
25            addEvent(clicky,'click',function(event){ return media.toggle(event,this); });
26
27            // attach action load folder list via AJAX
28            var link = elem.getElementsByTagName('a')[0];
29            link.style.cursor = 'pointer';
30            addEvent(link,'click',function(event){ return media.list(event,this); });
31        }
32    },
33
34    /**
35     * Attach the image selector action to all links below the given element
36     * also add the action to autofill the "upload as" field
37     *
38     * @author Andreas Gohr <andi@splitbrain.org>
39     */
40    selectorattach: function(obj){
41        if(!obj) return;
42
43        var items = getElementsByClass('select',obj,'a');
44        for(var i=0; i<items.length; i++){
45            var elem = items[i];
46            elem.style.cursor = 'pointer';
47            addEvent(elem,'click',function(event){ return media.select(event,this); });
48        }
49
50        // hide syntax example
51        items = getElementsByClass('example',obj,'div');
52        for(var i=0; i<items.length; i++){
53            elem = items[i];
54            elem.style.display = 'none';
55        }
56
57        var file = $('upload__file');
58        if(!file) return;
59        addEvent(file,'change',media.suggest);
60    },
61
62    /**
63     * Creates checkboxes for additional options
64     *
65     * @author Andreas Gohr <andi@splitbrain.org>
66     */
67    attachoptions: function(obj){
68        if(!obj) return;
69
70        // keep open
71        if(opener){
72            var kobox  = document.createElement('input');
73            kobox.type = 'checkbox';
74            kobox.id   = 'media__keepopen';
75            if(DokuCookie.getValue('keepopen')){
76                kobox.checked  = true;
77                media.keepopen = true;
78            }
79            addEvent(kobox,'change',function(event){ return media.togglekeepopen(event,this); });
80
81            var kolbl  = document.createElement('label');
82            kolbl.htmlFor   = 'media__keepopen';
83            kolbl.innerHTML = LANG['keepopen'];
84
85            var kobr = document.createElement('br');
86
87            obj.appendChild(kobox);
88            obj.appendChild(kolbl);
89            obj.appendChild(kobr);
90        }
91
92        // hide details
93        var hdbox  = document.createElement('input');
94        hdbox.type = 'checkbox';
95        hdbox.id   = 'media__hide';
96        if(DokuCookie.getValue('hide')){
97            hdbox.checked = true;
98            media.hide    = true;
99        }
100        addEvent(hdbox,'change',function(event){ return media.togglehide(event,this); });
101
102        var hdlbl  = document.createElement('label');
103        hdlbl.htmlFor   = 'media__hide';
104        hdlbl.innerHTML = LANG['hidedetails'];
105
106        var hdbr = document.createElement('br');
107
108        obj.appendChild(hdbox);
109        obj.appendChild(hdlbl);
110        obj.appendChild(hdbr);
111        media.updatehide();
112    },
113
114    /**
115     * Toggles the keep open state
116     *
117     * @author Andreas Gohr <andi@splitbrain.org>
118     */
119    togglekeepopen: function(event,cb){
120        if(cb.checked){
121            DokuCookie.setValue('keepopen',1);
122            media.keepopen = true;
123        }else{
124            DokuCookie.setValue('keepopen','');
125            media.keepopen = false;
126        }
127    },
128
129    /**
130     * Toggles the hide details state
131     *
132     * @author Andreas Gohr <andi@splitbrain.org>
133     */
134    togglehide: function(event,cb){
135        if(cb.checked){
136            DokuCookie.setValue('hide',1);
137            media.hide = true;
138        }else{
139            DokuCookie.setValue('hide','');
140            media.hide = false;
141        }
142        media.updatehide();
143    },
144
145    /**
146     * Sets the visibility of the image details accordingly to the
147     * chosen hide state
148     *
149     * @author Andreas Gohr <andi@splitbrain.org>
150     */
151    updatehide: function(){
152        var obj = $('media__content');
153        if(!obj) return;
154        var details = getElementsByClass('detail',obj,'div');
155        for(var i=0; i<details.length; i++){
156            if(media.hide){
157                details[i].style.display = 'none';
158            }else{
159                details[i].style.display = '';
160            }
161        }
162    },
163
164    /**
165     * Insert the clicked image into the opener's textarea
166     *
167     * @author Andreas Gohr <andi@splitbrain.org>
168     */
169    select: function(event,link){
170        var id = link.name.substr(2);
171
172        if(!opener){
173            // if we don't run in popup display example
174            var ex = $('ex_'+id);
175            if(ex.style.display == ''){
176                ex.style.display = 'none';
177            }else{
178                ex.style.display = '';
179            }
180            return false;
181        }
182        opener.insertTags('wiki__text','{{'+id+'|','}}','');
183
184        if(!media.keepopen) window.close();
185        opener.focus();
186        return false;
187    },
188
189    /**
190     * list the content of a namespace using AJAX
191     *
192     * @author Andreas Gohr <andi@splitbrain.org>
193     */
194    list: function(event,link){
195        // prepare an AJAX call to fetch the subtree
196        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
197        ajax.AjaxFailedAlert = '';
198        ajax.encodeURIString = false;
199        if(ajax.failed) return true;
200
201        cleanMsgArea();
202
203        var content = $('media__content');
204        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';
205
206        ajax.elementObj = content;
207        ajax.afterCompletion = function(){
208            media.selectorattach(content);
209            media.updatehide();
210        };
211        ajax.runAJAX(link.search.substr(1)+'&call=medialist');
212        return false;
213    },
214
215
216    /**
217     * Open or close a subtree using AJAX
218     *
219     * @author Andreas Gohr <andi@splitbrain.org>
220     */
221    toggle: function(event,clicky){
222        var listitem = clicky.parentNode;
223
224        // if already open, close by removing the sublist
225        var sublists = listitem.getElementsByTagName('ul');
226        if(sublists.length){
227            listitem.removeChild(sublists[0]);
228            clicky.src = DOKU_BASE+'lib/images/plus.gif';
229            return false;
230        }
231
232        // get the enclosed link (is always the first one)
233        var link = listitem.getElementsByTagName('a')[0];
234
235        // prepare an AJAX call to fetch the subtree
236        var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
237        ajax.AjaxFailedAlert = '';
238        ajax.encodeURIString = false;
239        if(ajax.failed) return true;
240
241        //prepare the new ul
242        var ul = document.createElement('ul');
243        //fixme add classname here
244        listitem.appendChild(ul);
245        ajax.elementObj = ul;
246        ajax.afterCompletion = function(){ media.treeattach(ul); };
247        ajax.runAJAX(link.search.substr(1)+'&call=medians');
248        clicky.src = DOKU_BASE+'lib/images/minus.gif';
249        return false;
250    },
251
252    /**
253     * Prefills the wikiname.
254     *
255     * @author Andreas Gohr <andi@splitbrain.org>
256     */
257    suggest: function(){
258        var file = $('upload__file');
259        var name = $('upload__name');
260        if(!file || !name) return;
261
262        var text = file.value;
263        text = text.substr(text.lastIndexOf('/')+1);
264        text = text.substr(text.lastIndexOf('\\')+1);
265        name.value = text;
266    }
267
268};
269
270addInitEvent(function(){
271    media.treeattach($('media__tree'));
272    media.selectorattach($('media__content'));
273    media.attachoptions($('media__opts'));
274});
275