e61617c31428e818bf7a8e237b03732d0ce29763
[platal.git] / htdocs / javascript / search.js
1 /***************************************************************************
2 * Copyright (C) 2003-2011 Polytechnique.org *
3 * http://opensource.polytechnique.org/ *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software *
17 * Foundation, Inc., *
18 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
19 ***************************************************************************/
20
21 // {{{ Page initialization
22
23 var baseurl = $.plURL('search/');
24 var address_types = new Array('country', 'administrative_area_level_1', 'administrative_area_level_2', 'locality', 'postal_code');
25 var address_types_count = address_types.length;
26
27 function load_advanced_search(request)
28 {
29 $('.autocomplete_target').hide();
30 $('.autocomplete').show().each(function() {
31 $(this).autocomplete({
32 source: baseurl + 'autocomplete/' + this.name,
33 select: function(event, ui) {
34 select_autocomplete(this.name, ui.item.id);
35 },
36 change: function(event, ui) {
37 if (ui.item != null && ui.item.field != null) {
38 $(this).val(ui.item.field);
39 }
40 }
41 });
42 });
43
44 $('.autocomplete').change(function() { $(this).removeClass('hidden_valid'); });
45
46 if (request['country']) {
47 setAddress(0, 1, new Array(request['country'],
48 request['administrative_area_level_1'],
49 request['administrative_area_level_2'],
50 request['locality'],
51 request['postal_code'])
52 );
53 } else {
54 for (var i = 1; i < address_types_count; ++i) {
55 $('tr#' + address_types[i]).hide();
56 }
57 }
58
59 $(".autocomplete[name='school_text']").change(function() { changeSchool('', ''); });
60 changeSchool(request['school'], request['diploma']);
61
62 $(".autocomplete_to_select").each(function() {
63 var field_name = $(this).attr('href');
64
65 if ($(".autocomplete_target[name='" + field_name + "']").val()) {
66 display_list(field_name);
67 }
68
69 $(this).attr('href', baseurl + 'list/' + field_name).click(function() {
70 if ($(this).attr('title') == 'display') {
71 display_list(field_name);
72 } else {
73 var value = $("select[name='" + field_name + "']").val();
74 var text_value = $("select[name='" + field_name + "'] option:selected").text();
75 $('#' + field_name + '_list').html('');
76 $(".autocomplete[name='" + field_name + "_text']").show();
77 $('#' + field_name + '_table').attr('title', 'display');
78 if (value) {
79 $(".autocomplete_target[name='" + field_name + "']").val(value);
80 $(".autocomplete[name='" + field_name + "_text']").val(text_value).addClass('hidden_valid');
81 }
82 }
83
84 return false;
85 });
86 });
87
88 $('#only_referent').change(function() { changeOnlyReferent(); });
89
90 $('.delete_address_component').click(function() {
91 var field_name = $(this).attr('href');
92 var hide = false;
93 var remove = false;
94
95 for (var i = 1; i < address_types_count; ++i) {
96 if (field_name == address_types[i]) {
97 hide = true;
98 }
99 if (hide) {
100 if (field_name != address_types[i]) {
101 remove = true;
102 }
103 delete_address_component(address_types[i], remove);
104 }
105 }
106
107 return false;
108 });
109 }
110
111 function display_list(field_name)
112 {
113 var value = $("input.autocomplete_target[name='" + field_name + "']").val();
114
115 $('#' + field_name + '_list').load(baseurl + 'list/' + field_name, {}, function(selectBox) {
116 $(".autocomplete_target[name='" + field_name + "']").val('');
117 $(".autocomplete[name='" + field_name + "_text']").hide().val('').removeClass('hidden_valid');
118 $("select[name='" + field_name + "']").val(value);
119 $('#' + field_name + '_table').attr('title', 'hide');
120 });
121 }
122
123 // }}}
124 // {{{ Regexps to wipe out from search queries
125
126 var default_form_values = [ /&woman=0(&|$)/, /&subscriber=0(&|$)/, /&alive=0(&|$)/, /&egal[12]=[^&]*&promo[12]=(&|$)/g, /&networking_type=0(&|$)/, /&[^&=]+=(&|$)/g ];
127
128 /** Uses javascript to clean form from all empty fields */
129 function cleanForm(f, targeturl)
130 {
131 var query = $(f).formSerialize();
132 var old_query;
133 for (var i in default_form_values) {
134 var reg = default_form_values[i];
135 if (typeof(reg) != 'undefined') {
136 do {
137 old_query = query;
138 query = query.replace(reg, '$1');
139 } while (old_query != query);
140 }
141 }
142 query = query.replace(/^&*(.*)&*$/, '$1');
143 if (query == 'rechercher=Chercher') {
144 alert("Aucun critère n'a été spécifié.");
145 return false;
146 }
147 document.location = $.plURL(targeturl + '?' + query);
148 return false;
149 }
150
151 // }}}
152 // {{{ Autocomplete related functions.
153
154 function cancel_autocomplete(field, realfield)
155 {
156 $(".autocomplete[name='" + field + "']").removeClass('hidden_valid').val('').focus();
157 if (typeof(realfield) != 'undefined') {
158 $(".autocomplete_target[name='" + realfield + "']").val('');
159 }
160 return;
161 }
162
163 // when choosing autocomplete from list, must validate
164 function select_autocomplete(name, id)
165 {
166 var field_name = name.replace(/_text$/, '');
167
168 // just display field as valid if field is not a text field for a list
169 if (field_name == name) {
170 $(".autocomplete[name='" + name + "']").addClass('hidden_valid');
171 return;
172 }
173
174 // When changing country, locality or school, open next address component.
175 if (field_name == 'country' || field_name == 'locality' || field_name == 'school') {
176 if (id < 0) {
177 cancel_autocomplete(name, field_name);
178 id = '';
179 }
180
181 if (field_name == 'school') {
182 changeSchool(id, '');
183 } else {
184 changeAddressComponents(field_name, id);
185 }
186
187 $(".autocomplete_target[name='" + field_name + "']").attr('value', id);
188 $(".autocomplete[name='" + name + "']").addClass('hidden_valid');
189 return;
190 }
191
192 // change field in list and display text field as valid
193 if (id < 0) {
194 cancel_autocomplete(this.field, field_name);
195 return;
196 }
197
198 $(".autocomplete_target[name='" + field_name + "']").attr('value', id);
199 $(".autocomplete[name='" + name + "']").addClass('hidden_valid');
200 }
201
202 // }}}
203 // {{{ Various search functions.
204
205 function setAddress(i, j, values)
206 {
207 var prev_type = address_types[i];
208 var next_type = address_types[j];
209 var next_list = next_type + '_list';
210
211 $('#' + next_list).load(baseurl + 'list/' + next_type, { previous:prev_type, value:values[i] }, function() {
212 if ($("select[name='" + next_type + "']").children("option").size() > 1) {
213 $("tr#" + next_type).show();
214 $("select[name='" + next_type + "']").attr('value', values[j]);
215 if (next_type == 'locality') {
216 $('tr#locality_text').hide();
217 $("select[name='locality_text']").attr('value', '');
218 }
219 if (j < address_types_count) {
220 setAddress(j, j + 1, values);
221 }
222 } else {
223 $("tr#" + next_type).hide();
224 $("select[name='" + next_type + "']").attr('value', '');
225 if (j < address_types_count) {
226 setAddress(i, j + 1, values);
227 }
228 }
229 });
230 }
231
232 function displayNextAddressComponent(i, j, value)
233 {
234 var prev_type = address_types[i];
235 var next_type = address_types[j];
236 var next_list = next_type + '_list';
237
238 if (next_type == 'locality') {
239 $('tr#locality_text').hide();
240 $("select[name='locality_text']").attr('value', '');
241 }
242
243 $('#' + next_list).load(baseurl + 'list/' + next_type, { previous:prev_type, value:value }, function() {
244 $("select[name='" + next_type + "']").attr('value', '');
245 if ($("select[name='" + next_type + "']").children('option').size() > 1) {
246 $('tr#' + next_type).show();
247 } else {
248 $('tr#' + next_type).hide();
249 if (j < address_types_count) {
250 displayNextAddressComponent(i, j + 1, value);
251 }
252 }
253 });
254 }
255
256 function changeAddressComponents(type, value)
257 {
258 var i = 0;
259
260 while (address_types[i] != type && i < address_types_count) {
261 ++i;
262 }
263
264 for (var j = i + 1; j < address_types_count; ++j) {
265 delete_address_component(address_types[j], true);
266 }
267
268 if (value != '' && i < address_types_count) {
269 $("select[name='" + type + "']").attr('value', value);
270 displayNextAddressComponent(i, i + 1, value);
271 }
272 }
273
274 function delete_address_component(field_name, remove)
275 {
276 if (remove || field_name == 'locality') {
277 $('tr#' + field_name).hide();
278 $('#' + field_name + '_list').html('');
279
280 if (field_name == 'locality') {
281 $("input[name='locality_text']").val('');
282 $('tr#locality_text').show();
283 }
284 } else {
285 $("select[name='" + field_name + "']").val('');
286 $("input[name='" + field_name + "']").val('');
287 }
288 }
289
290 // when changing school, open diploma choice
291 function changeSchool(schoolId, diploma)
292 {
293 $(".autocompleteTarget[name='school']").attr('value', schoolId);
294
295 if (schoolId) {
296 $(".autocomplete[name='school_text']").addClass('hidden_valid');
297 } else {
298 $(".autocomplete[name='school_text']").removeClass('hidden_valid');
299 }
300
301 $("[name='diploma']").parent().load(baseurl + 'list/diploma/', { school:schoolId }, function() {
302 $("select[name='diploma']").attr('value', diploma);
303 });
304 }
305
306 // when choosing a job term in tree, hide tree and set job term field
307 function searchForJobTerm(treeid, jtid, full_name)
308 {
309 $(".term_tree").remove();
310 $("input[name='jobterm_text']").val(full_name).addClass("hidden_valid").show();
311 $("input[name='jobterm']").val(jtid);
312 }
313
314 function addressesDump()
315 {
316 if ($('#addresses_dump:checked').length > 0) {
317 $('#recherche').attr('action', 'search/adv/addresses').attr('method', 'post').removeAttr('onsubmit');
318 } else {
319 $('#recherche').attr('action', 'search/adv').attr('method', 'get');
320 }
321 }
322
323 // }}}
324 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: