summaryrefslogtreecommitdiff
path: root/lib/scripts/index.js
blob: c575ab6187cf8a5184a5b01969516d11a6cdb428 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, newcap: true, immed: true */
/*global jQuery, window, DOKU_BASE, DEPRECATED, bind*/

/**
 * Javascript for index view
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @author Pierre Spring <pierre.spring@caillou.ch>
 */

var dw_index = {

    /**
     * Delay in ms before showing the throbber.
     * Used to skip the throbber for fast AJAX calls.
     */
    throbber_delay: 500,

    /**
     * Initialize tree when the DOM is ready.
     */
    init: function () {
        dw_index.treeattach('#index__tree');
    },

    treeattach: function (obj) {
        jQuery(obj).delegate('a.idx_dir', 'click', dw_index.toggle);
    },

    /**
     * Open or close a subtree using AJAX
     * The contents of subtrees are "cached" until the page is reloaded.
     * A "loading" indicator is shown only when the AJAX call is slow.
     *
     * @author Andreas Gohr <andi@splitbrain.org>
     * @author Ben Coburn <btcoburn@silicodon.net>
     * @author Pierre Spring <pierre.spring@caillou.ch>
     */
    toggle: function (e, _this) {
        e.preventDefault();

        var $listitem, $sublist, timeout, $clicky, show_sublist;

        if (_this) {
            DEPRECATED('Use dw_index.toggle(e) (or dw_index.toggle.call(clicky, e) if you need to override clicky), not dw_index.toggle(e, clicky)');
        }

        $clicky = jQuery(_this || this);
        $listitem = $clicky.closest('li');
        $sublist = $listitem.find('ul').first();

        // if already open, close by removing the sublist
        if ($listitem.hasClass('open')) {
            $sublist.slideUp('fast',
                function () {
                    $listitem.addClass('closed').removeClass('open');
                }
            );
            return;
        }

        show_sublist = function (data) {
            if (!$listitem.hasClass('open') || $sublist.parent().length === 0) {
                $listitem.append($sublist).addClass('open').removeClass('closed');
            }
            $sublist.hide();
            if (data) {
                $sublist.html(data);
            }
            $sublist.slideDown('fast');
        };

        // just show if already loaded
        if ($sublist.length > 0) {
            show_sublist();
            return;
        }

        //prepare the new ul
        $sublist = jQuery('<ul class="idx"/>');

        timeout = window.setTimeout(
            bind(show_sublist, '<li><img src="' + DOKU_BASE + 'lib/images/throbber.gif" alt="loading..." title="loading..." /></li>'), dw_index.throbber_delay);

        jQuery.post(
            DOKU_BASE + 'lib/exe/ajax.php',
            $clicky[0].search.substr(1) + '&call=index',
            function (data) {
                window.clearTimeout(timeout);
                show_sublist(data);
            },
            'html'
        );
    }
};

jQuery(dw_index.init);