xref: /dokuwiki/lib/scripts/locktimer.js (revision 7441e340554a7a982047997cf61f72adaefacc99)
1/**
2 * Class managing the timer to display a warning on a expiring lock
3 */
4var locktimer = {
5    sack:     null,
6    timeout:  0,
7    timerID:  null,
8    lasttime: null,
9    msg:      '',
10    pageid:   '',
11
12    init: function(timeout,msg,draft){
13        // init values
14        locktimer.timeout  = timeout*1000;
15        locktimer.msg      = msg;
16        locktimer.draft    = draft;
17        locktimer.lasttime = new Date();
18
19        if(!$('dw__editform')) return;
20        locktimer.pageid = $('dw__editform').elements.id.value;
21        if(!locktimer.pageid) return;
22        if($('wiki__text').readOnly) return;
23
24        // init ajax component
25        locktimer.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
26        locktimer.sack.AjaxFailedAlert = '';
27        locktimer.sack.encodeURIString = false;
28        locktimer.sack.onCompletion = locktimer.refreshed;
29
30        // register refresh event
31        addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();});
32        // start timer
33        locktimer.reset();
34    },
35
36    /**
37     * (Re)start the warning timer
38     */
39    reset: function(){
40        locktimer.clear();
41        locktimer.timerID = window.setTimeout("locktimer.warning()", locktimer.timeout);
42    },
43
44    /**
45     * Display the warning about the expiring lock
46     */
47    warning: function(){
48        locktimer.clear();
49        alert(locktimer.msg);
50    },
51
52    /**
53     * Remove the current warning timer
54     */
55    clear: function(){
56        if(locktimer.timerID !== null){
57            window.clearTimeout(locktimer.timerID);
58            locktimer.timerID = null;
59        }
60    },
61
62    /**
63     * Refresh the lock via AJAX
64     *
65     * Called on keypresses in the edit area
66     */
67    refresh: function(){
68        var now = new Date();
69        // refresh every minute only
70        if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){
71            var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid);
72            var dwform = $('dw__editform');
73            if(locktimer.draft && dwform.elements.wikitext){
74                params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value);
75                params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value);
76                params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value);
77                if(dwform.elements.date){
78                    params += '&date='+encodeURIComponent(dwform.elements.date.value);
79                }
80            }
81            locktimer.sack.runAJAX(params);
82            locktimer.lasttime = now;
83        }
84    },
85
86    /**
87     * Callback. Resets the warning timer
88     */
89    refreshed: function(){
90        var data  = this.response;
91        var error = data.charAt(0);
92            data  = data.substring(1);
93
94        $('draft__status').innerHTML=data;
95        if(error != '1') return; // locking failed
96        locktimer.reset();
97    },
98};
99
100