Aleksander Machniak
2013-02-17 60dabb35aed6689dd6b50cb885b3dbbf5504ef1f
program/steps/addressbook/func.inc
@@ -5,8 +5,11 @@
 | program/steps/addressbook/func.inc                                    |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2005-2007, The Roundcube Dev Team                       |
 | Licensed under the GNU GPL                                            |
 | Copyright (C) 2005-2012, The Roundcube Dev Team                       |
 |                                                                       |
 | Licensed under the GNU General Public License version 3 or            |
 | any later version with exceptions for skins & plugins.                |
 | See the README file for a full license statement.                     |
 |                                                                       |
 | PURPOSE:                                                              |
 |   Provide addressbook functionality and GUI objects                   |
@@ -14,9 +17,6 @@
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 +-----------------------------------------------------------------------+
 $Id$
*/
$SEARCH_MODS_DEFAULT = array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1);
@@ -63,12 +63,6 @@
    // add list of address sources to client env
    $js_list = $RCMAIL->get_address_sources();
    $source = get_input_value('_source', RCUBE_INPUT_GPC);
    // use first directory by default
    if (!strlen($source) || !isset($js_list[$source]))
        $source = $js_list[key($js_list)]['id'];
    // count all/writeable sources
    $writeable = 0;
    $count = 0;
@@ -87,13 +81,22 @@
    $OUTPUT->set_env('search_mods', $search_mods);
    $OUTPUT->set_env('address_sources', $js_list);
    $OUTPUT->set_env('writable_source', $writeable);
    $OUTPUT->set_env('compose_extwin', $RCMAIL->config->get('compose_extwin',false));
    $OUTPUT->set_pagetitle(rcube_label('addressbook'));
    $_SESSION['addressbooks_count'] = $count;
    $_SESSION['addressbooks_count_writeable'] = $writeable;
    if (!strlen($source))
      $source = strval(key($js_list));
    // select address book
    $source = get_input_value('_source', RCUBE_INPUT_GPC);
    // use first directory by default
    if (!strlen($source) || !isset($js_list[$source])) {
        $source = $RCMAIL->config->get('default_addressbook');
        if (!strlen($source) || !isset($js_list[$source])) {
            $source = strval(key($js_list));
        }
    }
    $CONTACTS = rcmail_contact_source($source, true);
}
@@ -157,17 +160,6 @@
}
function rcmail_default_source($writable=false)
{
    global $RCMAIL;
    // get list of address sources
    $first = reset($RCMAIL->get_address_sources($writable));
    // use first directory by default
    return $first['id'];
}
function rcmail_set_sourcename($abook)
{
    global $OUTPUT;
@@ -178,7 +170,7 @@
        if (!$name && $source == 0) {
            $name = rcube_label('personaladrbook');
        }
        $OUTPUT->set_env('sourcename', $name);
        $OUTPUT->set_env('sourcename', html_entity_decode($name, ENT_COMPAT, 'UTF-8'));
    }
}
@@ -200,7 +192,7 @@
            'rel' => '%s',
            'onclick' => "return ".JS_OBJECT_NAME.".command('list','%s',this)"), '%s'));
    $sources = (array) $OUTPUT->env['address_sources'];
    $sources = (array) $OUTPUT->get_env('address_sources');
    reset($sources);
    // currently selected source
@@ -219,12 +211,13 @@
        if ($source['class_name'])
            $class_name .= ' ' . $source['class_name'];
        $name = !empty($source['name']) ? $source['name'] : $id;
        $out .= sprintf($line_templ,
            html_identifier($id),
            $class_name,
            Q(rcmail_url(null, array('_source' => $id))),
            $source['id'],
            $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id)));
            $js_id, $name);
        $groupdata = array('out' => $out, 'jsdata' => $jsdata, 'source' => $id);
        if ($source['groups'])
