summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/refnotes/script.js
blob: 79e3482dbc2c21002b7ecc8a30d1cf1f992fb6f6 (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(function () {
    let floater = null;
    let tracking = false;
    let timer = null;

    function createFloater() {
        return jQuery('<div id="insitu__fn" />')
            .addClass('insitu-footnote JSpopup')
            .css({ visibility : 'hidden', left : '0px', top : '0px' })
            .mouseleave(function () { jQuery(this).hide(); })
            .appendTo('.dokuwiki:first');
    }

    function getFloater() {
        if (!floater) {
            floater = jQuery('#insitu__fn');
            if (floater.length == 0) {
                floater = createFloater();
            }
        }

        return floater;
    }

    let preview = {
        setNoteId(id) {
            // locate the note span element
            let note = jQuery('#' + id.replace(/:/g, '\\:') + '\\:text');
            if (note.length == 0) {
                return false;
            }

            // remove any element ids from the content to ensure that they remain unique
            // and display hidden tooltip so we can move it around
            getFloater()
                .html(note.html().replace(/\bid\s*=\s*".*?"/gi, ''))
                .css('visibility', 'hidden')
                .show();

            return true;
        },

        show() {
            getFloater()
                .css('visibility', 'visible')
                .show();
        },

        hide() {
            // prevent creation of the floater and re-hiding it on window.scroll()
            if (floater && floater.is(':visible')) {
                floater.hide();
            }
        },

        move(event, dx, dy) {
            getFloater().position({
                my : 'left top',
                of : event,
                offset : dx + ' ' + dy,
                collision : 'flip'
            });
        }
    };

    function getNoteId(event) {
        return event.target.href.replace(/^.*?#([\w:]+)$/gi, '$1');
    }

    plugin_refnotes = {
        popup : {
            show(event) {
                plugin_refnotes.tooltip.hide(event);
                if (preview.setNoteId(getNoteId(event))) {
                    preview.move(event, 2, 2);
                    preview.show();
                }
            }
        },

        tooltip : {
            show(event) {
                plugin_refnotes.tooltip.hide(event);
                if (preview.setNoteId(getNoteId(event))) {
                    timer = setTimeout(function () { preview.show(); }, 500);
                    tracking = true;
                }
            },

            hide(event) {
                if (tracking) {
                    clearTimeout(timer);
                    tracking = false;
                }
                preview.hide();
            },

            track(event) {
                if (tracking) {
                    preview.move(event, 10, 12);
                }
            }
        }
    };
})();

jQuery(function () {
    jQuery('a.refnotes-ref.note-popup').mouseenter(plugin_refnotes.popup.show);
    jQuery('a.refnotes-ref.note-tooltip')
        .mouseenter(plugin_refnotes.tooltip.show)
        .mouseleave(plugin_refnotes.tooltip.hide);
    jQuery(document).mousemove(plugin_refnotes.tooltip.track);
    jQuery(window).scroll(plugin_refnotes.tooltip.hide);
});