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