]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/skin/default/js/adv_global.js
modified form clearing to work regardless of propogated search terms
[Evergreen.git] / Open-ILS / web / opac / skin / default / js / adv_global.js
1
2 attachEvt("common", "run", advgInit);
3 attachEvt("common", "locationChanged", advSyncCopyLocLink );
4
5 var COOKIE_NOGROUP_RECORDS = 'grpt';
6 var advSelectedOrg = null;
7
8 function advgInit() {
9
10         /* XXX */
11         if( cookieManager.read(COOKIE_NOGROUP_RECORDS) || SHOW_MR_DEFAULT )
12                 $('adv_group_titles').checked = true;
13
14         $n($('adv_global_tbody'), 'term').focus();
15
16         var extras = [ 
17                 FETCH_LIT_FORMS, 
18                 FETCH_ITEM_FORMS, 
19                 FETCH_ITEM_TYPES, 
20                 FETCH_AUDIENCES,
21                 FETCH_BIB_LEVELS 
22     ];
23
24         for( var x in extras ) {
25
26                 var req = new Request(extras[x]);
27
28                 if(x == 0) req.request.sel = $('adv_global_lit_form');
29                 if(x == 1) req.request.sel = $('adv_global_item_form');
30                 if(x == 2) req.request.sel = $('adv_global_item_type');
31                 if(x == 3) req.request.sel = $('adv_global_audience');
32                 if(x == 4) req.request.sel = $('adv_global_bib_level');
33
34                 req.callback(advDrawBibExtras);
35                 req.send();
36         }
37
38         var input = $n($('adv_global_trow'), 'term');
39         input.focus();
40         setEnterFunc(input, advSubmitGlobal);
41
42     if(getSort() && getSortDir()) {
43             setSelector($('adv_global_sort_by'), getSort());
44             setSelector($('adv_global_sort_dir'), getSortDir());
45         if(getSort() != 'rel')
46             $('adv_global_sort_dir').disabled = false;
47     }
48
49     if(getAvail())
50         $('opac.result.limit2avail').checked = true;
51
52     initSearchBoxes();
53
54     advSyncCopyLocLink(getLocation());
55 }
56
57 function advSyncCopyLocLink(org) {
58     // display the option to filter by copy location
59     advLocationsLoaded = false;
60     advSelectedOrg = org;
61     removeChildren($('adv_copy_location_filter_select'));
62
63     if(isTrue(findOrgType(findOrgUnit(org).ou_type()).can_have_vols())) {
64         unHideMe($('adv_copy_location_filter_row'));
65         advLoadCopyLocations(org); 
66     } else {
67         hideMe($('adv_copy_location_filter_row'));
68     }
69
70 }
71
72 function clearSearchBoxes() {
73     var rows = $('adv_global_tbody').getElementsByTagName('tr');
74     for(var t = 0; t < rows.length; t++) {
75         if($n(rows[t], 'term')) {
76             $n(rows[t], 'term').value = '';
77             setSelector($n(rows[t], 'container'), 'contains');
78             setSelector($n(rows[t], 'type'), 'keyword');
79         }
80     }
81 }
82
83
84 function initSearchBoxes() {
85     /* loads the compiled search from the search cookie 
86         and sets the widgets accordingly */
87
88     search = cookieManager.read(COOKIE_SEARCH);
89     if(!search) return;
90     _debug("loaded compiled search cookie: " + search);
91
92     search = JSON2js(search);
93     if(!search) return;
94
95     var types = getObjectKeys(search.searches);
96
97     /* pre-add the needed rows */
98     while($('adv_global_tbody').getElementsByTagName('tr').length - 1 < types.length)
99         advAddGblRow();
100
101     var rows = $('adv_global_tbody').getElementsByTagName('tr');
102
103     for(var t = 0; t < types.length; t++) {
104         var row = rows[t];
105         setSelector($n(row, 'type'), types[t]);
106         var term = search.searches[types[t]].term;
107
108         /* if this is a single -<term> search, set the selector to nocontains */
109         if(match = term.match(/^-(\w+)$/)) {
110             term = match[1];
111             setSelector($n(row, 'contains'), 'nocontains');
112         }
113         $n(row, 'term').value = term;
114     }
115 }
116
117 function advAddGblRow() {
118         var tbody = $("adv_global_tbody");
119         var newrow = $("adv_global_trow").cloneNode(true);
120         tbody.insertBefore(newrow, $("adv_global_addrow"));
121         var input = $n(newrow, "term");
122         input.value = "";
123         setEnterFunc(input, advSubmitGlobal);
124         $n(newrow, 'type').focus();
125 }
126
127 function advDrawBibExtras(r) {
128         var data = r.getResultObject();
129         var sel = r.sel;
130
131         data = data.sort( /* sort alphabetically */
132                 function(a,b) { 
133                         if( a.value() < b.value() ) return -1;
134                         if( a.value() > b.value() ) return 1;
135                         return 0;
136                 }
137         );
138
139         for( var d = 0; d < data.length; d++ ) {
140                 var thing = data[d];
141                 var opt = insertSelectorVal( sel, -1, thing.value(), thing.code() );
142                 opt.setAttribute('title', thing.value());
143         }
144 }
145
146 function advSelToStringList(sel) {
147         var list = getSelectedList(sel);
148         var vals = [];
149         for( var i = 0; i < list.length; i++ ) {
150                 var str = list[i];
151                 for( var j = 0; j < str.length; j++ ) {
152                         //if(str.charAt(j) == ' ') continue;
153                         vals.push(str.charAt(j));
154                 }
155         }
156         return vals.toString();
157 }
158
159 function advGetVisSelectorVals(id) {
160         var basic = id + '_basic';
161         if(! $(id).className.match(/hide_me/)) 
162                 return advSelToStringList($(id));
163         return advSelToStringList($(basic));
164 }
165
166 function advSubmitGlobal() {
167         
168         var sortdir = getSelectorVal($('adv_global_sort_dir'));
169         var sortby  = getSelectorVal($('adv_global_sort_by'));
170
171         var litforms  = advGetVisSelectorVals('adv_global_lit_form');
172         var itemforms = advGetVisSelectorVals('adv_global_item_form');
173         var itemtypes = advGetVisSelectorVals('adv_global_item_type');
174         var audiences = advGetVisSelectorVals('adv_global_audience');
175         var biblevels = advGetVisSelectorVals('adv_global_bib_level');
176     var locations = advGetVisSelectorVals('adv_copy_location_filter_select');
177         var languages = getSelectedList($('adv_global_lang')) + '';     
178     var limit2avail = $('opac.result.limit2avail').checked ? 1 : ''
179
180         var searches = advBuildSearchBlob();
181         if(!searches) return;
182
183         clearSearchParams();
184
185         var args = {};
186         args.page = MRESULT;
187         args[PARAM_ITEMFORM] = itemforms;
188         args[PARAM_ITEMTYPE] = itemtypes;
189         args[PARAM_BIBLEVEL] = biblevels;
190         args[PARAM_LITFORM]     = litforms;
191         args[PARAM_AUDIENCE]    = audiences;
192         args[PARAM_LANGUAGE] = languages;
193         args[PARAM_COPYLOCS] = locations;
194         //args[PARAM_SEARCHES]  = js2JSON(searches); /* break these out */
195         args[PARAM_DEPTH]               = depthSelGetDepth();
196         args[PARAM_LOCATION]    = depthSelGetNewLoc();
197         args[PARAM_SORT]                = sortby;
198         args[PARAM_SORT_DIR]    = sortdir;
199         args[PARAM_ADVTYPE]     = ADVTYPE_MULTI;
200         args[PARAM_STYPE]               = "";
201         args[PARAM_TERM]                = searches;
202         args[PARAM_AVAIL]               = limit2avail;
203
204         /* pubdate sorting causes a record (not metarecord) search */
205         if( sortby == SORT_TYPE_PUBDATE || !$('adv_group_titles').checked ) {
206                 args.page = RRESULT;
207                 args[PARAM_RTYPE] = RTYPE_MULTI;
208         }
209
210         if($('adv_group_titles').checked ) 
211                 cookieManager.write(COOKIE_NOGROUP_RECORDS,'1',-1);
212         else
213                 cookieManager.write(COOKIE_NOGROUP_RECORDS,'');
214
215
216         goTo(buildOPACLink(args));
217 }
218
219
220 function advBuildSearchBlob() {
221
222         var searches = '';
223         var tbody    = $('adv_global_tbody');
224         var rows     = tbody.getElementsByTagName('tr');
225
226         for( var i = 0; i < rows.length; i++ ) {
227
228                 var row = rows[i];
229                 if(!(row && typeof row == 'object')) continue;
230                 if(!row.getAttribute('type')) continue;
231                 
232                 var stype        = getSelectorVal($n(row, 'type'));
233                 var contains = getSelectorVal($n(row, 'contains'));
234                 var term                 = $n(row, 'term').value;
235                 if(!term) continue;
236
237                 var string = "";
238                 switch(contains) {
239                         case 'contains' : 
240                                 string += " " + term; 
241                                 break;
242
243                         case 'nocontains' : {
244                                 var words = term.split(" ");
245                                         for( var j in words ) 
246                                                 string += " -" + words[j];
247                                 }
248                                 break;
249
250                         case 'exact' : 
251                                 if(term.indexOf('"') > -1) string += " " + term;
252                                 else string += " \"" + term + "\"";
253                                 break;
254                 }
255                 if(string) {
256                         string = string.replace(/'/g,' ');
257                         string = string.replace(/\\/g,' ');
258             string = string.replace(/^\s*/,'');
259             string = string.replace(/\s*$/,'');
260                         //searches[stype].term = string;
261             if(searches) searches += ' ';
262             searches += stype + ':'+ string;
263                 }
264         }
265
266     _debug("created search query " + searches);
267         return searches;
268 }
269
270
271 // retrieves the shelving locations
272 var advLocationsLoaded = false;
273 function advLoadCopyLocations(org) {
274     if(org == null) 
275         org = advSelectedOrg;
276     var req = new Request(FETCH_COPY_LOCATIONS, org);
277     req.callback(advShowCopyLocations);
278     req.send();
279     advLocationsLoaded = true;
280 }
281
282 // inserts the shelving locations into the multi-select
283 function advShowCopyLocations(r) {
284     var locations = r.getResultObject();
285     var sel = $('adv_copy_location_filter_select');
286     for(var i = 0; i < locations.length; i++) 
287         insertSelectorVal(sel, -1, locations[i].name(), locations[i].id());
288 }
289
290