1 dojo.require('fieldmapper.AutoIDL');
2 dojo.require('fieldmapper.Fieldmapper');
3 dojo.require('fieldmapper.OrgUtils');
4 dojo.require('openils.Event');
6 var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true; var g = {};
7 var FETCH_CLOSED_DATES = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve.all';
8 var FETCH_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.retrieve';
9 var CREATE_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.create';
10 var DELETE_CLOSED_DATE = 'open-ils.actor:open-ils.actor.org_unit.closed.delete';
14 var cdAllMultiDayTemplate;
27 'actor.org_unit.closed_date.delete',
28 'actor.org_unit.closed_date.create',
31 function cdEditorInit() {
33 /* set the various template rows */
34 cdTbody = $('cd_tbody');
35 cdRowTemplate = cdTbody.removeChild($('cd_row'));
36 cdAllDayTemplate = cdTbody.removeChild($('cd_allday_row'));
37 cdAllMultiDayTemplate = cdTbody.removeChild($('cd_allmultiday_row'));
42 $('cd_user').appendChild(text(USER.usrname()));
46 fetchHighestPermOrgs( SESSION, USER.id(), myPerms );
54 function cdCurrentOrg() {
55 var selector = $('cd_orgs');
56 return getSelectorVal(selector);
59 function cdBuildOrgs() {
60 var org = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
61 if( !org || org == -1 ) org = findOrgUnit(USER.ws_ou());
62 var type = findOrgType(org.ou_type()) ;
64 var selector = $('cd_orgs');
65 buildOrgSel(selector, org, type.depth());
66 if(!type.can_have_users()) selector.options[0].disabled = true;
69 selector.onchange = function() { cdDrawRange(); };
73 if( cdBaseOrg.children() && cdBaseOrg.children().length > 0 )
74 unHideMe($('cd_apply_all_div'));
76 var gotoOrg = USER.ws_ou();
77 if( ! setSelector( selector, gotoOrg ) ) {
78 gotoOrg = USER.home_ou();
79 setSelector( selector, gotoOrg );
82 var neworg = findOrgUnit(PERMS['actor.org_unit.closed_date.create']);
83 if(!neworg || neworg == -1 || !orgIsMine(neworg, findOrgUnit(cdCurrentOrg()))) {
84 $('cd_new_allday').disabled = true;
85 $('cd_new_multiday').disabled = true;
86 $('cd_new').disabled = true;
92 function cdInitCals() {
95 inputField : "cd_edit_allday_start_date",
96 ifFormat : "%Y-%m-%d",
97 button : "cd_edit_allday_start_date_img",
103 inputField : "cd_edit_allmultiday_start_date",
104 ifFormat : "%Y-%m-%d",
105 button : "cd_edit_allmultiday_start_date_img",
111 inputField : "cd_edit_allmultiday_end_date",
112 ifFormat : "%Y-%m-%d",
113 button : "cd_edit_allmultiday_end_date_img",
119 inputField : "cd_edit_end_date",
120 ifFormat : "%Y-%m-%d",
121 button : "cd_edit_end_date_img",
127 inputField : "cd_edit_start_date",
128 ifFormat : "%Y-%m-%d",
129 button : "cd_edit_start_date_img",
137 function cdDrawRange( start, end, alertSuccess ) {
138 start = (start) ? start : new Date().getYear() + 1899 + '-01-01'; /* include last year's closed info for comparison */
139 end = (end) ? end : '3001-01-01';
141 if(alertSuccess) alertId('cd_update_success');
143 selectedStart = start;
146 var req = new Request(
147 FETCH_CLOSED_DATES, SESSION,
149 orgid : cdCurrentOrg(),
156 req.callback( cdBuild );
160 /* adds one row in the display table per date */
161 function cdBuild(r) {
162 var dates = r.getResultObject();
163 removeChildren(cdTbody);
164 for( var d = 0; d < dates.length; d++ ) {
168 cdGetTZ(date.org_unit(), function () {
169 var row = cdBuildRow( date );
170 cdTbody.appendChild(row);
176 function cdDateToHours(date, org) {
177 var date_obj = moment(date).tz(orgTZ[org]);
178 var hrs = date_obj.hours();
179 var mins = date_obj.minutes();
181 if (hrs < 10) hrs = '0' + hrs;
182 if (mins < 10) mins = '0' + mins;
183 return hrs + ':' + mins;
186 function cdDateToDate(date, org) {
187 var date_obj = moment(date).tz(orgTZ[org]);
188 return date_obj.format('YYYY-MM-DD');
191 function cdGetTZ(org, callback) {
193 if (callback) callback();
197 fieldmapper.standardRequest(
199 'open-ils.actor.ou_setting.ancestor_default.batch'],
201 params: [org, ['lib.timezone'], SESSION],
202 oncomplete: function(r) {
203 var data = r.recv().content();
204 if(e = openils.Event.parse(data))
206 if (data['lib.timezone'] && data['lib.timezone'].value) {
207 orgTZ[org] = data['lib.timezone'].value;
209 orgTZ[org] = OpenSRF.tz;
211 if (callback) callback();
218 /* fleshes a single date */
219 function cdBuildRow( date ) {
221 cdDateCache[date.id()] = date;
223 var sh = cdDateToHours(date.close_start(), date.org_unit());
224 var sd = cdDateToDate(date.close_start(), date.org_unit());
225 var eh = cdDateToHours(date.close_end(), date.org_unit());
226 var ed = cdDateToDate(date.close_end(), date.org_unit());
231 if( isTrue(date.full_day()) ) {
233 if( !isTrue(date.multi_day()) ) {
234 row = cdAllDayTemplate.cloneNode(true);
235 $n(row, 'start_date').appendChild(text(sd));
238 row = cdAllMultiDayTemplate.cloneNode(true);
239 $n(row, 'start_date').appendChild(text(sd));
240 $n(row, 'end_date').appendChild(text(ed));
245 row = cdRowTemplate.cloneNode(true);
246 cdEditFleshRow(row, date);
249 $n(row,'delete').onclick = function() { cdDelete(row, date); };
250 $n(row, 'note').appendChild(text(date.reason()));
252 /* if we don't have delete perms for this location, disable the button */
253 var delorg = findOrgUnit(PERMS['actor.org_unit.closed_date.delete']);
254 if(!orgIsMine(delorg, findOrgUnit(cdCurrentOrg()))) $n(row,'delete').disabled = true;
259 function cdEditFleshRow(row, date) {
260 $n(row, 'start_time').appendChild(text(cdDateToHours(date.close_start(), date.org_unit())));
261 $n(row, 'start_date').appendChild(text(cdDateToDate(date.close_start(), date.org_unit())));
262 $n(row, 'end_time').appendChild(text(cdDateToHours(date.close_end(), date.org_unit())));
263 $n(row, 'end_date').appendChild(text(cdDateToDate(date.close_end(), date.org_unit())));
267 function cdShowEditRow(id) {
270 unHideMe($('cd_edit_submit'));
271 unHideMe($('cd_edit_note_row'));
274 function cdCancelEdit() {
275 hideMe($('cd_edit_row'));
276 hideMe($('cd_edit_allday_row'));
277 hideMe($('cd_edit_allmultiday_row'));
278 hideMe($('cd_edit_submit'));
279 hideMe($('cd_edit_note_row'));
285 function cdDelete(row, date) {
286 if(!confirmId('cd_confirm_delete')) return;
287 var req = new Request(DELETE_CLOSED_DATE, SESSION, date.id() );
290 var res = r.getResultObject();
291 if( checkILSEvent(res) ) alertILSEvent(res);
292 cdDrawRange(selectedStart, selectedEnd, true);
299 function cdVerifyDate(d) {
300 return d && d.match(/\d{4}-\d{2}-\d{2}/);
303 function cdVerifyTime(t) {
304 return t && t.match(/\d{2}:\d{2}:\d{2}/);
307 function cdDateStrToDate( str, org, callback ) {
308 if (!org) org = cdCurrentOrg();
310 if (callback) { // async mode
311 if (!orgTZ[org]) { // fetch then call again
312 return cdGetTZ(org, function () {
313 cdDateStrToDate( str, org, callback );
316 var d = cdDateStrToDate( str, org );
323 date = moment(new Date()).tz(orgTZ[org]);
325 date = moment(new Date());
328 var data = str.replace(/\s+/, 'T').split(/T/);
333 if(!cdVerifyDate(year)) return alertId('cd_invalid_date');
334 if(!cdVerifyTime(time)) return alertId('cd_invalid_time');
336 var yeardata = year.split(/-/);
337 var timedata = time.split(/:/);
339 /* seed the date with day = 1, which is a valid day for any month.
340 this prevents automatic date correction by the date code for days that
341 fall outside of the current or target month */
344 date.year(new Number(yeardata[0]));
345 date.month(new Number(yeardata[1]) - 1);
346 date.date(new Number(yeardata[2]));
348 date.hour(new Number(timedata[0]));
349 date.minute(new Number(timedata[1]));
350 date.second(new Number(timedata[2]));
362 if( ! $('cd_edit_allday_row').className.match(/hide_me/) ) {
364 var date = $('cd_edit_allday_start_date').value;
366 start = cdDateStrToDate(date + 'T00:00:00');
367 end = cdDateStrToDate(date + 'T23:59:59');
370 } else if( ! $('cd_edit_allmultiday_row').className.match(/hide_me/) ) {
372 var sdate = $('cd_edit_allmultiday_start_date').value;
373 var edate = $('cd_edit_allmultiday_end_date').value;
374 start = cdDateStrToDate(sdate + 'T00:00:00');
375 end = cdDateStrToDate(edate + 'T23:59:59');
381 var sdate = $('cd_edit_start_date').value;
382 var edate = $('cd_edit_end_date').value;
386 if($('cd_edit_start_time_allday').checked) {
389 stime = $('cd_edit_start_time').value;
394 if($('cd_edit_end_time_allday').checked) {
397 etime = $('cd_edit_end_time').value;
401 start = cdDateStrToDate(sdate + 'T' + stime);
402 end = cdDateStrToDate(edate + 'T' + etime);
405 if (end.unix() < start.unix()) {
406 alertId('cd_invalid_date_span');
410 cdCreate(start, end, $('cd_edit_note').value, full_day, multi_day);
413 function cdCreate(start, end, note, full_day, multi_day) {
415 if( $('cd_apply_all').checked ) {
416 var list = cdGetOrgList();
417 for( var o = 0; o < list.length; o++ ) {
418 var id = list[o].id();
419 cdCreateOne( id, start, end, note, full_day, multi_day, (id == cdCurrentOrg()) );
424 cdCreateOne( cdCurrentOrg(), start, end, note, full_day, multi_day, true );
428 function cdGetOrgList(org) {
429 if(!org) org = cdBaseOrg;
432 var type = findOrgType(org.ou_type()) ;
433 if( type.can_have_users() ) list.push(org);
435 if( org.children() ) {
436 for( var i = 0; i < org.children().length; i++ ) {
437 var child = org.children()[i];
439 var l = cdGetOrgList(child);
440 for( var j = 0; j < l.length; j++ )
449 function cdCreateOne( org, start, end, note, full_day, multi_day, refresh ) {
450 var date = new aoucd();
452 // force TZ normalization
453 cdDateStrToDate(start.format('YYYY-MM-DD HH:mm:ss'), org, function (s) {
455 cdDateStrToDate(end.format('YYYY-MM-DD HH:mm:ss'), org, function (e) {
458 date.close_start(start.toISOString());
459 date.close_end(end.toISOString());
462 date.full_day(full_day);
463 date.multi_day(multi_day);
465 var req = new Request(CREATE_CLOSED_DATE, SESSION, date);
468 var res = r.getResultObject();
469 if( checkILSEvent(res) ) alertILSEvent(res);
470 if(refresh) cdDrawRange(selectedStart, selectedEnd, true);