]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/closed_dates.js
opac/staff login timeouts are now inherited (see last change to oils_utils.c)
[Evergreen.git] / Open-ILS / xul / staff_client / server / admin / closed_dates.js
1 var FETCH_CLOSED_DATES  = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve.all';
2 var FETCH_CLOSED_DATE   = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve';
3 var CREATE_CLOSED_DATE  = 'open-ils.actor:open-ils.actor.org_unit.closed.create';
4 var DELETE_CLOSED_DATE  = 'open-ils.actor:open-ils.actor.org_unit.closed.delete';
5
6 var cdRowTemplate;
7 var cdAllDayTemplate;
8 var cdAllMultiDayTemplate;
9
10 var cdTbody;
11 var cdDateCache = {};
12
13 var selectedStart;
14 var selectedEnd;
15
16 var cdBaseOrg;
17
18
19 var myPerms = [ 
20         'actor.org_unit.closed_date.delete',
21         'actor.org_unit.closed_date.create',
22         ];
23
24 function cdEditorInit() {
25
26         /* set the various template rows */
27         cdTbody = $('cd_tbody');
28         cdRowTemplate                                   = cdTbody.removeChild($('cd_row'));
29         cdAllDayTemplate                                = cdTbody.removeChild($('cd_allday_row'));
30         cdAllMultiDayTemplate           = cdTbody.removeChild($('cd_allmultiday_row'));
31
32         cdInitCals();
33
34         fetchUser();
35         $('cd_user').appendChild(text(USER.usrname()));
36
37         setTimeout( 
38                 function() { 
39                         fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
40                         cdBuildOrgs();
41                         cdDrawRange();
42                 }, 
43                 20 
44         );
45 }
46
47 function cdCurrentOrg() {
48         var selector = $('cd_orgs');
49         return getSelectorVal(selector);
50 }
51
52 function cdBuildOrgs() {
53         var org = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
54         if( !org || org == -1 ) org = findOrgUnit(USER.ws_ou());
55         var type = findOrgType(org.ou_type()) ;
56
57         var selector = $('cd_orgs');
58         buildOrgSel(selector, org, type.depth());
59         if(!type.can_have_users()) selector.options[0].disabled = true;
60
61
62         selector.onchange = function() { cdDrawRange(); };
63
64         cdBaseOrg = org;
65
66         if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
67                 unHideMe($('cd_apply_all_div'));
68
69         var gotoOrg = USER.ws_ou();
70         if( ! setSelector( selector, gotoOrg ) ) {
71                 gotoOrg = USER.home_ou();
72                 setSelector( selector, gotoOrg );
73         }
74
75         var neworg = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
76         if(!neworg || neworg == -1 || !orgIsMine(neworg, findOrgUnit(cdCurrentOrg()))) {
77                 $('cd_new_allday').disabled = true;
78                 $('cd_new_multiday').disabled = true;
79                 $('cd_new').disabled = true;
80         }
81
82         return gotoOrg;
83 }
84
85 function cdInitCals() {
86
87         Calendar.setup({
88                 inputField  : "cd_edit_allday_start_date",
89                 ifFormat    : "%Y-%m-%d",
90                 button      : "cd_edit_allday_start_date_img",
91                 align       : "Tl",
92                 singleClick : true
93         });
94
95         Calendar.setup({
96                 inputField  : "cd_edit_allmultiday_start_date",
97                 ifFormat    : "%Y-%m-%d",
98                 button      : "cd_edit_allmultiday_start_date_img",
99                 align       : "Tl",
100                 singleClick : true
101         });
102
103         Calendar.setup({
104                 inputField  : "cd_edit_allmultiday_end_date",
105                 ifFormat    : "%Y-%m-%d",
106                 button      : "cd_edit_allmultiday_end_date_img",
107                 align       : "Tl",
108                 singleClick : true
109         });
110
111         Calendar.setup({
112                 inputField  : "cd_edit_end_date",
113                 ifFormat    : "%Y-%m-%d",
114                 button      : "cd_edit_end_date_img",
115                 align       : "Tl",
116                 singleClick : true
117         });
118
119         Calendar.setup({
120                 inputField  : "cd_edit_start_date",
121                 ifFormat    : "%Y-%m-%d",
122                 button      : "cd_edit_start_date_img",
123                 align       : "Tl",
124                 singleClick : true
125         });
126
127
128 }
129
130 function cdDrawRange( start, end, alertSuccess ) {
131         start = (start) ? start : new Date().getYear() + 1899 + '-01-01'; /* include last year's closed info for comparison */
132         end = (end) ? end : '3001-01-01';
133
134     if(alertSuccess) alertId('cd_update_success');
135
136         selectedStart = start;
137         selectedEnd = end;
138
139         var req = new Request(
140                 FETCH_CLOSED_DATES, SESSION, 
141                 {
142                         orgid                   : cdCurrentOrg(),
143                         start_date      : start,
144                         end_date                : end,
145                         idlist          : 0
146                 }
147         );
148
149         req.callback( cdBuild );
150         req.send();  
151 }
152
153 /* adds one row in the display table per date */
154 function cdBuild(r) {
155         var dates = r.getResultObject();
156         removeChildren(cdTbody);
157         for( var d = 0; d < dates.length; d++ ) {
158                 var date = dates[d];
159                 var row = cdBuildRow( date );
160                 cdTbody.appendChild(row);
161         }
162 }
163
164 function cdDateToHours(date) {
165         var d = new Date.W3CDTF();
166         d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
167
168         var h = d.getHours() +'';
169         var m = d.getMinutes() +'';
170         var s = d.getSeconds() +'';
171
172         if(h.length == 1) h = '0'+h;
173         if(m.length == 1) m = '0'+m;
174         if(s.length == 1) s = '0'+s;
175
176         return  h + ':' + m + ':' + s;
177 }
178
179 function cdDateToDate(date) {
180         var d = new Date.W3CDTF();
181         d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
182
183         var y = d.getFullYear()+'';
184         var m = (d.getMonth() + 1)+'';
185         var d = d.getDate()+'';
186
187         if(m.length == 1) m = '0'+m;
188         if(d.length == 1) d = '0'+d;
189
190         return  y + '-' + m + '-' + d;
191 }
192
193
194 /* fleshes a single date */
195 function cdBuildRow( date ) {
196
197         cdDateCache[date.id()] = date;
198
199         var sh = cdDateToHours(date.close_start());
200         var sd = cdDateToDate(date.close_start());
201         var eh = cdDateToHours(date.close_end());
202         var ed = cdDateToDate(date.close_end());
203
204         var row;
205         var flesh = false;
206
207         if( sh == '00:00:00' && eh == '23:59:59' ) {
208
209                 if( sd == ed ) {
210                         row = cdAllDayTemplate.cloneNode(true);
211                         $n(row, 'start_date').appendChild(text(sd));
212
213                 } else {
214                         row = cdAllMultiDayTemplate.cloneNode(true);
215                         $n(row, 'start_date').appendChild(text(sd));
216                         $n(row, 'end_date').appendChild(text(ed));
217                 }
218
219         } else {
220
221                 row = cdRowTemplate.cloneNode(true);    
222                 cdEditFleshRow(row, date);
223         }
224
225         $n(row,'delete').onclick = function() { cdDelete(row, date); };
226         $n(row, 'note').appendChild(text(date.reason()));
227
228         /* if we don't have delete perms for this location, disable the button */
229         var delorg = findOrgUnit(PERMS['actor.org_unit.closed_date.delete']);
230         if(!orgIsMine(delorg, findOrgUnit(cdCurrentOrg()))) $n(row,'delete').disabled = true;
231
232         return row;
233 }
234
235 function cdEditFleshRow(row, date) {
236         $n(row, 'start_time').appendChild(text(cdDateToHours(date.close_start())));
237         $n(row, 'start_date').appendChild(text(cdDateToDate(date.close_start())));
238         $n(row, 'end_time').appendChild(text(cdDateToHours(date.close_end())));
239         $n(row, 'end_date').appendChild(text(cdDateToDate(date.close_end())));
240 }
241
242
243 function cdShowEditRow(id) {
244         cdCancelEdit();
245         unHideMe($(id));
246         unHideMe($('cd_edit_submit'));
247         unHideMe($('cd_edit_note_row'));
248 }
249
250 function cdCancelEdit() {
251         hideMe($('cd_edit_row'));
252         hideMe($('cd_edit_allday_row'));
253         hideMe($('cd_edit_allmultiday_row'));
254         hideMe($('cd_edit_submit'));
255         hideMe($('cd_edit_note_row'));
256 }
257
258
259
260
261 function cdDelete(row, date) {
262         if(!confirmId('cd_confirm_delete')) return;
263         var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
264         req.callback(
265                 function(r) {
266                         var res = r.getResultObject();
267                         if( checkILSEvent(res) ) alertILSEvent(res);
268                         cdDrawRange(selectedStart, selectedEnd, true);
269                 }
270         )
271         req.send();
272 }
273
274
275 /* getW3CDTF */
276
277 function cdVerifyDate(d) {
278         return d && d.match(/\d{4}-\d{2}-\d{2}/);
279 }
280
281 function cdVerifyTime(t) {
282         return t && t.match(/\d{2}:\d{2}:\d{2}/);
283 }
284
285 function cdDateStrToDate( str ) {
286
287         var date = new Date.W3CDTF();
288         var data = str.split(/ /);
289
290         var year = data[0];
291         var time = data[1];
292
293         if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
294         if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
295
296         var yeardata = year.split(/-/);
297         var timedata = time.split(/:/);
298     
299     /*  seed the date with day = 1, which is a valid day for any month.  
300         this prevents automatic date correction by the date code for days that 
301         fall outside of the current or target month */
302     date.setDate(1);
303
304         date.setFullYear(new Number(yeardata[0]));
305         date.setMonth(new Number(yeardata[1]) - 1);
306     date.setDate(new Number(yeardata[2]));
307
308         date.setHours(new Number(timedata[0]));
309         date.setMinutes(new Number(timedata[1]));
310         date.setSeconds(new Number(timedata[2]));
311
312         return date;
313 }
314
315 function cdNew() {
316
317         var start;
318         var end;
319
320         if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
321
322                 var date = $('cd_edit_allday_start_date').value;
323
324                 start = cdDateStrToDate(date + ' 00:00:00');
325                 end = cdDateStrToDate(date + ' 23:59:59');
326
327         } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
328
329                 var sdate = $('cd_edit_allmultiday_start_date').value;
330                 var edate = $('cd_edit_allmultiday_end_date').value;
331                 start = cdDateStrToDate(sdate + ' 00:00:00');
332                 end = cdDateStrToDate(edate + ' 23:59:59');
333
334         } else {
335
336                 var sdate = $('cd_edit_start_date').value;
337                 var edate = $('cd_edit_end_date').value;
338                 var stime;
339                 var etime;
340
341                 if($('cd_edit_start_time_allday').checked) {
342                         stime = '00:00';
343                 } else {
344                         stime = $('cd_edit_start_time').value;
345                 }
346
347                 stime += ':00';
348
349                 if($('cd_edit_end_time_allday').checked) {
350                         etime = '23:59:59';
351                 } else {
352                         etime = $('cd_edit_end_time').value;
353                         etime += ':00';
354                 }
355
356                 start = cdDateStrToDate(sdate + ' ' + stime);
357                 end = cdDateStrToDate(edate + ' ' + etime);
358         }
359
360         cdCreate(start, end, $('cd_edit_note').value);
361 }
362
363 function cdCreate(start, end, note) {
364
365         if( $('cd_apply_all').checked ) {
366                 var list = cdGetOrgList();
367                 for( var o = 0; o < list.length; o++ ) {
368                         var id = list[o].id();
369                         cdCreateOne( id, start, end, note, (id == cdCurrentOrg()) );
370                 }
371
372         } else {
373
374                 cdCreateOne( cdCurrentOrg(), start, end, note, true );
375         }
376 }
377
378 function cdGetOrgList(org) {
379         if(!org) org = cdBaseOrg;
380
381         var list = [];
382         var type = findOrgType(org.ou_type()) ;
383         if( type.can_have_users() ) list.push(org);
384
385         if( org.children() ) {
386                 for( var i = 0; i < org.children().length; i++ ) {
387                         var child = org.children()[i];
388                         if( child ) {
389                                 var l = cdGetOrgList(child);
390                                 for( var j = 0; j < l.length; j++ )
391                                         list.push(l[j]);
392                         }
393                 }
394         }
395
396         return list;
397 }
398
399
400 function cdCreateOne( org, start, end, note, refresh ) {
401         var date = new aoucd();
402
403         date.close_start(start.getW3CDTF());
404         date.close_end(end.getW3CDTF());
405         date.org_unit(org);
406         date.reason(note);
407
408         var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
409         req.callback(
410                 function(r) {
411                         var res = r.getResultObject();
412                         if( checkILSEvent(res) ) alertILSEvent(res);
413                         if(refresh) cdDrawRange(selectedStart, selectedEnd, true);
414                 }
415         );
416         req.send();
417 }
418
419
420