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