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