]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/myopac.js
added hold status to hold list in myopac
[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
111
112 var checkedRowTemplate;
113 var circsCache = new Array();
114 var checkedDrawn = false;
115
116 function myOPACDrawCheckedOutSlim(r) {
117
118         var checked                     = r.getResultObject();
119         var tbody                       = $("myopac_checked_tbody");
120         var loading                     = $("myopac_checked_loading");
121         var none                                = $("myopac_checked_none");
122
123         if(checkedDrawn) return;
124         checkedDrawn = true;
125         if(!checkedRowTemplate) 
126                 checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));
127
128         clearNodes( tbody, [ loading, none ] );
129
130         hideMe(loading); /* remove all children and start over */
131         if(!(checked && checked[0])) unHideMe(none);
132
133         for( var idx in checked ) {
134
135                 var circ    = checked[idx]
136                 var row = checkedRowTemplate.cloneNode(true);
137                 row.id = 'myopac_checked_row_ ' + circ.id();
138
139                 var due = circ.due_date();
140       due = due.replace(/[0-9][0-9]:.*$/,"");
141
142                 var dlink = $n( row, "myopac_checked_due" );
143                 var rlink = $n( row, "myopac_checked_renewals" );
144                 var rnlink = $n( row, "myopac_checked_renew_link" );
145
146                 dlink.appendChild(text(due));
147                 rlink.appendChild(text(circ.renewal_remaining()));
148                 unHideMe(row);
149                 rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');
150                 circsCache.push(circ);
151
152                 tbody.appendChild(row);
153
154                 var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );
155                 req.request.circ = circ.id();
156                 req.request.copy = circ.target_copy();
157                 req.callback(myOPACDrawCheckedTitle);
158                 req.send();
159         }
160 }
161
162 function myOPACDrawCheckedTitle(r) {
163         var record = r.getResultObject();
164         var circid = r.circ;
165
166         if(!record || checkILSEvent(record)) {
167                 var req = new Request( FETCH_COPY, r.copy );
168                 req.request.circ = circid
169                 req.callback(myOPACDrawNonCatalogedItem);
170                 req.send();
171                 return;
172         }
173
174         var row = $('myopac_checked_row_ ' + circid);
175         var tlink = $n( row, "myopac_checked_title_link" );
176         var alink = $n( row, "myopac_checked_author_link" );
177         buildTitleDetailLink(record, tlink);
178         buildSearchLink(STYPE_AUTHOR, record.author(), alink);
179 }
180
181 function myOPACDrawNonCatalogedItem(r) {
182         var copy = r.getResultObject();
183         var circid = r.circ;
184
185         var row = $('myopac_checked_row_ ' + circid);
186         var tlink = $n( row, "myopac_checked_title_link" );
187         var alink = $n( row, "myopac_checked_author_link" );
188
189         tlink.parentNode.appendChild(text(copy.dummy_title()));
190         alink.parentNode.appendChild(text(copy.dummy_author()));
191 }
192
193
194 function myOPACRenewCirc(circid) {
195
196         var circ;
197         for( var i = 0; i != circsCache.length; i++ ) 
198                 if(circsCache[i].id() == circid)
199                         circ = circsCache[i];
200
201         if(!confirm($('myopac_renew_confirm').innerHTML)) return;
202
203         var req = new Request(RENEW_CIRC, G.user.session, 
204                 { patron : G.user.id(), copyid : circ.target_copy() } );
205         req.send(true);
206         var res = req.result();
207
208         if(evt = checkILSEvent(res)) {
209                 if( evt != 0 ) {
210                         alert(evt);
211                         alertILSEvent(evt);
212                         return;
213                 }
214         }
215
216         alert($('myopac_renew_success').innerHTML);     
217         checkedDrawn = false;
218         myOPACShowChecked();
219 }
220
221
222
223 function myOPACShowHolds() {
224         var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());        
225         req.callback(myOPACDrawHolds);
226         req.send();
227 }
228
229 var holdsTemplateRowOrig;
230 var holdsTemplateRow;
231 function myOPACDrawHolds(r) {
232
233         var tbody = $("myopac_holds_tbody");
234         if(holdsTemplateRow) return;
235         if(holdsTemplateRowOrig) {
236                 holdsTemplateRow = holdsTemplateRowOrig;
237                 removeChildren(tbody);
238         } else {
239                 holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));
240                 holdsTemplateRowOrig = holdsTemplateRow;
241         }
242
243         hideMe($('myopac_holds_loading'));
244
245         var holds = r.getResultObject();
246
247         if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));
248         for( var i = 0; i != holds.length; i++ ) {
249
250                 var h = holds[i];
251                 holdCache[h.id()] = h;
252
253                 var row = holdsTemplateRow.cloneNode(true);
254                 row.id = "myopac_holds_row_" + h.id() + '_' + h.target();
255
256                 var formats = (h.holdable_formats()) ? h.holdable_formats() : null;
257                 var form = $n(row, "myopac_holds_formats");
258                 form.id = "myopac_holds_form_" + h.id() + '_' + h.target();
259                 if(formats) form.appendChild(text(formats));
260
261                 var orglink = $n(row, "myopac_holds_location");
262                 orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));
263
264                 tbody.appendChild(row);
265
266                 $n(row,'myopac_holds_cancel_link').setAttribute(
267                         'href','javascript:myOPACCancelHold("'+ h.id()+'");'); 
268
269                 $n(row,'myopac_holds_edit_link').setAttribute(
270                         'href','javascript:myOPACEditHold("'+ h.id()+'");'); 
271
272                 unHideMe(row);
273
274                 myOPACDrawHoldTitle(h);
275                 myOPACDrawHoldStatus(h);
276         }
277 }
278
279 function myOPACEditHold(holdid) {
280         var hold = holdCache[holdid];
281         holdsDrawWindow(hold.target(), hold.hold_type(), hold, 
282                 function(){
283                         holdsTemplateRow = null;
284                         myOPACShowHolds();
285                 }
286         );
287 }
288
289
290 function myOPACCancelHold(holdid) {
291         if( confirm($('myopac_holds_cancel_verify').innerHTML) ) {
292                 holdsCancel(holdid);
293                 holdsTemplateRow = null
294                 myOPACShowHolds();
295         }
296 }
297
298
299 function myOPACDrawHoldStatus(hold) {
300         var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );
301         req.callback(myOShowHoldStatus);
302         req.request.hold = hold;
303         req.send();
304 }
305
306 function myOShowHoldStatus(r) {
307
308         var hold = r.hold;
309         var status = r.getResultObject();
310         var row = $("myopac_holds_row_" + r.hold.id() + '_' + r.hold.target());
311
312         if( status < 3 )
313                 unHideMe($n(row, 'hold_status_waiting'));
314
315         if( status == 3 )
316                 unHideMe($n(row, 'hold_status_transit'));
317
318         if( status == 4 )
319                 unHideMe($n(row, 'hold_status_available'));
320 }
321
322 function myOPACDrawHoldTitle(hold) {
323         var method;
324         if(hold.hold_type() == "M") method = FETCH_MRMODS;
325         if(hold.hold_type() == "T") method = FETCH_RMODS;
326         var req = new Request(method, hold.target());
327         req.callback(myOPACFleshHoldTitle);
328         req.request.hold = hold.id();
329         req.send();
330 }
331
332 function myOPACFleshHoldTitle(r) {
333
334         var record = r.getResultObject();
335         var row = $("myopac_holds_row_" + r.hold + '_' + record.doc_id());
336         var title_link = $n(row, "myopac_holds_title_link");
337         var author_link = $n(row, "myopac_holds_author_link");
338
339         buildTitleDetailLink(record, title_link);
340         buildSearchLink(STYPE_AUTHOR, record.author(), author_link);
341
342         var form = $("myopac_holds_form_" + r.hold + '_' + record.doc_id());
343
344         if(form) {
345                 var img = elem("img");
346                 img.setAttribute("src", 
347                         buildImageLink('tor/' + record.types_of_resource()[0] + ".jpg"));
348                 addCSSClass(img, "myopac_form_pic");
349                 form.appendChild(img);
350         }
351 }
352
353 var finesShown = false;
354 function myOPACShowFines() {
355         if(finesShown) return; finesShown = true;
356         var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );
357         req.callback(_myOPACShowFines);
358         req.send();
359 }
360
361 function _myOPACShowFines(r) {
362         hideMe($('myopac_fines_summary_loading'));
363         unHideMe($('myopac_fines_summary_row'));
364
365         var summary = r.getResultObject();
366         var total       = "0.00"; /* localization? */
367         var paid                = "0.00";
368         var balance = "0.00";
369         if( instanceOf(summary,mous) ) {
370
371                 total           = _finesFormatNumber(summary.total_owed());
372                 paid            = _finesFormatNumber(summary.total_paid());
373                 balance = _finesFormatNumber(summary.balance_owed());
374
375                 var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );
376                 req.callback(myOPACShowTransactions);
377                 req.send();
378         }
379
380         $('myopac_fines_summary_total').appendChild(text(total));
381         $('myopac_fines_summary_paid').appendChild(text(paid));
382         $('myopac_fines_summary_balance').appendChild(text(balance));
383 }
384
385 function _finesFormatNumber(num) {
386         if(isNull(num)) num = 0;
387         num = num + "";
388         if(num.length < 2 || !num.match(/\./)) num += ".00";
389         if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0";
390         return num;
391 }          
392
393 function _trimTime(time) { if(!time) return ""; return time.replace(/\ .*/,""); }
394
395 function _trimSeconds(time) { if(!time) return ""; return time.replace(/:\d\d\..*$/,""); }
396
397 function myOPACShowTransactions(r) {
398
399         if(myopacGenericTransTemplate || myopacCircTransTemplate) return;
400
401         var transactions = r.getResultObject();
402
403         for( var idx in transactions ) {
404
405                 var trans       = transactions[idx].transaction;
406                 var record      = transactions[idx].record;
407                 var circ                = transactions[idx].circ;
408
409                 if(trans.xact_type() == 'circulation') 
410                         myOPACShowCircTransaction(trans, record, circ);
411
412                 else if(trans.xact_type() == 'grocery' ) 
413                         myopacShowGenericTransaction( trans );
414         }
415 }
416
417 var myopacGenericTransTemplate;
418 function myopacShowGenericTransaction( trans ) {
419         var tbody = $('myopac_trans_tbody');
420
421         if(!myopacGenericTransTemplate) {
422                 myopacGenericTransTemplate = 
423                         tbody.removeChild($('myopac_trans_row'));
424                 removeChildren(tbody);
425         }
426
427         var row = myopacGenericTransTemplate.cloneNode(true);
428
429         $n(row,'myopac_trans_start').appendChild(
430                         text(_trimSeconds(trans.xact_start())));
431
432         $n(row,'myopac_trans_last_payment').appendChild(
433                         text(_trimSeconds(trans.last_payment_ts())));
434
435         $n(row,'myopac_trans_init_amount').appendChild(
436                         text(_finesFormatNumber(trans.total_owed())));
437
438         $n(row,'myopac_trans_total_paid').appendChild(
439                         text(_finesFormatNumber(trans.total_paid())));
440
441         $n(row,'myopac_trans_balance').appendChild(
442                         text(_finesFormatNumber(trans.balance_owed())));
443
444         var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id());
445         req.send(true);
446         var bills = req.result();
447         if(bills && bills[0])
448                 $n(row,'myopac_trans_bill_type').appendChild(
449                                 text(bills[0].billing_type()));
450
451         tbody.appendChild(row);
452         unHideMe($('myopac_trans_div'));
453 }
454
455
456
457 /* draws a circulation transaction summary */
458 var myopacCircTransTemplate;
459 function myOPACShowCircTransaction(trans, record, circ) {
460         var tbody = $('myopac_circ_trans_tbody');
461
462         if(!myopacCircTransTemplate) {
463                 myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));
464                 removeChildren(tbody);
465         }
466
467         var row = myopacCircTransTemplate.cloneNode(true);
468
469         buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title'));
470
471         $n(row,'myopac_circ_trans_author').appendChild(text(
472                 normalize(truncate(record.author(), 65))));
473
474         $n(row,'myopac_circ_trans_start').
475                 appendChild(text(_trimTime(trans.xact_start())));
476
477    var due = _trimTime(circ.due_date());
478         var checkin = _trimTime(circ.stop_fines_time());
479
480         $n(row,'myopac_circ_trans_due').appendChild(text(due))
481         /*$n(row,'myopac_circ_trans_finished').appendChild(text(checkin));*/
482         if(checkin)
483                 appendClear($n(row,'myopac_circ_trans_finished'), text(checkin));
484
485         $n(row,'myopac_circ_trans_balance').
486                 appendChild(text(_finesFormatNumber(trans.balance_owed())));
487
488         tbody.appendChild(row);
489         unHideMe($('myopac_circ_trans_div'));
490 }
491
492
493 function myOPACSavePrefs() {
494         G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per'));
495         G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font'));
496         G.user.prefs[PREF_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));
497         if(commitUserPrefs())
498                 alert($('prefs_update_success').innerHTML);
499         else alert($('prefs_update_failure').innerHTML);
500 }
501
502
503 function myOPACShowDefFont() {
504         var font;
505         if(G.user.prefs[PREF_DEF_FONT])
506                 font = G.user.prefs[PREF_DEF_FONT];
507         else font = "regular";
508         setSelector($('prefs_def_font'), font);
509 }
510
511 function myOPACShowHoldNotify() {
512         var pref = G.user.prefs[PREF_HOLD_NOTIFY];
513
514         if(pref) {
515                 if(pref.match(/email/i) && pref.match(/phone/i)) {
516                         setSelector($('prefs_hold_notify'), 'phone:email');
517                 } else if( pref.match(/email/i) ) {
518                         setSelector($('prefs_hold_notify'), 'email');
519                 } else if( pref.match(/phone/i) ) {
520                         setSelector($('prefs_hold_notify'), 'phone');
521                 }
522
523         } else {
524                 setSelector($('prefs_hold_notify'), 'phone:email');
525         }
526 }
527
528 function myOPACShowPrefs() {
529         grabUserPrefs();
530         myOPACShowHitsPer();
531         myOPACShowDefFont();
532         myOPACShowHoldNotify();
533         hideMe($('myopac_prefs_loading'));
534 }
535
536 function myOPACShowHitsPer() {
537         var hits = 10;
538         if(G.user.prefs[PREF_HITS_PER])
539                 hits = G.user.prefs[PREF_HITS_PER];
540         var hitsSel = $('prefs_hits_per');
541         setSelector(hitsSel, hits);
542 }
543
544 var userShown = false;
545 function myOPACShowSummary() {
546         if(userShown) return; userShown = true;
547         var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());
548         req.callback(_myOPACSummaryShowUer);
549         req.send();
550 }
551
552 var addrRowTemplate;
553 function _myOPACSummaryShowUer(r) {
554
555         var user = r.getResultObject();
556         fleshedUser = user;
557         if(!user) return;
558
559         appendClear($('myopac_summary_first'),text(user.first_given_name()));
560         appendClear($('myopac_summary_middle'),text(user.second_given_name()));
561         appendClear($('myopac_summary_dayphone'),text(user.day_phone()));
562         appendClear($('myopac_summary_eveningphone'),text(user.evening_phone()));
563         appendClear($('myopac_summary_otherphone'),text(user.other_phone()));
564         appendClear($('myopac_summary_last'),text(user.family_name()));
565         appendClear($('myopac_summary_username'),text(user.usrname()));
566         appendClear($('myopac_summary_email'),text(user.email()));
567         appendClear($('myopac_summary_barcode'),text(user.card().barcode()));
568         appendClear($('myopac_summary_ident1'),text(user.ident_value()));
569         appendClear($('myopac_summary_ident2'),text(user.ident_value2()));
570         appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name()));
571         appendClear($('myopac_summary_create_date'),text(user.create_date()));
572
573         var tbody = $('myopac_addr_tbody');
574         var template;
575
576         if(addrRowTemplate) { 
577                 template = addrRowTemplate;
578         } else {
579                 template = tbody.removeChild($('myopac_addr_row'));
580                 addrRowTemplate = template;
581         }
582         removeChildren(tbody);
583
584         for( var a in user.addresses() ) {
585                 var row = template.cloneNode(true);
586                 myOPACDrawAddr(row, user.addresses()[a]);
587                 tbody.appendChild(row);
588         }
589 }
590
591 function myOPACDrawAddr(row, addr) {
592
593         appendClear($n(row, 'myopac_addr_type'),text(addr.address_type()));
594         var street = (addr.street2()) ? addr.street1() + ", " + addr.street2() : addr.street1();
595         appendClear($n(row, 'myopac_addr_street'),text(street));
596         appendClear($n(row, 'myopac_addr_city'),text(addr.city()));
597         appendClear($n(row, 'myopac_addr_county'),text(addr.county()));
598         appendClear($n(row, 'myopac_addr_state'),text(addr.state()));
599         appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code()));
600 }
601
602
603 function myOPACUpdateUsername() {
604         var username = $('myopac_new_username').value;
605         if(username == null || username == "") {
606                 alert($('myopac_username_error').innerHTML);
607                 return;
608         }
609         var req = new Request(UPDATE_USERNAME, G.user.session, username );
610         req.send(true);
611         if(req.result()) {
612
613                 var evt;
614                 if(evt = checkILSEvent(req.result())) {
615                         alertILSEvent(evt);
616                         return;
617                 }
618
619                 G.user.usrname(username);
620                 hideMe($('myopac_update_username_row'));
621                 userShown = false;
622                 myOPACShowSummary();
623                 return;
624         }
625
626         alert($('myopac_username_failure').innerHTML);
627 }
628
629 function myOPACUpdateEmail() {
630         var email = $('myopac_new_email').value;
631         if(email == null || email == "") {
632                 alert($('myopac_email_error').innerHTML);
633                 return;
634         }
635
636         var req = new Request(UPDATE_EMAIL, G.user.session, email );
637         req.send(true);
638         if(req.result()) {
639                 G.user.usrname(email);
640                 hideMe($('myopac_update_email_row'));
641                 userShown = false;
642                 myOPACShowSummary();
643                 return;
644         }
645
646         alert($('myopac_email_failure').innerHTML);
647 }
648
649
650 function myOPACUpdatePassword() {
651         var curpassword = $('myopac_current_password').value;
652         var password = $('myopac_new_password').value;
653         var password2 = $('myopac_new_password2').value;
654
655         if(     curpassword == null || curpassword == "" || 
656                         password == null || password == "" || 
657                         password2 == null || password2 == "" || password != password2 ) {
658                 alert($('myopac_password_error').innerHTML);
659                 return;
660         }
661
662         var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword );
663         req.send(true);
664         if(req.result()) {
665                 G.user.usrname(password);
666                 hideMe($('myopac_update_password_row'));
667                 userShown = false;
668                 myOPACShowSummary();
669                 return;
670         }
671
672         alert($('myopac_password_failure').innerHTML);
673 }
674
675
676
677
678 var containerTemplate;
679 function myOPACShowBookbags(force) {
680
681         var tbody =$('myopac_bookbag_tbody') ;
682
683         if(!containerTemplate) 
684                 containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));
685         else if(!force) return;
686
687         removeChildren(tbody);
688
689         var containers = containerFetchAll();
690
691         var found = false;
692         for( var i in containers ) {
693                 found = true;
694                 var cont = containers[i];
695                 var row = containerTemplate.cloneNode(true);
696                 row.id = 'myopac_bookbag_row_' + cont.id();
697                 var link = $n(row, 'myopac_expand_bookbag');
698                 var dlink = $n(row, 'myopac_container_delete');
699                 link.appendChild( text(cont.name()) );
700                 link.setAttribute('href', 
701                         'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');
702                 myOPACFetchBBItems( cont.id(), row );
703                 dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');
704
705                 if( cont.pub() ) {
706                         unHideMe($n(row, 'myopac_bb_published_yes'));
707                         var link = $n(row, 'myopac_bb_published_view');
708                         /*
709                         link.setAttribute('href', buildExtrasLink( 'bbags.xml?bb='+cont.id(), false));  
710                         */
711                         link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html/'+cont.id(), false));  
712                         link.setAttribute('target', '_blank' );
713                         unHideMe(link);
714
715                         link = $n(row, 'myopac_bb_make_unpublished');
716                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');
717                         unHideMe(link);
718
719                 } else { 
720                         unHideMe($n(row, 'myopac_bb_published_no')); 
721                         var link = $n(row, 'myopac_bb_make_published');
722                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');
723                         unHideMe(link);
724                 }
725
726                 tbody.appendChild(row); 
727         }
728
729         if(!found) unHideMe($('myopac_bookbags_none'));
730         else unHideMe($('myopac_bookbag_table'));       
731 }
732
733 function myOPACMakeBBPublished(bbid, hideme) {
734
735         var bb = fleshedContainers[bbid];
736
737         if(hideme) {
738                 if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;
739                 bb.pub(0);
740         } else {
741                 if(!confirm($('myopac_make_published_confirm').innerHTML)) return;
742                 bb.pub(1);
743         }
744
745         var result = containerUpdate(bb);
746
747         var code = checkILSEvent(result);
748         if(code) { alertILSEvent(code); return; }
749
750         if(result) alert($('myopac_bb_update_success').innerHTML);
751         myOPACShowBookbags(true);
752 }
753
754
755
756 function myOPACDeleteBookbag(id) {
757         if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {
758                 var result = containerDelete(id);
759                 var code = checkILSEvent(result);
760                 if(code) { alertILSEvent(code); return; }
761                 hideMe($('myopac_bookbag_items_table'));
762                 hideMe($('myopac_bookbag_items_name'));
763                 hideMe($('myopac_bookbag_no_items'));
764                 myOPACShowBookbags(true);
765         }
766 }
767
768 function myOPACFetchBBItems( id, row, block ) {
769         if(!block) {
770                 containerFlesh( id, _myOPACSetBBItems, { row: row }  );
771         } else {
772                 var cont = containerFlesh(id);
773                 myOPACSetBBItems( cont, row );
774         }
775 }
776
777 function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }
778
779 function myOPACSetBBItems( container, row ) {
780         fleshedContainers[container.id()] = container;
781         var node = $n(row, 'myopac_bookbag_item_count');
782         removeChildren(node);
783         node.appendChild( text(container.items().length) );
784 }
785
786 var BBItemsRow;
787 function myOPACExpandBookbag( id, name ) {
788         
789         var tbody = $('myopac_bookbag_items_tbody');
790         if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));
791         removeChildren(tbody);
792         removeChildren($('myopac_bookbag_items_name'));
793
794         $('myopac_bookbag_items_name').appendChild(text(name));
795
796         if( fleshedContainers[id] ) {
797                 var len = fleshedContainers[id].items().length;
798
799                 if( len == 0 ) {
800                         unHideMe($('myopac_bookbag_no_items'));
801                         hideMe($('myopac_bookbag_items_table'));
802                         return;
803                 }
804
805                 hideMe($('myopac_bookbag_no_items'));
806                 unHideMe($('myopac_bookbag_items_table'));
807
808                 for( var i = 0; i != len; i++ ) {
809                         var row = BBItemsRow.cloneNode(true);
810                         found = true;
811
812                         var item = fleshedContainers[id].items()[i];
813                         var tlink = $n(row,'myopac_bookbag_items_title');
814                         var alink = $n(row,'myopac_bookbag_items_author');
815
816                         var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );
817                         req.request.tlink = tlink;
818                         req.request.alink = alink;
819                         req.callback(myOPACShowBBItem);
820                         req.send();
821
822                         var clink = $n(row, 'myopac_bookbag_items_remove');
823                         clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');
824
825                         tbody.appendChild(row);
826                 }
827         }
828 }
829
830 function myOPACRemoveBBItem( id, containerid, container_name ) {
831         if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;
832         containerRemoveItem( id );
833         myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);
834         myOPACExpandBookbag( containerid, container_name );
835 }
836
837 function myOPACShowBBItem(r) {
838         var record = r.getResultObject();
839         buildTitleDetailLink(record, r.tlink);
840         buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);
841 }
842
843 function myOPACCreateBookbag() {
844         var name = $('myopac_bookbag_new_name').value;  
845         if(!name) return;
846
847         var exists = false;
848         for( var c in fleshedContainers ) { exists = true; break; }
849
850         /* let them know what they are getting into... */
851         if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return;
852
853         var result = containerCreate( name, $('bb_public_yes').checked );
854         var code = checkILSEvent(result);
855         if(code) { alertILSEvent(code); return; }
856         myOPACShowBookbags(true);
857 }
858
859