]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/javascript/opac/MyOPACSPage.js
changing the login dialog over to use the popup box stuff
[Evergreen.git] / Open-ILS / src / javascript / opac / MyOPACSPage.js
1 /* */
2
3 MyOPACSPage.prototype                                   = new Page();
4 MyOPACSPage.prototype.constructor       = Page;
5 MyOPACSPage.baseClass                                   = Page.constructor;
6
7 function MyOPACSPage() {
8         var session_id = location.search.substring(  
9                         location.search.indexOf("session") + 8 ); /*md5 session key*/
10
11         this.user = UserSession.instance();
12         this.user.verifySession(session_id);
13 }
14
15 MyOPACSPage.prototype.init = function() {
16         this.draw();
17 }
18
19 MyOPACSPage.prototype.draw = function(type) {
20
21         debug("Fleshing User");
22
23         this.infoPane = getById("my_opac_info_pane");
24         this.infoTable = getById("my_opac_info_table");
25         /*
26         removeChildren(this.infoPane);
27         removeChildren(this.infoTable);
28         this.infoPane.appendChild(this.infoTable);
29         */
30
31
32         this.buildNavBox(true);
33         
34         this.checkCell          = getById("my_opac_checked");
35         this.holdsCell          = getById("my_opac_holds");
36         this.profileCell        = getById("my_opac_profile");
37         this.finesCell          = getById("my_opac_fines");
38
39         check           = getById("my_opac_checked_link");
40         holds           = getById("my_opac_holds_link");
41         profile = getById("my_opac_profile_link");
42         fines           = getById("my_opac_fines_link");
43
44         var obj = this;
45         check.onclick           = function() { obj.drawCheckedOut(); };
46         holds.onclick           = function() { obj.drawHolds(); };
47         profile.onclick = function() { obj.drawProfile(); };
48         fines.onclick           = function() { obj.drawFines(); };
49
50         switch(type) {
51                 case "holds": this.drawHolds(); break;
52                 case "profile": this.drawProfile(); break;
53                 case "fines": this.drawFines(); break;
54                 case "checked": 
55                 default:this.drawCheckedOut();
56         }
57 }
58
59
60 MyOPACSPage.prototype.setLink = function(cell) {
61         remove_css_class(this.checkCell,        "my_opac_link_cell_active");
62         remove_css_class(this.holdsCell,        "my_opac_link_cell_active");
63         remove_css_class(this.profileCell, "my_opac_link_cell_active");
64         remove_css_class(this.finesCell,        "my_opac_link_cell_active");
65         add_css_class(cell, "my_opac_link_cell_active");
66 }
67
68 MyOPACSPage.prototype.drawCheckedOut = function() {
69         removeChildren(this.infoTable);
70         removeChildren(this.infoPane);
71         this.infoPane.appendChild(this.infoTable);
72         this.setLink(this.checkCell);
73         this.getCheckedOut(_drawCheckedOut);
74 }
75
76 MyOPACSPage.prototype.drawHolds = function() {
77         removeChildren(this.infoTable);
78         removeChildren(this.infoPane);
79         this.infoPane.appendChild(this.infoTable);
80         this.setLink(this.holdsCell);
81         this._drawHolds();
82 }
83
84 MyOPACSPage.prototype.drawProfile = function() {
85         removeChildren(this.infoTable);
86         removeChildren(this.infoPane);
87         this.infoPane.appendChild(this.infoTable);
88         this.setLink(this.profileCell);
89         this._drawProfile();
90 }
91
92 MyOPACSPage.prototype.drawFines = function() {
93         removeChildren(this.infoTable);
94         removeChildren(this.infoPane);
95         this.infoPane.appendChild(this.infoTable);
96         this.setLink(this.finesCell);
97 }
98
99 function _drawCheckedOut(obj, data) {
100
101         if(data == null) return;
102         //obj.infoPane.appendChild(obj.infoTable);
103         var circRow = obj.infoTable.insertRow(obj.infoTable.rows.length);
104
105         var tcell = circRow.insertCell(circRow.cells.length)
106         tcell.appendChild(mktext("Title"));
107         var dcell = circRow.insertCell(circRow.cells.length);
108         dcell.appendChild(mktext("Due Date"));
109         var drcell = circRow.insertCell(circRow.cells.length);
110         drcell.appendChild(mktext("Duration"));
111         var bcell = circRow.insertCell(circRow.cells.length);
112         bcell.appendChild(mktext("Barcode"));
113         var ccell = circRow.insertCell(circRow.cells.length);
114         ccell.appendChild(mktext("Circulating Library"));
115         var rcell = circRow.insertCell(circRow.cells.length);
116         rcell.appendChild(mktext("Renewals Remaining"));
117         var rbcell = circRow.insertCell(circRow.cells.length);
118         rbcell.appendChild(mktext("Renew?"));
119
120         add_css_class(tcell, "my_opac_info_table_header");
121         add_css_class(dcell, "my_opac_info_table_header");
122         add_css_class(drcell, "my_opac_info_table_header");
123         add_css_class(bcell, "my_opac_info_table_header");
124         add_css_class(ccell, "my_opac_info_table_header");
125         add_css_class(rcell, "my_opac_info_table_header");
126         add_css_class(rbcell, "my_opac_info_table_header");
127
128
129         if(data.length < 1) {
130                 debug("No circs exist for this user");
131                 circRow = obj.infoTable.insertRow(obj.infoTable.rows.length);
132                 circRow.insertCell(0).appendChild(
133                         mktext("No items currently checked out"));
134                 return;
135         }
136
137         for( var index in data ) {
138
139                 var circ                = data[index].circ;
140                 var record      = data[index].record;
141                 var copy                = data[index].copy;
142                 circRow = obj.infoTable.insertRow(obj.infoTable.rows.length);
143
144
145                 //var due = new Date(parseInt(circ.due_date() + "000")).toLocaleString();
146                 var due = circ.due_date();
147
148                 /* chop the 'time' portion of the date */
149                 due = due.replace(/[0-9][0-9]:.*$/,"");
150
151                 var title_href = createAppElement("a");
152                 title_href.setAttribute("href","?sub_frame=1&target=record_detail&record=" + record.doc_id() );
153                 title_href.setAttribute("target","_top"); /* escape to the outermost frame */
154                 title_href.appendChild(mktext(record.title()));
155
156                 var renewbox = elem("input", 
157                         {type:"checkbox", id:"renew_checkbox_" + record.doc_id()});
158
159                 /* grab circ lib name */
160                 var org = obj._getOrgUnit(copy.circ_lib());
161                 org = org.name();
162
163                 /* for each circulation, build a row of data */
164                 var titleCell                   = circRow.insertCell(circRow.cells.length);
165                 var dueCell                             = circRow.insertCell(circRow.cells.length);
166                 var durationCell                = circRow.insertCell(circRow.cells.length);
167                 var barcodeCell         = circRow.insertCell(circRow.cells.length);
168                 var circLibCell         = circRow.insertCell(circRow.cells.length);
169                 var renewRemainCell     = circRow.insertCell(circRow.cells.length);
170                 var renewCell                   = circRow.insertCell(circRow.cells.length);
171
172                 add_css_class(titleCell, "my_opac_profile_cell");
173                 add_css_class(dueCell, "my_opac_profile_cell");
174                 add_css_class(durationCell, "my_opac_profile_cell");
175                 add_css_class(barcodeCell, "my_opac_profile_cell");
176                 add_css_class(circLibCell, "my_opac_profile_cell");
177                 add_css_class(renewRemainCell, "my_opac_profile_cell");
178                 add_css_class(renewCell, "my_opac_profile_cell");
179
180                 titleCell.appendChild(title_href);
181                 dueCell.appendChild(mktext(due));
182                 durationCell.appendChild(mktext(circ.duration()));
183                 barcodeCell.appendChild(mktext(copy.barcode()));
184                 circLibCell.appendChild(mktext(org));
185                 renewRemainCell.appendChild(mktext(circ.renewal_remaining()));
186                 renewCell.appendChild(renewbox);
187
188         }
189
190 }
191
192
193 MyOPACSPage.prototype.getCheckedOut = function(callback) {
194
195         /* grab our circs and records */
196         var request = new RemoteRequest(
197                 "open-ils.circ",
198                 "open-ils.circ.actor.user.checked_out",
199                 this.user.getSessionId() );
200
201         var obj = this;
202         request.setCompleteCallback(
203                 function(req) {
204                         if(callback)
205                                 callback(obj, req.getResultObject());
206                 }
207         );
208
209         request.send();
210 }
211
212
213 MyOPACSPage.prototype._drawProfile = function() {
214
215         this.user.fleshMe(true);
216         var infot = elem("table");
217         this.infoTable.insertRow(0).insertCell(0).appendChild(infot);
218         this.infoTable.insertRow(1).insertCell(0).appendChild(
219                 elem("div",{id:"my_opac_update_info"}));
220
221         var urow = infot.insertRow(infot.rows.length);
222         var prow = infot.insertRow(infot.rows.length);
223         var erow = infot.insertRow(infot.rows.length);
224         var brow = infot.insertRow(infot.rows.length);
225         var arow = infot.insertRow(infot.rows.length);
226         var a2row = infot.insertRow(infot.rows.length);
227
228         var ucell       = urow.insertCell(urow.cells.length);
229         var ucell2      = urow.insertCell(urow.cells.length);
230         var ucell3      = urow.insertCell(urow.cells.length);
231
232         var pcell       = prow.insertCell(prow.cells.length);
233         var pcell2      = prow.insertCell(prow.cells.length);
234         var pcell3      = prow.insertCell(prow.cells.length);
235
236         var ecell       = erow.insertCell(erow.cells.length);
237         var ecell2      = erow.insertCell(erow.cells.length);
238         var ecell3      = erow.insertCell(erow.cells.length);
239
240         var bcell       = brow.insertCell(brow.cells.length);
241         var bcell2      = brow.insertCell(brow.cells.length);
242         var bcell3      = brow.insertCell(brow.cells.length);
243
244         add_css_class(ucell, "my_opac_info_table_header");
245         add_css_class(pcell, "my_opac_info_table_header");
246         add_css_class(ecell, "my_opac_info_table_header");
247         add_css_class(bcell, "my_opac_info_table_header");
248
249         add_css_class(ucell2, "my_opac_profile_cell");
250         add_css_class(pcell2, "my_opac_profile_cell");
251         add_css_class(ecell2, "my_opac_profile_cell");
252         add_css_class(bcell2, "my_opac_profile_cell");
253
254         add_css_class(ucell3, "my_opac_profile_cell");
255         add_css_class(pcell3, "my_opac_profile_cell");
256         add_css_class(ecell3, "my_opac_profile_cell");
257         add_css_class(bcell3, "my_opac_profile_cell");
258
259         var ubold       = elem("b");
260         var pbold       = elem("b");
261         var ebold       = elem("b");
262         var bbold       = elem("b");
263         var abold       = elem("b");
264
265         var uclick = elem("a", 
266                 {id:"uname_link",href:"javascript:void(0);",
267                 style:"text-decoration:underline;"}, null, "Change");
268
269         var pclick = elem("a", 
270                 {id:"passwd_link",href:"javascript:void(0);",
271                 style:"text-decoration:underline;"}, null, "Change");
272
273         var eclick = elem("a", 
274                 {id:"email_link",href:"javascript:void(0);", 
275                 style:"text-decoration:underline;"}, null, "Change");
276
277         var obj = this;
278         uclick.onclick = function() { obj.updateUsername(); }
279         pclick.onclick = function() { obj.updatePassword(); }
280         eclick.onclick = function() { obj.updateEmail(); }
281
282         ucell.appendChild(mktext("Username"));
283         ubold.appendChild(mktext(this.user.userObject.usrname()));
284         ucell2.appendChild(ubold);
285         ucell3.appendChild(uclick);
286
287         pcell.appendChild(mktext("Password"));
288         pbold.appendChild(mktext("N/A"));
289         pcell2.appendChild(pbold);
290         pcell3.appendChild(pclick);
291
292         ecell.appendChild(mktext("Email Address"));
293         ebold.appendChild(mktext(this.user.userObject.email()));
294         ecell2.appendChild(ebold);
295         ecell3.appendChild(eclick);
296
297         bcell.appendChild(mktext("Active Barcode"));
298         bbold.appendChild(mktext(this.user.userObject.card().barcode()));
299         bcell2.appendChild(bbold);
300         bcell3.appendChild(mktext(" "));
301
302         var addrTable = elem("table");
303         add_css_class(addrTable, "my_opac_addr_table");
304         var row = addrTable.insertRow(0);
305         var mailing = row.insertCell(0);
306         var space = row.insertCell(1);
307         var billing = row.insertCell(2);
308
309         space.setAttribute("style","width: 30px");
310         space.appendChild(mktext(" "));
311
312         var addr = this.user.userObject.mailing_address();
313         mailing.appendChild(this.mkAddrTable("Mailing Address", addr));
314
315         addr = this.user.userObject.billing_address();
316         billing.appendChild(this.mkAddrTable("Billing Address", addr));
317
318         this.infoPane.appendChild(elem("br"));
319         /*
320         this.infoPane.appendChild(elem("hr"));
321         this.infoPane.appendChild(elem("br"));
322         this.infoPane.appendChild(addrTable);
323         */
324
325 }
326
327
328 MyOPACSPage.prototype.mkAddrTable = function(type, addr) {
329         var table = elem("table");
330
331         var header_row = table.insertRow(table.rows.length);
332         var header_cell = header_row.insertCell(0);
333         add_css_class(header_cell,"my_opac_info_table_header");
334         header_cell.id = "header_cell";
335         header_cell.colSpan = 2;        
336         header_cell.setAttribute("colspan", "2");
337         header_cell.appendChild(mktext(type));
338
339         var s1row = table.insertRow(table.rows.length);
340         var s2row = table.insertRow(table.rows.length);
341         var cityrow = table.insertRow(table.rows.length);
342         var ziprow = table.insertRow(table.rows.length);
343         var staterow = table.insertRow(table.rows.length);
344
345         var s1cell = s1row.insertCell(0);
346         var s2cell = s2row.insertCell(0);
347         var citycell = cityrow.insertCell(0);
348         var zipcell = ziprow.insertCell(0);
349         var statecell = staterow.insertCell(0);
350
351         add_css_class(s1cell, "my_opac_info_table_header");
352         add_css_class(s2cell, "my_opac_info_table_header");
353         add_css_class(citycell, "my_opac_info_table_header");
354         add_css_class(zipcell, "my_opac_info_table_header");
355         add_css_class(statecell, "my_opac_info_table_header");
356
357         s1cell.appendChild(mktext("Address 1"));
358         s2cell.appendChild(mktext("Address 2"));
359         citycell.appendChild(mktext("City"));
360         zipcell.appendChild(mktext("Zip"));
361         statecell.appendChild(mktext("State"));
362
363
364         s1cell = s1row.insertCell(1);
365         s2cell = s2row.insertCell(1);
366         citycell = cityrow.insertCell(1);
367         zipcell = ziprow.insertCell(1);
368         statecell = staterow.insertCell(1);
369
370         add_css_class(s1cell, "my_opac_profile_cell");
371         add_css_class(s2cell, "my_opac_profile_cell");
372         add_css_class(citycell, "my_opac_profile_cell");
373         add_css_class(zipcell, "my_opac_profile_cell");
374         add_css_class(statecell, "my_opac_profile_cell");
375
376
377         s1cell.appendChild(mktext(addr.street1()));
378         s2cell.appendChild(mktext(addr.street2()));
379         citycell.appendChild(mktext(addr.city()));
380         zipcell.appendChild(mktext(addr.post_code()));
381         statecell.appendChild(mktext(addr.state()));
382
383         return table;
384 }
385
386
387 MyOPACSPage.prototype.updateUsername = function() {
388         var div = getById("my_opac_update_info");
389
390         /* user clicks to close */
391         if(getById("my_opac_update_usrname")) {
392                 removeChildren(div);
393                 return;
394         }
395
396         removeChildren(div);
397
398         var ut = elem("input",{type:"text",id:"new_uname"});
399         var but = elem("input",{type:"submit",value:"Update"});
400         var table = elem("table");
401         table.id = "my_opac_update_usrname";
402         var row = table.insertRow(0);
403
404
405         add_css_class(table,"my_opac_update_table");
406
407         var c0 = row.insertCell(0);
408         var c1 = row.insertCell(1);
409         var c2 = row.insertCell(2);
410
411         c0.appendChild(mktext("Enter new username: " ));
412         c1.appendChild(ut);     
413         c2.appendChild(but);    
414
415         div.appendChild(elem("br"));
416         div.appendChild(table);
417
418         try{ut.focus();}catch(E){}
419
420         /* verify looks ok, send the update request */
421         var obj = this;
422         but.onclick = function() {
423                 var uname = getById("new_uname").value;
424                 if(uname == null || uname == "") {
425                         alert("Please enter a username");
426                         return;
427                 }
428                 var resp = obj.user.updateUsername(uname);
429                 if(resp)  alert("Username updated successfully");
430                 else{ alert("Username update failed"); return; }
431                 obj.draw("profile");
432
433         }
434 }
435
436 MyOPACSPage.prototype.updatePassword = function() {
437         var div = getById("my_opac_update_info");
438
439         /* user clicks to close */
440         if(getById("my_opac_update_password")) {
441                 removeChildren(div);
442                 return;
443         }
444         removeChildren(div);
445
446         var ut = elem("input",{type:"password",size:"15",id:"old_password"});
447         var ut2 = elem("input",{type:"password",size:"15",id:"new_password_1"});
448         var ut3 = elem("input",{type:"password",size:"15",id:"new_password_2"});
449         var but = elem("input",{type:"submit",value:"Update"});
450
451         var table = elem("table");
452         table.id = "my_opac_update_password";
453         add_css_class(table,"my_opac_update_table");
454
455         var row = table.insertRow(0);
456
457         var c0 = row.insertCell(0);
458         var c1 = row.insertCell(1);
459         var c2 = row.insertCell(2);
460         var c3 = row.insertCell(3);
461         var c4 = row.insertCell(4);
462         var c5 = row.insertCell(5);
463         var c6 = row.insertCell(6);
464
465         c0.appendChild(mktext("Current password: " ));
466         c1.appendChild(ut);     
467
468         c2.appendChild(mktext("New password: " ));
469         c3.appendChild(ut2);    
470
471         c4.appendChild(mktext("Repeat new password: " ));
472         c5.appendChild(ut3);    
473         c6.appendChild(but);    
474
475         div.appendChild(elem("br"));
476         div.appendChild(table);
477
478
479         try{ut.focus();}catch(E){}
480
481         /* verify looks ok, send the update request */
482         var obj = this;
483         but.onclick = function() {
484
485                 var old = getById("old_password").value;
486                 var p1 = getById("new_password_1").value;
487                 var p2 = getById("new_password_2").value;
488
489                 if(!old || !p1 || !p2) {
490                         alert("Please fill in all fields");
491                         return;
492                 }
493
494                 if(p1 != p2) {
495                         alert("New passwords do not match");
496                         return;
497                 }
498
499                 var resp = obj.user.updatePassword(old, p1);
500                 if(resp) alert("Password updated successfully"); 
501                 else {alert("Password change failed"); return; }
502                 obj.draw("profile");
503         }
504
505 }
506
507
508 MyOPACSPage.prototype.updateEmail = function(){
509         var div = getById("my_opac_update_info");
510
511         /* user clicks to close */
512         if(getById("my_opac_update_usrname")) {
513                 removeChildren(div);
514                 return;
515         }
516
517         removeChildren(div);
518
519         var ut = elem("input",{type:"text",id:"new_email"});
520         var but = elem("input",{type:"submit",value:"Update"});
521         var table = elem("table");
522         table.id = "my_opac_update_usrname";
523         var row = table.insertRow(0);
524
525         add_css_class(table,"my_opac_update_table");
526
527         var c0 = row.insertCell(0);
528         var c1 = row.insertCell(1);
529         var c2 = row.insertCell(2);
530
531         c0.appendChild(mktext("Enter new email address: " ));
532         c1.appendChild(ut);     
533         c2.appendChild(but);    
534
535         div.appendChild(elem("br"));
536         div.appendChild(table);
537
538         try{ut.focus();}catch(E){}
539
540         /* verify looks ok, send the update request */
541         var obj = this;
542         but.onclick = function() {
543                 var uname = getById("new_email").value;
544                 if(uname == null || uname == "") {
545                         alert("Please enter a valid email address");
546                         return;
547                 }
548                 var resp = obj.user.updateEmail(uname);
549                 if(resp)  alert("Email updated successfully");
550                 else{ alert("Email update failed"); return; }
551                 obj.draw("profile");
552
553         }
554
555 }
556
557 MyOPACSPage.prototype._drawHolds = function() {
558
559         var holds = this.grabHolds();
560         var table = this.infoTable;
561         var row = table.insertRow(table.rows.length);
562
563         var cell = row.insertCell(row.cells.length);
564         add_css_class(cell, "my_opac_info_table_header");
565         cell.appendChild(mktext("Title"));
566
567         cell = row.insertCell(row.cells.length);
568         add_css_class(cell, "my_opac_info_table_header");
569         cell.appendChild(mktext("Author"));
570
571         cell = row.insertCell(row.cells.length);
572         add_css_class(cell, "my_opac_info_table_header");
573         cell.appendChild(mktext("Format(s)"));
574
575         cell = row.insertCell(row.cells.length);
576         add_css_class(cell, "my_opac_info_table_header");
577         cell.appendChild(mktext("Pickup Location"));
578
579         cell = row.insertCell(row.cells.length);
580         add_css_class(cell, "my_opac_info_table_header");
581         cell.appendChild(mktext("Notify Email / Phone"));
582
583         cell = row.insertCell(row.cells.length);
584         add_css_class(cell, "my_opac_info_table_header");
585         cell.appendChild(mktext("Cancel"));
586
587         for( var idx = 0; idx != holds.length; idx++ ) {
588                 _doCallbackDance(table, holds[idx]);
589         }
590 }
591
592 function _doCallbackDance(table, hold) {
593         if(hold == null) return;
594         debug("Setting holds callback with hold " + hold.id() );
595         var func = function(rec) {_drawHoldsRow(table, hold, rec)};
596
597         /* grab the record that is held */
598         if(hold.hold_type() == "M")
599                 fetchMetaRecord(hold.target(), func);
600
601         if(hold.hold_type() == "T")
602                 fetchRecord(hold.target(), func);
603 }
604
605
606
607 function _drawHoldsRow(table, hold, record) {
608
609         if(record == null || record.length == 0) return;
610         debug("In holds callback with hold " + hold );
611
612         var row = table.insertRow(table.rows.length);
613         var cell = row.insertCell(row.cells.length);
614
615         add_css_class(cell, "my_opac_profile_cell");
616         cell.style.width = "35%";
617         cell.appendChild(mktext(record.title()));
618         cell = row.insertCell(row.cells.length);
619         add_css_class(cell, "my_opac_profile_cell");
620         cell.appendChild(mktext(record.author()));
621
622         cell = row.insertCell(row.cells.length);
623         add_css_class(cell, "my_opac_profile_cell");
624
625         var formats = hold.holdable_formats();
626         if(formats == null || formats == "") /* only metarecord holds have holdable_formats */
627                 formats = modsFormatToMARC(record.types_of_resource()[0]);
628
629         cell.appendChild(_mkFormatList(formats));
630         cell.noWrap = "nowrap";
631         cell.setAttribute("nowrap", "nowrap");
632
633         cell = row.insertCell(row.cells.length);
634         add_css_class(cell, "my_opac_profile_cell");
635         cell.appendChild(mktext(findOrgUnit(hold.pickup_lib()).name()));
636
637         cell = row.insertCell(row.cells.length);
638         add_css_class(cell, "my_opac_profile_cell");
639         cell.appendChild(_buildChangeEmailNotify(hold));
640         cell.appendChild(elem("br"));
641         cell.appendChild(_buildChangePhoneNotify(hold));
642
643         cell = row.insertCell(row.cells.length);
644         var a = elem("a",{href:"javascript:void(0);",
645                         style:"text-decoration:underline"},null, "Cancel");
646         a.onclick = function(){_cancelHoldRequest(hold);};
647         add_css_class(cell, "my_opac_profile_cell");
648         cell.appendChild(a);
649 }
650
651 function _cancelHoldRequest(hold) {
652         alert("Canceling hold " + hold.id());
653 }
654
655 function _buildChangeEmailNotify(hold) {
656         var a = elem("a",{href:"javascript:void(0);",
657                         style:"text-decoration:underline"},null, hold.email_notify());
658         var et1 = elem("input",{type:"text",size:"20"});
659         var et2 = elem("input",{type:"text",size:"20"});
660         var box = new PopupBox(a);
661         var but = elem("input",{type:"submit",value:"Submit"});
662         var can = elem("input",{type:"submit",value:"Cancel"});
663
664         but.onclick = function(){
665                 var ret = _submitUpdateNotifyEmail(hold);
666                 if(ret) box.hide();
667         }
668         can.onclick = function(){ box.hide(); };
669
670         box.title("Change Holds Notification Email");
671         box.addText("Enter new notification email");
672         box.addNode(et1);
673         box.lines(1);
674         box.addText("Repeat email");
675         box.addNode(et2);
676         box.lines();
677         box.makeGroup([ but, can ]);
678
679         a.onclick = function(){box.show();}
680         return a;
681 }
682
683 /* return true to show success */
684 function _submitUpdateNotifyEmail(hold) {
685         alert("updating email for hold " + hold.id());
686         return true;
687 }
688
689 function _submitUpdateNotifyPhone(hold) {
690         alert("updating phone for hold " + hold.id());
691         return true;
692 }
693
694
695 function _buildChangePhoneNotify(hold) {
696
697         var a = elem("a",{href:"javascript:void(0);",
698                         style:"text-decoration:underline"},null, hold.phone_notify());
699
700         var et1 = elem("input",{type:"text",size:"10"});
701         var box = new PopupBox(a);
702         var but = elem("input",{type:"submit",value:"Submit"});
703         var can = elem("input",{type:"submit",value:"Cancel"});
704
705         but.onclick = function(){
706                 var ret = _submitUpdateNotifyPhone(hold);
707                 if(ret) box.hide();
708         }
709         can.onclick = function(){ box.hide(); };
710
711         box.title("Change Holds Notification Phone Number");
712         box.addText("Enter new notification number");
713         box.addNode(et1);
714         box.lines();
715         box.makeGroup([ but, can ]);
716
717         a.onclick = function(){box.show();}
718         return a;
719 }
720
721
722 function _mkFormatList(formats) {
723
724         var div = elem("div");
725         var seen = new Object();
726         for( var i = 0; i!= formats.length; i++ ) {
727                 var form = MARCFormatToMods(formats.charAt(i));
728                 if(seen[form]) continue;
729                 div.appendChild(mkResourceImage(form));
730                 seen[form] = true;
731         }
732         return div;
733 }
734
735
736
737
738 MyOPACSPage.prototype.grabHolds = function() {
739         this.user.fleshMe();
740         var req = new RemoteRequest(
741                 "open-ils.circ",
742                 "open-ils.circ.holds.retrieve",
743                 this.user.session_id,
744                 this.user.userObject.id() );
745         req.send(true);
746         return req.getResultObject();
747 }
748
749
750
751
752
753
754
755
756
757
758 /* ----------------------------------------------------------------- ========== ------------ */
759
760
761
762 MyOPACSPage.prototype.drawPersonal = function() {
763         this.personalBox = new Box();
764         this.personalBox.init(
765                 "Edit User Information", false, false);
766
767         var obj = this;
768
769         var uname_div = createAppElement("div");
770         var uname_href = createAppElement("a");
771         uname_href.onclick = function() {obj.buildUpdateUname();}
772         uname_href.setAttribute("href", "javascript:void(0)");
773         uname_href.appendChild(mktext("Change Username"));
774
775         uname_div.appendChild(mktext("Username is ")); 
776         var bold = createAppElement("b");
777         bold.appendChild(mktext(this.user.username));
778         uname_div.appendChild(bold);
779         uname_div.appendChild(createAppElement("br"));
780         uname_div.appendChild(uname_href);
781         this.personalBox.addItem( uname_div,"edit_username");
782
783         this.personalBox.addItem( createAppElement("hr"),"break");
784
785         var password_href = createAppElement("a");
786         password_href.setAttribute("href", "javascript:void(0)");
787         password_href.onclick = function() {obj.buildUpdatePassword();}
788         password_href.appendChild(mktext("Change Password"));
789         this.personalBox.addItem( password_href,"edit_password");
790
791         this.personalBox.addItem( createAppElement("hr"),"break2");
792
793         var email_div = createAppElement("div");
794         var email_href = createAppElement("a");
795         email_href.onclick = function() {obj.buildUpdateEmail();}
796         email_href.setAttribute("href", "javascript:void(0)");
797         email_href.appendChild(mktext("Change Email Address"));
798
799         var em = this.user.userObject.email();
800         if(!em) em = "[empty]";
801
802         email_div.appendChild(mktext("Email address is ")); 
803         var bold = createAppElement("b");
804         bold.appendChild(mktext(em));
805         email_div.appendChild(bold);
806         email_div.appendChild(createAppElement("br"));
807         email_div.appendChild(email_href);
808         this.personalBox.addItem( email_div,"edit_email");
809
810
811         this.personal.appendChild(this.personalBox.getNode());
812 }
813
814
815 MyOPACSPage.prototype.buildUpdateEmail = function() {
816         var item = this.personalBox.findByKey("edit_email");
817         var node = item.getNode();
818
819         if(node.childNodes.length > 1) {
820                 node.removeChild(node.childNodes[1]);
821                 return;
822         }
823
824         var newEmail = createAppElement("input");
825         newEmail.setAttribute("type", "text");
826         newEmail.id = "new_email";
827
828         var newEmail2 = createAppElement("input");
829         newEmail2.setAttribute("type", "text");
830         newEmail2.id = "new_email2";
831
832         var button = createAppElement("input");
833         button.setAttribute("type", "submit");
834         button.setAttribute("value", "Submit");
835
836         var obj = this;
837         button.onclick = function() { 
838
839                 var em = getById("new_email").value;
840                 var em2 = getById("new_email2").value;
841                 if(em != em2) {
842                         alert("Email addresses do not match");
843                         return;
844                 }
845                 var resp = obj.user.updateEmail(em);
846                 if(resp) { alert("Email updated successfully"); obj.draw();}
847                 else { return; }
848
849                 var node = obj.personalBox.findByKey("edit_email").getNode();
850                 node.removeChild(node.childNodes[1]);
851         }
852
853
854         var chunk = createAppElement("div");
855         chunk.className = "edit_personal_active";
856
857         chunk.appendChild(createAppElement("br"));
858         chunk.appendChild(mktext("Enter New Email:"));
859         chunk.appendChild(newEmail);
860         chunk.appendChild(createAppElement("br"));
861         chunk.appendChild(createAppElement("br"));
862         chunk.appendChild(mktext("Repeat New Email:"));
863         chunk.appendChild(createAppElement("br"));
864         chunk.appendChild(newEmail2);
865         chunk.appendChild(createAppElement("br"));
866         chunk.appendChild(createAppElement("br"));
867         chunk.appendChild(mktext(" "));
868
869         var center = createAppElement("center");
870         center.appendChild(button);
871         chunk.appendChild(center);
872
873         node.appendChild(chunk);
874         try { newEmail.focus(); } catch(E){}
875
876 }
877
878 MyOPACSPage.prototype.buildUpdateUname = function() {
879         var item = this.personalBox.findByKey("edit_username");
880         var node = item.getNode();
881
882         if(node.childNodes.length > 1) {
883                 node.removeChild(node.childNodes[1]);
884                 return;
885         }
886
887         var newName = createAppElement("input");
888         newName.setAttribute("type", "text");
889         newName.id = "new_uname";
890
891         var button = createAppElement("input");
892         button.setAttribute("type", "submit");
893         button.setAttribute("value", "Submit");
894
895         var obj = this;
896         button.onclick = function() { 
897
898                 var resp = obj.user.updateUsername(getById("new_uname").value);
899                 if(resp) { alert("Username updated successfully"); obj.draw()}
900                 else { alert("Username update failed"); return; }
901
902                 var node = obj.personalBox.findByKey("edit_username").getNode();
903                 node.removeChild(node.childNodes[1]);
904         }
905
906
907         var chunk = createAppElement("div");
908         chunk.className = "edit_personal_active";
909
910         chunk.appendChild(createAppElement("br"));
911         chunk.appendChild(mktext("Enter New Username:"));
912         chunk.appendChild(newName);
913         chunk.appendChild(createAppElement("br"));
914         chunk.appendChild(createAppElement("br"));
915         chunk.appendChild(mktext(" "));
916
917         var center = createAppElement("center");
918         center.appendChild(button);
919         chunk.appendChild(center);
920
921         //chunk.appendChild(createAppElement("br"));
922         //chunk.appendChild(createAppElement("br"));
923         node.appendChild(chunk);
924         try { newName.focus(); } catch(E){}
925 }
926
927 MyOPACSPage.prototype.buildUpdatePassword = function() {
928         var item = this.personalBox.findByKey("edit_password");
929         var node = item.getNode();
930         if(node.childNodes.length > 1) {
931                 node.removeChild(node.childNodes[1]);
932                 return;
933         }
934
935         var oldPassword = createAppElement("input");
936         oldPassword.setAttribute("type", "password");
937         oldPassword.id = "old_password";
938
939         var newPassword = createAppElement("input");
940         newPassword.setAttribute("type", "password");
941         newPassword.id = "new_password";
942
943         var newPassword2 = createAppElement("input");
944         newPassword2.setAttribute("type", "password");
945         newPassword2.id = "new_password2";
946
947
948         var button = createAppElement("input");
949         button.setAttribute("type", "submit");
950         button.setAttribute("value", "Submit");
951
952         var obj = this;
953         button.onclick = function() { 
954
955                 var new1 = getById("new_password").value;
956                 var new2 = getById("new_password2").value;
957                 var old = getById("old_password").value;
958
959                 if(new1 != new2) {
960                         alert("Passwords do not match");
961                         return;
962                 }
963
964                 var resp = obj.user.updatePassword(old, new1);
965                 if(resp) { alert("Password updated successfully"); }
966                 else { return; }
967
968                 var node = obj.personalBox.findByKey("edit_password").getNode();
969                 node.removeChild(node.childNodes[1]);
970         }
971
972         var chunk = createAppElement("div");
973         chunk.className = "edit_personal_active";
974
975         chunk.appendChild(createAppElement("br"));
976         chunk.appendChild(mktext("Current Password:"));
977         chunk.appendChild(oldPassword);
978         chunk.appendChild(createAppElement("br"));
979
980         chunk.appendChild(createAppElement("br"));
981         chunk.appendChild(mktext("Enter New Password:"));
982         chunk.appendChild(newPassword);
983         chunk.appendChild(createAppElement("br"));
984
985         chunk.appendChild(createAppElement("br"));
986         chunk.appendChild(mktext("Re-Enter New Password:"));
987         chunk.appendChild(newPassword2);
988         chunk.appendChild(createAppElement("br"));
989         chunk.appendChild(createAppElement("br"));
990
991         chunk.appendChild(mktext(" "));
992
993         var center = createAppElement("center");
994         center.appendChild(button);
995         chunk.appendChild(center);
996
997         //chunk.appendChild(createAppElement("br"));
998         node.appendChild(chunk);
999         try { newPassword.focus(); } catch(E){}
1000
1001 }
1002
1003
1004 /*
1005 MyOPACSPage.prototype.getCheckedOut = function() {
1006
1007         this.checkedOutBox = new Box();
1008         this.checkedOutBox.init(
1009                 "Items Checked Out", false, false);
1010         this.checkedOutBox.sortByKey();
1011
1012
1013         var request = new RemoteRequest(
1014                 "open-ils.circ",
1015                 "open-ils.circ.actor.user.checked_out",
1016                 this.user.getSessionId() );
1017
1018         var obj = this;
1019         request.setCompleteCallback(
1020                 function(req) {
1021                         obj._addCircs(req.getResultObject());
1022                 }
1023         );
1024
1025         request.send();
1026 }
1027 */
1028
1029
1030 MyOPACSPage.prototype._addCircs = function(data) {
1031
1032         if(data.length < 1) {
1033                 debug("No circs exist for this user");
1034                 this.checkedOutBox.addItem(
1035                         mktext("No items currently checked out") );
1036                 return;
1037         }
1038
1039         for( var index in data ) {
1040
1041                 var circ                = data[index].circ;
1042                 var record      = data[index].record;
1043                 var copy                = data[index].copy;
1044
1045
1046                 var due = new Date(parseInt(circ.due_date() + "000")).toLocaleString();
1047                 /* chop the 'time' portion of the date */
1048                 due = due.replace(/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/,"");
1049
1050                 var title_href = createAppElement("a");
1051                 title_href.setAttribute("href","?sub_frame=1&target=record_detail&record=" + record.doc_id() );
1052                 title_href.setAttribute("target","_top"); /* escape to the outermost frame */
1053                 title_href.appendChild(mktext(record.title()));
1054
1055                 /* grab circ lib name */
1056                 var org = this._getOrgUnit(copy.circ_lib());
1057                 org = org.name();
1058
1059                 /* for each circulation, build a small table of data */
1060                 var table = createAppElement("table");
1061                 this._mkCircRow(table, "Title",         title_href);
1062                 this._mkCircRow(table, "Due Date",      mktext(due));
1063                 this._mkCircRow(table, "Duration",      mktext(circ.duration()));
1064                 this._mkCircRow(table, "Barcode",       mktext(copy.barcode()));
1065                 this._mkCircRow(table, "Circulating Library", mktext(org));
1066
1067
1068                 this.checkedOutBox.addItem(table);
1069
1070                 if(index < data.length - 1) 
1071                         this.checkedOutBox.addItem(createAppElement("hr"));
1072         }
1073
1074 }
1075
1076 MyOPACSPage.prototype._mkCircRow = function(table, title, data) {
1077         var row = table.insertRow(table.rows.length);
1078         var cell = row.insertCell(row.cells.length);
1079         cell.appendChild(mktext(title));
1080         cell = row.insertCell(row.cells.length);
1081         cell.appendChild(data);
1082 }
1083
1084
1085 MyOPACSPage.prototype._getOrgUnit = function(org_id) {
1086         var request = new RemoteRequest(
1087                 "open-ils.actor",
1088                 "open-ils.actor.org_unit.retrieve",
1089                 this.user.getSessionId(),
1090                 org_id );
1091         request.send(true);
1092         return request.getResultObject();
1093 }
1094
1095
1096