]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/Users/reassignUserRecords.php
Release 6.5.11
[Github/sugarcrm.git] / modules / Users / reassignUserRecords.php
1 <?php
2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4  * SugarCRM Community Edition is a customer relationship management program developed by
5  * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
6  * 
7  * This program is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU Affero General Public License version 3 as published by the
9  * Free Software Foundation with the addition of the following permission added
10  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13  * 
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
17  * details.
18  * 
19  * You should have received a copy of the GNU Affero General Public License along with
20  * this program; if not, see http://www.gnu.org/licenses or write to the Free
21  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301 USA.
23  * 
24  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26  * 
27  * The interactive user interfaces in modified source and object code versions
28  * of this program must display Appropriate Legal Notices, as required under
29  * Section 5 of the GNU Affero General Public License version 3.
30  * 
31  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32  * these Appropriate Legal Notices must retain the display of the "Powered by
33  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34  * technical reasons, the Appropriate Legal Notices must display the words
35  * "Powered by SugarCRM".
36  ********************************************************************************/
37
38
39 global $mod_strings;
40 $mod_strings_users = $mod_strings;
41
42 global $current_user;
43 if(!$GLOBALS['current_user']->isAdminForModule('Users')
44   ){
45         sugar_die("You cannot access this page.");
46 }
47
48 global $locale;
49
50 $return_module = isset($_REQUEST['return_module']) ? $_REQUEST['return_module'] : '';
51 $return_action = isset($_REQUEST['return_action']) ? $_REQUEST['return_action'] : '';
52 $return_id = isset($_REQUEST['return_id']) ? $_REQUEST['return_id'] : '';
53 if(!empty($return_module))
54     $cancel_location = "index.php?module=".$return_module."&action=".$return_action."&record=".$return_id;
55 else
56     $cancel_location = "index.php?module=Users&action=index";
57
58 echo "<h2 class='moduleTitle' style=\"margin-bottom:0px;\">{$mod_strings_users['LBL_REASS_SCRIPT_TITLE']}</h2>";
59
60 // Include Metadata for processing
61 require_once("modules/Users/metadata/reassignScriptMetadata.php");
62 if(file_exists("custom/modules/Users/reassignScriptMetadata_override.php")){
63         include("custom/modules/Users/reassignScriptMetadata_override.php");
64 }
65
66 if(!empty($_GET['record'])){
67         unset($_SESSION['reassignRecords']);
68         $_SESSION['reassignRecords']['fromuser'] = $_GET['record'];
69 }
70
71 if(!isset($_POST['fromuser']) && !isset($_GET['execute'])){
72 ///////////////////// BEGIN STEP 1 - Select users/modules /////////////////////////
73         $exclude_modules = array(
74                 "ImportMap",
75                 "UsersLastImport",
76                 "Dashboard",
77                 "SavedSearch",
78                 "UserPreference",
79             "SugarFavorites",
80             'OAuthKey',
81             'OAuthToken',
82         );
83
84         if(isset($_GET['clear']) && $_GET['clear'] == 'true'){
85                 unset($_SESSION['reassignRecords']);
86         }
87 ?>
88 <form method=post action="index.php?module=Users&action=reassignUserRecords" name='EditView' id='EditView'>
89 <table cellspacing='1' cellpadding='1' border='0'>
90 <tr>
91     <td><?php echo $mod_strings_users['LBL_REASS_DESC_PART1']."<BR><br>"?></td>
92 </tr>
93 <tr>
94 <td>
95 <input type=submit class="button" value="<?php echo $mod_strings_users['LBL_REASS_BUTTON_CONTINUE']; ?>" name=steponesubmit>
96 &nbsp;<input type=button class="button" value="<?php echo $mod_strings_users['LBL_REASS_BUTTON_CLEAR']; ?>" onclick='clearCurrentRecords();'>
97 <input type=button class="button" value="<?php echo $app_strings['LBL_CANCEL_BUTTON_LABEL']; ?>" onclick='document.location="<?php echo $cancel_location ?>"'>
98 </td>
99 </tr>
100 </table>
101 <table border='0' cellspacing='0' cellpadding='0'  class='edit view'>
102 <tr>
103 <td>
104 <BR>
105 <?php echo $mod_strings_users['LBL_REASS_USER_FROM']; ?>
106 <BR>
107 <select name="fromuser" id='fromuser'>
108 <?php
109 $all_users = User::getAllUsers();
110 //Bug 48697 - We need to display only active users as possible reassign targets
111 $active_users = User::getActiveUsers();
112 echo get_select_options_with_id($all_users, isset($_SESSION['reassignRecords']['fromuser']) ? $_SESSION['reassignRecords']['fromuser'] : '');
113 ?>
114 </select>
115 <BR>
116 <BR>
117 <?php echo $mod_strings_users['LBL_REASS_USER_TO']; ?>
118 <BR>
119 <select name="touser" id="touser">
120 <?php
121 if(isset($_SESSION['reassignRecords']['fromuser']) && isset($all_users[$_SESSION['reassignRecords']['fromuser']]))
122 {
123         unset($all_users[$_SESSION['reassignRecords']['fromuser']]);
124 }
125
126 echo get_select_options_with_id($active_users, isset($_SESSION['reassignRecords']['touser']) ? $_SESSION['reassignRecords']['touser'] : '');
127 ?>
128 </select>
129 <?php
130 ?>
131 <BR>
132 <?php echo $mod_strings_users['LBL_REASS_MOD_REASSIGN']; ?>
133 <BR>
134 <select size="6" name='modules[]' multiple="true" id='modulemultiselect' onchange="updateDivDisplay(this);">
135 <?php
136 if(!isset($_SESSION['reassignRecords']['assignedModuleListCache'])){
137         $beanListDup = $beanList;
138         foreach($beanListDup as $m => $p){
139                 if(empty($beanFiles[$p])){
140                         unset($beanListDup[$m]);
141                 }
142                 else{
143                         require_once($beanFiles[$p]);
144                         $obj = new $p();
145                         if( !isset($obj->field_defs['assigned_user_id']) ||
146                                 (
147                                         isset($obj->field_defs['assigned_user_id']) &&
148                                         isset($obj->field_defs['assigned_user_id']['source']) &&
149                                         $obj->field_defs['assigned_user_id']['source'] == "non-db"
150                                 )
151                           )
152                         {
153                                 unset($beanListDup[$m]);
154                         }
155                 }
156         }
157         $beanListDup = array_diff($beanListDup, $exclude_modules);
158
159         //Leon bug 20739
160         $beanListDupDisp=array() ;
161         foreach($beanListDup as $m => $p){
162                 if (isset($app_list_strings['moduleList'][$m]))
163                 {
164                     $beanListDupDisp[$app_list_strings['moduleList'][$m]]=$p;
165                 }
166         }
167         $_SESSION['reassignRecords']['assignedModuleListCache'] = $beanListDup;
168         $_SESSION['reassignRecords']['assignedModuleListCacheDisp'] = $beanListDupDisp;
169 }
170 $beanListDup = array_flip($_SESSION['reassignRecords']['assignedModuleListCache']);
171 $beanListFlip = array_flip($_SESSION['reassignRecords']['assignedModuleListCacheDisp']);
172 asort($beanListFlip);
173 $selected = array();
174 if(!empty($_SESSION['reassignRecords']['modules'])){
175         foreach($_SESSION['reassignRecords']['modules'] as $mod => $arr)
176                 $selected[] = $mod;
177 }
178 echo get_select_options_with_id($beanListFlip, $selected);
179 ?>
180 </select>
181 <BR>
182 </td>
183 </tr>
184 <tr>
185 <td>
186 <?php
187 foreach($moduleFilters as $modFilter => $fieldArray){
188         $display = (!empty($fieldArray['display_default']) && $fieldArray['display_default'] == true ? "block" : "none");
189         //Leon bug 20739
190         $t_mod_strings=return_module_language($GLOBALS['current_language'], $modFilter);
191         echo "<div id=\"reassign_{$GLOBALS['beanList'][$modFilter]}\" style=\"display:$display\">\n";
192         echo "<h5 style=\"padding-left:0px; margin-bottom:4px;\">{$app_list_strings['moduleList'][$modFilter]} ", " {$mod_strings_users['LBL_REASS_FILTERS']}</h5>\n";
193         foreach($fieldArray['fields'] as $meta){
194                 $multi = "";
195                 $name = (!empty($meta['name']) ? $meta['name'] : "");
196                 $size = (!empty($meta['size']) ? "size=\"{$meta['size']}\"" : "");
197                 //Leon bug 20739
198                 echo $t_mod_strings[$meta['vname']] ."\n<BR>\n";
199                 switch($meta['type']){
200                         case "text":
201                                 $tag = "input";
202                                 break;
203                         case "multiselect":
204                                 $multi = "multiple=\"true\"";
205                                 $name .= "[]";
206                                 // NO BREAK - Continue into select
207                         case "select":
208                                 $tag = "select";
209                                 $sel = '';
210                                 if(!empty($_SESSION['reassignRecords']['filters'][$meta['name']])){
211                                         $sel = $_SESSION['reassignRecords']['filters'][$meta['name']];
212                                 }
213                                 $extra = get_select_options_with_id($meta['dropdown'], $sel);
214                                 $extra .= "\n</select>";
215                                 break;
216                         default:
217                                 //echo "Skipping field {$meta['name']} since the type is not supported<BR>";
218                                 continue;
219                 }
220                 echo "<$tag $size name=\"$name\" $multi>\n$extra";
221                 echo "<BR>\n";
222         }
223         echo "</div>\n";
224 }
225 ?>
226 </td>
227 </tr>
228 </table>
229 <table cellspacing='1' cellpadding='1' border='0'>
230 <tr>
231 <td>
232 <input type=submit class="button" value="<?php echo $mod_strings_users['LBL_REASS_BUTTON_CONTINUE']; ?>" name=steponesubmit>
233 &nbsp;<input type=button class="button" value="<?php echo $mod_strings_users['LBL_REASS_BUTTON_CLEAR']; ?>" onclick='clearCurrentRecords();'>
234 <input type=button class="button" value="<?php echo $app_strings['LBL_CANCEL_BUTTON_LABEL']; ?>" onclick='document.location="<?php echo $cancel_location ?>"'>
235 </td>
236 </tr>
237 </table>
238 </form>
239
240 <?php
241 ///////////////////// END STEP 1 - Select users/modules /////////////////////////
242 }
243 else if(!isset($_GET['execute'])){
244 ///////////////////// BEGIN STEP 2 - Confirm Selections /////////////////////////
245         if(empty($_POST['modules'])){
246                 sugar_die($mod_strings_users['ERR_REASS_SELECT_MODULE']);
247         }
248         if($_POST['fromuser'] == $_POST['touser']){
249                 sugar_die($mod_strings_users['ERR_REASS_DIFF_USERS']);
250         }
251
252         global $current_user;
253         // Set the from and to user names so that we can display them in the results
254         $fromusername = $_POST['fromuser'];
255         $tousername = $_POST['touser'];
256
257         $query = "select user_name, id from users where id in ('{$_POST['fromuser']}', '{$_POST['touser']}')";
258         $res = $GLOBALS['db']->query($query);
259         while($row = $GLOBALS['db']->fetchByAssoc($res)){
260                 if($row['id'] == $_POST['fromuser'])
261                         $fromusername = $row['user_name'];
262                 if($row['id'] == $_POST['touser'])
263                         $tousername = $row['user_name'];
264         }
265         echo "{$mod_strings_users['LBL_REASS_DESC_PART2']}\n";
266         echo "<form action=\"index.php?module=Users&action=reassignUserRecords&execute=true\" method=post>\n";
267         echo "<BR>{$mod_strings_users['LBL_REASS_NOTES_TITLE']}\n";
268         echo "<ul>\n";
269         echo "<li>* {$mod_strings_users['LBL_REASS_NOTES_ONE']}\n";
270         echo "<li>* {$mod_strings_users['LBL_REASS_NOTES_TWO']}\n";
271         echo "<li>* {$mod_strings_users['LBL_REASS_NOTES_THREE']}\n";
272         echo "</ul>\n";
273         require_once('include/Smarty/plugins/function.sugar_help.php');
274         $sugar_smarty = new Sugar_Smarty();
275         $help_img = smarty_function_sugar_help(array("text"=>$mod_strings['LBL_REASS_VERBOSE_HELP']),$sugar_smarty);
276         echo "<BR><input type=checkbox name=verbose> {$mod_strings_users['LBL_REASS_VERBOSE_OUTPUT']}".$help_img."<BR>\n";
277         
278         unset($_SESSION['reassignRecords']['modules']);
279         $beanListFlip = array_flip($_SESSION['reassignRecords']['assignedModuleListCache']);
280         foreach($_POST['modules'] as $module){
281                 if(!array_key_exists($module, $beanListFlip)){
282                         //echo "$module not found as key in \$beanListFlip. Skipping $module.<BR>";
283                         continue;
284                 }
285                 $p_module = $beanListFlip[$module];
286
287                 require_once($beanFiles[$module]);
288                 $object = new $module();
289                 if(empty($object->table_name)){
290 //                      echo "<h5>Could not find the database table for $p_module.</h5>";
291                         continue;
292                 }
293
294                 echo "<h5>{$mod_strings_users['LBL_REASS_ASSESSING']} {$app_list_strings['moduleList'][$p_module]}</h5>";
295
296                 echo "<table border='0' cellspacing='0' cellpadding='0'  class='detail view'>\n";
297                 echo "<tr>\n";
298                 echo "<td>\n";
299
300                 $q_select = "select id";
301                 $q_update = "update ";
302                 $q_set = " set assigned_user_id = '{$_POST['touser']}', ".
303                               "date_modified = '".TimeDate::getInstance()->nowDb()."', ".
304                               "modified_user_id = '{$current_user->id}' ";
305                 $q_tables   = " {$object->table_name} ";
306                 $q_where  = "where {$object->table_name}.deleted=0 and {$object->table_name}.assigned_user_id = '{$_POST['fromuser']}' ";
307
308                 // Process conditions based on metadata
309                 if(isset($moduleFilters[$p_module]['fields']) && is_array($moduleFilters[$p_module]['fields'])){
310                         $custom_added = false;
311                         foreach($moduleFilters[$p_module]['fields'] as $meta){
312                                 if(!empty($_POST[$meta['name']]))
313                                         $_SESSION['reassignRecords']['filters'][$meta['name']] = $_POST[$meta['name']];
314                                 $is_custom = isset($meta['custom_table']) && $meta['custom_table'] == true;
315                                 if($is_custom && !$custom_added){
316                                         $q_tables .= "inner join {$object->table_name}_cstm on {$object->table_name}.id = {$object->table_name}_cstm.id_c ";
317                                         $custom_added = true;
318                                 }
319                                 $addcstm = ($is_custom ? "_cstm" : "");
320                                 switch($meta['type']){
321                                         case "text":
322                                         case "select":
323                                                 $q_where .= " and {$object->table_name}{$addcstm}.{$meta['dbname']} = '{$_POST[$meta['name']]}' ";
324                                                 break;
325                                         case "multiselect":
326                                                 if(empty($_POST[$meta['name']])){
327                                                         continue;
328                                                 }
329                                                 $in_string = "";
330                                                 $empty_check = "";
331                                                 foreach($_POST[$meta['name']] as $onevalue){
332                                                         if(empty($onevalue))
333                                                                 $empty_check .= " OR {$object->table_name}{$addcstm}.{$meta['dbname']} is null ";
334                                                         $in_string .= "'$onevalue', ";
335                                                 }
336                                                 $in_string = substr($in_string, 0, count($in_string) - 3);
337                                                 $q_where .= " and ({$object->table_name}{$addcstm}.{$meta['dbname']} in ($in_string) $empty_check)";
338                                                 break;
339                                         default:
340                                                 //echo "Skipping field {$meta['name']} since the type is not supported<BR>";
341                                                 continue;
342                                                 break;
343                                 }
344                         }
345                 }
346                 $query = "$q_select from $q_tables $q_where";
347                 $countquery = "select count(*) AS count from $q_tables $q_where";
348                 $updatequery = "$q_update $q_tables $q_set $q_where";
349
350                 $_SESSION['reassignRecords']['fromuser'] = $_POST['fromuser'];
351                 $_SESSION['reassignRecords']['touser'] = $_POST['touser'];
352                 $_SESSION['reassignRecords']['fromusername'] = $fromusername;
353                 $_SESSION['reassignRecords']['tousername'] = $tousername;
354                 $_SESSION['reassignRecords']['modules'][$module]['query'] = $query;
355                 $_SESSION['reassignRecords']['modules'][$module]['update'] = $updatequery;
356
357                 $res = $GLOBALS['db']->query($countquery);
358                 $row = $GLOBALS['db']->fetchByAssoc($res);
359
360                 echo "{$row['count']} {$mod_strings_users['LBL_REASS_RECORDS_FROM']} {$app_list_strings['moduleList'][$p_module]} {$mod_strings_users['LBL_REASS_WILL_BE_UPDATED']}\n<BR>\n";
361                 echo "<input type=checkbox name={$module}_workflow> {$mod_strings_users['LBL_REASS_WORK_NOTIF_AUDIT']}<BR>\n";
362                 echo "</td></tr></table>\n";
363         }
364
365         echo "<BR><input type=button class=\"button\" value=\"{$mod_strings_users['LBL_REASS_BUTTON_GO_BACK']}\" onclick='document.location=\"index.php?module=Users&action=reassignUserRecords\"'>\n";
366         echo "&nbsp;<input type=submit class=\"button\" value=\"{$mod_strings_users['LBL_REASS_BUTTON_CONTINUE']}\">\n";
367         echo "&nbsp;<input type=button class=\"button\" value=\"{$mod_strings_users['LBL_REASS_BUTTON_RESTART']}\" onclick='document.location=\"index.php?module=Users&action=reassignUserRecords&clear=true\"'>\n";
368
369         echo "</form>\n";
370
371         // debug
372         //print_r($_SESSION['reassignRecords']);
373 ///////////////////// END STEP 2 - Confirm Selections /////////////////////////
374 }
375 /////////////////// BEGIN STEP 3 - Execute reassignment ///////////////////////
376 else if(isset($_GET['execute']) && $_GET['execute'] == true){
377         $fromuser = $_SESSION['reassignRecords']['fromuser'];
378         $touser = $_SESSION['reassignRecords']['touser'];
379         $fromusername = $_SESSION['reassignRecords']['fromusername'];
380         $tousername = $_SESSION['reassignRecords']['tousername'];
381
382         $beanListFlip = array_flip($_SESSION['reassignRecords']['assignedModuleListCache']);
383
384         foreach($_SESSION['reassignRecords']['modules'] as $module => $queries){
385                 $p_module = $beanListFlip[$module];
386                 $workflow = false;
387                 if(isset($_POST[$module."_workflow"]) && $_POST[$module."_workflow"] = "on")
388                         $workflow = true;
389
390                 $query = $workflow ? $queries['query'] : $queries['update'];
391
392                 echo "<h5>{$mod_strings_users['LBL_PROCESSING']} {$app_list_strings['moduleList'][$p_module]}</h5>";
393
394                 $res = $GLOBALS['db']->query($query, true);
395
396                 //echo "<i>Workflow and Notifications <b>".($workflow ? "enabled" : "disabled")."</b> for this module record reassignment</i>\n<BR>\n";
397                 echo "<table border='0' cellspacing='0' cellpadding='0'  class='detail view'>\n";
398                 echo "<tr>\n";
399                 echo "<td>\n";
400                 if(! $workflow){
401                         $affected_rows = $GLOBALS['db']->getAffectedRowCount($res);
402                         echo "{$mod_strings_users['LBL_UPDATE_FINISH']}: $affected_rows {$mod_strings_users['LBL_AFFECTED']}<BR>\n";
403                 }
404                 else{
405                         $successarr = array();
406                         $failarr = array();
407
408                         require_once($beanFiles[$module]);
409                         while($row = $GLOBALS['db']->fetchByAssoc($res)){
410                                 $bean = new $module();
411                                 if(empty($row['id'])){
412                                         continue;
413                                 }
414                                 $bean->retrieve($row['id']);
415
416                                 // So that we don't create new blank records.
417                                 if(!isset($bean->id)){
418                                         continue;
419                                 }
420                                 $bean->assigned_user_id = $touser;
421
422                                 if($bean->save()){
423                                         $linkname = "record with id {$bean->id}";
424                                         if(!empty($bean->name)){
425                                                 $linkname = $bean->name;
426                                         }
427                                         else if(!empty($bean->last_name)){
428                                                 $linkname = $locale->getLocaleFormattedName($bean->first_name, $bean->last_name);
429                                         }
430                                         else if(!empty($bean->document_name)){
431                                                 $linkname = $bean->document_name;
432                                         }
433                                         $successstr = "{$mod_strings_users['LBL_REASS_SUCCESS_ASSIGN']} {$bean->object_name} \"<i><a href=\"index.php?module={$bean->module_dir}&action=DetailView&record={$bean->id}\">$linkname</a></i>\" {$mod_strings_users['LBL_REASS_FROM']} $fromusername {$mod_strings_users['LBL_REASS_TO']} $tousername";
434                                         $successarr[] = $successstr;
435                                 }
436                                 else{
437                                         $failarr[] = "{$mod_strings_users['LBL_REASS_FAILED_SAVE']} \"<i><a href=\"index.php?module={$bean->module_dir}&action=DetailView&record={$bean->id}\">$linkname</a></i>\".";
438                                 }
439                         }
440
441                         if(isset($_POST['verbose']) && $_POST['verbose'] == "on"){
442                                 echo "<h5>{$mod_strings_users['LBL_REASS_THE_FOLLOWING']} {$app_list_strings['moduleList'][$p_module]} {$mod_strings_users['LBL_REASS_HAVE_BEEN_UPDATED']}</h5>\n";
443                                 foreach($successarr as $ord){
444                                         echo "$ord\n<BR>\n";
445                                 }
446                                 if(empty($successarr))
447                                         echo "{$mod_strings_users['LBL_REASS_NONE']}\n<BR>\n";
448
449                                 echo "<h5>{$mod_strings_users['LBL_REASS_THE_FOLLOWING']} {$app_list_strings['moduleList'][$p_module]} {$mod_strings_users['LBL_REASS_CANNOT_PROCESS']}</h5>\n";
450                                 foreach($failarr as $failure){
451                                         echo $failure."\n<BR>\n";
452                                 }
453                                 if(empty($failarr))
454                                         echo "{$mod_strings_users['LBL_REASS_NONE']}\n<BR>\n";
455                         }
456                         else{
457                                 echo "{$mod_strings_users['LBL_REASS_UPDATE_COMPLETE']}\n<BR>\n";
458                                 echo "&nbsp;&nbsp;".count($successarr)." {$mod_strings_users['LBL_REASS_SUCCESSFUL']}\n<BR>\n";
459                                 echo "&nbsp;&nbsp;".count($failarr)." {$mod_strings_users['LBL_REASS_FAILED']}\n";
460                         }
461                         echo "<BR>\n";
462                 }
463                 echo "</td></tr></table>\n";
464         }
465
466         echo "<BR><input type=button class=\"button\" value=\"{$mod_strings_users['LBL_REASS_BUTTON_RETURN']}\" onclick='document.location=\"index.php?module=Users&action=reassignUserRecords\"'>\n";
467
468 /////////////////// END STEP 3 - Execute reassignment ///////////////////////
469 }
470 ?>
471 <script type="text/javascript">
472
473 function clearCurrentRecords()
474 {
475     var callback = {
476                 success: function(){
477                     document.getElementById('fromuser').selectedIndex = 0;
478                     document.getElementById('touser').selectedIndex = 0;
479                     document.getElementById('modulemultiselect').selectedIndex = -1;
480                     updateDivDisplay(document.getElementById('modulemultiselect'));
481                 }
482             };
483
484     YAHOO.util.Connect.asyncRequest('POST', 'index.php?module=Users&action=clearreassignrecords&to_pdf=1', callback, null);
485 }
486
487 var allselected = [];
488 function updateDivDisplay(multiSelectObj){
489     for(var i = 0; i < multiSelectObj.options.length; i++){
490         if(multiSelectObj.options[i].selected != allselected[i]){
491             allselected[i] = multiSelectObj.options[i].selected;
492
493             if(allselected[i]){
494                 theElement = document.getElementById('reassign_'+multiSelectObj.options[i].value);
495                 if(theElement != null){
496                     theElement.style.display = 'block';
497                 }
498             }
499             else{
500                 theElement = document.getElementById('reassign_'+multiSelectObj.options[i].value);
501                 if(theElement != null){
502                     theElement.style.display = 'none';
503                 }
504             }
505         }
506     }
507 }
508 <?php
509 if(!isset($_POST['fromuser']) && !isset($_GET['execute'])){
510 ?>
511 updateDivDisplay(document.getElementById('modulemultiselect'));
512 <?php
513 }
514 ?>
515 </script>