31a21c175ac9ab3d9853031d9d7f423f97f29afb
[evergreen-equinox.git] / Open-ILS / web / opac / extras / circ / alt_holds_print.js
1 dojo.require("dojo.cookie");
2 dojo.require("dojox.xml.parser");
3 dojo.require("openils.BibTemplate");
4 dojo.require("openils.widget.ProgressDialog");
5
6 var authtoken;
7 var cgi;
8
9 function do_pull_list() {
10     progress_dialog.show(true);
11
12     var any = false;
13
14     fieldmapper.standardRequest(
15         ['open-ils.circ','open-ils.circ.hold_pull_list.print.stream'],
16         { async : true,
17           params: [
18             authtoken, {
19               org_id     : cgi.param('o'),
20               limit      : cgi.param('limit'),
21               offset     : cgi.param('offset'),
22               chunk_size : cgi.param('chunk_size'),
23               sort       : sort_order
24             }
25           ],
26           onresponse : function (r) {
27             any = true;
28             dojo.forEach( openils.Util.readResponse(r), function (hold_fm) {
29
30                 // hashify the hold
31                 var hold = hold_fm.toHash(true);
32                 hold.usr = hold_fm.usr().toHash(true);
33                 hold.usr.card = hold_fm.usr().card().toHash(true);
34                 hold.current_copy = hold_fm.current_copy().toHash(true);
35                 hold.current_copy.location = hold_fm.current_copy().location().toHash(true);
36                 hold.current_copy.call_number = hold_fm.current_copy().call_number().toHash(true);
37                 hold.current_copy.call_number.record = hold_fm.current_copy().call_number().record().toHash(true);
38
39                 // clone the template's html
40                 var tr = dojo.clone(
41                     dojo.query("tr", dojo.byId('template'))[0]
42                 );
43                 dojo.query("td:not([type])", tr).forEach(
44                     function(td) {
45                         td.innerHTML =
46                             dojo.string.substitute(td.innerHTML, hold);
47                     }
48                 );
49
50                 new openils.BibTemplate({
51                     root : tr,
52                     xml  : dojox.xml.parser.parse(hold.current_copy.call_number.record.marc),
53                     delay: false
54                 });
55
56                 dojo.place(tr, "target");
57             });
58           },
59           oncomplete : function () {
60             progress_dialog.hide();
61             setTimeout(
62                 function() {
63                     if (any) window.print();
64                     else alert(dojo.byId("no_results").innerHTML);
65                 }, 500  /* give the progress_dialog more time to go away */
66             );
67           }
68         }
69     );
70 }
71
72 function place_by_sortkey(node, container) {
73     /*Don't use a forEach() or anything like that here. too slow.*/
74     var sortkey = dojo.attr(node, "sortkey");
75     for (var i = 0; i < container.childNodes.length; i++) {
76         var rover = container.childNodes[i];
77         if (rover.nodeType != 1) continue;
78         if (dojo.attr(rover, "sortkey") > sortkey) {
79             dojo.place(node, rover, "before");
80             return;
81         }
82     }
83     dojo.place(node, container, "last");
84 }
85
86 function hashify_fields(fields) {
87     var hold  = {
88         "usr": {},
89         "current_copy": {
90             "barcode": fields.barcode,
91             "call_number": {
92                 "label": fields.label,
93                 "record": {"marc": fields.marc}
94             },
95             "location": {"name": fields.name}
96         }
97     };
98
99     if (fields.alias) {
100         hold.usr.display_name = fields.alias;
101     } else {
102         hold.usr.display_name = [
103             (fields.family_name ? fields.family_name : ""),
104             (fields.first_given_name ? fields.first_given_name : ""),
105             (fields.second_given_name ? fields.second_given_name : "")
106         ].join(" ");
107     }
108
109     ["first_given_name","second_given_name","family_name","alias"].forEach(
110         function(k) { hold.usr[k] = fields[k]; }
111     );
112
113     return hold;
114 }
115
116 function do_clear_holds() {
117     progress_dialog.show(true);
118
119     var launcher;
120     fieldmapper.standardRequest(
121         ["open-ils.circ", "open-ils.circ.hold.clear_shelf.process"], {
122             "async": true,
123             "params": [authtoken, cgi.param("o")],
124             "onresponse": function(r) {
125                 if (r = openils.Util.readResponse(r)) {
126                     if (r.cache_key) { /* complete */
127                         launcher = dojo.byId("clear_holds_launcher");
128                         launcher.innerHTML = "Re-fetch for Printing"; /* XXX i18n */
129                         launcher.onclick =
130                             function() { do_clear_holds_from_cache(r.cache_key); };
131                         dojo.byId("clear_holds_set_label").innerHTML = r.cache_key;
132                     } else if (r.maximum) {
133                         progress_dialog.update(r);
134                     }
135                 }
136             },
137             "oncomplete": function() {
138                 progress_dialog.hide();
139                 if (launcher) launcher.onclick();
140                 else alert(dojo.byId("no_results").innerHTML);
141             }
142         }
143     );
144 }
145
146 function do_clear_holds_from_cache(cache_key) {
147     progress_dialog.show(true);
148
149     var any = 0;
150     var target = dojo.byId("target");
151     dojo.empty(target);
152     var template = dojo.query("tr", dojo.byId("template"))[0];
153     fieldmapper.standardRequest(
154         ["open-ils.circ",
155             "open-ils.circ.hold.clear_shelf.get_cache"], {
156             "async": true,
157             "params": [authtoken, cache_key, cgi.param("chunk_size")],
158             "onresponse": function(r) {
159                 dojo.forEach(
160                     openils.Util.readResponse(r),
161                     function(resp) {
162                         if (resp.maximum) {
163                             progress_dialog.update(resp);
164                             return;
165                         }
166
167                         var hold = hashify_fields(resp.hold_details);
168                         hold.action = resp.action;
169
170                         var tr = dojo.clone(template);
171                         any++;
172
173                         dojo.query("td:not([type])", tr).forEach(
174                             function(td) {
175                                 td.innerHTML =
176                                     dojo.string.substitute(td.innerHTML, hold);
177                             }
178                         );
179
180                         new openils.BibTemplate({
181                             "root": tr,
182                             "xml": dojox.xml.parser.parse(
183                                 hold.current_copy.call_number.record.marc
184                             ),
185                             "delay": false
186                         });
187
188                         dojo.attr(tr, "sortkey", hold.usr.display_name);
189                         place_by_sortkey(tr, target);
190                     }
191                 );
192                 progress_dialog.update({"progress": any});
193             },
194             "oncomplete": function() {
195                 progress_dialog.hide();
196                 if (any)
197                     window.print();
198                 else
199                     alert(dojo.byId("no_results").innerHTML);
200             }
201         }
202     );
203 }
204