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';
9 var cdAllMultiDayTemplate;
21 'actor.org_unit.closed_date.delete',
22 'actor.org_unit.closed_date.create',
25 function cdEditorInit() {
28 if (typeof JSAN == 'undefined') { throw( "The JSAN library object is missing."); }
29 JSAN.errorLevel = "die"; // none, warn, or die
30 JSAN.addRepository('..');
31 JSAN.use('util.error'); g.error = new util.error();
32 JSAN.use('util.date');
34 var err_msg = "!! This software has encountered an error. Please tell your friendly " +
35 "system administrator or software developer the following:\nadmin/closed_dates.xhtml\n" + E + '\n';
36 try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
40 /* set the various template rows */
41 cdTbody = $('cd_tbody');
42 cdRowTemplate = cdTbody.removeChild($('cd_row'));
43 cdAllDayTemplate = cdTbody.removeChild($('cd_allday_row'));
44 cdAllMultiDayTemplate = cdTbody.removeChild($('cd_allmultiday_row'));
49 $('cd_user').appendChild(text(USER.usrname()));
53 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
61 function cdCurrentOrg() {
62 var selector = $('cd_orgs');
63 return getSelectorVal(selector);
66 function cdBuildOrgs() {
67 var org = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
68 if( !org || org == -1 ) org = findOrgUnit(USER.ws_ou());
69 var type = findOrgType(org.ou_type()) ;
71 var selector = $('cd_orgs');
72 buildOrgSel(selector, org, type.depth());
73 if(!type.can_have_users()) selector.options[0].disabled = true;
76 selector.onchange = function() { cdDrawRange(); };
80 if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
81 unHideMe($('cd_apply_all_div'));
83 var gotoOrg = USER.ws_ou();
84 if( ! setSelector( selector, gotoOrg ) ) {
85 gotoOrg = USER.home_ou();
86 setSelector( selector, gotoOrg );
89 var neworg = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
90 if(!neworg || neworg == -1 || !orgIsMine(neworg, findOrgUnit(cdCurrentOrg()))) {
91 $('cd_new_allday').disabled = true;
92 $('cd_new_multiday').disabled = true;
93 $('cd_new').disabled = true;
99 function cdInitCals() {
102 inputField : "cd_edit_allday_start_date",
103 ifFormat : "%Y-%m-%d",
104 button : "cd_edit_allday_start_date_img",
110 inputField : "cd_edit_allmultiday_start_date",
111 ifFormat : "%Y-%m-%d",
112 button : "cd_edit_allmultiday_start_date_img",
118 inputField : "cd_edit_allmultiday_end_date",
119 ifFormat : "%Y-%m-%d",
120 button : "cd_edit_allmultiday_end_date_img",
126 inputField : "cd_edit_end_date",
127 ifFormat : "%Y-%m-%d",
128 button : "cd_edit_end_date_img",
134 inputField : "cd_edit_start_date",
135 ifFormat : "%Y-%m-%d",
136 button : "cd_edit_start_date_img",
144 function cdDrawRange( start, end, alertSuccess ) {
145 start = (start) ? start : new Date().getYear() + 1899 + '-01-01'; /* include last year's closed info for comparison */
146 end = (end) ? end : '3001-01-01';
148 if(alertSuccess) alertId('cd_update_success');
150 selectedStart = start;
153 var req = new Request(
154 FETCH_CLOSED_DATES, SESSION,
156 orgid : cdCurrentOrg(),
163 req.callback( cdBuild );
167 /* adds one row in the display table per date */
168 function cdBuild(r) {
169 var dates = r.getResultObject();
170 removeChildren(cdTbody);
171 for( var d = 0; d < dates.length; d++ ) {
173 var row = cdBuildRow( date );
174 cdTbody.appendChild(row);
178 function cdDateToHours(date) {
179 return util.date.formatted_date(date, '%H:%M');
182 function cdDateToDate(date) {
183 return util.date.formatted_date(date, '%F');
187 /* fleshes a single date */
188 function cdBuildRow( date ) {
190 cdDateCache[date.id()] = date;
192 var sh = cdDateToHours(date.close_start());
193 var sd = cdDateToDate(date.close_start());
194 var eh = cdDateToHours(date.close_end());
195 var ed = cdDateToDate(date.close_end());
200 if( sh == '00:00:00' && eh == '23:59:59' ) {
203 row = cdAllDayTemplate.cloneNode(true);
204 $n(row, 'start_date').appendChild(text(sd));
207 row = cdAllMultiDayTemplate.cloneNode(true);
208 $n(row, 'start_date').appendChild(text(sd));
209 $n(row, 'end_date').appendChild(text(ed));
214 row = cdRowTemplate.cloneNode(true);
215 cdEditFleshRow(row, date);
218 $n(row,'delete').onclick = function() { cdDelete(row, date); };
219 $n(row, 'note').appendChild(text(date.reason()));
221 /* if we don't have delete perms for this location, disable the button */
222 var delorg = findOrgUnit(PERMS['actor.org_unit.closed_date.delete']);
223 if(!orgIsMine(delorg, findOrgUnit(cdCurrentOrg()))) $n(row,'delete').disabled = true;
228 function cdEditFleshRow(row, date) {
229 $n(row, 'start_time').appendChild(text(cdDateToHours(date.close_start())));
230 $n(row, 'start_date').appendChild(text(cdDateToDate(date.close_start())));
231 $n(row, 'end_time').appendChild(text(cdDateToHours(date.close_end())));
232 $n(row, 'end_date').appendChild(text(cdDateToDate(date.close_end())));
236 function cdShowEditRow(id) {
239 unHideMe($('cd_edit_submit'));
240 unHideMe($('cd_edit_note_row'));
243 function cdCancelEdit() {
244 hideMe($('cd_edit_row'));
245 hideMe($('cd_edit_allday_row'));
246 hideMe($('cd_edit_allmultiday_row'));
247 hideMe($('cd_edit_submit'));
248 hideMe($('cd_edit_note_row'));
254 function cdDelete(row, date) {
255 if(!confirmId('cd_confirm_delete')) return;
256 var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
259 var res = r.getResultObject();
260 if( checkILSEvent(res) ) alertILSEvent(res);
261 cdDrawRange(selectedStart, selectedEnd, true);
268 function cdVerifyDate(d) {
269 return d && d.match(/\d{4}-\d{2}-\d{2}/);
272 function cdVerifyTime(t) {
273 return t && t.match(/\d{2}:\d{2}:\d{2}/);
276 function cdDateStrToDate( str ) {
278 var date = new Date.W3CDTF();
279 var data = str.split(/ /);
284 if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
285 if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
287 var yeardata = year.split(/-/);
288 var timedata = time.split(/:/);
290 /* seed the date with day = 1, which is a valid day for any month.
291 this prevents automatic date correction by the date code for days that
292 fall outside of the current or target month */
295 date.setFullYear(new Number(yeardata[0]));
296 date.setMonth(new Number(yeardata[1]) - 1);
297 date.setDate(new Number(yeardata[2]));
299 date.setHours(new Number(timedata[0]));
300 date.setMinutes(new Number(timedata[1]));
301 date.setSeconds(new Number(timedata[2]));
311 if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
313 var date = $('cd_edit_allday_start_date').value;
315 start = cdDateStrToDate(date + ' 00:00:00');
316 end = cdDateStrToDate(date + ' 23:59:59');
318 } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
320 var sdate = $('cd_edit_allmultiday_start_date').value;
321 var edate = $('cd_edit_allmultiday_end_date').value;
322 start = cdDateStrToDate(sdate + ' 00:00:00');
323 end = cdDateStrToDate(edate + ' 23:59:59');
327 var sdate = $('cd_edit_start_date').value;
328 var edate = $('cd_edit_end_date').value;
332 if($('cd_edit_start_time_allday').checked) {
335 stime = $('cd_edit_start_time').value;
340 if($('cd_edit_end_time_allday').checked) {
343 etime = $('cd_edit_end_time').value;
347 start = cdDateStrToDate(sdate + ' ' + stime);
348 end = cdDateStrToDate(edate + ' ' + etime);
351 if (end.getTime() < start.getTime()) {
352 alertId('cd_invalid_date_span');
356 cdCreate(start, end, $('cd_edit_note').value);
359 function cdCreate(start, end, note) {
361 if( $('cd_apply_all').checked ) {
362 var list = cdGetOrgList();
363 for( var o = 0; o < list.length; o++ ) {
364 var id = list[o].id();
365 cdCreateOne( id, start, end, note, (id == cdCurrentOrg()) );
370 cdCreateOne( cdCurrentOrg(), start, end, note, true );
374 function cdGetOrgList(org) {
375 if(!org) org = cdBaseOrg;
378 var type = findOrgType(org.ou_type()) ;
379 if( type.can_have_users() ) list.push(org);
381 if( org.children() ) {
382 for( var i = 0; i < org.children().length; i++ ) {
383 var child = org.children()[i];
385 var l = cdGetOrgList(child);
386 for( var j = 0; j < l.length; j++ )
396 function cdCreateOne( org, start, end, note, refresh ) {
397 var date = new aoucd();
399 date.close_start(start.getW3CDTF());
400 date.close_end(end.getW3CDTF());
404 var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
407 var res = r.getResultObject();
408 if( checkILSEvent(res) ) alertILSEvent(res);
409 if(refresh) cdDrawRange(selectedStart, selectedEnd, true);