]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/myopac.js
bold/red-ifying the text for when the hold is available
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / myopac.js
1
2 attachEvt("common", "run", myOPACInit );
3 attachEvt("common", "loggedIn", myOPACInit );
4
5 attachEvt('common','locationUpdated', myopacReload );
6
7 var fleshedUser = null;
8 var fleshedContainers = {};
9 var holdCache = {};
10
11
12 function clearNodes( node, keepArray ) {
13         if(!node) return;
14         for( var n in keepArray ) node.removeChild(keepArray[n]);
15         removeChildren(node);
16         for( var n in keepArray ) node.appendChild(keepArray[n]);
17 }
18
19 function myOPACInit() {
20         if(!(G.user && G.user.session)) initLogin();
21         else myOPACChangePage( "summary" );
22 }
23
24 function myopacReload() {
25         swapCanvas($('myopac_reloading'));
26         var a = {};
27         a[PARAM_LOCATION] = getNewSearchLocation();
28         a[PARAM_DEPTH] = getNewSearchDepth();
29         goTo(buildOPACLink(a, true));
30 }
31
32
33 function myOPACChangePage( page ) {
34         
35         var s = $("myopac_summary_td");
36         var c = $("myopac_checked_td");
37         var f = $("myopac_fines_td");
38         var h = $("myopac_holds_td");
39         var p = $("myopac_prefs_td");
40         var b = $('myopac_bookbag_td');
41
42         var ss = $("myopac_summary_div");
43         var cc = $("myopac_checked_div");
44         var ff = $("myopac_fines_div");
45         var hh = $("myopac_holds_div");
46         var pp = $("myopac_prefs_div");
47         var bb = $('myopac_bookbag_div');
48
49         var cls = "myopac_link";
50         var acls = "myopac_link_active";
51
52         hideMe(ss);
53         hideMe(cc); hideMe(ff);
54         hideMe(hh); hideMe(pp);
55         hideMe(bb);
56
57         removeCSSClass(s, acls );
58         removeCSSClass(c, acls );
59         removeCSSClass(f, acls );
60         removeCSSClass(h, acls );
61         removeCSSClass(p, acls );
62         removeCSSClass(b, acls );
63
64         switch( page ) {
65
66                 case "summary": 
67                         unHideMe(ss);
68                         addCSSClass(s, acls );
69                         myOPACShowSummary();
70                         break;
71
72                 case "checked": 
73                         unHideMe(cc);
74                         addCSSClass(c, acls );
75                         myOPACShowChecked();
76                         break;
77
78                 case "holds": 
79                         unHideMe(hh);
80                         addCSSClass(h, acls );
81                         myOPACShowHolds();
82                         break;
83
84                 case "fines": 
85                         unHideMe(ff);
86                         addCSSClass(f, acls );
87                         myOPACShowFines();
88                         break;
89
90                 case "prefs": 
91                         unHideMe(pp);
92                         addCSSClass(p, acls );
93                         myOPACShowPrefs();
94                         break;
95
96                 case 'bookbag':
97                         unHideMe(bb);
98                         addCSSClass(b, acls);
99                         myOPACShowBookbags();
100                         break;
101         }
102 }
103
104 function myOPACShowChecked() {
105         if(checkedDrawn) return;
106         var req = new Request(FETCH_CHECKED_OUT_SLIM, G.user.session);  
107         req.callback(myOPACDrawCheckedOutSlim);
108         req.send();
109
110         var nreq = new Request(FETCH_NON_CAT_CIRCS, G.user.session);
111         nreq.callback(myOPACDrawNonCatCircs);
112         nreq.send();
113 }
114
115
116 var checkedRowTemplate;
117 var circsCache = new Array();
118 var checkedDrawn = false;
119
120 function myOPACDrawCheckedOutSlim(r) {
121
122         var checked                     = r.getResultObject();
123         var tbody                       = $("myopac_checked_tbody");
124         var loading                     = $("myopac_checked_loading");
125         var none                                = $("myopac_checked_none");
126
127         if(checkedDrawn) return;
128         checkedDrawn = true;
129         if(!checkedRowTemplate) 
130                 checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));
131
132         clearNodes( tbody, [ loading, none ] );
133
134         hideMe(loading); /* remove all children and start over */
135         if(!(checked && checked[0])) unHideMe(none);
136
137         for( var idx in checked ) {
138
139                 var circ    = checked[idx]
140                 var row = checkedRowTemplate.cloneNode(true);
141                 row.id = 'myopac_checked_row_ ' + circ.id();
142
143                 var due = circ.due_date();
144       due = due.replace(/[0-9][0-9]:.*$/,"");
145
146                 var dlink = $n( row, "myopac_checked_due" );
147                 var rlink = $n( row, "myopac_checked_renewals" );
148                 var rnlink = $n( row, "myopac_checked_renew_link" );
149
150                 dlink.appendChild(text(due));
151                 rlink.appendChild(text(circ.renewal_remaining()));
152                 unHideMe(row);
153                 rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');
154                 circsCache.push(circ);
155
156                 if( circ.renewal_remaining() < 1 ) hideMe(rnlink);
157
158                 tbody.appendChild(row);
159
160                 var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );
161                 req.request.alertEvent = false;
162                 req.request.circ = circ.id();
163                 req.request.copy = circ.target_copy();
164                 req.callback(myOPACDrawCheckedTitle);
165                 req.send();
166         }
167 }
168
169 function myOPACDrawCheckedTitle(r) {
170         var record = r.getResultObject();
171         var circid = r.circ;
172
173         if(!record || checkILSEvent(record)) {
174                 var req = new Request( FETCH_COPY, r.copy );
175                 req.request.circ = circid
176                 req.callback(myOPACDrawNonCatalogedItem);
177                 req.send();
178                 return;
179         }
180
181         var row = $('myopac_checked_row_ ' + circid);
182         var tlink = $n( row, "myopac_checked_title_link" );
183         var alink = $n( row, "myopac_checked_author_link" );
184         buildTitleDetailLink(record, tlink);
185         buildSearchLink(STYPE_AUTHOR, record.author(), alink);
186 }
187
188 function myOPACDrawNonCatalogedItem(r) {
189         var copy = r.getResultObject();
190         var circid = r.circ;
191
192         var row = $('myopac_checked_row_ ' + circid);
193         var tlink = $n( row, "myopac_checked_title_link" );
194         var alink = $n( row, "myopac_checked_author_link" );
195
196         tlink.parentNode.appendChild(text(copy.dummy_title()));
197         alink.parentNode.appendChild(text(copy.dummy_author()));
198 }
199
200
201 function myOPACRenewCirc(circid) {
202
203         var circ;
204         for( var i = 0; i != circsCache.length; i++ ) 
205                 if(circsCache[i].id() == circid)
206                         circ = circsCache[i];
207
208         if(!confirm($('myopac_renew_confirm').innerHTML)) return;
209
210         var req = new Request(RENEW_CIRC, G.user.session, 
211                 { patron : G.user.id(), copyid : circ.target_copy() } );
212         req.send(true);
213         var res = req.result();
214
215         if(checkILSEvent(res)) {
216                 alertILSEvent(res);
217                 return;
218         }
219
220         alert($('myopac_renew_success').innerHTML);     
221         checkedDrawn = false;
222         myOPACShowChecked();
223 }
224
225
226
227 function myOPACShowHolds() {
228         var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());        
229         req.callback(myOPACDrawHolds);
230         req.send();
231 }
232
233 var holdsTemplateRowOrig;
234 var holdsTemplateRow;
235 function myOPACDrawHolds(r) {
236
237         var tbody = $("myopac_holds_tbody");
238         if(holdsTemplateRow) return;
239         if(holdsTemplateRowOrig) {
240                 holdsTemplateRow = holdsTemplateRowOrig;
241                 removeChildren(tbody);
242         } else {
243                 holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));
244                 holdsTemplateRowOrig = holdsTemplateRow;
245         }
246
247         hideMe($('myopac_holds_loading'));
248
249         var holds = r.getResultObject();
250
251         if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));
252         for( var i = 0; i != holds.length; i++ ) {
253
254                 var h = holds[i];
255                 holdCache[h.id()] = h;
256
257                 var row = holdsTemplateRow.cloneNode(true);
258                 row.id = "myopac_holds_row_" + h.id() + '_' + h.target();
259
260                 var formats = (h.holdable_formats()) ? h.holdable_formats() : null;
261                 var form = $n(row, "myopac_holds_formats");
262                 form.id = "myopac_holds_form_" + h.id() + '_' + h.target();
263                 if(formats) form.appendChild(text(formats));
264
265                 var orglink = $n(row, "myopac_holds_location");
266                 orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
267
268                 tbody.appendChild(row);
269
270                 $n(row,'myopac_holds_cancel_link').setAttribute(
271                         'href','javascript:myOPACCancelHold("'+ h.id()+'");'); 
272
273                 $n(row,'myopac_holds_edit_link').setAttribute(
274                         'href','javascript:myOPACEditHold("'+ h.id()+'");'); 
275
276                 unHideMe(row);
277
278                 myOPACDrawHoldTitle(h);
279                 myOPACDrawHoldStatus(h);
280         }
281 }
282
283 function myOPACEditHold(holdid) {
284         var hold = holdCache[holdid];
285         holdsDrawWindow(hold.target(), hold.hold_type(), hold, 
286                 function(){
287                         holdsTemplateRow = null;
288                         myOPACShowHolds();
289                 }
290         );
291 }
292
293
294 function myOPACCancelHold(holdid) {
295         if( confirm($('myopac_holds_cancel_verify').innerHTML) ) {
296                 holdsCancel(holdid);
297                 holdsTemplateRow = null
298                 myOPACShowHolds();
299         }
300 }
301
302
303 function myOPACDrawHoldStatus(hold) {
304         var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );
305         req.callback(myOShowHoldStatus);
306         req.request.hold = hold;
307         req.send();
308 }
309
310 function myOShowHoldStatus(r) {
311
312         var hold = r.hold;
313         var status = r.getResultObject();
314         var row = $("myopac_holds_row_" + r.hold.id() + '_' + r.hold.target());
315
316         if( status < 3 )
317                 unHideMe($n(row, 'hold_status_waiting'));
318
319         if( status == 3 )
320                 unHideMe($n(row, 'hold_status_transit'));
321
322         if( status == 4 )
323                 unHideMe($n(row, 'hold_status_available'));
324 }
325
326
327 function myOPACDrawHoldTitle(hold) {
328         var method;
329         if(hold.hold_type() == "M") method = FETCH_MRMODS;
330         if(hold.hold_type() == "T") method = FETCH_RMODS;
331         var req = new Request(method, hold.target());
332         req.callback(myOPACFleshHoldTitle);
333         req.request.hold = hold.id();
334         req.send();
335 }
336
337 function myOPACFleshHoldTitle(r) {
338
339         var record = r.getResultObject();
340         var row = $("myopac_holds_row_" + r.hold + '_' + record.doc_id());
341         var title_link = $n(row, "myopac_holds_title_link");
342         var author_link = $n(row, "myopac_holds_author_link");
343
344         buildTitleDetailLink(record, title_link);
345         buildSearchLink(STYPE_AUTHOR, record.author(), author_link);
346
347         var form = $("myopac_holds_form_" + r.hold + '_' + record.doc_id());
348
349         if(form) {
350                 var img = elem("img");
351                 img.setAttribute("src", 
352                         buildImageLink('tor/' + record.types_of_resource()[0] + ".jpg"));
353                 addCSSClass(img, "myopac_form_pic");
354                 form.appendChild(img);
355         }
356 }
357
358 var finesShown = false;
359 function myOPACShowFines() {
360         if(finesShown) return; finesShown = true;
361         var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );
362         req.callback(_myOPACShowFines);
363         req.send();
364 }
365
366 function _myOPACShowFines(r) {
367         hideMe($('myopac_fines_summary_loading'));
368         unHideMe($('myopac_fines_summary_row'));
369
370         var summary = r.getResultObject();
371         var total       = "0.00"; /* localization? */
372         var paid                = "0.00";
373         var balance = "0.00";
374         if( instanceOf(summary,mous) ) {
375
376                 total           = _finesFormatNumber(summary.total_owed());
377                 paid            = _finesFormatNumber(summary.total_paid());
378                 balance = _finesFormatNumber(summary.balance_owed());
379
380                 var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );
381                 req.callback(myOPACShowTransactions);
382                 req.send();
383         }
384
385         $('myopac_fines_summary_total').appendChild(text(total));
386         $('myopac_fines_summary_paid').appendChild(text(paid));
387         $('myopac_fines_summary_balance').appendChild(text(balance));
388 }
389
390 function _finesFormatNumber(num) {
391         if(isNull(num)) num = 0;
392         num = num + "";
393         if(num.length < 2 || !num.match(/\./)) num += ".00";
394         if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0";
395         return num;
396 }          
397
398 function _trimTime(time) { if(!time) return ""; return time.replace(/\ .*/,""); }
399
400 function _trimSeconds(time) { if(!time) return ""; return time.replace(/:\d\d\..*$/,""); }
401
402 function myOPACShowTransactions(r) {
403
404         if(myopacGenericTransTemplate || myopacCircTransTemplate) return;
405
406         var transactions = r.getResultObject();
407
408         for( var idx in transactions ) {
409
410                 var trans       = transactions[idx].transaction;
411                 var record      = transactions[idx].record;
412                 var circ                = transactions[idx].circ;
413
414                 if(trans.xact_type() == 'circulation') 
415                         myOPACShowCircTransaction(trans, record, circ);
416
417                 else if(trans.xact_type() == 'grocery' ) 
418                         myopacShowGenericTransaction( trans );
419         }
420 }
421
422 var myopacGenericTransTemplate;
423 function myopacShowGenericTransaction( trans ) {
424         var tbody = $('myopac_trans_tbody');
425
426         if(!myopacGenericTransTemplate) {
427                 myopacGenericTransTemplate = 
428                         tbody.removeChild($('myopac_trans_row'));
429                 removeChildren(tbody);
430         }
431
432         var row = myopacGenericTransTemplate.cloneNode(true);
433
434         $n(row,'myopac_trans_start').appendChild(
435                         text(_trimSeconds(trans.xact_start())));
436
437         $n(row,'myopac_trans_last_payment').appendChild(
438                         text(_trimSeconds(trans.last_payment_ts())));
439
440         $n(row,'myopac_trans_init_amount').appendChild(
441                         text(_finesFormatNumber(trans.total_owed())));
442
443         $n(row,'myopac_trans_total_paid').appendChild(
444                         text(_finesFormatNumber(trans.total_paid())));
445
446         $n(row,'myopac_trans_balance').appendChild(
447                         text(_finesFormatNumber(trans.balance_owed())));
448
449         var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id());
450         req.send(true);
451         var bills = req.result();
452         if(bills && bills[0])
453                 $n(row,'myopac_trans_bill_type').appendChild(
454                                 text(bills[0].billing_type()));
455
456         tbody.appendChild(row);
457         unHideMe($('myopac_trans_div'));
458 }
459
460
461
462 /* draws a circulation transaction summary */
463 var myopacCircTransTemplate;
464 function myOPACShowCircTransaction(trans, record, circ) {
465         var tbody = $('myopac_circ_trans_tbody');
466
467         if(!myopacCircTransTemplate) {
468                 myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));
469                 removeChildren(tbody);
470         }
471
472         var row = myopacCircTransTemplate.cloneNode(true);
473
474         buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title'));
475
476         $n(row,'myopac_circ_trans_author').appendChild(text(
477                 normalize(truncate(record.author(), 65))));
478
479         $n(row,'myopac_circ_trans_start').
480                 appendChild(text(_trimTime(trans.xact_start())));
481
482    var due = _trimTime(circ.due_date());
483         var checkin = _trimTime(circ.stop_fines_time());
484
485         $n(row,'myopac_circ_trans_due').appendChild(text(due))
486         if(checkin)
487                 appendClear($n(row,'myopac_circ_trans_finished'), text(checkin));
488         if(circ.stop_fines() == 'LOST')
489                 appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines()));
490         if(circ.stop_fines() == 'CLAIMSRETURNED')
491                 appendClear($n(row,'myopac_circ_trans_finished'), text(""));
492
493
494         $n(row,'myopac_circ_trans_balance').
495                 appendChild(text(_finesFormatNumber(trans.balance_owed())));
496
497         tbody.appendChild(row);
498         unHideMe($('myopac_circ_trans_div'));
499 }
500
501
502 function myOPACSavePrefs() {
503         G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per'));
504         G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font'));
505         G.user.prefs[PREF_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));
506         if(commitUserPrefs())
507                 alert($('prefs_update_success').innerHTML);
508         else alert($('prefs_update_failure').innerHTML);
509 }
510
511
512 function myOPACShowDefFont() {
513         var font;
514         if(G.user.prefs[PREF_DEF_FONT])
515                 font = G.user.prefs[PREF_DEF_FONT];
516         else font = "regular";
517         setSelector($('prefs_def_font'), font);
518 }
519
520 function myOPACShowHoldNotify() {
521         var pref = G.user.prefs[PREF_HOLD_NOTIFY];
522
523         if(pref) {
524                 if(pref.match(/email/i) && pref.match(/phone/i)) {
525                         setSelector($('prefs_hold_notify'), 'phone:email');
526                 } else if( pref.match(/email/i) ) {
527                         setSelector($('prefs_hold_notify'), 'email');
528                 } else if( pref.match(/phone/i) ) {
529                         setSelector($('prefs_hold_notify'), 'phone');
530                 }
531
532         } else {
533                 setSelector($('prefs_hold_notify'), 'phone:email');
534         }
535 }
536
537 function myOPACShowPrefs() {
538         grabUserPrefs();
539         myOPACShowHitsPer();
540         myOPACShowDefFont();
541         myOPACShowHoldNotify();
542         hideMe($('myopac_prefs_loading'));
543 }
544
545 function myOPACShowHitsPer() {
546         var hits = 10;
547         if(G.user.prefs[PREF_HITS_PER])
548                 hits = G.user.prefs[PREF_HITS_PER];
549         var hitsSel = $('prefs_hits_per');
550         setSelector(hitsSel, hits);
551 }
552
553 var userShown = false;
554 function myOPACShowSummary() {
555         if(userShown) return; userShown = true;
556         var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());
557         req.callback(_myOPACSummaryShowUer);
558         req.send();
559 }
560
561 var addrRowTemplate;
562 function _myOPACSummaryShowUer(r) {
563
564         var user = r.getResultObject();
565         fleshedUser = user;
566         if(!user) return;
567
568         appendClear($('myopac_summary_first'),text(user.first_given_name()));
569         appendClear($('myopac_summary_middle'),text(user.second_given_name()));
570         appendClear($('myopac_summary_dayphone'),text(user.day_phone()));
571         appendClear($('myopac_summary_eveningphone'),text(user.evening_phone()));
572         appendClear($('myopac_summary_otherphone'),text(user.other_phone()));
573         appendClear($('myopac_summary_last'),text(user.family_name()));
574         appendClear($('myopac_summary_username'),text(user.usrname()));
575         appendClear($('myopac_summary_email'),text(user.email()));
576         appendClear($('myopac_summary_barcode'),text(user.card().barcode()));
577         appendClear($('myopac_summary_ident1'),text(user.ident_value()));
578         appendClear($('myopac_summary_ident2'),text(user.ident_value2()));
579         appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name()));
580         appendClear($('myopac_summary_create_date'),text(user.create_date()));
581
582         var tbody = $('myopac_addr_tbody');
583         var template;
584
585         if(addrRowTemplate) { 
586                 template = addrRowTemplate;
587         } else {
588                 template = tbody.removeChild($('myopac_addr_row'));
589                 addrRowTemplate = template;
590         }
591         removeChildren(tbody);
592
593         for( var a in user.addresses() ) {
594                 var row = template.cloneNode(true);
595                 myOPACDrawAddr(row, user.addresses()[a]);
596                 tbody.appendChild(row);
597         }
598 }
599
600 function myOPACDrawAddr(row, addr) {
601
602         appendClear($n(row, 'myopac_addr_type'),text(addr.address_type()));
603         var street = (addr.street2()) ? addr.street1() + ", " + addr.street2() : addr.street1();
604         appendClear($n(row, 'myopac_addr_street'),text(street));
605         appendClear($n(row, 'myopac_addr_city'),text(addr.city()));
606         appendClear($n(row, 'myopac_addr_county'),text(addr.county()));
607         appendClear($n(row, 'myopac_addr_state'),text(addr.state()));
608         appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code()));
609 }
610
611
612 function myOPACUpdateUsername() {
613         var username = $('myopac_new_username').value;
614         if(username == null || username == "") {
615                 alert($('myopac_username_error').innerHTML);
616                 return;
617         }
618
619         /* first see if the requested username is taken */
620         var req = new Request(CHECK_USERNAME, username);
621         req.send(true);
622         if( req.result() == 1 ) {
623                 alertId('myopac_username_dup');
624                 return;
625         }
626
627         var req = new Request(UPDATE_USERNAME, G.user.session, username );
628         req.send(true);
629         if(req.result()) {
630
631                 var evt;
632                 var res = req.result();
633                 if(evt = checkILSEvent(res)) {
634                         alertILSEvent(res);
635                         return;
636                 }
637
638                 G.user.usrname(username);
639                 hideMe($('myopac_update_username_row'));
640                 userShown = false;
641                 myOPACShowSummary();
642                 return;
643         }
644
645         alert($('myopac_username_failure').innerHTML);
646 }
647
648 function myOPACUpdateEmail() {
649         var email = $('myopac_new_email').value;
650         if(email == null || email == "") {
651                 alert($('myopac_email_error').innerHTML);
652                 return;
653         }
654
655         var req = new Request(UPDATE_EMAIL, G.user.session, email );
656         req.send(true);
657         if(req.result()) {
658                 G.user.usrname(email);
659                 hideMe($('myopac_update_email_row'));
660                 userShown = false;
661                 myOPACShowSummary();
662                 return;
663         }
664
665         alert($('myopac_email_failure').innerHTML);
666 }
667
668
669 function myOPACUpdatePassword() {
670         var curpassword = $('myopac_current_password').value;
671         var password = $('myopac_new_password').value;
672         var password2 = $('myopac_new_password2').value;
673
674         if(     curpassword == null || curpassword == "" || 
675                         password == null || password == "" || 
676                         password2 == null || password2 == "" || password != password2 ) {
677                 alert($('myopac_password_error').innerHTML);
678                 return;
679         }
680
681         if(!strongPassword(password, true)) return;
682
683         var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword );
684         req.send(true);
685         if(req.result()) {
686                 hideMe($('myopac_update_password_row'));
687                 userShown = false;
688                 myOPACShowSummary();
689                 alert($('pw_update_successful').innerHTML);
690                 return;
691         }
692
693         alert($('myopac_password_failure').innerHTML);
694 }
695
696
697
698
699 var containerTemplate;
700 function myOPACShowBookbags(force) {
701
702         var tbody =$('myopac_bookbag_tbody') ;
703
704         if(!containerTemplate) 
705                 containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));
706         else if(!force) return;
707
708         removeChildren(tbody);
709
710         var containers = containerFetchAll();
711
712         var found = false;
713         for( var i in containers ) {
714                 found = true;
715                 var cont = containers[i];
716                 var row = containerTemplate.cloneNode(true);
717                 row.id = 'myopac_bookbag_row_' + cont.id();
718                 var link = $n(row, 'myopac_expand_bookbag');
719                 var dlink = $n(row, 'myopac_container_delete');
720                 link.appendChild( text(cont.name()) );
721                 link.setAttribute('href', 
722                         'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');
723                 myOPACFetchBBItems( cont.id(), row );
724                 dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');
725
726                 if( cont.pub() ) {
727                         unHideMe($n(row, 'myopac_bb_published_yes'));
728                         var link = $n(row, 'myopac_bb_published_view');
729                         /*
730                         link.setAttribute('href', buildExtrasLink( 'bbags.xml?bb='+cont.id(), false));  
731                         */
732                         link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html/'+cont.id(), false));  
733                         link.setAttribute('target', '_blank' );
734                         unHideMe(link);
735
736                         link = $n(row, 'myopac_bb_make_unpublished');
737                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');
738                         unHideMe(link);
739
740                 } else { 
741                         unHideMe($n(row, 'myopac_bb_published_no')); 
742                         var link = $n(row, 'myopac_bb_make_published');
743                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');
744                         unHideMe(link);
745                 }
746
747                 tbody.appendChild(row); 
748         }
749
750         if(!found) unHideMe($('myopac_bookbags_none'));
751         else unHideMe($('myopac_bookbag_table'));       
752 }
753
754 function myOPACMakeBBPublished(bbid, hideme) {
755
756         var bb = fleshedContainers[bbid];
757
758         if(hideme) {
759                 if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;
760                 bb.pub(0);
761         } else {
762                 if(!confirm($('myopac_make_published_confirm').innerHTML)) return;
763                 bb.pub(1);
764         }
765
766         var result = containerUpdate(bb);
767
768         var code = checkILSEvent(result);
769         if(code) { alertILSEvent(result); return; }
770
771         if(result) alert($('myopac_bb_update_success').innerHTML);
772         myOPACShowBookbags(true);
773 }
774
775
776
777 function myOPACDeleteBookbag(id) {
778         if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {
779                 var result = containerDelete(id);
780                 var code = checkILSEvent(result);
781                 if(code) { alertILSEvent(result); return; }
782                 hideMe($('myopac_bookbag_items_table'));
783                 hideMe($('myopac_bookbag_items_name'));
784                 hideMe($('myopac_bookbag_no_items'));
785                 myOPACShowBookbags(true);
786         }
787 }
788
789 function myOPACFetchBBItems( id, row, block ) {
790         if(!block) {
791                 containerFlesh( id, _myOPACSetBBItems, { row: row }  );
792         } else {
793                 var cont = containerFlesh(id);
794                 myOPACSetBBItems( cont, row );
795         }
796 }
797
798 function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }
799
800 function myOPACSetBBItems( container, row ) {
801         fleshedContainers[container.id()] = container;
802         var node = $n(row, 'myopac_bookbag_item_count');
803         removeChildren(node);
804         node.appendChild( text(container.items().length) );
805 }
806
807 var BBItemsRow;
808 function myOPACExpandBookbag( id, name ) {
809         
810         var tbody = $('myopac_bookbag_items_tbody');
811         if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));
812         removeChildren(tbody);
813         removeChildren($('myopac_bookbag_items_name'));
814
815         $('myopac_bookbag_items_name').appendChild(text(name));
816
817         if( fleshedContainers[id] ) {
818                 var len = fleshedContainers[id].items().length;
819
820                 if( len == 0 ) {
821                         unHideMe($('myopac_bookbag_no_items'));
822                         hideMe($('myopac_bookbag_items_table'));
823                         return;
824                 }
825
826                 hideMe($('myopac_bookbag_no_items'));
827                 unHideMe($('myopac_bookbag_items_table'));
828
829                 for( var i = 0; i != len; i++ ) {
830                         var row = BBItemsRow.cloneNode(true);
831                         found = true;
832
833                         var item = fleshedContainers[id].items()[i];
834                         var tlink = $n(row,'myopac_bookbag_items_title');
835                         var alink = $n(row,'myopac_bookbag_items_author');
836
837                         var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );
838                         req.request.tlink = tlink;
839                         req.request.alink = alink;
840                         req.callback(myOPACShowBBItem);
841                         req.send();
842
843                         var clink = $n(row, 'myopac_bookbag_items_remove');
844                         clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');
845
846                         tbody.appendChild(row);
847                 }
848         }
849 }
850
851 function myOPACRemoveBBItem( id, containerid, container_name ) {
852         if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;
853         containerRemoveItem( id );
854         myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);
855         myOPACExpandBookbag( containerid, container_name );
856 }
857
858 function myOPACShowBBItem(r) {
859         var record = r.getResultObject();
860         buildTitleDetailLink(record, r.tlink);
861         buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);
862 }
863
864 function myOPACCreateBookbag() {
865         var name = $('myopac_bookbag_new_name').value;  
866         if(!name) return;
867
868         var exists = false;
869         for( var c in fleshedContainers ) { exists = true; break; }
870
871         /* let them know what they are getting into... */
872         if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return;
873
874         var result = containerCreate( name, $('bb_public_yes').checked );
875         var code = checkILSEvent(result);
876         if(code) { alertILSEvent(result); return; }
877         myOPACShowBookbags(true);
878 }
879
880
881 /* ---------------------------------------------------------------------- */
882 /* Non cat circs */
883 /* ---------------------------------------------------------------------- */
884
885 var nonCatCircIds;
886 var nonCatTypes;
887 /* if we have some circs, grab the non-cat types */
888 function myOPACDrawNonCatCircs(r) {
889         var ids = r.getResultObject();
890         if(ids.length == 0) return;
891         nonCatCircIds = ids;
892         unHideMe($('non_cat_circs_div'));
893         var req = new Request(FETCH_NON_CAT_TYPES, G.user.home_ou());
894         req.callback(myOPACDrawNonCatCircs2);
895         req.send();
896 }
897
898
899 /* now we have circs and the types.. draw each one */
900 var nonCatTbody;
901 var nonCatRow;
902 function myOPACDrawNonCatCircs2(r) {
903         nonCatTypes = r.getResultObject();
904         nonCatTbody = $('non_cat_circs_tbody');
905         if(!nonCatRow) nonCatRow = 
906                 nonCatTbody.removeChild($('non_cat_circs_row'));
907         removeChildren(nonCatTbody);
908         for( var i in nonCatCircIds ) {
909                 var req = new Request(FETCH_NON_CAT_CIRC, G.user.session, nonCatCircIds[i]);
910                 req.callback(myOPACDrawNonCatCirc);
911                 req.send();
912         }
913 }
914
915
916 /* draw a single circ */
917 function myOPACDrawNonCatCirc(r) {
918         var circ = r.getResultObject();
919
920
921         var type = grep(nonCatTypes, 
922                 function(i){
923                         return (i.id() == circ.item_type());
924                 }
925         )[0];
926
927
928         var row = nonCatTbody.appendChild(nonCatRow.cloneNode(true));
929         appendClear($n(row, 'circ_lib'), text(findOrgUnit(circ.circ_lib()).name()));
930         appendClear($n(row, 'item_type'), text(type.name()));
931
932         var duration = interval_to_seconds(type.circ_duration());
933         duration = parseInt(duration + '000');
934
935         var dtf = circ.circ_time();
936
937         /*Date.W3CDTF is not happy with the milliseonds, nor is it
938         happy without minute component of the timezone */
939         dtf = dtf.replace(/\.\d+/,'');
940         dtf += ":00"; 
941
942         var start = new Date.W3CDTF();
943         start.setW3CDTF(dtf);
944         var due = new Date(  start.getTime() + duration );
945
946         appendClear($n(row, 'circ_time'), text(due));
947 }
948
949
950
951