Initial dev repository
[kcls-web.git] / js / ui / default / acq / picklist / bib_search.js
1 dojo.require('dijit.form.FilteringSelect');
2 dojo.require('dijit.ProgressBar');
3 dojo.require('dijit.Dialog');
4 dojo.require('dojox.form.CheckedMultiSelect');
5 dojo.require('fieldmapper.Fieldmapper');
6 dojo.require('dijit.form.Form');
7 dojo.require('dijit.form.TextBox');
8 dojo.require('dijit.form.NumberSpinner');
9 dojo.require('openils.Event');
10 dojo.require('openils.acq.Picklist');
11 dojo.require('openils.acq.Lineitem');
12 dojo.require('openils.User');
13 dojo.require('openils.Util');
14
15 var searchFields = [];
16 var resultPicklist;
17 var resultLIs;
18 var selectedLIs;
19 var recvCount = 0;
20 var sourceCount = 0; // how many sources are we searching
21 var user = new openils.User();
22 var searchLimit = 10;
23 var liCache = {};
24 var liTable;
25
26 function drawForm() {
27     liTable = new AcqLiTable();
28     liTable.skipInitialEligibilityCheck = true;
29
30     fieldmapper.standardRequest(
31         ['open-ils.search', 'open-ils.search.z3950.retrieve_services'], 
32         {   async: true,
33             params: [user.authtoken],
34             oncomplete: _drawForm
35         }
36     );
37 }
38
39 function _drawForm(r) {
40
41     var sources = openils.Util.readResponse(r);
42     if(!sources) return;
43
44     for(var name in sources) {
45         source = sources[name];
46         if(name == 'native-evergreen-catalog') continue;
47         bibSourceSelect.addOption({value:name, label:source.label});
48         for(var attr in source.attrs) 
49             if(!attr.match(/^#/)) // xml comment nodes
50                 searchFields.push(source.attrs[attr]);
51     }
52
53     searchFields = searchFields.sort(
54         function(a,b) {
55             if(a.label < b.label) 
56                 return -1;
57             if(a.label > b.label) 
58                 return 1;
59             return 0;
60         }
61     );
62
63     var tbody = dojo.byId('oils-acq-search-fields-tbody');
64     var tmpl = tbody.removeChild(dojo.byId('oils-acq-search-fields-template'));
65
66     for(var f in searchFields) {
67         var field = searchFields[f];
68         if(dijit.byId('text_input_'+field.name)) continue;
69         var row = tmpl.cloneNode(true);
70         tbody.insertBefore(row, dojo.byId('oils-acq-seach-fields-count-row'));
71         var labelCell = dojo.query('[name=label]', row)[0];
72         var inputCell = dojo.query('[name=input]', row)[0];
73         labelCell.appendChild(document.createTextNode(field.label));
74         input = new dijit.form.TextBox({name:field.name, label:field.label, id:'text_input_'+field.name});
75         inputCell.appendChild(input.domNode);
76     }
77 }
78
79 function clearSearchForm() {
80     for(var f in searchFields) {
81         var field = searchFields[f];
82         dijit.byId('text_input_'+field.name).setValue('');
83     }
84 }
85
86 var resultRow;
87 function doSearch(values) {
88     liTable.reset();
89     showDiv('oils-acq-pl-loading');
90
91     search = {
92         service : [],
93         username : [],
94         password : [],
95         search : {},
96         limit : values.limit,
97         offset : searchOffset
98     };
99     searchLimit = values.limit;
100     delete values.limit;
101
102     var selected = bibSourceSelect.getValue();
103     for(var i = 0; i < selected.length; i++) {
104         search.service.push(selected[i]);
105         search.username.push('');
106         search.password.push('');
107         sourceCount++;
108     }
109
110     for(var v in values) {
111         if(values[v]) {
112             var input = dijit.byId('text_input_'+v);
113             search.search[v] = values[v];
114         }
115     }
116
117     fieldmapper.standardRequest(
118         ['open-ils.acq', 'open-ils.acq.picklist.search.z3950'],
119         {   async: true,
120             params: [user.authtoken, search, null, {respond_li:1, flesh_attrs:1, clear_marc:1}],
121             onresponse: handleResult
122         }
123     );
124 }
125
126
127 function setRowAttr(td, liWrapper, field) {
128     var val = liWrapper.findAttr(field, 'lineitem_marc_attr_definition') || '';
129     td.appendChild(document.createTextNode(val));
130 }
131
132 function handleResult(r) {
133     var result = openils.Util.readResponse(r);
134     liTable.show('list');
135     dojo.style(dojo.byId('oils-acq-pl-search-results'), 'display', 'block');
136     var tbody = dojo.byId('plist-tbody');
137     if(result.lineitem)
138         liTable.addLineitem(result.lineitem);
139     if(result.complete) // hide the loading image
140         dojo.style('oils-acq-pl-loading','display', 'none');
141 }
142
143 function showDiv(div) {
144     var divs = [
145         'oils-acq-search-block', 
146         'oils-acq-pl-loading' ];
147     dojo.forEach(divs, function(d) {dojo.style(d,'display', 'none')});
148     liTable.hide();
149     dojo.style(div, 'display', 'block');
150 }
151
152
153 openils.Util.addOnLoad(drawForm);
154
155