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