1/**
2 * JavaScript functionalitiy for the media management popup
3 *
4 * @author Andreas Gohr <andi@splitbrain.org>
5 * @author  Otto Vainio <plugins@valjakko.net>
6 */
7linkpage = {
8    keepopen: false,
9    hide: false,
10
11    /**
12     * Attach event handlers to all "folders" below the given element
13     *
14     * @author Andreas Gohr <andi@splitbrain.org>
15   * @author  Otto Vainio <plugins@valjakko.net>
16     */
17    treeattach: function(obj){
18        if(!obj) return;
19
20        var items = obj.getElementsByTagName('li');
21        for(var i=0; i<items.length; i++){
22            var elem = items[i];
23
24            // attach action to make the +/- clickable
25            var clicky = elem.getElementsByTagName('img')[0];
26            clicky.style.cursor = 'pointer';
27            addEvent(clicky,'click',function(event){ return linkpage.toggle(event,this); });
28            // attach action load folder list via AJAX
29            var link = elem.getElementsByTagName('a')[0];
30            link.style.cursor = 'pointer';
31            addEvent(link,'click',function(event){ return linkpage.list(event,this); });
32        }
33    },
34
35    /**
36     * Attach the image selector action to all links below the given element
37     *
38     * @author Andreas Gohr <andi@splitbrain.org>
39   * @author  Otto Vainio <plugins@valjakko.net>
40   */
41    selectorattach: function(obj){
42        if(!obj) return;
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 linkpage.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 items = getElementsByClass('newpage__submit',obj,'a');
58        for(var i=0; i<items.length; i++){
59            var elem = items[i];
60//        var elem = $('newpage__submit');
61//        if(!elem) return;
62          elem.style.cursor = 'pointer';
63          addEvent(elem,'click',function(event){ return linkpage.selectnew(event,this); });
64        }
65//        var elem = $('newpage__name');
66//        if(!elem) return;
67//        addEvent(elem,'change',linkpage.update);
68    },
69
70    /**
71     * Creates checkboxes for additional options
72     *
73     * @author Andreas Gohr <andi@splitbrain.org>
74   * @author  Otto Vainio <plugins@valjakko.net>
75   */
76    attachoptions: function(obj){
77        if(!obj) return;
78        // keep open
79        if(opener){
80            var kobox  = document.createElement('input');
81            kobox.type = 'checkbox';
82            kobox.id   = 'linkpage__keepopen';
83            if(DokuCookie.getValue('keepopen')){
84                kobox.checked  = true;
85                kobox.defaultChecked = true; //IE wants this
86                linkpage.keepopen = true;
87            }
88            addEvent(kobox,'click',function(event){ return linkpage.togglekeepopen(event,this); });
89
90            var kolbl  = document.createElement('label');
91            kolbl.htmlFor   = 'linkpage__keepopen';
92            kolbl.innerHTML = LANG['keepopen'];
93
94            var kobr = document.createElement('br');
95
96            obj.appendChild(kobox);
97            obj.appendChild(kolbl);
98            obj.appendChild(kobr);
99        }
100
101    },
102
103    /**
104     * Toggles the keep open state
105     *
106     * @author Andreas Gohr <andi@splitbrain.org>
107     */
108    togglekeepopen: function(event,cb){
109        if(cb.checked){
110            DokuCookie.setValue('keepopen',1);
111            linkpage.keepopen = true;
112        }else{
113            DokuCookie.setValue('keepopen','');
114            linkpage.keepopen = false;
115        }
116    },
117
118    /**
119     * Toggles the hide details state
120     *
121     * @author Andreas Gohr <andi@splitbrain.org>
122     */
123    togglehide: function(event,cb){
124        if(cb.checked){
125            DokuCookie.setValue('hide',1);
126            linkpage.hide = true;
127        }else{
128            DokuCookie.setValue('hide','');
129            linkpage.hide = false;
130        }
131        linkpage.updatehide();
132    },
133
134    /**
135     * Sets the visibility of the image details accordingly to the
136     * chosen hide state
137     *
138     * @author Andreas Gohr <andi@splitbrain.org>
139     */
140    updatehide: function(){
141        var obj = $('linkpage__content');
142        if(!obj) return;
143        var details = getElementsByClass('detail',obj,'div');
144        for(var i=0; i<details.length; i++){
145            if(linkpage.hide){
146                details[i].style.display = 'none';
147            }else{
148                details[i].style.display = '';
149            }
150        }
151    },
152
153    /**
154     * Insert the clicked image into the opener's textarea
155     *
156     * @author Andreas Gohr <andi@splitbrain.org>
157     */
158    select: function(event,link){
159        var id = link.name.substr(2);
160        var confusesepafield = $('conf__use_sepa');
161        var confusesepa = confusesepafield.value;
162        var sepa = '';
163        if (confusesepa==1)
164        {
165          sepa='|';
166        }
167        if (confusesepa==0)
168        {
169          sepa='';
170        }
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+sepa,']]','');
183
184        if(!linkpage.keepopen) window.close();
185        opener.focus();
186        return false;
187    },
188
189    selectnew: function(event,link){
190//        var id = link.value;
191      var submit = $('newpage__name');
192      var id = submit.value;
193      var nsfield = $('newpage__ns');
194      var confusesepafield = $('conf__use_sepa');
195      var confusesepa = confusesepafield.value;
196      var sepa = '';
197      if (confusesepa==1)
198      {
199        sepa='|';
200      }
201      if (confusesepa==0)
202      {
203        sepa='';
204      }
205
206      var ns = nsfield.value;
207      if (ns)
208      {
209        ns = ns + ':';
210      }
211      if(!opener){
212          // if we don't run in popup display example
213          var ex = $('ex_'+id);
214          if(ex.style.display == ''){
215              ex.style.display = 'none';
216          }else{
217              ex.style.display = '';
218          }
219          return false;
220      }
221      opener.insertTags('wiki__text','[[:'+ns+id+sepa,']]','');
222
223      if(!linkpage.keepopen) window.close();
224      opener.focus();
225      return false;
226    },
227
228    /**
229     * list the content of a namespace using AJAX
230     *
231     * @author Andreas Gohr <andi@splitbrain.org>
232     */
233    list: function(event,link){
234        // prepare an AJAX call to fetch the subtree
235
236        var ajax = new sack(DOKU_BASE + 'lib/plugins/linkmanager/exe/ajax.php');
237        ajax.AjaxFailedAlert = '';
238        ajax.encodeURIString = false;
239        if(ajax.failed) return true;
240
241        cleanMsgArea();
242
243        var content = $('linkpage__content');
244        content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';
245
246        ajax.elementObj = content;
247        ajax.afterCompletion = function(){
248          linkpage.selectorattach(content);
249          linkpage.updatehide();
250          reinitsort();
251        };
252        ajax.runAJAX(link.search.substr(1)+'&call=linkpagelist');
253        return false;
254    },
255
256
257    /**
258     * Open or close a subtree using AJAX
259     *
260     * @author Andreas Gohr <andi@splitbrain.org>
261     */
262    toggle: function(event,clicky){
263        var listitem = clicky.parentNode;
264
265        // if already open, close by removing the sublist
266        var sublists = listitem.getElementsByTagName('ul');
267        if(sublists.length){
268            listitem.removeChild(sublists[0]);
269            clicky.src = DOKU_BASE+'lib/images/plus.gif';
270            return false;
271        }
272
273        // get the enclosed link (is always the first one)
274        var link = listitem.getElementsByTagName('a')[0];
275
276        // prepare an AJAX call to fetch the subtree
277        var ajax = new sack(DOKU_BASE + 'lib/plugins/linkmanager/exe/ajax.php');
278        ajax.AjaxFailedAlert = '';
279        ajax.encodeURIString = false;
280        if(ajax.failed) return true;
281
282        //prepare the new ul
283        var ul = document.createElement('ul');
284        //fixme add classname here
285        listitem.appendChild(ul);
286        ajax.elementObj = ul;
287        ajax.afterCompletion = function(){ linkpage.treeattach(ul); };
288        ajax.runAJAX(link.search.substr(1)+'&call=linkpagens');
289        clicky.src = DOKU_BASE+'lib/images/minus.gif';
290        return false;
291    }
292
293};
294
295addInitEvent(function(){
296  linkpage.treeattach($('linkpage__tree'));
297  linkpage.selectorattach($('linkpage__content'));
298  linkpage.attachoptions($('linkpage__opts'));
299});
300
301
302//if(toolbar){
303if(window.toolbar!=undefined){
304  toolbar[toolbar.length] = {"type":"mediapopup",
305                             "title":"links",
306                             "icon":"../../plugins/linkmanager/images/page_link.png",
307                             "key":"",
308                             "name":"linknameselect",
309                              "url":DOKU_BASE+"lib/plugins/linkmanager/exe/filemanager.php?ns=",
310                             "options":"width=750,height=500,left=20,top=20,scrollbars=yes,resizable=yes"
311                          };
312}
313
314
315function reinitsort() {
316  sorttable.reinit();
317}
318