@@ -336,6 +329,7 @@
    while ($row = $result->next()) {
        $a_row_cols = array();
        $classes = array('person');  // org records will follow some day
        // build contact ID with source ID
        if (isset($row['sourceid'])) {
@@ -344,15 +338,14 @@
        // format each col
        foreach ($a_show_cols as $col) {
            $val = $row[$col];
            if ($val == '' && $col == 'name') {
                $val = rcube_addressbook::compose_display_name($row, true);
            }
            $val = $col == 'name' ? rcube_addressbook::compose_list_name($row) : $row[$col];
            $a_row_cols[$col] = Q($val);
   }
        }
        $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
        if ($row['readonly'])
            $classes[] = 'readonly';
        $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols, join(' ', $classes));
    }
}
@@ -365,12 +358,7 @@
    if (!$attrib['id'])
        $attrib['id'] = 'rcmcontactframe';
    $attrib['name'] = $attrib['id'];
    $OUTPUT->set_env('contentframe', $attrib['name']);
    $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
    return html::iframe($attrib);
    return $OUTPUT->frame($attrib, true);
}
@@ -580,8 +568,13 @@
                if (empty($values) && $colprop['visible'])
                    $values[] = '';
                if (!is_array($values)) {
                    // $values can be an object, don't use (array)$values syntax
                    $values = !empty($values) ? array($values) : array();
                }
                $rows = '';
                foreach ((array)$values as $i => $val) {
                foreach ($values as $i => $val) {
                    if ($subtypes[$i])
                        $subtype = $subtypes[$i];
@@ -590,7 +583,12 @@
                        $composite = array(); $j = 0;
                        $template = $RCMAIL->config->get($col . '_template', '{'.join('} {', array_keys($colprop['childs'])).'}');
                        foreach ($colprop['childs'] as $childcol => $cp) {
                            $childvalue = $val[$childcol] ? $val[$childcol] : $val[$j];
                            if (!empty($val) && is_array($val)) {
                                $childvalue = $val[$childcol] ? $val[$childcol] : $val[$j];
                            }
                            else {
                                $childvalue = '';
                            }
                            if ($edit_mode) {
                                if ($colprop['subtypes'] || $colprop['limit'] != 1) $cp['array'] = true;
@@ -617,10 +615,11 @@
                        if ($colprop['subtypes'] || $colprop['limit'] != 1)
                            $colprop['array'] = true;
                        // load jquery UI datepickert for date fields
                        // load jquery UI datepicker for date fields
                        if ($colprop['type'] == 'date') {
                            $colprop['class'] .= ($colprop['class'] ? ' ' : '') . 'datepicker';
                            $val = rcmail_format_date_col($val);
                            if (!$colprop['render_func'])
                                $val = rcmail_format_date_col($val);
                        }
                        $val = rcmail_get_edit_field($col, $val, $colprop, $colprop['type']);
@@ -665,7 +664,7 @@
                }
            }
            if (!$content)
            if (!$content && (!$edit_mode || !$select_add->_count))
                continue;
            // also render add-field selector
@@ -699,11 +698,15 @@
    if ($result = $CONTACTS->get_result())
        $record = $result->first();
    $photo_img = $attrib['placeholder'] ? $CONFIG['skin_path'] . $attrib['placeholder'] : 'program/blank.gif';
    $photo_img = $attrib['placeholder'] ? $CONFIG['skin_path'] . $attrib['placeholder'] : 'program/resources/blank.gif';
    $RCMAIL->output->set_env('photo_placeholder', $photo_img);
    unset($attrib['placeholder']);
    if (preg_match('!^https?://!i', $record['photo']))
    $plugin = $RCMAIL->plugins->exec_hook('contact_photo', array('record' => $record, 'data' => $record['photo']));
    if ($plugin['url'])
        $photo_img = $plugin['url'];
    else if (preg_match('!^https?://!i', $record['photo']))
        $photo_img = $record['photo'];
    else if ($record['photo'])
        $photo_img = $RCMAIL->url(array('_action' => 'photo', '_cid' => $record['ID'], '_source' => $SOURCE_ID));
@@ -735,7 +738,7 @@
 *
 * @return array List of contact IDs per-source
 */
function rcmail_get_cids()
function rcmail_get_cids($filter = null)
{
    // 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
@@ -743,6 +746,10 @@
    $cid    = get_input_value('_cid', RCUBE_INPUT_GPC);
    $source = (string) get_input_value('_source', RCUBE_INPUT_GPC);
    if (is_array($cid)) {
        return $cid;
    }
    if (!preg_match('/^[a-zA-Z0-9\+\/=_-]+(,[a-zA-Z0-9\+\/=_-]+)*$/', $cid)) {
        return array();
@@ -754,24 +761,29 @@
    // create per-source contact IDs array
    foreach ($cid as $id) {
        // if _source is not specified we'll find it from decoded ID
        // extract source ID from contact ID (it's there in search mode)
        // see #1488959 and #1488862 for reference
        if (!$got_source) {
            if ($sep = strrpos($id, '-')) {
                $contact_id = substr($id, 0, $sep);
                $source_id  = substr($id, $sep+1);
                $source_id  = (string) substr($id, $sep+1);
                if (strlen($source_id)) {
                    $result[(string)$source_id][] = $contact_id;
                    $result[$source_id][] = $contact_id;
                }
            }
        }
        else {
            if (substr($id, -($got_source+1)) == "-$source") {
                $id = substr($id, 0, -($got_source+1));
            }
            $result[$source][] = $id;
        }
    }
    return $result;
    return $filter !== null ? $result[$filter] : $result;
}
// register UI objects
$OUTPUT->add_handlers(array(
    'directorylist' => 'rcmail_directory_list',