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';
8 var cdAllMultiDayTemplate;
20 'actor.org_unit.closed_date.delete',
21 'actor.org_unit.closed_date.create',
24 function cdEditorInit() {
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'));
35 $('cd_user').appendChild(text(USER.usrname()));
39 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
47 function cdCurrentOrg() {
48 var selector = $('cd_orgs');
49 return getSelectorVal(selector);
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()) ;
57 var selector = $('cd_orgs');
58 buildOrgSel(selector, org, type.depth());
59 if(!type.can_have_users()) selector.options[0].disabled = true;
62 selector.onchange = function() { cdDrawRange(); };
66 if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
67 unHideMe($('cd_apply_all_div'));
69 var gotoOrg = USER.ws_ou();
70 if( ! setSelector( selector, gotoOrg ) ) {
71 gotoOrg = USER.home_ou();
72 setSelector( selector, gotoOrg );
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;
85 function cdInitCals() {
88 inputField : "cd_edit_allday_start_date",
89 ifFormat : "%Y-%m-%d",
90 button : "cd_edit_allday_start_date_img",
96 inputField : "cd_edit_allmultiday_start_date",
97 ifFormat : "%Y-%m-%d",
98 button : "cd_edit_allmultiday_start_date_img",
104 inputField : "cd_edit_allmultiday_end_date",
105 ifFormat : "%Y-%m-%d",
106 button : "cd_edit_allmultiday_end_date_img",
112 inputField : "cd_edit_end_date",
113 ifFormat : "%Y-%m-%d",
114 button : "cd_edit_end_date_img",
120 inputField : "cd_edit_start_date",
121 ifFormat : "%Y-%m-%d",
122 button : "cd_edit_start_date_img",
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';
134 if(alertSuccess) alertId('cd_update_success');
136 selectedStart = start;
139 var req = new Request(
140 FETCH_CLOSED_DATES, SESSION,
142 orgid : cdCurrentOrg(),
149 req.callback( cdBuild );
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++ ) {
159 var row = cdBuildRow( date );
160 cdTbody.appendChild(row);
164 function cdDateToHours(date) {
165 var d = new Date.W3CDTF();
166 d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
168 var h = d.getHours() +'';
169 var m = d.getMinutes() +'';
170 var s = d.getSeconds() +'';
172 if(h.length == 1) h = '0'+h;
173 if(m.length == 1) m = '0'+m;
174 if(s.length == 1) s = '0'+s;
176 return h + ':' + m + ':' + s;
179 function cdDateToDate(date) {
180 var d = new Date.W3CDTF();
181 d.setW3CDTF(date.replace(/\.\d+/,'') + ":00");
183 var y = d.getFullYear()+'';
184 var m = (d.getMonth() + 1)+'';
185 var d = d.getDate()+'';
187 if(m.length == 1) m = '0'+m;
188 if(d.length == 1) d = '0'+d;
190 return y + '-' + m + '-' + d;
194 /* fleshes a single date */
195 function cdBuildRow( date ) {
197 cdDateCache[date.id()] = date;
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());
207 if( sh == '00:00:00' && eh == '23:59:59' ) {
210 row = cdAllDayTemplate.cloneNode(true);
211 $n(row, 'start_date').appendChild(text(sd));
214 row = cdAllMultiDayTemplate.cloneNode(true);
215 $n(row, 'start_date').appendChild(text(sd));
216 $n(row, 'end_date').appendChild(text(ed));
221 row = cdRowTemplate.cloneNode(true);
222 cdEditFleshRow(row, date);
225 $n(row,'delete').onclick = function() { cdDelete(row, date); };
226 $n(row, 'note').appendChild(text(date.reason()));
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;
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())));
243 function cdShowEditRow(id) {
246 unHideMe($('cd_edit_submit'));
247 unHideMe($('cd_edit_note_row'));
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'));
261 function cdDelete(row, date) {
262 if(!confirmId('cd_confirm_delete')) return;
263 var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
266 var res = r.getResultObject();
267 if( checkILSEvent(res) ) alertILSEvent(res);
268 cdDrawRange(selectedStart, selectedEnd, true);
277 function cdVerifyDate(d) {
278 return d && d.match(/\d{4}-\d{2}-\d{2}/);
281 function cdVerifyTime(t) {
282 return t && t.match(/\d{2}:\d{2}:\d{2}/);
285 function cdDateStrToDate( str ) {
287 var date = new Date.W3CDTF();
288 var data = str.split(/ /);
293 if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
294 if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
296 var yeardata = year.split(/-/);
297 var timedata = time.split(/:/);
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 */
304 date.setFullYear(new Number(yeardata[0]));
305 date.setMonth(new Number(yeardata[1]) - 1);
306 date.setDate(new Number(yeardata[2]));
308 date.setHours(new Number(timedata[0]));
309 date.setMinutes(new Number(timedata[1]));
310 date.setSeconds(new Number(timedata[2]));
320 if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
322 var date = $('cd_edit_allday_start_date').value;
324 start = cdDateStrToDate(date + ' 00:00:00');
325 end = cdDateStrToDate(date + ' 23:59:59');
327 } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
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');
336 var sdate = $('cd_edit_start_date').value;
337 var edate = $('cd_edit_end_date').value;
341 if($('cd_edit_start_time_allday').checked) {
344 stime = $('cd_edit_start_time').value;
349 if($('cd_edit_end_time_allday').checked) {
352 etime = $('cd_edit_end_time').value;
356 start = cdDateStrToDate(sdate + ' ' + stime);
357 end = cdDateStrToDate(edate + ' ' + etime);
360 if (end.getTime() < start.getTime()) {
361 alertId('cd_invalid_date_span');
365 cdCreate(start, end, $('cd_edit_note').value);
368 function cdCreate(start, end, note) {
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()) );
379 cdCreateOne( cdCurrentOrg(), start, end, note, true );
383 function cdGetOrgList(org) {
384 if(!org) org = cdBaseOrg;
387 var type = findOrgType(org.ou_type()) ;
388 if( type.can_have_users() ) list.push(org);
390 if( org.children() ) {
391 for( var i = 0; i < org.children().length; i++ ) {
392 var child = org.children()[i];
394 var l = cdGetOrgList(child);
395 for( var j = 0; j < l.length; j++ )
405 function cdCreateOne( org, start, end, note, refresh ) {
406 var date = new aoucd();
408 date.close_start(start.getW3CDTF());
409 date.close_end(end.getW3CDTF());
413 var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
416 var res = r.getResultObject();
417 if( checkILSEvent(res) ) alertILSEvent(res);
418 if(refresh) cdDrawRange(selectedStart, selectedEnd, true);