Fixes some sectors related issues.
[platal.git] / htdocs / javascript / profile.js
1 /***************************************************************************
2 * Copyright (C) 2003-2009 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 {{{1
22
23 function wizPage_onLoad(id)
24 {
25 switch (id) {
26 case 'general':
27 var i = 1;
28 while ($('.edu_' + i).length != 0) {
29 prepareType(i - 1);
30 ++i;
31 }
32 break;
33 case 'adresses':
34 checkCurrentAddress();
35 break;
36 case 'poly':
37 updateGroupSubLink();
38 break;
39 case 'deco':
40 for (var i in names) {
41 if ($('#medal_' + i).length != 0) {
42 getMedalName(i);
43 buildGrade(i, $('#medal_' + i).find('[name*=medal_' + i + '_grade]').val());
44 }
45 }
46 break;
47 case 'emploi':
48 for (var i = 0 ; $('#job_' + i).length != 0; ++i) {
49 updateJobSector(i, $('#job_' + i).find("[name='jobs[" + i + "][subSector]']").val());
50 updateJobSubSector(i, $('#job_' + i).find("[name='jobs[" + i + "][subSubSector]']").val());
51 }
52 break;
53 }
54 }
55
56 var educationDegree;
57 var educationDegreeAll;
58 var educationDegreeName;
59 var subgrades;
60 var names;
61
62 // Names {{{1
63
64 function toggleNamesAdvanced()
65 {
66 $('.names_advanced').toggle();
67 }
68
69 function addSearchName()
70 {
71 var i = 0;
72 while ($('#search_name_' + i).length != 0) {
73 i++;
74 }
75 Ajax.update_html('search_name_' + i, 'profile/ajax/searchname/' + i, function(data){
76 $('#searchname').before(data);
77 changeNameFlag(i);
78 });
79 }
80
81 function removeSearchName(i)
82 {
83 $('#search_name_' + i).remove();
84 updateNameDisplay();
85 }
86
87 function changeNameFlag(i)
88 {
89 $('#flag_' + i).remove();
90 var typeid = $('#search_name_' + i).find('select').val();
91 var type = $('#search_name_' + i).find('select :selected').text();
92 if ($('[name=sn_type_' + typeid + '_' + i + ']').val() > 0) {
93 $('#flag_cb_' + i).after('<span id="flag_' + i + '">&nbsp;' +
94 '<img src="images/icons/flag_green.gif" alt="site public" title="site public" />' +
95 '<input type="hidden" name="search_names[' + i + '][pub]" value="1"/>' +
96 '<input type="hidden" name="search_names[' + i + '][typeid]" value="' + typeid + '"/>' +
97 '<input type="hidden" name="search_names[' + i + '][type]" value="' + type + '"/></span>');
98 } else {
99 $('#flag_cb_' + i).after('<span id="flag_' + i + '">&nbsp;' +
100 '<img src="images/icons/flag_red.gif" alt="site privé" title="site privé" />' +
101 '<input type="hidden" name="search_names[' + i + '][typeid]" value="' + typeid + '"/>' +
102 '<input type="hidden" name="search_names[' + i + '][type]" value="' + type + '"/></span>');
103 }
104 }
105
106 function updateNameDisplay()
107 {
108 var searchnames = '';
109 for (var i = 0; i < 10; i++) {
110 if ($('#search_name_' + i).find(':text').val()) {
111 searchnames += $('#search_name_' + i).find('[name*=typeid]').val() + ';';
112 searchnames += $('#search_name_' + i).find(':text').val() + ';;';
113 }
114 }
115 Ajax.update_html(null, 'profile/ajax/buildnames/' + searchnames, function(data){
116 var name = data.split(';');
117 $('#public_name').html(name[0]);
118 $('#private_name').html(name[0] + name[1]);
119 });
120 }
121
122 // Nationalities {{{1
123
124 function delNationality(i)
125 {
126 $('#nationalite' + i).hide().find('select').val('');
127 }
128
129 function addNationality()
130 {
131 var i = 0;
132 if ($('#nationalite2').find('select').val() == "") {
133 i = 2;
134 } else if ($('#nationalite3').find('select').val() == "") {
135 i = 3;
136 }
137 if ((i == 2) || (i == 3)) {
138 $('#nationalite' + i).show();
139 }
140 }
141
142 // Education {{{1
143
144 function prepareType(id)
145 {
146 var edu = $('.edu_' + id).find("[name='edus[" + id + "][eduid]']").val() - 1;
147 var sel = $('.edu_' + id).find('[name=edu_' + id + '_tmp]').val();
148 var html = '';
149 var length = educationDegree[edu].length;
150 for (i = 0; i < length; ++i) {
151 html += '<option value="' + educationDegree[edu][i] + '"';
152 if (sel == educationDegree[edu][i]) {
153 html += ' selected="selected"';
154 }
155 html += '>' + educationDegreeName[educationDegree[edu][i] - 1] + '</option>';
156 }
157 $('.edu_' + id).find("[name='edus[" + id + "][degreeid]']").html(html);
158 }
159
160 function addEdu()
161 {
162 var i = 0;
163 var j = 0;
164 var prefix = 'edu_';
165 var class_parity;
166
167 while (!$('#edu_add').hasClass(prefix + i)) {
168 if ($('.' + prefix + i).length != 0) {
169 j++;
170 }
171 i++;
172 }
173 if (j % 2) {
174 class_parity = 'pair';
175 } else {
176 class_parity = 'impair';
177 }
178 $('#edu_add').removeClass(prefix + i);
179 i++;
180 $('#edu_add').addClass(prefix + i);
181 i--;
182 $.get(platal_baseurl + 'profile/ajax/edu/' + i + '/' + class_parity,
183 function(data) {
184 $('#edu_add').before(data);
185 prepareType(i);
186 });
187 }
188
189 function removeEdu(i)
190 {
191 var prefix = 'edu_';
192 $('.' + prefix + i).remove();
193 while (!$('#edu_add').hasClass(prefix + i)) {
194 $('.' + prefix + i).toggleClass('pair');
195 $('.' + prefix + i).toggleClass('impair');
196 i++;
197 }
198 }
199
200 // Networking {{{1
201
202 function addNetworking()
203 {
204 var i = 0;
205 while ($('#networking_' + i).length != 0) {
206 i++;
207 }
208 var namefirst = '';
209 var html = '<tr id="networking_' + i + '">'
210 + ' <td colspan="2">'
211 + ' <div style="float: left; width: 200px;">'
212 + ' <span class="flags">'
213 + ' <input type="checkbox" name="networking[' + i + '][pub]"/>'
214 + ' <img src="images/icons/flag_green.gif" alt="site public" title="site public">'
215 + ' </span>&nbsp;'
216 + ' <select name="networking[' + i + '][type]" onchange="javascript:updateNetworking(' + i + ');">';
217 for (nw in nw_list) {
218 if (namefirst == '') {
219 namefirst = nw;
220 }
221 html += ' <option value="' + nw_list[nw] + '">' + nw + '</option>';
222 }
223 html += '</select>'
224 + ' <input type="hidden" name="networking[' + i + '][name]" value="' + namefirst + '"/>'
225 + ' </div>'
226 + ' <div style="float: left">'
227 + ' <input type="text" name="networking[' + i + '][address]" value="" size="30"/>'
228 + ' <a href="javascript:removeNetworking(' + i + ')">'
229 + ' <img src="images/icons/cross.gif" alt="cross" title="Supprimer cet élément"/>'
230 + ' </a>'
231 + ' </div>'
232 + ' </td>'
233 + '</tr>';
234
235 $('#networking').before(html);
236 }
237
238 function removeNetworking(id)
239 {
240 $('#networking_' + id).remove();
241 }
242
243 function updateNetworking(i)
244 {
245 $('#networking_' + i).find("[name='networking[" + i + "][name]']").val($('#networking_' + i).find('select option:selected').text());
246 }
247
248 // Addresses {{{1
249
250 function toggleAddress(id, val)
251 {
252 $('#addresses_' + id + '_grayed').toggle();
253 $('#addresses_' + id).toggle();
254 $('#addresses_' + id + '_cont').find('[name*=removed]').val(val);
255 checkCurrentAddress();
256 }
257
258 function checkCurrentAddress(id)
259 {
260 var hasCurrentAddress = id ? true : false;
261 var i = 0;
262 while ($('#addresses_' + i + '_cont').length != 0) {
263 if ($('#addresses_' + i + '_cont').find('[name*=removed]').val() == 1) {
264 $('#addresses_' + i + '_cont').find('[name*=current]').attr('checked', false);
265 }
266 if (!hasCurrentAddress && $('#addresses_' + i + '_cont').find('[name*=current]:checked').length != 0) {
267 hasCurrentAddress = true;
268 } else {
269 $('#addresses_' + i + '_cont').find('[name*=current]').attr('checked', false);
270 }
271 i++;
272 }
273 if (!hasCurrentAddress) {
274 i = 0;
275 while ($('#addresses_' + i + '_cont').length != 0) {
276 if ($('#addresses_' + i + '_cont').find('[name*=removed]').val() == 0) {
277 $('#addresses_' + i + '_cont').find('[name*=current]').attr('checked', 'checked');
278 break;
279 }
280 i++;
281 }
282 }
283 if (id) {
284 $('#addresses_' + id + '_cont').find('[name*=current]').attr('checked', 'checked');
285 }
286 }
287
288 function addAddress()
289 {
290 var i = 0;
291 while ($('#addresses_' + i + '_cont').length != 0) {
292 i++;
293 }
294 $('#add_address').before('<div id="addresses_' + i + '_cont"></div>');
295 Ajax.update_html('addresses_' + i + '_cont', 'profile/ajax/address/' + i, checkCurrentAddress());
296 }
297
298 function addressChanged(prefid)
299 {
300 $('#' + prefid + '_cont').find('[name*=changed]').val("1");
301 }
302
303 function validGeoloc(prefid, id, geoloc)
304 {
305 if (geoloc == 1) {
306 $('#' + prefid + '_cont').find('[name*=text]').val($('#' + prefid + '_cont').find('[name*=geoloc]').val());
307 $('#' + prefid + '_cont').find('[name*=postalText]').val($('#' + prefid + '_cont').find('[name*=geocodedPostalText]').val());
308 }
309 if (geoloc > 0) {
310 $('#' + prefid + '_cont').find("[name*='[geoloc]']").remove();
311 }
312 $('#' + prefid + '_cont').find('[name*=text]').removeClass('error');
313 $('#' + prefid + '_cont').find('[name*=geoloc_choice]').val(geoloc);
314 $('.' + prefid + '_geoloc').remove();
315 }
316
317 // {{{1 Phones
318
319 function addTel(prefid, prefname)
320 {
321 var i = 0;
322 var prefix = prefid + '_';
323 while ($('#' + prefix + i).length != 0) {
324 i++;
325 }
326 $('#' + prefix + 'add').before('<div id="' + prefix + i + '" style="clear: both; padding-top: 4px; padding-bottom: 4px"></div>');
327 Ajax.update_html(prefix + i, 'profile/ajax/tel/' + prefid + '/' + prefname + '/' + i);
328 }
329
330 function removeTel(id)
331 {
332 $('#' + id).remove();
333 }
334
335 function addPhoneComment(id)
336 {
337 $(id + '_comment').show();
338 $(id + '_addComment').hide();
339 }
340
341 function removePhoneComment(id, pref)
342 {
343 $(id + '_comment').hide();
344 $(id + '_comment').find("[name='" + pref + "[comment]']").val('');
345 $(id + '_addComment').show();
346 }
347
348 // {{{1 Groups
349
350 function addBinet()
351 {
352 var id = $('#binets_table').find('[name=binets_sel]').val();
353 var text = $('#binets_table').find('select option:selected').text();
354 var html = '<tr id="binets_' + id + '">'
355 + ' <td>'
356 + ' <input type="hidden" name="binets[' + id + ']" value="' + text + '" />'
357 + ' </td>'
358 + ' <td>'
359 + ' <div style="float: left; width: 70%">'
360 + text
361 + ' </div>'
362 + ' <a href="javascript:removeElement(\'binets\', ' + id + ')">'
363 + ' <img src="images/icons/cross.gif" alt="cross" title="Supprimer ce groupe" />'
364 + ' </a>'
365 + ' </td>'
366 + '</tr>';
367 $('#binets_table').after(html);
368 updateElement('binets');
369 }
370
371 function updateGroupSubLink()
372 {
373 var href = $('[name*=groupesx_sub]').val() ? $('[name*=groupesx_sub]').val() : 'http://www.polytechnique.net';
374 $('#groupesx_sub').attr('href', href);
375 }
376
377 // {{{1 Medals
378
379 function updateMedal()
380 {
381 var val = $('#medals').find('[name*=medal_sel]').val();
382 if (val && ($('#medal_' + val).length == 0)) {
383 $('#medal_add').show();
384 } else {
385 $('#medal_add').hide();
386 }
387 }
388
389 function getMedalName(id)
390 {
391 $('#medal_name_' + id).html(names[id]);
392 }
393
394 function buildGrade(id, current)
395 {
396 var grade;
397 var subg = subgrades[id];
398 var obj = $('#medal_grade_' + id);
399 if (!subg) {
400 obj.prepend('<input type="hidden" name="medals[' + id + '][grade]" value="0" />');
401 } else {
402 var html = 'Agrafe : <select name="medals[' + id + '][grade]">';
403 html += '<option value="0">Non précisée</option>';
404 for (grade = 0 ; grade < subg.length ; grade++) {
405 html += '<option value="' + subg[grade][0] + '"';
406 if (subg[grade][0] == current) {
407 html += ' selected="selected"';
408 }
409 html += '>' + subg[grade][1] + '</option>';
410 }
411
412 html += '</select>';
413 obj.prepend(html);
414 }
415 }
416
417 function makeAddProcess(id)
418 {
419 return function(data)
420 {
421 $('#medals').after(data);
422 updateMedal();
423 getMedalName(id);
424 buildGrade(id, 0);
425 };
426 }
427
428 function addMedal()
429 {
430 var id = $('#medals').find('[name=medal_sel]').val();
431 $.get(platal_baseurl + 'profile/ajax/medal/' + id, makeAddProcess(id));
432 }
433
434 function removeMedal(id)
435 {
436 $("#medal_" + id).remove();
437 updateMedal();
438 }
439
440 // Jobs {{{1
441
442 function removeJob(id, pref)
443 {
444 $('#' + id + '_cont').hide();
445 if ($('#' + id).find("[name='" + pref + "[new]']").val() == '0') {
446 $('#' + id + '_grayed').show();
447 $('#' + id + '_grayed_name').html($('#' + id).find("[name='" + pref + "[name]']").val());
448 }
449 $('#' + id).find("[name='" + pref + "[removed]']").val('1');
450 }
451
452 function restoreJob(id, pref)
453 {
454 $('#' + id + '_cont').show();
455 $('#' + id + '_grayed').hide();
456 $('#' + id).find("[name='" + pref + "[removed]']").val('0');
457 }
458
459 function updateJobSector(id, sel)
460 {
461 var sector = $('#job_' + id).find("[name='jobs[" + id + "][sector]']").val();
462 if (sector == '') {
463 sector = '-1';
464 }
465 Ajax.update_html('job_' + id + '_subSector', 'profile/ajax/sector/' + id + '/job_' + id + '/jobs[' + id + ']/' + sector + '/' + sel);
466 }
467
468 function updateJobSubSector(id, sel)
469 {
470 var subSector = $('#job_' + id).find("[name='jobs[" + id + "][subSector]']").val();
471 if (subSector == '') {
472 subSector = '-1';
473 }
474 Ajax.update_html('job_' + id + '_subSubSector', 'profile/ajax/sub_sector/' + id + '/' + subSector + '/' + sel);
475 }
476
477 function displayAllSector(id)
478 {
479 $('.sector_text_' + id).remove();
480 $('.sector_' + id).show();
481 }
482
483 function makeAddJob(id)
484 {
485 return function(data)
486 {
487 $('#add_job').before(data);
488 registerEnterpriseAutocomplete(id);
489 };
490 }
491
492 function addJob()
493 {
494 var i = 0;
495 while ($('#job_' + i).length != 0) {
496 ++i;
497 }
498 $.get(platal_baseurl + 'profile/ajax/job/' + i, makeAddJob(i));
499 }
500
501 function addEntreprise(id)
502 {
503 $('.entreprise_' + id).toggle();
504 }
505
506 // {{{1 Skills
507
508 function addSkill(cat)
509 {
510 var val = $('#' + cat + '_table').find('[name=' + cat + '_sel]').val();
511 var text = $('#' + cat + '_table').find('[name=' + cat + '_sel] :selected').text();
512 $.get(platal_baseurl + 'profile/ajax/skill/' + cat + '/' + val,
513 function(data) {
514 $('#' + cat).append(data);
515 $('#' + cat + '_' + val + '_title').text(text);
516 updateElement(cat);
517 });
518 }
519
520 // {{{1 Mentor
521
522 function addCountry()
523 {
524 var val = $('#countries_table').find('[name=countries_sel] :selected').val();
525 var text = $('#countries_table').find('[name=countries_sel] :selected').text();
526 var html = '<div id="countries_' + val + '" style="clear: both; margin-bottom: 0.7em">'
527 + ' <a href="javascript:removeElement(\'countries\', \'' + val + '\')" style="display: block; float:right">'
528 + ' <img src="images/icons/cross.gif" alt="" title="Supprimer ce pays" />'
529 + ' </a>'
530 + ' <div style="float: left; width: 50%">' + text + '</div>'
531 + ' <input type="hidden" name="countries[' + val + ']" value="' + text + '" />'
532 + '</div>';
533 $('#countries').append(html);
534 updateElement('countries');
535 }
536
537 function updateSubSector()
538 {
539 var s = $('#sectorSelection').find('[name=sectorSelection]').val();
540 var ss = $('#selectedSubSector').find("[name='jobs[-1][subSector]']").val();
541 if ((s == '' || ss == '') || $('#sectors_' + s + '_' + ss).length != 0) {
542 $('#addSector').hide();
543 } else {
544 $('#addSector').show();
545 }
546 }
547
548 function removeSector(s, ss)
549 {
550 $('#sectors_' + s + '_' + ss).remove();
551 updateSubSector();
552 }
553
554 function updateSector()
555 {
556 var sector = $('#sectorSelection').find('[name=sectorSelection]').val();
557 if (sector == '') {
558 sector = '-1';
559 $('#selectedSubSector').html('');
560 return;
561 }
562 $.get(platal_baseurl + 'profile/ajax/sector/-1/0/0/' + sector,
563 function(data) {
564 data = '<a href="javascript:addSector()" style="display: none; float: right" id="addSector">'
565 + ' <img src="images/icons/add.gif" alt="" title="Ajouter ce secteur" />'
566 + '</a>' + data;
567 $('#selectedSubSector').html(data);
568 $('#selectedSubSector').find("[name='jobs[-1][subSector]']").change(updateSubSector);
569 });
570 }
571
572 function addSector()
573 {
574 var s = $('#sectorSelection').find('[name=sectorSelection]').val();
575 var ss = $('#selectedSubSector').find("[name='jobs[-1][subSector]']").val();
576 var sst = $('#selectedSubSector').find("[name='jobs[-1][subSector]'] :selected").text();
577
578 var html = '<div id="sectors_' + s + '_' + ss + '" style="clear: both; margin-top: 0.5em" class="titre">'
579 + ' <a href="javascript:removeSector(\'' + s + '\', \'' + ss + '\')" style="display: block; float: right">'
580 + ' <img src="images/icons/cross.gif" alt="" title="Supprimer ce secteur" />'
581 + ' </a>'
582 + ' <input type="hidden" name="sectors[' + s + '][' + ss + ']" value="' + sst + '" />'
583 + ' ' + sst
584 + '</div>';
585 $('#sectors').append(html);
586 updateSubSector();
587 }
588
589 function registerEnterpriseAutocomplete(id)
590 {
591 $(".enterpriseName").each(
592 function() {
593 if (id == -1 || this.name == "jobs[" + id + "][name]") {
594 $(this).autocomplete(platal_baseurl + "search/autocomplete/entreprise",
595 {
596 selectOnly:1,
597 field:this.name,
598 matchSubset:0,
599 width:$(this).width()
600 });
601 }
602 });
603
604 $(".sectorName").each(
605 function() {
606 if (id == -1 || this.name == "jobs[" + id + "][subSubSectorName]") {
607 $(this).autocomplete(platal_baseurl + "search/autocomplete/subSubSector",
608 {
609 selectOnly:1,
610 field:this.name,
611 matchSubset:0,
612 width:$(this).width()
613 });
614 }
615 });
616 }
617
618 // {{{1 Multiusage functions
619
620 function updateElement(cat)
621 {
622 var val = $('#' + cat + '_table').find('[name=' + cat + '_sel]').val();
623 if (val == '' || $('#' + cat + '_' + val).length != 0) {
624 $('#' + cat + '_add').hide();
625 } else {
626 $('#' + cat + '_add').show();
627 }
628 }
629
630 function removeElement(cat, id)
631 {
632 $('#' + cat + '_' + id).remove();
633 updateElement(cat);
634 }
635
636 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: