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