]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/closed_dates.js
d784ff662707a04ec758648aa8c3fee7b9c3aa7f
[working/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     if (end.getTime() < start.getTime()) {
361         alertId('cd_invalid_date_span');
362         return;
363     }
364
365     cdCreate(start, end, $('cd_edit_note').value);
366 }
367
368 function cdCreate(start, end, note) {
369
370     if( $('cd_apply_all').checked ) {
371         var list = cdGetOrgList();
372         for( var o = 0; o < list.length; o++ ) {
373             var id = list[o].id();
374             cdCreateOne( id, start, end, note, (id == cdCurrentOrg()) );
375         }
376
377     } else {
378
379         cdCreateOne( cdCurrentOrg(), start, end, note, true );
380     }
381 }
382
383 function cdGetOrgList(org) {
384     if(!org) org = cdBaseOrg;
385
386     var list = [];
387     var type = findOrgType(org.ou_type()) ;
388     if( type.can_have_users() ) list.push(org);
389
390     if( org.children() ) {
391         for( var i = 0; i < org.children().length; i++ ) {
392             var child = org.children()[i];
393             if( child ) {
394                 var l = cdGetOrgList(child);
395                 for( var j = 0; j < l.length; j++ )
396                     list.push(l[j]);
397             }
398         }
399     }
400
401     return list;
402 }
403
404
405 function cdCreateOne( org, start, end, note, refresh ) {
406     var date = new aoucd();
407
408     date.close_start(start.getW3CDTF());
409     date.close_end(end.getW3CDTF());
410     date.org_unit(org);
411     date.reason(note);
412
413     var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
414     req.callback(
415         function(r) {
416             var res = r.getResultObject();
417             if( checkILSEvent(res) ) alertILSEvent(res);
418             if(refresh) cdDrawRange(selectedStart, selectedEnd, true);
419         }
420     );
421     req.send();
422 }
423
424
425