diff --git a/phpgwapi/inc/class.uiaccountsel.inc.php b/phpgwapi/inc/class.uiaccountsel.inc.php
new file mode 100644
index 0000000000..821c5a56c1
--- /dev/null
+++ b/phpgwapi/inc/class.uiaccountsel.inc.php
@@ -0,0 +1,480 @@
+ True,
+ );
+
+ function uiaccountsel($account_id = '', $account_type='')
+ {
+ $this->accounts($account_id,$account_type); // call constructor of extended class
+
+ $this->account_selection = $GLOBALS['phpgw_info']['user']['preferences']['common']['account_selection'];
+ }
+
+ /**
+ * Create an account-selection for a certain range of users
+ *
+ * @param $name string name of the form-element
+ * @param $element_id string id of the form-element, this need to be unique for the whole window !!!
+ * @param $selected array/int user-id or array of user-id's which are already selected
+ * @param $use string/array 'accounts', 'groups', 'both' or app-name for all accounts with run-rights or an
+ * array with id's as keys or values. If the id is in the key and the value is a string, it gets appended to the user-name
+ * @param $lines int number of lines for multiselection or 0 for a single selection
+ * (in that case accounts should be an int or contain only 1 user-id)
+ * @param $not int/array user-id or array of user-id's not to display in selection, default False = display all
+ * @param $options additional options (e.g. style)
+ * @param $onchange javascript to execute if the selection changes, eg. to reload the page
+ * @return the necessary html
+ */
+ function selection($name,$element_id,$selected,$use='accounts',$lines=1,$not=False,$options='',$onchange='')
+ {
+ //echo "
uiaccountsel::selection('$name',".print_r($selected,True).",'$use',$lines,$not,'$options')
\n";
+ if (!is_object($GLOBALS['phpgw']->html))
+ {
+ $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html');
+ }
+ if (!is_array($selected))
+ {
+ $selected = $selected ? array($selected) : array();
+ }
+ $enumerate_groups = False;
+
+ switch($this->account_selection)
+ {
+ case 'popup':
+ $use = $selected;
+ break;
+ case 'primary_group':
+ $use = count($selected) && !isset($selected[0]) ? array_keys($selected) : $selected;
+ $members = $this->member($GLOBALS['phpgw']->accounts->data['account_primary_group']);
+ if (is_array($members))
+ {
+ foreach($members as $member)
+ {
+ if (!in_array($member['account_id'],$use))
+ {
+ $use[] = $member['account_id'];
+ }
+ }
+ }
+ break;
+ case 'selectbox':
+ default:
+ if ($use == 'accounts' || $use == 'groups' || $use == 'both')
+ {
+ $use = $GLOBALS['phpgw']->accounts->get_list($use);
+ }
+ elseif (!is_array($use)) // app-name
+ {
+ $use = $GLOBALS['phpgw']->acl->get_ids_for_location('run',1,$use);
+ $enumerate_groups = True;
+ }
+ }
+ $users = $groups = array();
+ $use_keys = count($use) && !isset($use[0]); // id's are the keys
+ foreach($use as $key => $val)
+ {
+ $id = $use_keys ? $key : (is_array($val) ? $val['account_id'] : $val);
+
+ if ($not && ($id == $not || is_array($not) && in_array($id,$not)))
+ {
+ continue; // dont display that one
+ }
+ if ($this->get_type($id) == 'u')
+ {
+ $users[$id] = !is_array($val) ? $GLOBALS['phpgw']->common->grab_owner_name($id) :
+ $GLOBALS['phpgw']->common->display_fullname(
+ $val['account_lid'],$val['account_firstname'],$val['account_lastname']);
+ }
+ else
+ {
+ if ($enumerate_groups && ($members = $this->member($id)))
+ {
+ foreach($members as $member)
+ {
+ if ($not && $member['account_id'] == $not) continue; // dont display that one
+
+ $users[$member['account_id']] = $GLOBALS['phpgw']->common->grab_owner_name($member['account_id']);
+ }
+ }
+ $groups[$id] = lang('group').' '.$this->id2name($id);
+ }
+ }
+ // sort users and groups alphabeticaly and put the groups behind the users
+ uasort($users,strcasecmp);
+ uasort($groups,strcasecmp);
+ $select = $users + $groups;
+
+ if (count($selected) && !isset($selected[0])) // id's are the keys
+ {
+ foreach($selected as $id => $val)
+ {
+ if (is_string($val) && isset($users[$id])) // add string to option-label
+ {
+ $users[$id] .= " ($val)";
+ }
+ }
+ $selected = array_keys($selected);
+ }
+ // add necessary popup trigers
+ $popup = "window.open('".$GLOBALS['phpgw']->link('/index.php',array(
+ 'menuaction' => 'phpgwapi.uiaccountsel.popup',
+ 'app' => $GLOBALS['phpgw_info']['flags']['currentapp'],
+ 'element_id' => $element_id,
+ ))."','Search','width=800,height=600,toolbar=no,scrollbars=yes,resizable=yes')";
+ if (!$lines)
+ {
+ $options .= ' onchange="if (this.value=\'popup\') '.$popup.';'.($onchange?" else {$onchange}":'').'"';
+ $select['popup'] = lang('Search').' ...';
+ }
+ elseif ($onchange)
+ {
+ $options .= ' onchange="'.$onchange.'"';
+ }
+ //echo "html::select('$name',".print_r($selected,True).",".print_r($select,True).",True,'$options')
\n";
+ $html = $GLOBALS['phpgw']->html->select($name,$selected,$select,True,$options.' id="'.$element_id.'"',$lines);
+
+ if ($lines > 1 && ($this->account_selection == 'popup' || $this->account_selection == 'primary_group'))
+ {
+ $html .= $GLOBALS['phpgw']->html->image('calendar','multi_3',lang('click to select or search accounts'),' onclick="'.$popup.';" style="cursor: pointer; cursor: hand;"');
+ }
+
+ if(!$GLOBALS['phpgw_info']['flags']['uiaccountsel']['addOption_installed'])
+ {
+ $html .= '';
+ $GLOBALS['phpgw_info']['flags']['uiaccountsel']['addOption_installed'] = True;
+ }
+ return $html;
+ }
+
+ function popup($app='')
+ {
+ if (!$app) $app = $_GET['app'];
+
+ $group_id = get_var('group_id',array('GET','POST'));
+ $element_id = get_var('element_id',array('GET','POST'));
+
+ if(isset($_POST['query']))
+ {
+ $GLOBALS['query'] = $_POST['query'];
+ }
+
+ $start = (int) get_var('start',array('POST'),0);
+ $order = get_var('order',array('GET'),'account_lid');
+ $sort = get_var('sort',array('GET'),'ASC');
+
+ $this->nextmatchs = CreateObject('phpgwapi.nextmatchs');
+
+ $GLOBALS['phpgw']->template->set_root($GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi'));
+
+ $GLOBALS['phpgw']->template->set_file(array('accounts_list_t' => 'uiaccountsel.tpl'));
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_cal','cal');
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_other','other');
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_all','all');
+
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','bla_intro','ibla');
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','other_intro','iother');
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','all_intro','iall');
+
+
+ $GLOBALS['phpgw']->template->set_block('accounts_list_t','accounts_list','list');
+
+ $GLOBALS['phpgw']->template->set_var('font',$GLOBALS['phpgw_info']['theme']['font']);
+ $GLOBALS['phpgw']->template->set_var('lang_search',lang('search'));
+ $GLOBALS['phpgw']->template->set_var('lang_groups',lang('user groups'));
+ $GLOBALS['phpgw']->template->set_var('lang_accounts',lang('user accounts'));
+
+ $GLOBALS['phpgw']->template->set_var('img',$GLOBALS['phpgw']->common->image('phpgwapi','select'));
+ $GLOBALS['phpgw']->template->set_var('lang_select_user',lang('Select user'));
+ $GLOBALS['phpgw']->template->set_var('lang_select_group',lang('Select group'));
+ $GLOBALS['phpgw']->template->set_var('css_file',$GLOBALS['phpgw_info']['server']['webserver_url'] .
+ '/phpgwapi/templates/idots/css/idots.css');
+
+ switch($app)
+ {
+ case 'calendar':
+ $GLOBALS['phpgw']->template->fp('ibla','bla_intro',True);
+ $GLOBALS['phpgw']->template->fp('iall','all_intro',True);
+ break;
+ case 'admin':
+ $GLOBALS['phpgw']->template->set_var('lang_perm',lang('group name'));
+ $GLOBALS['phpgw']->template->fp('iother','other_intro',True);
+ break;
+ default:
+ $GLOBALS['phpgw']->template->fp('iother','other_intro',True);
+ $GLOBALS['phpgw']->template->fp('iall','all_intro',True);
+ break;
+ }
+
+ $GLOBALS['phpgw_info']['flags']['currentapp'] = $app;
+ $GLOBALS['phpgw']->common->phpgw_header();
+
+ $GLOBALS['phpgw']->template->set_var('lang_perm',lang('Groups with permission for %1',lang($app)));
+ $GLOBALS['phpgw']->template->set_var('lang_nonperm',lang('Groups without permission for %1',lang($app)));
+
+ $link_data = array
+ (
+ 'menuaction' => 'phpgwapi.uiaccountsel.popup',
+ 'app' => $app,
+ 'group_id' => $group_id,
+ 'element_id' => $element_id,
+ );
+
+ $app_groups = array();
+
+ if ($app != 'admin')
+ {
+ $user_groups = $this->membership($this->account);
+
+ $app_user = $GLOBALS['phpgw']->acl->get_ids_for_location('run',1,$app);
+ for ($i = 0;$iget_type($app_user[$i]);
+ if($type == 'g')
+ {
+ $app_groups[] = $app_user[$i];
+ $members[] = $GLOBALS['phpgw']->acl->get_ids_for_location($app_user[$i],1,'phpgw_group');
+ }
+ }
+
+ $i = count($app_user);
+ while(is_array($members) && list(,$mem) = each($members))
+ {
+ for($j=0;$jget_list('groups');
+ $all_user = $this->get_list('accounts');
+
+ while(is_array($all_groups) && list(,$agroup) = each($all_groups))
+ {
+ $user_groups[] = array
+ (
+ 'account_id' => $agroup['account_id'],
+ 'account_name' => $agroup['account_firstname']
+ );
+ }
+
+ for($j=0;$jtemplate->set_var('lang_list_members',lang('List members'));
+
+ if (is_array($user_groups))
+ {
+ foreach($user_groups as $group)
+ {
+ $link_data['group_id'] = $group['account_id'];
+
+ $GLOBALS['phpgw']->template->set_var('onclick',"opener.addOption('$element_id','".
+ $GLOBALS['phpgw']->common->grab_owner_name($group['account_id'])."','$group[account_id]')");
+
+ if (in_array($group['account_id'],$app_groups))
+ {
+ $GLOBALS['phpgw']->template->set_var('tr_color',$this->nextmatchs->alternate_row_color($tr_color));
+ $GLOBALS['phpgw']->template->set_var('link_user_group',$GLOBALS['phpgw']->link('/index.php',$link_data));
+ $GLOBALS['phpgw']->template->set_var('name_user_group',$group['account_name']);
+ $GLOBALS['phpgw']->template->set_var('account_display',$GLOBALS['phpgw']->common->grab_owner_name($group['account_id']));
+ $GLOBALS['phpgw']->template->set_var('accountid',$group['account_id']);
+
+ switch($app)
+ {
+ case 'calendar': $GLOBALS['phpgw']->template->fp('cal','group_cal',True); break;
+ default: $GLOBALS['phpgw']->template->fp('other','group_other',True); break;
+ }
+ }
+ else
+ {
+ if ($app != 'admin')
+ {
+ $GLOBALS['phpgw']->template->set_var('link_all_group',$GLOBALS['phpgw']->link('/index.php',$link_data));
+ $GLOBALS['phpgw']->template->set_var('name_all_group',$group['account_name']);
+ $GLOBALS['phpgw']->template->set_var('accountid',$group['account_id']);
+ $GLOBALS['phpgw']->template->fp('all','group_all',True);
+ }
+ }
+ }
+ }
+
+ if (!$GLOBALS['query'])
+ {
+ if (isset($group_id) && !empty($group_id))
+ {
+ //echo 'GROUP_ID: ' . $group_id;
+ $users = $GLOBALS['phpgw']->acl->get_ids_for_location($group_id,1,'phpgw_group');
+
+ for ($i=0;$iaccounts->account_id = $users[$i];
+ $GLOBALS['phpgw']->accounts->read_repository();
+
+ switch ($order)
+ {
+ case 'account_firstname':
+ $id = $GLOBALS['phpgw']->accounts->data['firstname'];
+ break;
+ case 'account_lastname':
+ $id = $GLOBALS['phpgw']->accounts->data['lastname'];
+ break;
+ case 'account_lid':
+ default:
+ $id = $GLOBALS['phpgw']->accounts->data['account_lid'];
+ break;
+ }
+ $id .= $GLOBALS['phpgw']->accounts->data['lastname']; // default sort-order
+ $id .= $GLOBALS['phpgw']->accounts->data['firstname'];
+ $id .= $GLOBALS['phpgw']->accounts->data['account_id']; // make our index unique
+
+ $val_users[$id] = array
+ (
+ 'account_id' => $GLOBALS['phpgw']->accounts->data['account_id'],
+ 'account_lid' => $GLOBALS['phpgw']->accounts->data['account_lid'],
+ 'account_firstname' => $GLOBALS['phpgw']->accounts->data['firstname'],
+ 'account_lastname' => $GLOBALS['phpgw']->accounts->data['lastname']
+ );
+ }
+ }
+
+ if (is_array($val_users))
+ {
+ if ($sort != 'DESC')
+ {
+ ksort($val_users);
+ }
+ else
+ {
+ krsort($val_users);
+ }
+ }
+ $val_users = array_values($val_users); // get a numeric index
+ }
+ $total = count($val_users);
+ }
+ else
+ {
+ switch($app)
+ {
+ case 'calendar': $users = 'both'; break;
+ default: $users = 'accounts'; break;
+ }
+ $entries = $this->get_list($users,$start,$sort,$order,$GLOBALS['query']);
+ $total = $this->total;
+ for ($i=0;$inextmatchs->left('/index.php',$start,$total,$link_data);
+ $right = $this->nextmatchs->right('/index.php',$start,$total,$link_data);
+ $GLOBALS['phpgw']->template->set_var('left',$left);
+ $GLOBALS['phpgw']->template->set_var('right',$right);
+
+ $GLOBALS['phpgw']->template->set_var('lang_showing',$this->nextmatchs->show_hits($total,$start));
+
+// -------------------------- end nextmatch ------------------------------------
+
+ $GLOBALS['phpgw']->template->set_var('search_action',$GLOBALS['phpgw']->link('/index.php',$link_data));
+ $GLOBALS['phpgw']->template->set_var('search_list',$this->nextmatchs->search(array('query' => $GLOBALS['query'], 'search_obj' => 1)));
+
+// ---------------- list header variable template-declarations --------------------------
+
+// -------------- list header variable template-declaration ------------------------
+ $GLOBALS['phpgw']->template->set_var('sort_lid',$this->nextmatchs->show_sort_order($sort,'account_lid',$order,'/index.php',lang('LoginID'),$link_data));
+ $GLOBALS['phpgw']->template->set_var('sort_firstname',$this->nextmatchs->show_sort_order($sort,'account_firstname',$order,'/index.php',lang('Firstname'),$link_data));
+ $GLOBALS['phpgw']->template->set_var('sort_lastname',$this->nextmatchs->show_sort_order($sort,'account_lastname',$order,'/index.php',lang('Lastname'),$link_data));
+
+// ------------------------- end header declaration --------------------------------
+ $stop = min($start + $this->nextmatchs->maxmatches,count($val_users));
+ for($i = $start; $i < $stop; ++$i)
+ {
+ $GLOBALS['phpgw']->template->set_var('tr_color',$this->nextmatchs->alternate_row_color($tr_color));
+
+// ---------------- template declaration for list records --------------------------
+
+ $user = $val_users[$i];
+ $GLOBALS['phpgw']->template->set_var(array(
+ 'lid' => $user['account_lid'],
+ 'firstname' => $user['account_firstname'] ? $user['account_firstname'] : ' ',
+ 'lastname' => $user['account_lastname'] ? $user['account_lastname'] : ' ',
+ 'onclick' => "opener.addOption('$element_id','".
+ $GLOBALS['phpgw']->common->grab_owner_name($user['account_id'])."','$user[account_id]')",
+ ));
+
+ $GLOBALS['phpgw']->template->fp('list','accounts_list',True);
+ }
+
+ $GLOBALS['phpgw']->template->set_var('start',$start);
+ $GLOBALS['phpgw']->template->set_var('sort',$sort);
+ $GLOBALS['phpgw']->template->set_var('order',$order);
+ $GLOBALS['phpgw']->template->set_var('query',$GLOBALS['query']);
+ $GLOBALS['phpgw']->template->set_var('group_id',$group_id);
+
+ $GLOBALS['phpgw']->template->set_var('lang_done',lang('done'));
+ $GLOBALS['phpgw']->template->pfp('out','accounts_list_t',True);
+
+ $GLOBALS['phpgw']->common->phpgw_footer();
+ }
+ }
diff --git a/phpgwapi/templates/default/uiaccountsel.tpl b/phpgwapi/templates/default/uiaccountsel.tpl
new file mode 100644
index 0000000000..2e09e0cf5c
--- /dev/null
+++ b/phpgwapi/templates/default/uiaccountsel.tpl
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+ {left}
+ {lang_showing}
+ {right}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {lang_accounts}
+
+
+ {sort_lid}
+ {sort_firstname}
+ {sort_lastname}
+
+
+
+
+
+
+ {lid}
+ {firstname}
+ {lastname}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+