Improves email combobox (Closes #1110).
[platal.git] / include / name.func.inc.php
CommitLineData
6e32823c
SJ
1<?php
2/***************************************************************************
5e1513f6 3 * Copyright (C) 2003-2011 Polytechnique.org *
6e32823c
SJ
4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
e8a7cf31 22function build_javascript_names($data, $isFemale)
6e32823c
SJ
23{
24 $data_array = explode(';;', $data);
25 $n = count($data_array);
26 $n--;
27 for ($i = 0; $i < $n; $i++) {
28 $searchname = explode(';', $data_array[$i]);
dced83b4
SJ
29 if (isset($search_names[$searchname[0]])) {
30 $search_names[$searchname[0]][] = $searchname[1];
6e32823c 31 } else {
dced83b4 32 $search_names[$searchname[0]] = array('fullname' => $searchname[1]);
6e32823c
SJ
33 }
34 }
dced83b4 35
6e32823c
SJ
36 $sn_types_public = build_types('public');
37 $sn_types_private = build_types('private');
e8a7cf31 38 $full_name = build_full_name($search_names, $sn_types_public, $isFemale);
6e32823c 39 return build_public_name($search_names, $sn_types_public, $full_name) . ';' .
dced83b4
SJ
40 build_private_name($search_names, $sn_types_private);
41}
42
e8a7cf31 43function build_display_names(&$display_names, $search_names, $isFemale, $private_name_end = null, &$alias = null)
dced83b4
SJ
44{
45 $sn_types_public = build_types('public');
e8a7cf31 46 $full_name = build_full_name($search_names, $sn_types_public, $isFemale);
dced83b4
SJ
47 $display_names['public_name'] = build_public_name($search_names, $sn_types_public, $full_name);
48 $display_names['private_name'] = $display_names['public_name'] . $private_name_end;
49 $display_names['directory_name'] = build_directory_name($search_names, $sn_types_public, $full_name);
50 $display_names['short_name'] = build_short_name($search_names, $sn_types_public, $alias);
51 $display_names['sort_name'] = build_sort_name($search_names, $sn_types_public);
6e32823c
SJ
52}
53
dced83b4 54function build_types($pub = null)
6e32823c
SJ
55{
56 if ($pub == 'public') {
57 $sql_pub = "AND FIND_IN_SET('public', flags)";
58 } elseif ($pub == 'private') {
59 $sql_pub = "AND NOT FIND_IN_SET('public', flags)";
60 } else {
61 $sql_pub = "";
62 }
6cb58d39 63 $sql = "SELECT id, type, name
97a98687 64 FROM profile_name_enum
6e32823c
SJ
65 WHERE NOT FIND_IN_SET('not_displayed', flags)" . $sql_pub;
66 $sn_types = XDB::iterator($sql);
67 $types = array();
68 while ($sn_type = $sn_types->next()) {
dced83b4 69 if ($pub) {
6cb58d39 70 $types[$sn_type['type']] = $sn_type['id'];
dced83b4 71 } else {
6cb58d39 72 $types[$sn_type['id']] = $sn_type['name'];
dced83b4 73 }
6e32823c
SJ
74 }
75 return $types;
76}
77
e8a7cf31 78function build_full_name(&$search_names, &$sn_types, $isFemale)
6e32823c
SJ
79{
80 $name = "";
6cb58d39
SJ
81 if (isset($search_names[$sn_types['lastname_ordinary']])) {
82 $name .= $search_names[$sn_types['lastname_ordinary']]['fullname'] . " ("
83 . $search_names[$sn_types['lastname']]['fullname'] . ")";
6e32823c 84 } else {
6cb58d39 85 $name .= $search_names[$sn_types['lastname']]['fullname'];
6e32823c 86 }
6cb58d39
SJ
87 if (isset($search_names[$sn_types['lastname_marital']])
88 || isset($search_names[$sn_types['pseudonym']])) {
c4b45374 89 $name .= " (";
6cb58d39 90 if (isset($search_names[$sn_types['lastname_marital']])) {
e8a7cf31 91 if ($isFemale) {
c4b45374 92 $name .= "Mme ";
6e32823c 93 } else {
c4b45374 94 $name .= "M ";
6e32823c 95 }
6cb58d39
SJ
96 $name .= $search_names[$sn_types['lastname_marital']]['fullname'];
97 if (isset($search_names[$sn_types['pseudonym']])) {
6e32823c
SJ
98 $name .= ", ";
99 }
100 }
6cb58d39
SJ
101 if (isset($search_names[$sn_types['pseudonym']])) {
102 $name .= $search_names[$sn_types['pseudonym']]['fullname'];
6e32823c
SJ
103 }
104 $name .= ")";
105 }
106 return $name;
107}
108
109function build_public_name(&$search_names, &$sn_types, $full_name)
110{
6cb58d39 111 return $search_names[$sn_types['firstname']]['fullname'] . " " . $full_name;
6e32823c
SJ
112}
113
114function build_private_name(&$search_names, &$sn_types)
115{
116 $name = "";
6cb58d39
SJ
117 if (isset($search_names[$sn_types['nickname']])
118 || (isset($search_names[$sn_types['name_other']])
119 || isset($search_names[$sn_types['name_other']]))) {
6e32823c 120 $name .= " (";
6cb58d39
SJ
121 if (isset($search_names[$sn_types['nickname']])) {
122 $name .= "alias " . $search_names[$sn_types['nickname']]['fullname'];
dced83b4 123 $i = 0;
6cb58d39
SJ
124 while (isset($search_names[$sn_types['nickname']][$i])) {
125 $name .= ", " . $search_names[$sn_types['nickname']][$i];
6e32823c
SJ
126 $i++;
127 }
6cb58d39 128 if (isset($search_names[$sn_types['name_other']])
6115899b 129 || isset($search_names[$sn_types['firstname_other']])) {
6e32823c
SJ
130 $name .= ", ";
131 }
132 }
6cb58d39
SJ
133 if (isset($search_names[$sn_types['firstname_other']])) {
134 $name .= "autres prénoms : " . $search_names[$sn_types['firstname_other']]['fullname'];
dced83b4 135 $i = 0;
6cb58d39
SJ
136 while (isset($search_names[$sn_types['firstname_other']][$i])) {
137 $name .= ", " . $search_names[$sn_types['firstname_other']][$i];
6e32823c
SJ
138 $i++;
139 }
6cb58d39 140 if (isset($search_names[$sn_types['name_other']])) {
6e32823c
SJ
141 $name .= ", ";
142 }
143 }
6cb58d39
SJ
144 if (isset($search_names[$sn_types['name_other']])) {
145 $name .= "autres noms : " . $search_names[$sn_types['name_other']]['fullname'];
dced83b4 146 $i = 0;
6cb58d39
SJ
147 while (isset($search_names[$sn_types['name_other']][$i])) {
148 $name .= ", " . $search_names[$sn_types['name_other']][$i];
6e32823c
SJ
149 $i++;
150 }
151 }
152 $name .= ")";
153 }
154 return $name;
155}
156
157function build_directory_name(&$search_names, &$sn_types, $full_name)
158{
6cb58d39 159 return $full_name . " " . $search_names[$sn_types['firstname']]['fullname'];
6e32823c
SJ
160}
161
dced83b4 162function build_short_name(&$search_names, &$sn_types, &$alias = null)
6e32823c 163{
6cb58d39
SJ
164 if (isset($search_names[$sn_types['lastname_ordinary']])) {
165 $lastname = $search_names[$sn_types['lastname_ordinary']]['fullname'];
6e32823c 166 } else {
6cb58d39 167 $lastname = $search_names[$sn_types['lastname']]['fullname'];
6e32823c 168 }
6cb58d39
SJ
169 if (isset($search_names[$sn_types['firstname_ordinary']])) {
170 $firstname = $search_names[$sn_types['firstname_ordinary']]['fullname'];
6e32823c 171 } else {
6cb58d39 172 $firstname = $search_names[$sn_types['firstname']]['fullname'];
6e32823c 173 }
dced83b4 174 if ($alias) {
e788e5a2 175 $alias = PlUser::makeUserName($firstname, $lastname);
dced83b4
SJ
176 }
177 return $firstname . " " . $lastname;
6e32823c
SJ
178}
179
dced83b4 180function build_sort_name(&$search_names, &$sn_types)
6e32823c
SJ
181{
182 $name = "";
6cb58d39
SJ
183 if (isset($search_names[$sn_types['lastname_ordinary']])) {
184 $name .= $search_names[$sn_types['lastname_ordinary']]['name'];
6e32823c 185 } else {
6cb58d39 186 $name .= $search_names[$sn_types['lastname']]['name'];
6e32823c 187 }
6cb58d39 188 $name .= " " . $search_names[$sn_types['firstname']]['fullname'];
6e32823c
SJ
189 return $name;
190}
191
f4b04704 192function set_profile_display(&$display_names, Profile $profile)
dced83b4
SJ
193{
194 XDB::execute("UPDATE profile_display
195 SET public_name = {?}, private_name = {?},
196 directory_name = {?}, short_name = {?}, sort_name = {?}
197 WHERE pid = {?}",
198 $display_names['public_name'], $display_names['private_name'],
199 $display_names['directory_name'], $display_names['short_name'],
f4b04704 200 $display_names['sort_name'], $profile->id());
cb0af6e5 201
cb0af6e5
FB
202 $owner = $profile->owner();
203 if ($owner) {
204 XDB::execute('UPDATE accounts
01525e8f 205 SET full_name = {?}, directory_name = {?}
cb0af6e5 206 WHERE uid = {?}',
01525e8f 207 $display_names['public_name'], $display_names['directory_name'], $owner->id());
cb0af6e5 208 }
dced83b4
SJ
209}
210
e8a7cf31 211function build_sn_pub($pid)
dced83b4
SJ
212{
213 $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid,
214 sn.particle, sn.name, sn.id
97a98687
SJ
215 FROM profile_name AS sn
216 INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid)
dced83b4
SJ
217 WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)
218 AND FIND_IN_SET('public', e.flags)
219 ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name",
e8a7cf31 220 $pid);
dced83b4
SJ
221 $sn_old = array();
222 while ($old = $res->next()) {
223 $sn_old[$old['typeid']] = array('fullname' => $old['fullname'],
224 'name' => $old['name'],
225 'particle' => $old['particle'],
226 'id' => $old['id']);
227 }
228 return $sn_old;
229}
230
ac40839f
PC
231/** Transform a name to its canonical value so it can be compared
232 * to another form (different case, with accents or with - instead
233 * of blanks).
234 * @see compare_basename to compare
235 */
236function name_to_basename($value) {
237 $value = mb_strtoupper(replace_accent($value));
238 return preg_replace('/[^A-Z]/', ' ', $value);
239}
240
241/** Compares two strings and check if they are two forms of the
242 * same name (different case, with accents or with - instead of
243 * blanks).
244 * @see name_to_basename to retreive the compared string
245 */
246function compare_basename($a, $b) {
247 return name_to_basename($a) == name_to_basename($b);
248}
249
f036c896 250function set_alias_names(&$sn_new, $sn_old, $pid, PlUser $user, $update_new = false, $new_alias = null)
dced83b4
SJ
251{
252 $has_new = false;
253 foreach ($sn_new as $typeid => $sn) {
297bf4c8 254 if (isset($sn['pub']) && !is_null($sn['fullname'])) {
3ec8ae8e 255 if (isset($sn_old[$typeid]) && $update_new) {
97a98687 256 XDB::execute("UPDATE profile_name
dced83b4
SJ
257 SET particle = {?}, name = {?}, typeid = {?}
258 WHERE id = {?} AND pid = {?}",
e8a7cf31 259 $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], $pid);
dced83b4 260 unset($sn_old[$typeid]);
297bf4c8
SJ
261 } elseif ($sn['fullname'] == $sn_old[$typeid]['fullname'] && $sn['name'] == $sn_old[$typeid]['name']) {
262 XDB::execute('INSERT INTO profile_name (particle, name, typeid, pid)
263 VALUES ({?}, {?}, {?}, {?})',
264 $sn_old[$typeid]['particle'], $sn_old[$typeid]['name'], $typeid, $pid);
265 unset($sn_old[$typeid]);
dced83b4
SJ
266 } else {
267 $has_new = true;
268 }
269 } else {
270 if ($sn['fullname'] != '') {
97a98687 271 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
dced83b4 272 VALUES ('', {?}, {?}, {?})",
e8a7cf31 273 $sn['fullname'], $typeid, $pid);
dced83b4 274 }
6cb58d39
SJ
275 $i = 0;
276 while (isset($sn[$i])) {
277 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
278 VALUES ('', {?}, {?}, {?})",
e8a7cf31 279 $sn[$i], $typeid, $pid);
6cb58d39
SJ
280 $i++;
281 }
dced83b4
SJ
282 }
283 }
284 if (count($sn_old) > 0) {
285 if (!$update_new) {
286 $has_new = true;
287 foreach ($sn_old as $typeid => $sn) {
97a98687 288 XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
dced83b4 289 VALUES ({?}, {?}, {?}, {?})",
e8a7cf31 290 $sn['particle'], $sn['name'], $typeid, $pid);
dced83b4
SJ
291 }
292 } else {
293 foreach ($sn_old as $typeid => $sn) {
97a98687 294 XDB::execute("DELETE FROM profile_name
dced83b4 295 WHERE pid = {?} AND id = {?}",
e8a7cf31 296 $pid, $sn['id']);
dced83b4
SJ
297 }
298 }
299 }
300 if ($update_new) {
f036c896
SJ
301 XDB::execute('DELETE FROM email_source_account
302 WHERE FIND_IN_SET(\'usage\', flags) AND uid = {?} AND type = \'alias\'',
303 $user->id());
dced83b4
SJ
304 }
305 if ($new_alias) {
c0436d0b
SJ
306 XDB::execute('INSERT INTO email_source_account (email, uid, type, flags, domain)
307 SELECT {?}, {?}, \'alias\', \'usage\', id
308 FROM email_virtual_domains
309 WHERE name = {?}',
f036c896 310 $new_alias, $user->id(), $user->mainEmailDomain());
dced83b4 311 }
bedc4295 312 Profile::rebuildSearchTokens($pid, false);
dced83b4
SJ
313 return $has_new;
314}
315
6e32823c
SJ
316// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
317?>