1(function () {
2    let floater = null;
3    let tracking = false;
4    let timer = null;
5
6    function createFloater() {
7        return jQuery('<div id="insitu__fn" />')
8            .addClass('insitu-footnote JSpopup')
9            .css({ visibility : 'hidden', left : '0px', top : '0px' })
10            .mouseleave(function () { jQuery(this).hide(); })
11            .appendTo('.dokuwiki:first');
12    }
13
14    function getFloater() {
15        if (!floater) {
16            floater = jQuery('#insitu__fn');
17            if (floater.length == 0) {
18                floater = createFloater();
19            }
20        }
21
22        return floater;
23    }
24
25    let preview = {
26        setNoteId(id) {
27            // locate the note span element
28            let note = jQuery('#' + id.replace(/:/g, '\\:') + '\\:text');
29            if (note.length == 0) {
30                return false;
31            }
32
33            // remove any element ids from the content to ensure that they remain unique
34            // and display hidden tooltip so we can move it around
35            getFloater()
36                .html(note.html().replace(/\bid\s*=\s*".*?"/gi, ''))
37                .css('visibility', 'hidden')
38                .show();
39
40            return true;
41        },
42
43        show() {
44            getFloater()
45                .css('visibility', 'visible')
46                .show();
47        },
48
49        hide() {
50            // prevent creation of the floater and re-hiding it on window.scroll()
51            if (floater && floater.is(':visible')) {
52                floater.hide();
53            }
54        },
55
56        move(event, dx, dy) {
57            getFloater().position({
58                my : 'left top',
59                of : event,
60                offset : dx + ' ' + dy,
61                collision : 'flip'
62            });
63        }
64    };
65
66    function getNoteId(event) {
67        return event.target.href.replace(/^.*?#([\w:]+)$/gi, '$1');
68    }
69
70    plugin_refnotes = {
71        popup : {
72            show(event) {
73                plugin_refnotes.tooltip.hide(event);
74                if (preview.setNoteId(getNoteId(event))) {
75                    preview.move(event, 2, 2);
76                    preview.show();
77                }
78            }
79        },
80
81        tooltip : {
82            show(event) {
83                plugin_refnotes.tooltip.hide(event);
84                if (preview.setNoteId(getNoteId(event))) {
85                    timer = setTimeout(function () { preview.show(); }, 500);
86                    tracking = true;
87                }
88            },
89
90            hide(event) {
91                if (tracking) {
92                    clearTimeout(timer);
93                    tracking = false;
94                }
95                preview.hide();
96            },
97
98            track(event) {
99                if (tracking) {
100                    preview.move(event, 10, 12);
101                }
102            }
103        }
104    };
105})();
106
107jQuery(function () {
108    jQuery('a.refnotes-ref.note-popup').mouseenter(plugin_refnotes.popup.show);
109    jQuery('a.refnotes-ref.note-tooltip')
110        .mouseenter(plugin_refnotes.tooltip.show)
111        .mouseleave(plugin_refnotes.tooltip.hide);
112    jQuery(document).mousemove(plugin_refnotes.tooltip.track);
113    jQuery(window).scroll(plugin_refnotes.tooltip.hide);
114});
115