alecpl
2011-06-14 ecf295f6ef2b83c5e51cc74adf833fd8e18b6cfb
program/steps/addressbook/func.inc
@@ -21,46 +21,6 @@
$SEARCH_MODS_DEFAULT = array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1);
// select source
$source = get_input_value('_source', RCUBE_INPUT_GPC);
if (!$RCMAIL->action && !$OUTPUT->ajax_call) {
    // add list of address sources to client env
    $js_list = $RCMAIL->get_address_sources();
    // if source is not set use first directory
    if (empty($source))
        $source = $js_list[key($js_list)]['id'];
    $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT);
    $OUTPUT->set_env('search_mods', $search_mods);
    $OUTPUT->set_env('address_sources', $js_list);
}
// instantiate a contacts object according to the given source
$CONTACTS = $RCMAIL->get_address_book($source);
$CONTACTS->set_pagesize($CONFIG['pagesize']);
// set list properties and session vars
if (!empty($_GET['_page']))
    $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page'])));
else
    $CONTACTS->set_page(isset($_SESSION['page']) ?$_SESSION['page'] : 1);
if (!empty($_REQUEST['_gid']))
    $CONTACTS->set_group(get_input_value('_gid', RCUBE_INPUT_GPC));
// set data source env
$OUTPUT->set_env('source', $source ? $source : '0');
$OUTPUT->set_env('readonly', $CONTACTS->readonly);
if (!$OUTPUT->ajax_call) {
    $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT);
    $OUTPUT->set_env('search_mods', $search_mods);
    $OUTPUT->set_pagetitle(rcube_label('addressbook'));
}
// general definition of contact coltypes
$CONTACT_COLTYPES = array(
  'name'         => array('type' => 'text', 'size' => 40, 'limit' => 1, 'label' => rcube_label('name'), 'category' => 'main'),
@@ -96,6 +56,65 @@
  // TODO: define fields for vcards like GEO, KEY
);
// Addressbook UI
if (!$RCMAIL->action && !$OUTPUT->ajax_call) {
    // add list of address sources to client env
    $js_list = $RCMAIL->get_address_sources();
    // use first directory by default
    $source = $js_list[key($js_list)]['id'];
    // find writeable source
    foreach ($js_list as $s) {
        if (!$s['readonly']) {
            $OUTPUT->set_env('writable_source', $s['id']);
            break;
        }
    }
    $search_mods = $RCMAIL->config->get('addressbook_search_mods', $SEARCH_MODS_DEFAULT);
    $OUTPUT->set_env('search_mods', $search_mods);
    $OUTPUT->set_env('address_sources', $js_list);
    $OUTPUT->set_pagetitle(rcube_label('addressbook'));
    $CONTACTS = rcmail_contact_source($source, true);
}
// instantiate a contacts object according to the given source
function rcmail_contact_source($source=null, $init_env=false)
{
    global $RCMAIL, $OUTPUT, $CONFIG, $CONTACT_COLTYPES;
    if (!strlen($source)) {
        $source = get_input_value('_source', RCUBE_INPUT_GPC);
    }
    if (!strlen($source)) {
        return null;
    }
    // Get object
    $CONTACTS = $RCMAIL->get_address_book($source);
    $CONTACTS->set_pagesize($CONFIG['pagesize']);
    // set list properties and session vars
    if (!empty($_GET['_page']))
        $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page'])));
    else
        $CONTACTS->set_page(isset($_SESSION['page']) ? $_SESSION['page'] : 1);
    if (!empty($_REQUEST['_gid']))
        $CONTACTS->set_group(get_input_value('_gid', RCUBE_INPUT_GPC));
    if (!$init_env)
        return $CONTACTS;
    $OUTPUT->set_env('readonly', $CONTACTS->readonly);
    $OUTPUT->set_env('source', $source);
// reduce/extend $CONTACT_COLTYPES with specification from the current $CONTACT object
if (is_array($CONTACTS->coltypes)) {
    // remove cols not listed by the backend class
@@ -109,6 +128,21 @@
}
$OUTPUT->set_env('photocol', is_array($CONTACT_COLTYPES['photo']));
    return $CONTACTS;
}
function rcmail_default_source($writable=false)
{
    global $RCMAIL;
    // get list of address sources
    $list = $RCMAIL->get_address_sources($writable);
    // use first directory by default
    return $list[key($list)]['id'];
}
function rcmail_directory_list($attrib)
@@ -230,6 +264,11 @@
    while ($row = $result->next()) {
        $a_row_cols = array();
        // build contact ID with source ID
        if (isset($row['sourceid'])) {
            $row['ID'] = $row['ID'].'-'.$row['sourceid'];
        }
        // format each col
        foreach ($a_show_cols as $col)
            $a_row_cols[$col] = Q($row[$col]);
@@ -269,12 +308,14 @@
}
function rcmail_get_rowcount_text()
function rcmail_get_rowcount_text($result=null)
{
    global $CONTACTS;
    global $CONTACTS, $CONFIG;
  
    // read nr of contacts
    if (!$result) {
    $result = $CONTACTS->get_result();
    }
    if (!$result) {
        $result = $CONTACTS->count();
    }
@@ -286,7 +327,7 @@
            'name'  => 'contactsfromto',
            'vars'  => array(
            'from'  => $result->first + 1,
            'to'    => min($result->count, $result->first + $CONTACTS->page_size),
            'to'    => min($result->count, $result->first + $CONFIG['pagesize']),
            'count' => $result->count)
        ));
@@ -599,6 +640,48 @@
}
/**
 * Returns contact ID(s) and source(s) from GET/POST data
 *
 * @return array List of contact IDs per-source
 */
function rcmail_get_cids()
{
    // contact ID (or comma-separated list of IDs) is provided in two
    // forms. If _source is an empty string then the ID is a string
    // containing contact ID and source name in form: <ID>-<SOURCE>
    $cid    = get_input_value('_cid', RCUBE_INPUT_GPC);
    $source = get_input_value('_source', RCUBE_INPUT_GPC);
    if (!preg_match('/^[a-zA-Z0-9\+\/=_-]+(,[a-zA-Z0-9\+\/=_-]+)*$/', $cid)) {
        return array();
    }
    $cid        = explode(',', $cid);
    $got_source = strlen($source);
    $result     = array();
    // create per-source contact IDs array
    foreach ($cid as $id) {
        // if _source is not specified we'll find it from decoded ID
        if (!$got_source) {
            list ($c, $s) = explode('-', $id, 2);
            if (strlen($s)) {
                $result[$s][] = $c;
            }
            else if (strlen($source)) {
                $result[$source][] = $c;
            }
        }
        else {
            $result[$source][] = $id;
        }
    }
    return $result;
}
// register UI objects
$OUTPUT->add_handlers(array(
    'directorylist' => 'rcmail_directory_list',