]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/javascript/opac/MyOPACSPage.js
main my_opac processing
[working/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"));
582
583         cell = row.insertCell(row.cells.length);
584         add_css_class(cell, "my_opac_info_table_header");
585         cell.appendChild(mktext("Notify Phone"));
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
631         cell = row.insertCell(row.cells.length);
632         add_css_class(cell, "my_opac_profile_cell");
633         cell.appendChild(mktext(findOrgUnit(hold.pickup_lib()).name()));
634
635         cell = row.insertCell(row.cells.length);
636         add_css_class(cell, "my_opac_profile_cell");
637         cell.appendChild(mktext(hold.email_notify()));
638         cell = row.insertCell(row.cells.length);
639         add_css_class(cell, "my_opac_profile_cell");
640         cell.appendChild(mktext(hold.phone_notify()));
641 }
642
643
644 function _mkFormatList(formats) {
645
646         var div = elem("div");
647         var seen = new Object();
648         for( var i = 0; i!= formats.length; i++ ) {
649                 var form = MARCFormatToMods(formats.charAt(i));
650                 if(seen[form]) continue;
651                 div.appendChild(mkResourceImage(form));
652                 seen[form] = true;
653         }
654         return div;
655 }
656
657
658
659
660 MyOPACSPage.prototype.grabHolds = function() {
661         this.user.fleshMe();
662         var req = new RemoteRequest(
663                 "open-ils.circ",
664                 "open-ils.circ.holds.retrieve",
665                 this.user.session_id,
666                 this.user.userObject.id() );
667         req.send(true);
668         return req.getResultObject();
669 }
670
671
672
673
674
675
676
677
678
679
680 /* ----------------------------------------------------------------- ========== ------------ */
681
682
683
684 MyOPACSPage.prototype.drawPersonal = function() {
685         this.personalBox = new Box();
686         this.personalBox.init(
687                 "Edit User Information", false, false);
688
689         var obj = this;
690
691         var uname_div = createAppElement("div");
692         var uname_href = createAppElement("a");
693         uname_href.onclick = function() {obj.buildUpdateUname();}
694         uname_href.setAttribute("href", "javascript:void(0)");
695         uname_href.appendChild(mktext("Change Username"));
696
697         uname_div.appendChild(mktext("Username is ")); 
698         var bold = createAppElement("b");
699         bold.appendChild(mktext(this.user.username));
700         uname_div.appendChild(bold);
701         uname_div.appendChild(createAppElement("br"));
702         uname_div.appendChild(uname_href);
703         this.personalBox.addItem( uname_div,"edit_username");
704
705         this.personalBox.addItem( createAppElement("hr"),"break");
706
707         var password_href = createAppElement("a");
708         password_href.setAttribute("href", "javascript:void(0)");
709         password_href.onclick = function() {obj.buildUpdatePassword();}
710         password_href.appendChild(mktext("Change Password"));
711         this.personalBox.addItem( password_href,"edit_password");
712
713         this.personalBox.addItem( createAppElement("hr"),"break2");
714
715         var email_div = createAppElement("div");
716         var email_href = createAppElement("a");
717         email_href.onclick = function() {obj.buildUpdateEmail();}
718         email_href.setAttribute("href", "javascript:void(0)");
719         email_href.appendChild(mktext("Change Email Address"));
720
721         var em = this.user.userObject.email();
722         if(!em) em = "[empty]";
723
724         email_div.appendChild(mktext("Email address is ")); 
725         var bold = createAppElement("b");
726         bold.appendChild(mktext(em));
727         email_div.appendChild(bold);
728         email_div.appendChild(createAppElement("br"));
729         email_div.appendChild(email_href);
730         this.personalBox.addItem( email_div,"edit_email");
731
732
733         this.personal.appendChild(this.personalBox.getNode());
734 }
735
736
737 MyOPACSPage.prototype.buildUpdateEmail = function() {
738         var item = this.personalBox.findByKey("edit_email");
739         var node = item.getNode();
740
741         if(node.childNodes.length > 1) {
742                 node.removeChild(node.childNodes[1]);
743                 return;
744         }
745
746         var newEmail = createAppElement("input");
747         newEmail.setAttribute("type", "text");
748         newEmail.id = "new_email";
749
750         var newEmail2 = createAppElement("input");
751         newEmail2.setAttribute("type", "text");
752         newEmail2.id = "new_email2";
753
754         var button = createAppElement("input");
755         button.setAttribute("type", "submit");
756         button.setAttribute("value", "Submit");
757
758         var obj = this;
759         button.onclick = function() { 
760
761                 var em = getById("new_email").value;
762                 var em2 = getById("new_email2").value;
763                 if(em != em2) {
764                         alert("Email addresses do not match");
765                         return;
766                 }
767                 var resp = obj.user.updateEmail(em);
768                 if(resp) { alert("Email updated successfully"); obj.draw();}
769                 else { return; }
770
771                 var node = obj.personalBox.findByKey("edit_email").getNode();
772                 node.removeChild(node.childNodes[1]);
773         }
774
775
776         var chunk = createAppElement("div");
777         chunk.className = "edit_personal_active";
778
779         chunk.appendChild(createAppElement("br"));
780         chunk.appendChild(mktext("Enter New Email:"));
781         chunk.appendChild(newEmail);
782         chunk.appendChild(createAppElement("br"));
783         chunk.appendChild(createAppElement("br"));
784         chunk.appendChild(mktext("Repeat New Email:"));
785         chunk.appendChild(createAppElement("br"));
786         chunk.appendChild(newEmail2);
787         chunk.appendChild(createAppElement("br"));
788         chunk.appendChild(createAppElement("br"));
789         chunk.appendChild(mktext(" "));
790
791         var center = createAppElement("center");
792         center.appendChild(button);
793         chunk.appendChild(center);
794
795         node.appendChild(chunk);
796         try { newEmail.focus(); } catch(E){}
797
798 }
799
800 MyOPACSPage.prototype.buildUpdateUname = function() {
801         var item = this.personalBox.findByKey("edit_username");
802         var node = item.getNode();
803
804         if(node.childNodes.length > 1) {
805                 node.removeChild(node.childNodes[1]);
806                 return;
807         }
808
809         var newName = createAppElement("input");
810         newName.setAttribute("type", "text");
811         newName.id = "new_uname";
812
813         var button = createAppElement("input");
814         button.setAttribute("type", "submit");
815         button.setAttribute("value", "Submit");
816
817         var obj = this;
818         button.onclick = function() { 
819
820                 var resp = obj.user.updateUsername(getById("new_uname").value);
821                 if(resp) { alert("Username updated successfully"); obj.draw()}
822                 else { alert("Username update failed"); return; }
823
824                 var node = obj.personalBox.findByKey("edit_username").getNode();
825                 node.removeChild(node.childNodes[1]);
826         }
827
828
829         var chunk = createAppElement("div");
830         chunk.className = "edit_personal_active";
831
832         chunk.appendChild(createAppElement("br"));
833         chunk.appendChild(mktext("Enter New Username:"));
834         chunk.appendChild(newName);
835         chunk.appendChild(createAppElement("br"));
836         chunk.appendChild(createAppElement("br"));
837         chunk.appendChild(mktext(" "));
838
839         var center = createAppElement("center");
840         center.appendChild(button);
841         chunk.appendChild(center);
842
843         //chunk.appendChild(createAppElement("br"));
844         //chunk.appendChild(createAppElement("br"));
845         node.appendChild(chunk);
846         try { newName.focus(); } catch(E){}
847 }
848
849 MyOPACSPage.prototype.buildUpdatePassword = function() {
850         var item = this.personalBox.findByKey("edit_password");
851         var node = item.getNode();
852         if(node.childNodes.length > 1) {
853                 node.removeChild(node.childNodes[1]);
854                 return;
855         }
856
857         var oldPassword = createAppElement("input");
858         oldPassword.setAttribute("type", "password");
859         oldPassword.id = "old_password";
860
861         var newPassword = createAppElement("input");
862         newPassword.setAttribute("type", "password");
863         newPassword.id = "new_password";
864
865         var newPassword2 = createAppElement("input");
866         newPassword2.setAttribute("type", "password");
867         newPassword2.id = "new_password2";
868
869
870         var button = createAppElement("input");
871         button.setAttribute("type", "submit");
872         button.setAttribute("value", "Submit");
873
874         var obj = this;
875         button.onclick = function() { 
876
877                 var new1 = getById("new_password").value;
878                 var new2 = getById("new_password2").value;
879                 var old = getById("old_password").value;
880
881                 if(new1 != new2) {
882                         alert("Passwords do not match");
883                         return;
884                 }
885
886                 var resp = obj.user.updatePassword(old, new1);
887                 if(resp) { alert("Password updated successfully"); }
888                 else { return; }
889
890                 var node = obj.personalBox.findByKey("edit_password").getNode();
891                 node.removeChild(node.childNodes[1]);
892         }
893
894         var chunk = createAppElement("div");
895         chunk.className = "edit_personal_active";
896
897         chunk.appendChild(createAppElement("br"));
898         chunk.appendChild(mktext("Current Password:"));
899         chunk.appendChild(oldPassword);
900         chunk.appendChild(createAppElement("br"));
901
902         chunk.appendChild(createAppElement("br"));
903         chunk.appendChild(mktext("Enter New Password:"));
904         chunk.appendChild(newPassword);
905         chunk.appendChild(createAppElement("br"));
906
907         chunk.appendChild(createAppElement("br"));
908         chunk.appendChild(mktext("Re-Enter New Password:"));
909         chunk.appendChild(newPassword2);
910         chunk.appendChild(createAppElement("br"));
911         chunk.appendChild(createAppElement("br"));
912
913         chunk.appendChild(mktext(" "));
914
915         var center = createAppElement("center");
916         center.appendChild(button);
917         chunk.appendChild(center);
918
919         //chunk.appendChild(createAppElement("br"));
920         node.appendChild(chunk);
921         try { newPassword.focus(); } catch(E){}
922
923 }
924
925
926 /*
927 MyOPACSPage.prototype.getCheckedOut = function() {
928
929         this.checkedOutBox = new Box();
930         this.checkedOutBox.init(
931                 "Items Checked Out", false, false);
932         this.checkedOutBox.sortByKey();
933
934
935         var request = new RemoteRequest(
936                 "open-ils.circ",
937                 "open-ils.circ.actor.user.checked_out",
938                 this.user.getSessionId() );
939
940         var obj = this;
941         request.setCompleteCallback(
942                 function(req) {
943                         obj._addCircs(req.getResultObject());
944                 }
945         );
946
947         request.send();
948 }
949 */
950
951
952 MyOPACSPage.prototype._addCircs = function(data) {
953
954         if(data.length < 1) {
955                 debug("No circs exist for this user");
956                 this.checkedOutBox.addItem(
957                         mktext("No items currently checked out") );
958                 return;
959         }
960
961         for( var index in data ) {
962
963                 var circ                = data[index].circ;
964                 var record      = data[index].record;
965                 var copy                = data[index].copy;
966
967
968                 var due = new Date(parseInt(circ.due_date() + "000")).toLocaleString();
969                 /* chop the 'time' portion of the date */
970                 due = due.replace(/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/,"");
971
972                 var title_href = createAppElement("a");
973                 title_href.setAttribute("href","?sub_frame=1&target=record_detail&record=" + record.doc_id() );
974                 title_href.setAttribute("target","_top"); /* escape to the outermost frame */
975                 title_href.appendChild(mktext(record.title()));
976
977                 /* grab circ lib name */
978                 var org = this._getOrgUnit(copy.circ_lib());
979                 org = org.name();
980
981                 /* for each circulation, build a small table of data */
982                 var table = createAppElement("table");
983                 this._mkCircRow(table, "Title",         title_href);
984                 this._mkCircRow(table, "Due Date",      mktext(due));
985                 this._mkCircRow(table, "Duration",      mktext(circ.duration()));
986                 this._mkCircRow(table, "Barcode",       mktext(copy.barcode()));
987                 this._mkCircRow(table, "Circulating Library", mktext(org));
988
989
990                 this.checkedOutBox.addItem(table);
991
992                 if(index < data.length - 1) 
993                         this.checkedOutBox.addItem(createAppElement("hr"));
994         }
995
996 }
997
998 MyOPACSPage.prototype._mkCircRow = function(table, title, data) {
999         var row = table.insertRow(table.rows.length);
1000         var cell = row.insertCell(row.cells.length);
1001         cell.appendChild(mktext(title));
1002         cell = row.insertCell(row.cells.length);
1003         cell.appendChild(data);
1004 }
1005
1006
1007 MyOPACSPage.prototype._getOrgUnit = function(org_id) {
1008         var request = new RemoteRequest(
1009                 "open-ils.actor",
1010                 "open-ils.actor.org_unit.retrieve",
1011                 this.user.getSessionId(),
1012                 org_id );
1013         request.send(true);
1014         return request.getResultObject();
1015 }
1016
1017
1018