Initial dev repository
[kcls-web.git] / opac / skin / lfw / js / myopac.old.js
1 \r
2 attachEvt("common", "run", myOPACInit );\r
3 //attachEvt("common", "loggedIn", myOPACInit );\r
4 attachEvt('common','locationUpdated', myopacReload );\r
5 \r
6 var fleshedUser = null;\r
7 var fleshedContainers = {};\r
8 var holdCache = {};\r
9 var holdStatusCache = {};\r
10 var allowPendingAddr = false;\r
11 \r
12 function clearNodes( node, keepArray ) {\r
13         if(!node) return;\r
14         for( var n in keepArray ) node.removeChild(keepArray[n]);\r
15         removeChildren(node);\r
16         for( var n in keepArray ) node.appendChild(keepArray[n]);\r
17 }\r
18 \r
19 function myOPACInit() {\r
20 \r
21         if(!(G.user && G.user.session)) {\r
22         initLogin();\r
23 \r
24     } else {\r
25 \r
26         allowPendingAddr = fetchOrgSettingDefault(G.user.home_ou(), 'opac.allow_pending_address');\r
27         if(allowPendingAddr)\r
28             unHideMe($('myopac_pending_addr_td'));\r
29                 \r
30                 var page = "summary";\r
31                 \r
32                 switch(new CGI().param('acctpage')) {\r
33                         case "1": page = "summary"; swapTabs($('acct_summary')); break;\r
34                         case "2": page = "checked"; swapTabs($('acct_checked_out')); break;\r
35                         case "3": page = "holds"; swapTabs($('acct_holds')); break;\r
36                         case "4": page = "fines"; swapTabs($('acct_prefs')); break;\r
37                         case "5": page = "prefs"; swapTabs($('acct_favs')); break;\r
38                         case "6": page = "bookbag"; swapTabs($('acct_lists')); break;\r
39                 }\r
40             myOPACChangePage(page);\r
41     }\r
42 \r
43     //$('myopac_holds_thaw_date_input').onkeyup = \r
44     //    function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }\r
45     //$('myopac_holds_thaw_date_input').onchange = \r
46     //    function(){holdsVerifyThawDateUI('myopac_holds_thaw_date_input'); }\r
47 \r
48 }\r
49 \r
50 function myopacReload() {\r
51         //swapCanvas($('myopac_reloading'));\r
52         var a = {};\r
53         a[PARAM_LOCATION] = getNewSearchLocation();\r
54         a[PARAM_DEPTH] = getNewSearchDepth();\r
55         hideMe($('canvas_main'));\r
56         goTo(buildOPACLink(a, true));\r
57 }\r
58 \r
59 \r
60 function myOPACChangePage( page ) {\r
61         showCanvas();\r
62 \r
63         var s = $("myopac_summary_td");\r
64         var c = $("myopac_checked_td");\r
65         var f = $("myopac_fines_td");\r
66         var h = $("myopac_holds_td");\r
67         var p = $("myopac_prefs_td");\r
68         var b = $('myopac_bookbag_td');\r
69 \r
70         var ss = $("myopac_summary_div");\r
71         var cc = $("myopac_checked_div");\r
72         var ff = $("myopac_fines_div");\r
73         var hh = $("myopac_holds_div");\r
74         var pp = $("myopac_prefs_div");\r
75         var bb = $('myopac_bookbag_div');\r
76 \r
77         var cls = "myopac_link";\r
78         var acls = "myopac_link_active";\r
79 \r
80         hideMe(ss);\r
81         hideMe(cc); hideMe(ff);\r
82         hideMe(hh); hideMe(pp);\r
83         hideMe(bb);\r
84 \r
85         removeCSSClass(s, acls );\r
86         removeCSSClass(c, acls );\r
87         removeCSSClass(f, acls );\r
88         removeCSSClass(h, acls );\r
89         removeCSSClass(p, acls );\r
90         removeCSSClass(b, acls );\r
91 \r
92         switch( page ) {\r
93 \r
94                 case "summary": \r
95                         unHideMe(ss);\r
96                         addCSSClass(s, acls );\r
97                         myOPACShowSummary();\r
98                         if($('show_fines_link').innerHTML=="Hide Overdue Materials") unHideMe(ff);\r
99                         addCSSClass(f, acls );\r
100                         myOPACShowFines();\r
101                         break;\r
102 \r
103                 case "checked": \r
104                         unHideMe(cc);\r
105                         addCSSClass(c, acls );\r
106                         myOPACShowChecked();\r
107                         break;\r
108 \r
109                 case "holds": \r
110                         unHideMe(hh);\r
111                         addCSSClass(h, acls );\r
112                         myOPACShowHolds();\r
113                         break;\r
114 \r
115                 case "fines": \r
116                 break;\r
117                         unHideMe(ff);\r
118                         addCSSClass(f, acls );\r
119                         myOPACShowFines();\r
120                         \r
121 \r
122                 case "prefs": \r
123                         unHideMe(pp);\r
124                         addCSSClass(p, acls );\r
125                         myOPACShowPrefs();\r
126                         break;\r
127 \r
128                 case 'bookbag':\r
129                         unHideMe(bb);\r
130                         addCSSClass(b, acls);\r
131                         myOPACShowBookbags();\r
132                         break;\r
133         }\r
134 }\r
135 \r
136 function myOPACShowChecked() {\r
137         if(checkedDrawn) return;\r
138         var req = new Request(FETCH_CHECKED_OUT_SUM, G.user.session, G.user.id());      \r
139         req.callback(myOPACDrawCheckedOutSlim);\r
140         req.send();\r
141 \r
142         var nreq = new Request(FETCH_NON_CAT_CIRCS, G.user.session);\r
143         nreq.callback(myOPACDrawNonCatCircs);\r
144         nreq.send();\r
145 }\r
146 \r
147 \r
148 var checkedRowTemplate;\r
149 var circsCache = new Array();\r
150 var checkedDrawn = false;\r
151 \r
152 function moClearCheckedTable() {\r
153         var tbody                       = $("myopac_checked_tbody");\r
154         var loading                     = $("myopac_checked_loading");\r
155         var none                                = $("myopac_checked_none");\r
156         clearNodes( tbody, [ loading, none ] );\r
157 }\r
158 \r
159 var __can_renew_one = false;\r
160 \r
161 function myOPACDrawCheckedOutSlim(r) {\r
162 return;\r
163         var checked                     = r.getResultObject();\r
164         var tbody                       = $("myopac_checked_tbody");\r
165         var loading                     = $("myopac_checked_loading");\r
166         var none                                = $("myopac_checked_none");\r
167 \r
168    __can_renew_one = false;\r
169 \r
170         if(checkedDrawn) return;\r
171         checkedDrawn = true;\r
172         if(!checkedRowTemplate) \r
173                 checkedRowTemplate = tbody.removeChild($("myopac_checked_row"));\r
174 \r
175    moClearCheckedTable();\r
176 \r
177         hideMe(loading); /* remove all children and start over */\r
178         if(!(checked && (checked.out || checked.overdue)) || (!checked.out.length && !checked.overdue.length)) {\r
179                 unHideMe(none);\r
180                 return;\r
181         }\r
182 \r
183     var totalAsync = checked.overdue.length + checked.out.length;\r
184     var fetchedCircs = [];\r
185     var collectCircs = function(r) {\r
186         var circ = r.getResultObject();\r
187         circ._od = r.od;\r
188         fetchedCircs.push(circ);\r
189         if(fetchedCircs.length < totalAsync) return;\r
190 \r
191         // sort by due date, oldest to newest\r
192         fetchedCircs = fetchedCircs.sort(\r
193             function(a, b) {\r
194                 if(a.due_date() > b.due_date()) return 1;\r
195                 return -1;\r
196             }\r
197         )\r
198 \r
199         dojo.forEach(fetchedCircs, \r
200             function(circ) { \r
201                 myOPACDrawCheckedItem(circ, tbody);\r
202             }\r
203         );\r
204     }\r
205 \r
206         for( var i = 0; i < checked.overdue.length; i++ ) {\r
207                 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.overdue[i]);\r
208                 //req.request.tbody = tbody;\r
209                 req.request.od = true;\r
210                 req.callback(collectCircs);\r
211                 req.send();\r
212         }\r
213 \r
214 \r
215         for( var i = 0; i < checked.out.length; i++ ) {\r
216                 var req = new Request(FETCH_CIRC_BY_ID, G.user.session, checked.out[i]);\r
217                 //req.request.tbody = tbody;\r
218                 req.callback(collectCircs);\r
219                 req.send();\r
220         }\r
221 \r
222    appendClear($('mo_items_out_count'), \r
223       text(new String( parseInt(checked.overdue.length) + parseInt(checked.out.length) )) );\r
224 \r
225    if( checked.overdue.length > 0 ) {\r
226       addCSSClass($('mo_items_overdue_count'), 'overdue');\r
227       appendClear($('mo_items_overdue_count'),\r
228          text(new String( parseInt(checked.overdue.length) )) );\r
229    }\r
230 \r
231 }\r
232 \r
233 \r
234 //function myOPACDrawCheckedItem(r) {\r
235 function myOPACDrawCheckedItem(circ, tbody) {\r
236 \r
237         //var circ = r.getResultObject();\r
238         //var tbody = r.tbody;\r
239         var row = checkedRowTemplate.cloneNode(true);\r
240         row.id = 'myopac_checked_row_ ' + circ.id();\r
241     row.setAttribute('circid', circ.id());\r
242 \r
243         var due = _trimTime(circ.due_date());\r
244 \r
245         var dlink = $n( row, "myopac_checked_due" );\r
246         var rlink = $n( row, "myopac_checked_renewals" );\r
247         var cnlink = $n(row, "myopac_checked_cn");\r
248         //var rnlink = $n( row, "myopac_checked_renew_link" );\r
249 \r
250         //if( r.od ) due = elem('b', {style:'color:red;font-size:110%'},due);\r
251         if( circ._od ) {\r
252       due = elem('b', {style:'color:red;'}, due);\r
253       addCSSClass(due, 'overdue');\r
254    } else {\r
255       due = text(due);\r
256    }\r
257 \r
258         dlink.appendChild(due);\r
259         rlink.appendChild(text(circ.renewal_remaining()));\r
260         unHideMe(row);\r
261         //rnlink.setAttribute('href', 'javascript:myOPACRenewCirc("'+circ.id()+'");');\r
262         circsCache.push(circ);\r
263 \r
264         if( circ.renewal_remaining() < 1 ) {\r
265       $n(row, 'selectme').disabled = true;\r
266       if(!__can_renew_one)\r
267          hideMe($('mo_renew_button'));\r
268    } else {\r
269       __can_renew_one = true;\r
270       unHideMe($('mo_renew_button'));\r
271       $n(row, 'selectme').disabled = false;\r
272    }\r
273 \r
274         tbody.appendChild(row);\r
275 \r
276         var req = new Request(FETCH_MODS_FROM_COPY, circ.target_copy() );\r
277         req.request.alertEvent = false;\r
278         req.request.circ = circ.id();\r
279         req.request.copy = circ.target_copy();\r
280         req.callback(myOPACDrawCheckedTitle);\r
281         req.send();\r
282 }\r
283 \r
284 var __circ_titles = {};\r
285 \r
286 function myOPACDrawCheckedTitle(r) {\r
287         var record = r.getResultObject();\r
288         var circid = r.circ;\r
289 \r
290         if(!record || checkILSEvent(record)) {\r
291                 var req = new Request( FETCH_COPY, r.copy );\r
292                 req.request.circ = circid\r
293                 req.callback(myOPACDrawNonCatalogedItem);\r
294                 req.send();\r
295                 return;\r
296         }\r
297 \r
298         var row = $('myopac_checked_row_ ' + circid);\r
299         var tlink = $n( row, "myopac_checked_title_link" );\r
300         var alink = $n( row, "myopac_checked_author_link" );\r
301 \r
302         var cn = fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.copy_location_counts.summary.retrieve"],{params:[record.doc_id(),getLocation(),getDepth()]});\r
303         var cnlink = $n( row, "myopac_checked_cn" );\r
304         if(cn.length) cnlink.appendChild(text(cn[0][1]));\r
305         buildTitleDetailLink(record, tlink);\r
306         buildSearchLink(STYPE_AUTHOR, record.author(), alink);\r
307     __circ_titles[circid] = record.title();\r
308 }\r
309 \r
310 function myOPACDrawNonCatalogedItem(r) {\r
311         var copy = r.getResultObject();\r
312         var circid = r.circ;\r
313 \r
314         var row = $('myopac_checked_row_ ' + circid);\r
315         var tlink = $n( row, "myopac_checked_title_link" );\r
316         var alink = $n( row, "myopac_checked_author_link" );\r
317 \r
318         tlink.parentNode.appendChild(text(copy.dummy_title()));\r
319         alink.parentNode.appendChild(text(copy.dummy_author()));\r
320    __circ_titles[circid] = copy.dummy_title();\r
321 }\r
322 \r
323 \r
324 /*\r
325 function myOPACRenewCirc(circid) {\r
326 \r
327         var circ;\r
328         for( var i = 0; i != circsCache.length; i++ ) \r
329                 if(circsCache[i].id() == circid)\r
330                         circ = circsCache[i];\r
331 \r
332         if(!confirm($('myopac_renew_confirm').innerHTML)) return;\r
333 \r
334         var req = new Request(RENEW_CIRC, G.user.session, \r
335                 { patron : G.user.id(), copyid : circ.target_copy(), opac_renewal : 1 } );\r
336         req.request.alertEvent = false;\r
337         req.send(true);\r
338         var res = req.result();\r
339 \r
340         if(checkILSEvent(res) || checkILSEvent(res[0])) {\r
341                 alertId('myopac_renew_fail');\r
342                 return;\r
343         }\r
344 \r
345         alert($('myopac_renew_success').innerHTML);     \r
346         checkedDrawn = false;\r
347         myOPACShowChecked();\r
348 }\r
349 */\r
350 \r
351 \r
352 \r
353 function myOPACShowHolds() {\r
354         var req = new Request(FETCH_HOLDS, G.user.session, G.user.id());        \r
355         req.callback(myOPACDrawHolds);\r
356         req.send();\r
357     //$('myopac_holds_actions_none').selected = true;\r
358 }\r
359 \r
360 var holdsTemplateRowOrig;\r
361 var holdsTemplateRow;\r
362 var template;\r
363 var myopacForceHoldsRedraw = true;\r
364 function myOPACDrawHolds(r) {\r
365         if(!myopacForceHoldsRedraw) return;\r
366         var holds_main = $('holds_main'); if(!holds_main) return;\r
367         if(!template) template = holds_main.removeChild($('acct_holds_temp'));\r
368         //if(!template) template = $('acct_holds_temp').cloneNode(true);\r
369         var holds = r.getResultObject();\r
370         if(!holds || !holds.length || !template) return;\r
371         myopacForceHoldsRedraw = false;\r
372 \r
373         if(!holds.length) { holds_main.appendChild(elem('div',{style:"font-size:16px;font-weight:bold;text-align:center;width:100%;"},text('You have no holds'))); return; }\r
374         for(var i=0; i<holds.length; i++) {\r
375                 var h = holds[i];\r
376                 holdCache[h.id()] = h;\r
377                 var row = template.cloneNode(true);\r
378                 row.id = "myopac_holds_row_" + h.id();\r
379                 var form = $n(row, "myopac_holds_formats");\r
380                 form.id = "myopac_holds_form_" + h.id();\r
381                 \r
382                 var tree = $n(row,'hold_pickup_lib_sel');\r
383                 buildOrgSel(tree, globalOrgTree, 0);\r
384                 setSelector(tree, h.pickup_lib());\r
385                 $n(row,'hold_edit_link').setAttribute('href','javascript:editHold('+ h.id()+');'); \r
386                 $n(row,'hold_cancel_link').setAttribute('href','javascript:cancelHold('+ h.id()+');');\r
387                 $n(row,'hold_save_link').setAttribute('href','javascript:saveHold('+ h.id()+');');\r
388                 var activeSel = $n(row,'hold_active_sel');\r
389                 activeSel.selectedIndex = isTrue(h.frozen())?1:0;\r
390                 \r
391                 updateHoldInfo(h.id(),row);\r
392                 myOPACDrawHoldTitle(h);\r
393                 myOPACDrawHoldStatus(h);\r
394                 \r
395                 unHideMe(row);\r
396                 holds_main.appendChild(row);\r
397         }\r
398         \r
399 return;\r
400 \r
401         var tbody = $("myopac_holds_tbody");\r
402         if(holdsTemplateRow && !myopacForceHoldsRedraw) return;\r
403     myopacForceHoldsRedraw = false;\r
404 \r
405         if(holdsTemplateRowOrig) {\r
406                 holdsTemplateRow = holdsTemplateRowOrig;\r
407                 removeChildren(tbody);\r
408         } else {\r
409                 holdsTemplateRow = tbody.removeChild($("myopac_holds_row"));\r
410                 holdsTemplateRowOrig = holdsTemplateRow;\r
411         }\r
412 \r
413         hideMe($('myopac_holds_loading'));\r
414         var holds = r.getResultObject();\r
415         if(!holds || holds.length < 1) unHideMe($('myopac_holds_none'));\r
416         \r
417         for( var i = 0; i != holds.length; i++ ) {\r
418                 var h = holds[i];\r
419                 holdCache[h.id()] = h;\r
420 \r
421                 var row = holdsTemplateRow.cloneNode(true);\r
422                 row.id = "myopac_holds_row_" + h.id();\r
423 \r
424                 var form = $n(row, "myopac_holds_formats");\r
425                 form.id = "myopac_holds_form_" + h.id();\r
426 \r
427                 var orglink = $n(row, "myopac_holds_location");\r
428                 orglink.appendChild(text(findOrgUnit(h.pickup_lib()).name()));\r
429 \r
430                 tbody.appendChild(row);\r
431 \r
432                 $n(row,'myopac_holds_edit_link').setAttribute(\r
433                         'href','javascript:myOPACEditHold("'+ h.id()+'");'); \r
434 \r
435         if(isTrue(h.frozen())) {\r
436             hideMe($n(row, 'myopac_hold_unfrozen_true'))\r
437             unHideMe($n(row, 'myopac_hold_unfrozen_false'))\r
438             if(h.thaw_date()) {\r
439                 var d = dojo.date.stamp.fromISOString(h.thaw_date());\r
440                 $n(row, 'myopac_holds_frozen_until').appendChild(text(dojo.date.locale.format(d, {selector: 'date', fullYear: true})));\r
441             }\r
442         } else {\r
443             unHideMe($n(row, 'myopac_hold_unfrozen_true'))\r
444             hideMe($n(row, 'myopac_hold_unfrozen_false'))\r
445         }\r
446 \r
447         $n(row, 'myopac_holds_selected_chkbx').checked = false;\r
448 \r
449         var exp_date;\r
450         if(h.expire_time()) {\r
451             exp_date = dojo.date.stamp.fromISOString(h.expire_time());\r
452             $n(row, 'myopac_hold_expire_time').appendChild(\r
453                 text(dojo.date.locale.format(exp_date, {selector:'date'})));\r
454         }\r
455 \r
456                 unHideMe(row);\r
457 \r
458         var interval = fetchOrgSettingDefault(G.user.home_ou(), 'circ.hold_expire_alert_interval');\r
459         if(interval && exp_date) {\r
460             secs = interval_to_seconds(interval) * 1000;\r
461             var diff = exp_date.getTime() - new Date().getTime();\r
462             if(diff < secs)\r
463                 addCSSClass($n(row, 'myopac_hold_expire_time'), 'hold_expire_warning');\r
464         }\r
465 \r
466         myOPACDrawHoldTitle(h);\r
467         myOPACDrawHoldStatus(h);\r
468     }\r
469 }\r
470 \r
471 function myOPACEditHold(holdid) {\r
472         var hold = holdCache[holdid];\r
473 \r
474         holdsDrawEditor( \r
475                 { \r
476                         editHold : hold,\r
477                         onComplete : function(){ \r
478                                 holdsTemplateRow = null;\r
479                                 myOPACShowHolds(); \r
480                         }\r
481                 }\r
482         );\r
483 }\r
484 \r
485 \r
486 function myOPACDrawHoldStatus(hold) {\r
487         var req = new Request(FETCH_HOLD_STATUS, G.user.session, hold.id() );\r
488         req.callback(myOShowHoldStatus);\r
489         req.request.hold = hold;\r
490         req.send();\r
491 }\r
492 \r
493 var myopacShowHoldEstimate = false;\r
494 function myOShowHoldStatus(r) {\r
495 \r
496         var hold = r.hold;\r
497         var qstats = r.getResultObject();\r
498     holdStatusCache[hold.id()] = qstats;\r
499         var row = $("myopac_holds_row_" + r.hold.id());\r
500         if(!row) return;\r
501         \r
502         if( qstats.status == 4 ) {\r
503                 $n(row,'acct_holds_status').innerHTML = "Ready for Pickup";\r
504         } else {\r
505                 var suffix = (qstats.queue_position==1)?"st":(qstats.queue_position==2)?"nd":(qstats.queue_position==3)?"rd":"th";\r
506                 $n(row,'acct_holds_status').innerHTML = qstats.queue_position+suffix+" hold on "+qstats.potential_copies+" circulating cop"+(qstats.potential_copies==1?"y":"ies");\r
507         }\r
508         \r
509 return;\r
510 \r
511 \r
512 /*\r
513     if(qstats.estimated_wait || myopacShowHoldEstimate) {\r
514         myopacShowHoldEstimate = true;\r
515         if(qstats.estimated_wait)\r
516             $n(row, 'myopac_holds_estimated_wait').appendChild(text(qstats.estimated_wait));\r
517         unHideMe($('myopac_holds_estimated_wait_column'));\r
518         unHideMe($n(row, 'myopac_holds_estimated_wait'));\r
519     } \r
520 */\r
521 \r
522         if( qstats.status == 4 ) {\r
523                 unHideMe($n(row, 'hold_status_available'));\r
524                 hideMe($n(row, 'myopac_holds_cancel_link'));\r
525         }\r
526 \r
527     if(false) {\r
528         var node = $n(row, 'hold_qstats');\r
529         // XXX best way to display this info + dojo i18n\r
530         node.appendChild(text('hold #' + qstats.queue_position+' of '+qstats.queue_position+' and '+qstats.potential_copies+' item(s)'));\r
531         unHideMe(node);\r
532 \r
533     } else {\r
534             if( qstats.status < 3 )\r
535                     unHideMe($n(row, 'hold_status_waiting'));\r
536     \r
537             if( qstats.status == 3 )\r
538                     unHideMe($n(row, 'hold_status_transit'));\r
539     }\r
540 }\r
541 \r
542 \r
543 function myOPACDrawHoldTitle(hold) {\r
544         var method;\r
545 \r
546         if( hold.hold_type() == 'T' || hold.hold_type() == 'M' ) {\r
547                 if(hold.hold_type() == "M") method = FETCH_MRMODS;\r
548                 if(hold.hold_type() == "T") method = FETCH_RMODS;\r
549                 var req = new Request(method, hold.target());\r
550                 req.callback(myOPACFleshHoldTitle);\r
551                 req.request.hold = hold;\r
552                 req.request.alertEvent = false;\r
553                 req.send();\r
554 \r
555         } else {\r
556                 holdFetchObjects(hold, \r
557                         function(a) { _myOPACFleshHoldTitle(hold, a);});\r
558         }\r
559 }\r
560 \r
561 function myOPACFleshHoldTitle(r) {\r
562         var rec = r.getResultObject();\r
563         _myOPACFleshHoldTitle(r.hold, {recordObject: rec});\r
564 }\r
565 \r
566 function _myOPACFleshHoldTitle(hold, holdObjects) {\r
567 \r
568         var record = holdObjects.recordObject;\r
569         var volume      = holdObjects.volumeObject;\r
570         var copy        = holdObjects.copyObject;\r
571 \r
572         var row = $("myopac_holds_row_" + hold.id());\r
573         var title_link = $n(row, "myopac_holds_title_link");\r
574         //var author_link = $n(row, "myopac_holds_author_link");\r
575 \r
576         if(!record || checkILSEvent(record) ) {\r
577                 addCSSClass(row, 'invalid_hold');\r
578                 $n(row, 'myopac_holds_edit_link').setAttribute('href', 'javascript:void(0);');\r
579                 $n(row, 'myopac_holds_edit_link').onclick = function(){alertId('invalid_hold');};\r
580                 return;\r
581         }\r
582 \r
583         buildTitleDetailLink(record, title_link);\r
584         title_link.title = record.title();\r
585         //buildSearchLink(STYPE_AUTHOR, record.author(), author_link);\r
586 \r
587         if( volume ) {\r
588                 $n(row, 'volume').appendChild(text(volume.label()));\r
589                 unHideMe($n(row, 'vol_copy'));\r
590                 if(copy) $n(row, 'copy').appendChild(text(copy.barcode()));\r
591         }\r
592 \r
593         var ress = getMarcData(record.doc_id(),"998","d");\r
594         var img = elem("img");\r
595         var form = $("myopac_holds_form_" + hold.id());\r
596         \r
597         if(setFormatIcon(img, ress) && ress && form) form.appendChild(img); \r
598 \r
599 /*\r
600         \r
601 \r
602         if(form) {\r
603                 var mods_formats = record.types_of_resource();\r
604 \r
605                 if( hold.hold_type() == 'M' ) {\r
606                         var data = holdsParseMRFormats(hold.holdable_formats());\r
607                         mods_formats = data.mods_formats;\r
608                 }\r
609 \r
610                 for( var i = 0; i < mods_formats.length; i++ ) {\r
611                         var img = elem("img");\r
612                         setResourcePic(img, mods_formats[i]);\r
613                         form.appendChild(img);\r
614                 }\r
615         }\r
616 */\r
617 }\r
618 \r
619 var finesShown = false;\r
620 function myOPACShowFines() {\r
621         if(finesShown) return; finesShown = true;\r
622         var req = new Request(FETCH_FINES_SUMMARY, G.user.session, G.user.id() );\r
623         req.callback(_myOPACShowFines);\r
624         req.send();\r
625 }\r
626 \r
627 function _myOPACShowFines(r) {\r
628         hideMe($('myopac_fines_summary_loading'));\r
629         unHideMe($('myopac_fines_summary_row'));\r
630 \r
631         var summary = r.getResultObject();\r
632         var total       = "0.00"; /* localization? */\r
633         var paid                = "0.00";\r
634         var balance = "0.00";\r
635         if( instanceOf(summary,mous) ) {\r
636 \r
637                 total           = _finesFormatNumber(summary.total_owed());\r
638                 paid            = _finesFormatNumber(summary.total_paid());\r
639                 balance = _finesFormatNumber(summary.balance_owed());\r
640 \r
641                 var req = new Request(FETCH_TRANSACTIONS, G.user.session, G.user.id() );\r
642                 req.callback(myOPACShowTransactions);\r
643                 req.send();\r
644         }\r
645 \r
646         $('myopac_fines_summary_total').appendChild(text(total));\r
647         $('myopac_fines_summary_paid').appendChild(text(paid));\r
648         $('myopac_fines_summary_balance').appendChild(text(balance));\r
649 }\r
650 \r
651 function _finesFormatNumber(num) {\r
652         if(isNull(num)) num = 0;\r
653         num = num + "";\r
654         if(num.length < 2 || !num.match(/\./)) num += ".00";\r
655         if(num.match(/\./) && num.charAt(num.length-2) == '.') num += "0";\r
656         return num;\r
657 }          \r
658 \r
659 //function _trimTime(time) { if(!time) return ""; return time.replace(/\ .*/,""); }\r
660 function _trimTime(time) { \r
661         if(!time) return ""; \r
662     var d = dojo.date.stamp.fromISOString(time);\r
663     if(!d) return ""; /* date parse failed */\r
664     return d.iso8601Format('YMD');\r
665 }\r
666 \r
667 function _trimSeconds(time) { \r
668     if(!time) return ""; \r
669     var d = dojo.date.stamp.fromISOString(time);\r
670     if(!d) return ""; /* date parse failed */\r
671     return d.iso8601Format('YMDHM',null,true,true);\r
672 }\r
673 \r
674 function myOPACShowTransactions(r) {\r
675 \r
676         if(myopacGenericTransTemplate || myopacCircTransTemplate) return;\r
677 \r
678         var transactions = r.getResultObject();\r
679 \r
680         for( var idx in transactions ) {\r
681 \r
682                 var trans       = transactions[idx].transaction;\r
683                 var record      = transactions[idx].record;\r
684                 var circ                = transactions[idx].circ;\r
685 \r
686                 if(trans.xact_type() == 'circulation') \r
687                         myOPACShowCircTransaction(trans, record, circ);\r
688 \r
689                 else if(trans.xact_type() == 'grocery' ) \r
690                         myopacShowGenericTransaction( trans );\r
691         }\r
692 }\r
693 \r
694 var myopacGenericTransTemplate;\r
695 function myopacShowGenericTransaction( trans ) {\r
696         var tbody = $('myopac_trans_tbody');\r
697 \r
698         if(!myopacGenericTransTemplate) {\r
699                 myopacGenericTransTemplate = \r
700                         tbody.removeChild($('myopac_trans_row'));\r
701                 removeChildren(tbody);\r
702         }\r
703 \r
704         var row = myopacGenericTransTemplate.cloneNode(true);\r
705 \r
706         $n(row,'myopac_trans_start').appendChild(\r
707                         text(_trimSeconds(trans.xact_start())));\r
708 \r
709         $n(row,'myopac_trans_last_payment').appendChild(\r
710                         text(_trimSeconds(trans.last_payment_ts())));\r
711 \r
712         $n(row,'myopac_trans_init_amount').appendChild(\r
713                         text(_finesFormatNumber(trans.total_owed())));\r
714 \r
715         $n(row,'myopac_trans_total_paid').appendChild(\r
716                         text(_finesFormatNumber(trans.total_paid())));\r
717 \r
718         $n(row,'myopac_trans_balance').appendChild(\r
719                         text(_finesFormatNumber(trans.balance_owed())));\r
720 \r
721         var req = new Request(FETCH_MONEY_BILLING, G.user.session, trans.id());\r
722         req.send(true);\r
723         var bills = req.result();\r
724         if(bills && bills[0])\r
725                 $n(row,'myopac_trans_bill_type').appendChild(\r
726                                 text(bills[0].billing_type()));\r
727 \r
728         tbody.appendChild(row);\r
729         unHideMe($('myopac_trans_div'));\r
730 }\r
731 \r
732 \r
733 \r
734 /* draws a circulation transaction summary */\r
735 var myopacCircTransTemplate;\r
736 function myOPACShowCircTransaction(trans, record, circ) {\r
737         var tbody = $('myopac_circ_trans_tbody');\r
738 \r
739         if(!myopacCircTransTemplate) {\r
740                 myopacCircTransTemplate = tbody.removeChild($('myopac_circ_trans_row'));\r
741                 removeChildren(tbody);\r
742         }\r
743 \r
744         var row = myopacCircTransTemplate.cloneNode(true);\r
745 \r
746         if(record) {\r
747                 buildTitleDetailLink(record, $n(row,'myopac_circ_trans_title'));\r
748 \r
749                 $n(row,'myopac_circ_trans_author').appendChild(text(\r
750                         normalize(truncate(record.author(), 65))));\r
751 \r
752         } else {\r
753 \r
754                 var req = new Request( FETCH_COPY, circ.target_copy() );\r
755                 req.alertEvents = false;\r
756                 req.send(true);\r
757                 var copy = req.result();\r
758                 if( copy ) {\r
759                         $n(row,'myopac_circ_trans_title').appendChild(text(copy.dummy_title()));\r
760                         $n(row,'myopac_circ_trans_author').appendChild(text(copy.dummy_author()));\r
761                 }\r
762         }\r
763 \r
764 \r
765         $n(row,'myopac_circ_trans_start').\r
766                 appendChild(text(_trimTime(trans.xact_start())));\r
767 \r
768    var due = _trimTime(circ.due_date());\r
769         var checkin = _trimTime(circ.stop_fines_time());\r
770 \r
771         $n(row,'myopac_circ_trans_due').appendChild(text(due))\r
772         if(checkin)\r
773                 appendClear($n(row,'myopac_circ_trans_finished'), text(checkin));\r
774         if(circ.stop_fines() == 'LOST')\r
775                 appendClear($n(row,'myopac_circ_trans_finished'), text(circ.stop_fines()));\r
776         if(circ.stop_fines() == 'CLAIMSRETURNED')\r
777                 appendClear($n(row,'myopac_circ_trans_finished'), text(""));\r
778 \r
779 \r
780         $n(row,'myopac_circ_trans_balance').\r
781                 appendChild(text(_finesFormatNumber(trans.balance_owed())));\r
782 \r
783         tbody.appendChild(row);\r
784         unHideMe($('myopac_circ_trans_div'));\r
785 }\r
786 \r
787 \r
788 function myOPACSavePrefs() {\r
789         G.user.prefs[PREF_HITS_PER] = getSelectorVal($('prefs_hits_per'));\r
790         G.user.prefs[PREF_DEF_FONT] = getSelectorVal($('prefs_def_font'));\r
791         G.user.prefs[PREF_HOLD_NOTIFY] = getSelectorVal($('prefs_hold_notify'));\r
792         G.user.prefs[PREF_DEF_DEPTH] = getSelectorVal($('prefs_def_range'));\r
793 \r
794         if( $('myopac_pref_home_lib').checked == true )\r
795                 G.user.prefs[PREF_DEF_LOCATION] = null;\r
796         else\r
797                 G.user.prefs[PREF_DEF_LOCATION] = getSelectorVal($('prefs_def_location'));\r
798 \r
799         if(commitUserPrefs())\r
800                 alert($('prefs_update_success').innerHTML);\r
801         else alert($('prefs_update_failure').innerHTML);\r
802 }\r
803 \r
804 \r
805 function myOPACShowDefFont() {\r
806         var font;\r
807         if(G.user.prefs[PREF_DEF_FONT])\r
808                 font = G.user.prefs[PREF_DEF_FONT];\r
809         else font = "regular";\r
810         setSelector($('prefs_def_font'), font);\r
811 }\r
812 \r
813 function myOPACShowHoldNotify() {\r
814         var pref = G.user.prefs[PREF_HOLD_NOTIFY];\r
815 \r
816         if(pref) {\r
817                 if(pref.match(/email/i) && pref.match(/phone/i)) {\r
818                         setSelector($('prefs_hold_notify'), 'phone:email');\r
819                 } else if( pref.match(/email/i) ) {\r
820                         setSelector($('prefs_hold_notify'), 'email');\r
821                 } else if( pref.match(/phone/i) ) {\r
822                         setSelector($('prefs_hold_notify'), 'phone');\r
823                 }\r
824 \r
825         } else {\r
826                 setSelector($('prefs_hold_notify'), 'phone:email');\r
827         }\r
828 }\r
829 \r
830 function myOPACShowPrefs() {\r
831         grabUserPrefs();\r
832         myOPACShowHitsPer();\r
833         myOPACShowDefFont();\r
834         myOPACShowHoldNotify();\r
835         myOPACShowDefLocation();\r
836         hideMe($('myopac_prefs_loading'));\r
837 }\r
838 \r
839 var defSearchLocationDrawn = false;\r
840 var defDepthIndex = 0;\r
841 function myOPACShowDefLocation() {\r
842 \r
843         var selector = $('prefs_def_location');\r
844         var rsel = $('prefs_def_range');\r
845 \r
846         if(!defSearchLocationDrawn) {\r
847 \r
848                 defSearchLocationDrawn = true;\r
849 \r
850                 var org = G.user.prefs[PREF_DEF_LOCATION];\r
851 \r
852                 if(!org) {\r
853                         $('myopac_pref_home_lib').checked = true;\r
854                         $('prefs_def_location').disabled = true;\r
855                         org = G.user.home_ou();\r
856                 }\r
857 \r
858                 buildOrgSel(selector, globalOrgTree, 0);\r
859 \r
860                 globalOrgTypes = globalOrgTypes.sort(\r
861                         function(a, b) {\r
862                                 if( a.depth() < b.depth() ) return -1;\r
863                                 return 1;\r
864                         }\r
865                 );\r
866 \r
867                 iterate(globalOrgTypes,\r
868                         function(t) {\r
869                                 if( t.depth() <= findOrgDepth(org) ) {\r
870                                         setSelectorVal(rsel, defDepthIndex++, t.opac_label(), t.depth());\r
871                                         if( t.depth() == findOrgDepth(org) ) \r
872                                                 setSelector(rsel, t.depth());\r
873                                 }\r
874                         }\r
875                 );\r
876         }\r
877 \r
878         setSelector(selector, org);\r
879 }\r
880 \r
881 function myOPACShowHitsPer() {\r
882         var hits = 10;\r
883         if(G.user.prefs[PREF_HITS_PER])\r
884                 hits = G.user.prefs[PREF_HITS_PER];\r
885         var hitsSel = $('prefs_hits_per');\r
886         setSelector(hitsSel, hits);\r
887 }\r
888 \r
889 var userShown = false;\r
890 function myOPACShowSummary() {\r
891         if(userShown) return; userShown = true;\r
892         var req = new Request(FETCH_FLESHED_USER,G.user.session, G.user.id());\r
893         req.callback(_myOPACSummaryShowUer);\r
894         req.send();\r
895         \r
896         //would be nice to batch these requests in one shot.\r
897         fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.user.checked_out"],{params:[G.user.session, G.user.id()],oncomplete:drawMyOPACSumPage});\r
898         fieldmapper.standardRequest(["open-ils.circ","open-ils.circ.holds.retrieve"],{params:[G.user.session, G.user.id()], oncomplete:drawMyOPACSumPage});\r
899         fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.user.fines.summary"],{params:[G.user.session, G.user.id()], oncomplete:drawMyOPACSumPage});\r
900 }\r
901 \r
902 var holdsCount=0;\r
903 var pickupCount=0;\r
904 function drawMyOPACSumPage(r) {\r
905         var obj = r.recv().content();\r
906         \r
907         switch(r.method) {\r
908           case "open-ils.actor.user.checked_out":\r
909                 appendClear($('myopac_sum_checked'),text("("+(obj.out.length+obj.overdue.length+obj.lost.length+obj.long_overdue.length)+")"));\r
910                 break;\r
911           case "open-ils.circ.holds.retrieve":\r
912                 for(var i in obj) fieldmapper.standardRequest(["open-ils.circ","open-ils.circ.hold.queue_stats.retrieve"],{params:[G.user.session,obj[i].id()],oncomplete:drawMyOPACSumPage});\r
913                 break;\r
914           case "open-ils.actor.user.fines.summary":\r
915                 var balance = obj.balance_owed();\r
916                 if(parseFloat(balance) > 0.00) {\r
917                   var bal = $('myopac_sum_fines_bal');\r
918                   bal.style.color = "red";\r
919                   appendClear(bal,text("$"+balance));\r
920                   unHideMe($('myopac_sum_fines'));\r
921                   unHideMe($('myopac_sum_fines_slim'));\r
922                 } break;\r
923           case "open-ils.circ.hold.queue_stats.retrieve":\r
924                 if(obj.status==4) {\r
925                   appendClear($('myopac_sum_pickup'),text("("+(++pickupCount)+")"));\r
926                 } else {\r
927                   appendClear($('myopac_sum_holds'),text("("+(++holdsCount)+")"));\r
928                 } break;\r
929         }\r
930 }\r
931 \r
932 var addrRowTemplate;\r
933 var notesTemplate;\r
934 function _myOPACSummaryShowUer(r) {\r
935         var user = r.getResultObject();\r
936         fleshedUser = user;\r
937         if(!user) return;\r
938         \r
939 \r
940     var expireDate = dojo.date.stamp.fromISOString(user.expire_date());\r
941     if( expireDate < new Date() ) {\r
942         appendClear($('myopac.expired.date'), expireDate.iso8601Format('YMD'));\r
943         unHideMe($('myopac.expired.alert'));\r
944     }\r
945 \r
946         var iv1 = user.ident_value()+'';\r
947     if (iv1.length > 4 && iv1.match(/\d{4}/)) iv1 = iv1.substring(0,4) + '***********';\r
948 \r
949         appendClear($('myopac_sum_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name())));   \r
950         //appendClear($('myopac_summary_name'),text(user.first_given_name()+" "+(user.family_name()==null?"":user.family_name())));\r
951         //appendClear($('myopac_summary_homelib'),text(findOrgUnit(user.home_ou()).name()));\r
952 \r
953         appendClear($('myopac_summary_dayphone'),text(user.day_phone()));\r
954         appendClear($('myopac_summary_eveningphone'),text(user.evening_phone()));\r
955         appendClear($('myopac_summary_otherphone'),text(user.other_phone()));\r
956         appendClear($('myopac_summary_suffix'),text(user.suffix()));\r
957         appendClear($('myopac_summary_username'),text(user.usrname()));\r
958         appendClear($('myopac_summary_email'),text(user.email()));\r
959         appendClear($('myopac_summary_barcode'),text(user.card().barcode()));\r
960         appendClear($('myopac_summary_ident1'),text(iv1));\r
961         appendClear($('myopac_summary_create_date'),text(_trimTime(user.create_date())));\r
962 \r
963         var req = new Request( \r
964                 FETCH_USER_NOTES, G.user.session, {pub:1, patronid:G.user.id()});\r
965         req.callback(myopacDrawNotes);\r
966         req.send();\r
967 \r
968         var tbody = $('myopac_addr_tbody');\r
969         var template;\r
970 \r
971         if(addrRowTemplate) { \r
972                 template = addrRowTemplate;\r
973         } else {\r
974                 template = tbody.removeChild($('myopac_addr_row'));\r
975                 addrRowTemplate = template;\r
976         }\r
977         removeChildren(tbody);\r
978 \r
979     var addrs = user.addresses();\r
980         for( var a in addrs ) {\r
981         var addr = addrs[a];\r
982         if(!allowPendingAddr && isTrue(addr.pending()))\r
983             continue;\r
984         if(addr.replaces() != null) continue;\r
985                 var row = template.cloneNode(true);\r
986                 myOPACDrawAddr(row, addr, addrs);\r
987                 tbody.appendChild(row);\r
988         }\r
989 }\r
990 \r
991 function drawSumFines(r){\r
992         var rr = r.recv().content();\r
993         var bal1 = $('myopac_sum_fines_bal1');\r
994         var bal2 = $('myopac_sum_fines_bal2');\r
995         var balance = rr.balance_owed();\r
996         \r
997         if(parseFloat(balance) > 0.00) {\r
998                 bal1.style.color="red";\r
999                 bal2.style.color="red";\r
1000                 unHideMe($('acct_pay_fines1'));\r
1001                 unHideMe($('acct_pay_fines2'));\r
1002         }\r
1003         \r
1004         appendClear(bal1, text("$"+balance));\r
1005         appendClear(bal2, text("$"+balance));\r
1006         appendClear($('myopac_sum_fines_owed'), text(rr.total_owed()));\r
1007         appendClear($('myopac_sum_fines_paid'), text(rr.total_paid()));\r
1008 }\r
1009 \r
1010 function myopacDrawNotes(r) {\r
1011         var notes = r.getResultObject();\r
1012         var tbody = $('myopac.notes.tbody');\r
1013         if(!notesTemplate)\r
1014                 notesTemplate = tbody.removeChild($('myopac.notes.tr'));\r
1015         removeChildren(tbody);\r
1016 \r
1017         iterate(notes, \r
1018                 function(note) {\r
1019                         unHideMe($('myopac.notes.div'));\r
1020                         var row = notesTemplate.cloneNode(true);\r
1021                         $n(row, 'title').appendChild(text(note.title()));\r
1022                         $n(row, 'value').appendChild(text(note.value()));\r
1023                         tbody.appendChild(row);\r
1024                 }\r
1025         );\r
1026 }\r
1027 \r
1028 \r
1029 \r
1030 function myOPACDrawAddr(row, addr, addrs) {\r
1031     appendClear($n(row, 'myopac_addr_type'),text(addr.address_type()));\r
1032     appendClear($n(row, 'myopac_addr_street'),text(addr.street1()));\r
1033     appendClear($n(row, 'myopac_addr_street2'),text(addr.street2()));\r
1034     appendClear($n(row, 'myopac_addr_city'),text(addr.city()));\r
1035     appendClear($n(row, 'myopac_addr_county'),text(addr.county()));\r
1036     appendClear($n(row, 'myopac_addr_state'),text(addr.state()));\r
1037     appendClear($n(row, 'myopac_addr_country'),text(addr.country()));\r
1038     appendClear($n(row, 'myopac_addr_zip'),text(addr.post_code()));\r
1039 \r
1040     if(!allowPendingAddr) return;\r
1041 \r
1042     $n(row, 'myopac_addr_edit_link').onclick = function(){myopacEditAddress(addr)};\r
1043     unHideMe($n(row, 'myopac_addr_edit_td'));\r
1044 \r
1045     /* if we have a replacement address, plop it into the table next to this addr */\r
1046     var repl = grep(addrs,\r
1047         function(a) { \r
1048             return a.replaces() == addr.id(); \r
1049         } \r
1050     );\r
1051 \r
1052     $n(row, 'myopac_pending_addr_td').id = 'myopac_pending_addr_td_' + addr.id();\r
1053 \r
1054     if(repl) {\r
1055         hideMe($n(row, 'myopac_addr_edit_td')); // hide the edit link\r
1056         repl = repl[0];\r
1057         myopacSetAddrInputs(row, repl);\r
1058     }\r
1059 }\r
1060 \r
1061 function myopacEditAddress(addr) {\r
1062     var td = $('myopac_pending_addr_td_' + addr.id());\r
1063     var row = td.parentNode;\r
1064     myopacSetAddrInputs(row, addr);\r
1065 }\r
1066 \r
1067 function myopacSetAddrInputs(row, addr, prefix) {\r
1068     unHideMe($n(row, 'myopac_pending_addr_td'));\r
1069     $n(row, 'myopac_pending_addr_type').value = addr.address_type();\r
1070     $n(row, 'myopac_pending_addr_street').value = addr.street1();\r
1071     $n(row, 'myopac_pending_addr_street2').value = addr.street2();\r
1072     $n(row, 'myopac_pending_addr_city').value = addr.city();\r
1073     $n(row, 'myopac_pending_addr_county').value = addr.county();\r
1074     $n(row, 'myopac_pending_addr_state').value = addr.state();\r
1075     $n(row, 'myopac_pending_addr_country').value = addr.country();\r
1076     $n(row, 'myopac_pending_addr_zip').value = addr.post_code();\r
1077     $n(row, 'myopac_pending_addr_edit_link').onclick = function(){myopacSaveAddress(row, addr)};\r
1078     $n(row, 'myopac_pending_addr_del_link').onclick = function(){myopacSaveAddress(row, addr, true)};\r
1079 }\r
1080 \r
1081 // if no pending addr exists, this is called with the original address\r
1082 function myopacSaveAddress(row, addr, deleteMe) {\r
1083 \r
1084     if(addr.replaces() == null) {\r
1085         // we are editing a non-pending address.  create a pending address to manage that\r
1086         var repl = new aua();\r
1087         repl.usr(addr.usr());\r
1088         repl.address_type(addr.address_type());\r
1089         repl.within_city_limits(addr.within_city_limits());\r
1090         repl.replaces(addr.id());\r
1091         repl.pending('t');\r
1092         repl.isnew(true);\r
1093         repl.id(null);\r
1094         addr = repl;\r
1095     }\r
1096 \r
1097     if(deleteMe) {\r
1098         if(addr.id() == null) {\r
1099             hideMe($n(row, 'myopac_pending_addr_td'));\r
1100             return;\r
1101         }\r
1102         addr.isdeleted(true);\r
1103     } else {\r
1104         addr.address_type($n(row, 'myopac_pending_addr_type').value);\r
1105         addr.street1($n(row, 'myopac_pending_addr_street').value);\r
1106         addr.street2($n(row, 'myopac_pending_addr_street2').value);\r
1107         addr.city($n(row, 'myopac_pending_addr_city').value);\r
1108         addr.county($n(row, 'myopac_pending_addr_county').value);\r
1109         addr.state($n(row, 'myopac_pending_addr_state').value);\r
1110         addr.country($n(row, 'myopac_pending_addr_country').value);\r
1111         addr.post_code($n(row, 'myopac_pending_addr_zip').value);\r
1112     }\r
1113 \r
1114         var req = new Request(\r
1115         'open-ils.actor:open-ils.actor.user.address.pending.cud', \r
1116         G.user.session, addr);\r
1117 \r
1118     req.callback(\r
1119         function(r) {\r
1120             var resp = r.getResultObject(); \r
1121 \r
1122             if(addr.isnew()) {\r
1123                 // new, add to list of addrs\r
1124                 addr.id(resp);\r
1125                 fleshedUser.addresses().push(addr);\r
1126 \r
1127             } else {\r
1128                 // deleted, remove from list of addrs\r
1129                 if(addr.isdeleted()) {\r
1130                     hideMe($n(row, 'myopac_pending_addr_td'));\r
1131                     var addrs = [];\r
1132                     for(var i in fleshedUser.addresses()) {\r
1133                         var a = fleshedUser.addresses()[i];\r
1134                         if(a.id() != addr.id())\r
1135                             addrs.push(a);\r
1136                     }\r
1137                     fleshedUser.addresses(addrs);\r
1138                 }\r
1139             }\r
1140            alertId('myopac_addr_changes_saved');\r
1141         }\r
1142     );\r
1143     req.send();\r
1144 };\r
1145 \r
1146 \r
1147 function myOPACUpdateUsername() {\r
1148         var username = $('myopac_new_username').value;\r
1149         if(username == null || username == "") {\r
1150                 alert($('myopac_username_error').innerHTML);\r
1151                 return;\r
1152         }\r
1153 \r
1154         if( username.match(/.*\s.*/) ) {\r
1155                 alert($('myopac_invalid_username').innerHTML);\r
1156                 return;\r
1157         }\r
1158 \r
1159     r = fetchOrgSettingDefault(globalOrgTree.id(), 'opac.barcode_regex');\r
1160     if(r) REGEX_BARCODE = new RegExp(r);\r
1161 \r
1162     if(username.match(REGEX_BARCODE)) {\r
1163         alert($('myopac_invalid_username').innerHTML);\r
1164         return;\r
1165     }\r
1166 \r
1167         /* first see if the requested username is taken */\r
1168         var req = new Request(CHECK_USERNAME, G.user.session, username);\r
1169         req.send(true);\r
1170         var res = req.result();\r
1171         /* If the username does not already exist, res will be null;\r
1172          * we can move on to updating the username.\r
1173          * \r
1174          * If the username does exist, then res will be the user ID.\r
1175          * G.user.id() gives us the currently authenticated user ID.\r
1176          * If res == G.user.id(), we try to update the username anyways.\r
1177          */\r
1178         if( res !== null && res != G.user.id() ) {\r
1179                 alertId('myopac_username_dup');\r
1180                 return;\r
1181         }\r
1182 \r
1183         var req = new Request(UPDATE_USERNAME, G.user.session, username );\r
1184         req.send(true);\r
1185         if(req.result()) {\r
1186 \r
1187                 var evt;\r
1188                 var res = req.result();\r
1189                 if(evt = checkILSEvent(res)) {\r
1190                         alertILSEvent(res);\r
1191                         return;\r
1192                 }\r
1193 \r
1194                 G.user.usrname(username);\r
1195                 hideMe($('myopac_update_username_row'));\r
1196                 userShown = false;\r
1197                 alertId('myopac_username_success');\r
1198                 myOPACShowSummary();\r
1199                 return;\r
1200         }\r
1201 \r
1202         alert($('myopac_username_failure').innerHTML);\r
1203 }\r
1204 \r
1205 function myOPACUpdateEmail() {\r
1206         var email = $('myopac_new_email').value;\r
1207         if(email == null || email == "") {\r
1208                 alert($('myopac_email_error').innerHTML);\r
1209                 return;\r
1210         }\r
1211 \r
1212         var req = new Request(UPDATE_EMAIL, G.user.session, email );\r
1213         req.send(true);\r
1214         if(req.result()) {\r
1215                 G.user.usrname(email);\r
1216                 hideMe($('myopac_update_email_row'));\r
1217                 userShown = false;\r
1218                 alertId('myopac_email_success');\r
1219                 myOPACShowSummary();\r
1220                 return;\r
1221         }\r
1222 \r
1223         alert($('myopac_email_failure').innerHTML);\r
1224 }\r
1225 \r
1226 \r
1227 function myOPACUpdatePassword() {\r
1228         var curpassword = $('myopac_current_password').value;\r
1229         var password = $('myopac_new_password').value;\r
1230         var password2 = $('myopac_new_password2').value;\r
1231 \r
1232         if(     curpassword == null || curpassword == "" || \r
1233                         password == null || password == "" || \r
1234                         password2 == null || password2 == "" || password != password2 ) {\r
1235                 alert($('myopac_password_error').innerHTML);\r
1236                 return;\r
1237         }\r
1238 \r
1239         if(!strongPassword(password, true)) return;\r
1240 \r
1241         var req = new Request(UPDATE_PASSWORD, G.user.session, password, curpassword );\r
1242         req.send(true);\r
1243         if(req.result()) {\r
1244                 hideMe($('myopac_update_password_row'));\r
1245                 userShown = false;\r
1246                 alertId('myopac_password_success');\r
1247                 myOPACShowSummary();\r
1248                 return;\r
1249         }\r
1250 \r
1251         alert($('myopac_password_failure').innerHTML);\r
1252 }\r
1253 \r
1254 \r
1255 \r
1256 var containerTemplate = null;\r
1257 function myOPACShowBookbags(force) {\r
1258         var wrapper = $('acct_lists_prime');\r
1259         if(!containerTemplate) containerTemplate = wrapper.removeChild($('acct_list_template')); else if(!force) return;\r
1260         if(!wrapper) return;\r
1261         \r
1262         var containers = containerFetchAll();\r
1263         \r
1264         var found = false;\r
1265         for(var i in containers) {\r
1266                 found = true;\r
1267                 var cont = containers[i];\r
1268                 fleshedContainers[cont.id()] = cont;\r
1269                 var temp = containerTemplate.cloneNode(true);\r
1270                 var title = $n(temp, 'list_name');\r
1271                 var sel_none = $n(temp, 'select_none');\r
1272                 var sel_all = $n(temp, 'select_all');\r
1273                 var list_act = $n(temp, 'list_actions');\r
1274                 if(!title || !sel_none || !sel_all || !list_act) continue;\r
1275                 \r
1276                 title.appendChild(text(cont.name()));\r
1277                 sel_all.onclick = function() { tickTheBoxes(true,this); };\r
1278                 sel_none.onclick = function() { tickTheBoxes(false,this); };\r
1279                 list_act.listID = cont.id();\r
1280                 list_act.onchange = myListAction;\r
1281                 temp.setAttribute("id",temp.id+cont.id());\r
1282                 \r
1283                 if(isTrue(cont.pub())) {\r
1284                         list_act.appendChild(elem('option',{value:'hide'},'Un-share this list'));\r
1285                         var link = $n(temp,'share_list_rss');\r
1286                         link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));\r
1287                         unHideMe(link);\r
1288                 } else {\r
1289                         list_act.appendChild(elem('option',{value:'share'},'Share this list'));\r
1290                 }\r
1291                 \r
1292                 wrapper.appendChild(temp);\r
1293                 // grab container items after adding each list to the page\r
1294                 fieldmapper.standardRequest(["open-ils.actor","open-ils.actor.container.flesh"],{params:[G.user.session, 'biblio', cont.id()],oncomplete:drawListItemRows});\r
1295         }\r
1296         if(!found) wrapper.appendChild(elem("div",{style:"font-weight:bold;text-align:center;font-size:14px;"},"You have not created any lists"));\r
1297         \r
1298 /*\r
1299         var tbody =$('myopac_bookbag_tbody') ;\r
1300 \r
1301         if(!containerTemplate) \r
1302                 containerTemplate = tbody.removeChild($('myopac_bookbag_tr'));\r
1303         else if(!force) return;\r
1304 \r
1305         removeChildren(tbody);\r
1306 \r
1307         var containers = containerFetchAll();\r
1308 \r
1309         var found = false;\r
1310         for( var i in containers ) {\r
1311                 found = true;\r
1312                 var cont = containers[i];\r
1313                 var row = containerTemplate.cloneNode(true);\r
1314                 row.id = 'myopac_bookbag_row_' + cont.id();\r
1315                 var link = $n(row, 'myopac_expand_bookbag');\r
1316                 var dlink = $n(row, 'myopac_container_delete');\r
1317                 link.appendChild( text(cont.name()) );\r
1318                 link.setAttribute('href', \r
1319                         'javascript:myOPACExpandBookbag("' + cont.id() + '","' + cont.name() + '");');\r
1320                 myOPACFetchBBItems( cont.id(), row );\r
1321                 dlink.setAttribute('href', 'javascript:myOPACDeleteBookbag("'+cont.id()+'");');\r
1322 \r
1323                 if( isTrue(cont.pub()) ) {\r
1324                         unHideMe($n(row, 'myopac_bb_published_yes'));\r
1325                         var link = $n(row, 'myopac_bb_published_view');\r
1326                         link.setAttribute('href', buildExtrasLink( 'feed/bookbag/html-full/'+cont.id(), false));  \r
1327                         link.setAttribute('target', '_blank' );\r
1328                         unHideMe(link);\r
1329 \r
1330                         link = $n(row, 'myopac_bb_published_atom');\r
1331                         link.setAttribute('href', buildExtrasLink( 'feed/bookbag/rss2-full/'+cont.id(), false));\r
1332                         link.setAttribute('target', '_blank' );\r
1333                         unHideMe(link);\r
1334 \r
1335                         link = $n(row, 'myopac_bb_make_unpublished');\r
1336                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'", true);');\r
1337                         unHideMe(link);\r
1338 \r
1339                 } else { \r
1340                         unHideMe($n(row, 'myopac_bb_published_no')); \r
1341                         var link = $n(row, 'myopac_bb_make_published');\r
1342                         link.setAttribute('href', 'javascript:myOPACMakeBBPublished("'+cont.id()+'");');\r
1343                         unHideMe(link);\r
1344                 }\r
1345 \r
1346                 tbody.appendChild(row); \r
1347         }\r
1348 \r
1349         if(!found) unHideMe($('myopac_bookbags_none'));\r
1350         else unHideMe($('myopac_bookbag_table'));       \r
1351 */\r
1352 }\r
1353 \r
1354 function myListAction() {\r
1355         if(!this.listID) return;\r
1356         switch(this.value) {\r
1357                 case "delete": myOPACDeleteBookbag(this.listID); break;\r
1358                 case  "share": myOPACMakeBBPublished(this.listID); break;\r
1359                 case   "hide": myOPACMakeBBPublished(this.listID, true); break;\r
1360         }\r
1361 }\r
1362 \r
1363 function drawListItemRows(r) {\r
1364         var fleshed = r.recv().content();\r
1365         if(!fleshed) return;\r
1366         var modsArr = [];\r
1367         \r
1368         var temp = $('acct_list_template'+fleshed.id());\r
1369         if(!temp) return;\r
1370         var tbody = $n(temp,'list_tbody');\r
1371         if(!tbody) return;\r
1372         var items = fleshed.items();\r
1373         \r
1374         for(var i=0; i<items.length; i++) {\r
1375                 var it = items[i];\r
1376                 var tr = elem('tr');\r
1377                 var td1 = elem('td',{'class':'list_item_title_'+it.target_biblio_record_entry()});\r
1378                 var td2 = elem('td',{align:'right',width:'1'});\r
1379                 \r
1380                 td2.appendChild(elem('input',{type:'checkbox', title:'Remove', name:'item_remove_chbx','class':'item_remove_chbx',itemID:+it.id(),listID:fleshed.id()}));\r
1381                 \r
1382                 tr.appendChild(td1);\r
1383                 tr.appendChild(td2);\r
1384                 tbody.appendChild(tr);\r
1385                 modsArr[i] = it.target_biblio_record_entry();\r
1386         }\r
1387         \r
1388         // yay for batching requests\r
1389         if(modsArr.length) {\r
1390                 fieldmapper.standardRequest(["open-ils.search","open-ils.search.biblio.record.mods_slim.retrieve"],{params:[modsArr],oncomplete:drawListItemTitles});\r
1391         } else {\r
1392                 var tr = elem('');\r
1393                 var td = elem('td',{style:"font-weight:bold;font-size:14px;",align:'center'},'No items have been added to this list yet.');\r
1394                 tr.appendChild(td);\r
1395                 tbody.appendChild(tr);\r
1396         }\r
1397 }\r
1398 \r
1399 function drawListItemTitles(r) {\r
1400         var rec = r.recv().content();\r
1401         if(!rec) return;\r
1402         \r
1403         for(var i in rec) {\r
1404                 var rows = dojo.query('.list_item_title_'+rec[i].doc_id());\r
1405                 rows.forEach(function(node, index, arr){\r
1406                         node.innerHTML = rec[i].title();\r
1407                 });\r
1408         }\r
1409 }\r
1410 \r
1411 function myOPACMakeBBPublished(bbid, hideme) {\r
1412 \r
1413         var bb = fleshedContainers[bbid];\r
1414 \r
1415         if(hideme) {\r
1416                 if(!confirm($('myopac_make_unpublished_confirm').innerHTML)) return;\r
1417                 bb.pub('f');\r
1418         } else {\r
1419                 if(!confirm($('myopac_make_published_confirm').innerHTML)) return;\r
1420                 bb.pub('t');\r
1421         }\r
1422 \r
1423         var result = containerUpdate(bb);\r
1424 \r
1425         var code = checkILSEvent(result);\r
1426         if(code) { alertILSEvent(result); return; }\r
1427 \r
1428         alert($('myopac_bb_update_success').innerHTML);\r
1429         reloadMyLists();\r
1430 }\r
1431 \r
1432 \r
1433 \r
1434 function myOPACDeleteBookbag(id) {\r
1435         if( confirm( $('myopac_delete_bookbag_warn').innerHTML ) ) {\r
1436                 var result = containerDelete(id);\r
1437                 var code = checkILSEvent(result);\r
1438                 if(code) { alertILSEvent(result); return; }\r
1439                 alert($('myopac_bb_update_success').innerHTML);\r
1440                 //hideMe($('myopac_bookbag_items_table'));\r
1441                 //hideMe($('myopac_bookbag_items_name'));\r
1442                 //hideMe($('myopac_bookbag_no_items'));\r
1443                 reloadMyLists();\r
1444         }\r
1445 }\r
1446 \r
1447 function myOPACFetchBBItems( id, row, block ) {\r
1448         if(!block) {\r
1449                 containerFlesh( id, _myOPACSetBBItems, { row: row }  );\r
1450         } else {\r
1451                 var cont = containerFlesh(id);\r
1452                 myOPACSetBBItems( cont, row );\r
1453         }\r
1454 }\r
1455 \r
1456 function _myOPACSetBBItems(r) { myOPACSetBBItems( r.getResultObject(), r.args.row ); }\r
1457 \r
1458 function myOPACSetBBItems( container, row ) {\r
1459         fleshedContainers[container.id()] = container;\r
1460         var node = $n(row, 'myopac_bookbag_item_count');\r
1461         removeChildren(node);\r
1462         node.appendChild( text(container.items().length) );\r
1463 }\r
1464 \r
1465 var BBItemsRow;\r
1466 function myOPACExpandBookbag( id, name ) {\r
1467         \r
1468         var tbody = $('myopac_bookbag_items_tbody');\r
1469         if(!BBItemsRow) BBItemsRow = tbody.removeChild($('myopac_bookbag_items_row'));\r
1470         removeChildren(tbody);\r
1471         removeChildren($('myopac_bookbag_items_name'));\r
1472 \r
1473         $('myopac_bookbag_items_name').appendChild(text(name));\r
1474 \r
1475         if( fleshedContainers[id] ) {\r
1476                 var len = fleshedContainers[id].items().length;\r
1477 \r
1478                 if( len == 0 ) {\r
1479                         unHideMe($('myopac_bookbag_no_items'));\r
1480                         hideMe($('myopac_bookbag_items_table'));\r
1481                         return;\r
1482                 }\r
1483 \r
1484                 hideMe($('myopac_bookbag_no_items'));\r
1485                 unHideMe($('myopac_bookbag_items_table'));\r
1486 \r
1487                 for( var i = 0; i != len; i++ ) {\r
1488                         var row = BBItemsRow.cloneNode(true);\r
1489                         found = true;\r
1490 \r
1491                         var item = fleshedContainers[id].items()[i];\r
1492                         var tlink = $n(row,'myopac_bookbag_items_title');\r
1493                         var alink = $n(row,'myopac_bookbag_items_author');\r
1494 \r
1495                         var req = new Request( FETCH_RMODS, item.target_biblio_record_entry() );\r
1496                         req.request.tlink = tlink;\r
1497                         req.request.alink = alink;\r
1498                         req.callback(myOPACShowBBItem);\r
1499                         req.send();\r
1500 \r
1501                         var clink = $n(row, 'myopac_bookbag_items_remove');\r
1502                         clink.setAttribute('href', 'javascript:myOPACRemoveBBItem("'+item.id()+'","'+id+'","'+name+'");');\r
1503 \r
1504                         tbody.appendChild(row);\r
1505                 }\r
1506         }\r
1507 }\r
1508 \r
1509 function myOPACRemoveBBItem( id, containerid, container_name ) {\r
1510         if(!confirm($('myopac_remove_bb_item_confirm').innerHTML)) return;\r
1511         var stat = containerRemoveItem( id );\r
1512         if(stat) alert($('myopac_bb_update_success').innerHTML);\r
1513         myOPACFetchBBItems( containerid, $('myopac_bookbag_row_' + containerid), true);\r
1514         myOPACExpandBookbag( containerid, container_name );\r
1515 }\r
1516 \r
1517 function myOPACShowBBItem(r) {\r
1518         var record = r.getResultObject();\r
1519         buildTitleDetailLink(record, r.tlink);\r
1520         buildSearchLink(STYPE_AUTHOR, record.author(), r.alink);\r
1521 }\r
1522 \r
1523 \r
1524 /* ---------------------------------------------------------------------- */\r
1525 /* Non cat circs */\r
1526 /* ---------------------------------------------------------------------- */\r
1527 \r
1528 var nonCatCircIds;\r
1529 var nonCatTypes;\r
1530 /* if we have some circs, grab the non-cat types */\r
1531 function myOPACDrawNonCatCircs(r) {\r
1532         var ids = r.getResultObject();\r
1533         if(ids.length == 0) return;\r
1534         nonCatCircIds = ids;\r
1535         unHideMe($('non_cat_circs_div'));\r
1536         var req = new Request(FETCH_NON_CAT_TYPES, G.user.home_ou());\r
1537         req.callback(myOPACDrawNonCatCircs2);\r
1538         req.send();\r
1539 }\r
1540 \r
1541 \r
1542 /* now we have circs and the types.. draw each one */\r
1543 var nonCatTbody;\r
1544 var nonCatRow;\r
1545 function myOPACDrawNonCatCircs2(r) {\r
1546         nonCatTypes = r.getResultObject();\r
1547         nonCatTbody = $('non_cat_circs_tbody');\r
1548         if(!nonCatRow) nonCatRow = \r
1549                 nonCatTbody.removeChild($('non_cat_circs_row'));\r
1550         removeChildren(nonCatTbody);\r
1551         for( var i in nonCatCircIds ) {\r
1552                 var req = new Request(FETCH_NON_CAT_CIRC, G.user.session, nonCatCircIds[i]);\r
1553                 req.callback(myOPACDrawNonCatCirc);\r
1554                 req.send();\r
1555         }\r
1556 }\r
1557 \r
1558 \r
1559 /* draw a single circ */\r
1560 function myOPACDrawNonCatCirc(r) {\r
1561         var circ = r.getResultObject();\r
1562 \r
1563 \r
1564         var type = grep(nonCatTypes, \r
1565                 function(i){\r
1566                         return (i.id() == circ.item_type());\r
1567                 }\r
1568         )[0];\r
1569 \r
1570 \r
1571         var row = nonCatTbody.appendChild(nonCatRow.cloneNode(true));\r
1572         appendClear($n(row, 'circ_lib'), text(findOrgUnit(circ.circ_lib()).name()));\r
1573         appendClear($n(row, 'item_type'), text(type.name()));\r
1574 \r
1575         var duration = interval_to_seconds(type.circ_duration());\r
1576         duration = parseInt(duration + '000');\r
1577 \r
1578         var dtf = circ.circ_time();\r
1579     var start = dojo.date.stamp.fromISOString(circ.circ_time());\r
1580         var due = new Date(  start.getTime() + duration );\r
1581         appendClear($n(row, 'circ_time'), text(due.iso8601Format('YMDHM', null, true, true)));\r
1582 }\r
1583 \r
1584 \r
1585 \r
1586 \r
1587 function myopacSelectAllChecked() {\r
1588    __myopacSelectChecked(true);\r
1589 }\r
1590 \r
1591 function myopacSelectNoneChecked() {\r
1592    __myopacSelectChecked(false);\r
1593 }\r
1594 \r
1595 function __myopacSelectChecked(value) {\r
1596    var rows = myopacGetCheckedOutRows();\r
1597    for( var i = 0; i < rows.length; i++ ) {\r
1598       var row = rows[i];\r
1599       var box = $n(row, 'selectme');\r
1600       if( box && ! box.disabled )\r
1601       box.checked = value;\r
1602    }\r
1603 }\r
1604 \r
1605 function myopacGetCheckedOutRows() {\r
1606    var rows = [];\r
1607    var tbody = $('myopac_checked_tbody');\r
1608    var children = tbody.childNodes;\r
1609    for( var i = 0; i < children.length; i++ ) {\r
1610       var child = children[i];\r
1611       if( child.nodeName.match(/^tr$/i) ) \r
1612          if( $n(child, 'selectme') ) \r
1613             rows.push(child);\r
1614    }\r
1615    return rows;\r
1616 }\r
1617 \r
1618 var __renew_circs = [];\r
1619 \r
1620 /* true if 1 renewal succeeded */\r
1621 var __success_count = 0;\r
1622 \r
1623 /* renews all selected circulations */\r
1624 function myOPACRenewSelected() {\r
1625    var rows = myopacGetCheckedOutRows();\r
1626         if(!confirm($('myopac_renew_confirm').innerHTML)) return;\r
1627    __success_count = 0;\r
1628 \r
1629    for( var i = 0; i < rows.length; i++ ) {\r
1630 \r
1631       var row = rows[i];\r
1632       if( ! $n(row, 'selectme').checked ) continue;\r
1633       var circ_id = row.getAttribute('circid');\r
1634 \r
1635            var circ;\r
1636            for( var j = 0; j != circsCache.length; j++ ) \r
1637                    if(circsCache[j].id() == circ_id)\r
1638                            circ = circsCache[j];\r
1639 \r
1640       __renew_circs.push(circ);\r
1641    }\r
1642 \r
1643     if( __renew_circs.length == 0 ) return;\r
1644 \r
1645     unHideMe($('my_renewing'));\r
1646     moClearCheckedTable();\r
1647 \r
1648     for( var i = 0; i < __renew_circs.length; i++ ) {\r
1649         var circ = __renew_circs[i];\r
1650         moRenewCirc( circ.target_copy(), G.user.id(), circ );\r
1651     }\r
1652 }\r
1653 \r
1654 \r
1655 /* renews a single circulation */\r
1656 function moRenewCirc(copy_id, user_id, circ) {\r
1657 \r
1658    _debug('renewing circ ' + circ.id() + ' with copy ' + copy_id);\r
1659    var req = new Request(RENEW_CIRC, G.user.session, \r
1660       {  patron : user_id, \r
1661          copyid : copy_id, \r
1662          opac_renewal : 1 \r
1663       } \r
1664    );\r
1665 \r
1666    req.request.alertEvent = false;\r
1667    req.callback(myHandleRenewResponse);\r
1668    req.request.circ = circ;\r
1669    req.send();\r
1670 }\r
1671 \r
1672 \r
1673 \r
1674 /* handles the circ renew results */\r
1675 function myHandleRenewResponse(r) {\r
1676    var res = r.getResultObject();\r
1677    var circ = r.circ;\r
1678 \r
1679    /* remove this circ from the list of circs to renew */\r
1680    __renew_circs = grep(__renew_circs, function(i) { return (i.id() != circ.id()); });\r
1681 \r
1682    _debug("handling renew result for " + circ.id());\r
1683 \r
1684    if(checkILSEvent(res) || checkILSEvent(res[0])) \r
1685       alertIdText('myopac_renew_fail', __circ_titles[circ.id()]);\r
1686    else __success_count++;\r
1687 \r
1688    if(__renew_circs) return; /* more to come */\r
1689 \r
1690    __renew_circs = [];\r
1691 \r
1692         if( __success_count > 0 )\r
1693       alertIdText('myopac_renew_success', __success_count);\r
1694 \r
1695    hideMe($('my_renewing'));\r
1696    checkedDrawn = false;\r
1697     myOPACShowChecked();\r
1698 }\r
1699 \r
1700 /** ---- batch hold processing ------------ */\r
1701 \r
1702 \r
1703 /* myopac_holds_checkbx */\r
1704 function myopacSelectAllHolds() {\r
1705     var rows = getTableRows($("myopac_holds_tbody"));\r
1706     for(var i = 0; i < rows.length; i++) {\r
1707         cb = $n(rows[i], 'myopac_holds_selected_chkbx');\r
1708         if(cb) cb.checked = true;\r
1709     }\r
1710 }\r
1711 \r
1712 function myopacSelectNoneHolds() {\r
1713     var rows = getTableRows($("myopac_holds_tbody"));\r
1714     for(var i = 0; i < rows.length; i++) {\r
1715         cb = $n(rows[i], 'myopac_holds_selected_chkbx');\r
1716         if(cb) cb.checked = false;\r
1717     }\r
1718 }\r
1719 \r
1720 function myopacSelectedHoldsRows() {\r
1721     var r = [];\r
1722     var rows = getTableRows($("myopac_holds_tbody"));\r
1723     for(var i = 0; i < rows.length; i++) {\r
1724         cb = $n(rows[i], 'myopac_holds_selected_chkbx');\r
1725         if(cb && cb.checked)\r
1726             r.push(rows[i]);\r
1727     }\r
1728     return r;\r
1729 }\r
1730 \r
1731 var myopacProcessedHolds = 0;\r
1732 var myopacHoldsToProcess = 0;\r
1733 function myopacDoHoldAction() {\r
1734 \r
1735     var selectedRows = myopacSelectedHoldsRows();\r
1736     action = getSelectorVal($('myopac_holds_actions'));\r
1737     $('myopac_holds_actions_none').selected = true;\r
1738     if(selectedRows.length == 0) return;\r
1739 \r
1740     myopacProcessedHolds = 0;\r
1741 \r
1742     if(!confirmId('myopac.holds.'+action+'.confirm')) return;\r
1743     myopacSelectNoneHolds(); /* clear the selection */\r
1744 \r
1745 \r
1746     /* first, let's collect the holds that actually need processing and\r
1747         collect the full process count while we're at it */\r
1748     var holds = [];\r
1749     for(var i = 0; i < selectedRows.length; i++) {\r
1750         hold = holdCache[myopacHoldIDFromRow(selectedRows[i])];\r
1751         var qstats = holdStatusCache[hold.id()];\r
1752         switch(action) {\r
1753             case 'cancel':\r
1754                 holds.push(hold);\r
1755                 break;\r
1756             case 'thaw_date':\r
1757             case 'thaw':\r
1758                 if(isTrue(hold.frozen()))\r
1759                     holds.push(hold);\r
1760                 break;\r
1761             case 'freeze':\r
1762                 if(!isTrue(hold.frozen()) && qstats.status < 3)\r
1763                     holds.push(hold);\r
1764                 break;\r
1765         }\r
1766     }\r
1767     myopacHoldsToProcess = holds;\r
1768     if(myopacHoldsToProcess.length == 0) return;\r
1769 \r
1770     if(action == 'thaw_date' || action == 'freeze') \r
1771         myopacDrawHoldThawDateForm();\r
1772     else\r
1773     myopacProcessHolds(action);\r
1774 }\r
1775 \r
1776 \r
1777 function myopacProcessHolds(action, thawDate) {\r
1778 \r
1779     myopacShowHoldProcessing();\r
1780     /* now we process them */\r
1781     for(var i = 0; i < myopacHoldsToProcess.length; i++) {\r
1782 \r
1783         hold = myopacHoldsToProcess[i];\r
1784         \r
1785         var req;\r
1786         switch(action) { \r
1787 \r
1788             case 'cancel':\r
1789                 req = new Request(CANCEL_HOLD, G.user.session, hold.id());\r
1790                 break;\r
1791     \r
1792             case 'thaw':\r
1793                 hold.frozen('f');\r
1794                 hold.thaw_date(null);\r
1795                 req = new Request(UPDATE_HOLD, G.user.session, hold);\r
1796                 break;\r
1797 \r
1798             case 'thaw_date':\r
1799             case 'freeze':\r
1800                 hold.frozen('t');\r
1801                 hold.thaw_date(thawDate); \r
1802                 req = new Request(UPDATE_HOLD, G.user.session, hold);\r
1803                 break;\r
1804                 //thawDate = prompt($('myopac.holds.freeze.select_thaw').innerHTML);\r
1805 \r
1806         }\r
1807 \r
1808         req.callback(myopacBatchHoldCallback);\r
1809         req.send();\r
1810         req = null;\r
1811     }\r
1812 }\r
1813 \r
1814 function myopacDrawHoldThawDateForm() {\r
1815     hideMe($('myopac_holds_main_table'));\r
1816     unHideMe($('myopac_holds_thaw_date_form'));\r
1817     $('myopac_holds_thaw_date_input').focus();\r
1818 }\r
1819 \r
1820 function myopacApplyThawDate() {\r
1821         var obj = $('myopac_holds_thaw_date_input');\r
1822     var dateString = obj.value;\r
1823     if(dateString) {\r
1824         dateString = dojo.date.stamp.toISOString(dateString);\r
1825         if(dateString) {\r
1826             dateString = holdsVerifyThawDate(dateString);\r
1827             if(!dateString) return;\r
1828         } else {\r
1829             dateString = null;\r
1830         }\r
1831     }\r
1832     myopacProcessHolds('freeze', dateString);\r
1833 }\r
1834 \r
1835 function myopacHoldIDFromRow(row) {\r
1836     return row.id.replace(/.*_(\d+)$/, '$1');\r
1837 }\r
1838 \r
1839 function myopacShowHoldProcessing() {\r
1840     unHideMe($('myopac_holds_processing'));\r
1841     hideMe($('myopac_holds_main_table'));\r
1842 }\r
1843 \r
1844 function myopacHideHoldProcessing() {\r
1845     hideMe($('myopac_holds_processing'));\r
1846     unHideMe($('myopac_holds_main_table'));\r
1847     hideMe($('myopac_holds_thaw_date_form'));\r
1848 }\r
1849 \r
1850 function myopacBatchHoldCallback(r) {\r
1851     if(r) /* force load any exceptions */\r
1852         r.getResultObject();\r
1853     if(++myopacProcessedHolds >= myopacHoldsToProcess.length) {\r
1854         myopacHideHoldProcessing();\r
1855         holdCache = {};\r
1856         holdStatusCache = {};\r
1857         myopacForceHoldsRedraw = true;\r
1858         myOPACShowHolds();\r
1859     }\r
1860 }\r
1861 \r
1862 function switchHoldsPage(page) {\r
1863         var objs = [];\r
1864         objs['holds_label'] = $('holds_label');\r
1865         objs['holds_link'] = $('holds_link');\r
1866         objs['holds_hist_link'] = $('holds_hist_link');\r
1867         objs['holds_hist_label'] = $('holds_hist_label');\r
1868         \r
1869         objs['holds_main'] = $('holds_main');\r
1870         objs['holds_hist_table'] = $('holds_hist_table');\r
1871         \r
1872         for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }\r
1873         \r
1874         switch(page) {\r
1875                 case "main":\r
1876                         unHideMe(objs['holds_label']);\r
1877                         unHideMe(objs['holds_hist_link']);\r
1878                         unHideMe(objs['holds_main']);\r
1879                         $('acct_holds_header').innerHTML = "Current Items on Hold";\r
1880                         break;\r
1881                 case "holds_hist":\r
1882                         unHideMe(objs['holds_link']);\r
1883                         unHideMe(objs['holds_hist_label']);\r
1884                         unHideMe(objs['holds_hist_table']);\r
1885                         $('acct_holds_header').innerHTML = "Holds History";\r
1886                         break;\r
1887         }\r
1888 }\r
1889 \r
1890 function switchPrefsPage(page) {\r
1891         var objs = [];\r
1892         objs['acct_info_label']   = $('acct_info_label');\r
1893         objs['acct_info_link']    = $('acct_info_link');\r
1894         objs['acct_notify_label'] = $('acct_notify_label');\r
1895         objs['acct_notify_link']  = $('acct_notify_link');\r
1896         objs['acct_search_label'] = $('acct_search_label');\r
1897         objs['acct_search_link']  = $('acct_search_link');\r
1898         \r
1899         objs['acct_info_head']   = $('acct_info_head');\r
1900         objs['acct_search_head'] = $('acct_search_head');\r
1901         objs['acct_notify_head'] = $('acct_notify_head');\r
1902         objs['acct_info_main']   = $('acct_info_main');\r
1903         objs['acct_search_main'] = $('acct_search_main');\r
1904         objs['acct_notify_main'] = $('acct_notify_main');\r
1905         \r
1906         for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }\r
1907         \r
1908         switch(page) {\r
1909                 case "main":\r
1910                         unHideMe(objs['acct_info_label']);\r
1911                         unHideMe(objs['acct_notify_link']);\r
1912                         unHideMe(objs['acct_search_link']);\r
1913                         unHideMe(objs['acct_info_head']);\r
1914                         unHideMe(objs['acct_info_main']);\r
1915                         hideMe($('acct_prefs_save'));\r
1916                         break;\r
1917                 case "search":\r
1918                         unHideMe(objs['acct_search_label']);\r
1919                         unHideMe(objs['acct_info_link']);\r
1920                         unHideMe(objs['acct_notify_link']);\r
1921                         unHideMe(objs['acct_search_head']);\r
1922                         unHideMe(objs['acct_search_main']);\r
1923                         unHideMe($('acct_prefs_save'));\r
1924                         break;\r
1925                 case "notify":\r
1926                         unHideMe(objs['acct_info_link']);\r
1927                         unHideMe(objs['acct_notify_label']);\r
1928                         unHideMe(objs['acct_search_link']);\r
1929                         unHideMe(objs['acct_notify_head']);\r
1930                         unHideMe(objs['acct_notify_main']);\r
1931                         unHideMe($('acct_prefs_save'));\r
1932                         break;\r
1933         }\r
1934 }\r
1935 \r
1936 function switchCheckedPage(page) {\r
1937         var objs = [];\r
1938         objs['checked_label'] = $('checked_label');\r
1939         objs['checked_link'] = $('checked_link');\r
1940         objs['checked_hist_link'] = $('checked_hist_link');\r
1941         objs['checked_hist_label'] = $('checked_hist_label');\r
1942         \r
1943         objs['checked_main'] = $('checked_main');\r
1944         objs['checked_hist'] = $('checked_hist');\r
1945         \r
1946         for(var i in objs) { if(!objs[i]) return; hideMe(objs[i]); }\r
1947         \r
1948         switch(page) {\r
1949                 case "main":\r
1950                         unHideMe(objs['checked_label']);\r
1951                         unHideMe(objs['checked_hist_link']);\r
1952                         unHideMe(objs['checked_main']);\r
1953                         $('acct_checked_header').innerHTML = "Current Items Checked Out";\r
1954                         //if(__can_renew_one) unHideMe($('mo_renew_button'));\r
1955                         break;\r
1956                 case "checked_hist":\r
1957                         unHideMe(objs['checked_link']);\r
1958                         unHideMe(objs['checked_hist_label']);\r
1959                         unHideMe(objs['checked_hist']);\r
1960                         $('acct_checked_header').innerHTML = "Check Out History";\r
1961                         //hideMe($('mo_renew_button'));\r
1962                         break;\r
1963         }\r
1964 }\r
1965 \r
1966 function tickTheBoxes(bool,el) {\r
1967         var rows = dojo.query('input[type=checkbox]',el.parentNode.parentNode.parentNode);\r
1968         var cb = null;\r
1969     for(var i = 0; i < rows.length; i++) {\r
1970         cb = $n(rows[i], 'item_remove_chbx');\r
1971         if(cb) cb.checked = bool;\r
1972     }\r
1973 }\r
1974 \r
1975 function removeSelectedItems() {\r
1976         var items = dojo.query('.item_remove_chbx',$('acct_lists_prime')).filter(function(item, index, arr){return item.checked;},this);\r
1977         \r
1978         if(items.length && confirm("Are you sure you want to remove the selected items?")) {\r
1979                 for(var i=0; i<items.length; i++) {\r
1980                         var box = items[i];\r
1981                         if(box.checked) {\r
1982                                 containerRemoveItem(box.itemID);\r
1983                         }\r
1984                 }\r
1985                 \r
1986                 reloadMyLists();\r
1987         }\r
1988 }\r
1989 \r
1990 function reloadMyLists() {\r
1991         var prime = $('acct_lists_prime');\r
1992         var temp2 = $('acct_list_template2').cloneNode(true);\r
1993         prime.innerHTML = "";\r
1994         temp2.id = 'acct_list_template';\r
1995         prime.appendChild(temp2);\r
1996         myOPACShowBookbags(true);\r
1997 }\r
1998 \r
1999 function addMyList() {\r
2000         var name = $('mylist_new').value;       \r
2001         if(!name) return false;\r
2002 \r
2003         var exists = false;\r
2004         for( var c in fleshedContainers ) { exists = true; break; }\r
2005 \r
2006         /* let them know what they are getting into... */\r
2007         if(!exists) if(!confirm($('bb_create_warning').innerHTML)) return false;\r
2008         var result = containerCreate( name, $('shareListYes').checked );\r
2009         var code = checkILSEvent(result);\r
2010         if(code) { alertILSEvent(result); return false; }\r
2011         if(result) alert($('myopac_bb_update_success').innerHTML);\r
2012         $('mylist_new').value="";\r
2013         $('shareListYes').checked = false;\r
2014         $('shareListNo').checked = true;\r
2015         reloadMyLists();\r
2016         return true;\r
2017 }\r
2018 \r
2019 function showFinesDiv(el) {\r
2020         if(!el) return;\r
2021         if($('myopac_fines_div').className.indexOf('hide_me')>=0) { \r
2022                 unHideMe($('myopac_fines_div'));\r
2023                 el.innerHTML="Hide Overdue Materials";\r
2024         } else {\r
2025                 hideMe($('myopac_fines_div'));\r
2026                 el.innerHTML="Show Overdue Materials";\r
2027         }\r
2028 }\r