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