From ce988a0778aee7fb42ce5fc42e2986d562b6ccbb Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 09 Feb 2011 05:33:26 -0500
Subject: [PATCH] Always generate valid DOM identifiers using html_identifier() write original identifier string to rel attribute where possible

---
 program/include/main.inc           |   17 ++++++++++++++---
 program/steps/addressbook/save.inc |    2 +-
 program/steps/addressbook/func.inc |   14 +++++++++++---
 program/js/app.js                  |    5 ++++-
 4 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index 35f9ddc..dd86a78 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -741,6 +741,16 @@
 }
 
 /**
+ * Convert the given string into a valid HTML identifier
+ * Same functionality as done in app.js with this.identifier_expr
+ *
+ */
+function html_identifier($str)
+{
+  return asciiwords($str, true, '_');
+}
+
+/**
  * Remove single and double quotes from given string
  *
  * @param string Input value
@@ -791,7 +801,7 @@
     while ($table_data && ($sql_arr = $db->fetch_assoc($table_data)))
     {
       $zebra_class = $c % 2 ? 'even' : 'odd';
-      $table->add_row(array('id' => 'rcmrow' . $sql_arr[$id_col], 'class' => $zebra_class));
+      $table->add_row(array('id' => 'rcmrow' . html_identifier($sql_arr[$id_col]), 'class' => $zebra_class));
 
       // format each col
       foreach ($a_show_cols as $col)
@@ -808,7 +818,7 @@
       if (!empty($row_data['class']))
         $zebra_class .= ' '.$row_data['class'];
 
-      $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => $zebra_class));
+      $table->add_row(array('id' => 'rcmrow' . html_identifier($row_data[$id_col]), 'class' => $zebra_class));
 
       // format each col
       foreach ($a_show_cols as $col)
@@ -1487,7 +1497,7 @@
     }
 
     // make folder name safe for ids and class names
-    $folder_id = asciiwords($folder['id'], true, '_');
+    $folder_id = html_identifier($folder['id']);
     $classes = array('mailbox');
 
     // set special class for Sent, Drafts, Trash and Junk
@@ -1522,6 +1532,7 @@
     $link_attrib = $folder['virtual'] ? array() : array(
       'href' => rcmail_url('', array('_mbox' => $folder['id'])),
       'onclick' => sprintf("return %s.command('list','%s',this)", JS_OBJECT_NAME, $js_name),
+      'rel' => $folder['id'],
       'title' => $title,
     );
 
diff --git a/program/js/app.js b/program/js/app.js
index 3c8502d..43be6ae 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3781,6 +3781,9 @@
   // update a contact record in the list
   this.update_contact_row = function(cid, cols_arr, newcid)
   {
+    cid = String(cid).replace(this.identifier_expr, '_');
+    newcid = String(newcid).replace(this.identifier_expr, '_');
+
     var row;
     if (this.contact_list.rows[cid] && (row = this.contact_list.rows[cid].obj)) {
       for (var c=0; c<cols_arr.length; c++)
@@ -3813,7 +3816,7 @@
       even = rowcount%2,
       row = document.createElement('tr');
 
-    row.id = 'rcmrow'+cid;
+    row.id = 'rcmrow'+String(cid).replace(this.identifier_expr, '_');
     row.className = 'contact '+(even ? 'even' : 'odd');
 
     if (this.contact_list.in_selection(cid))
diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index 7597fa7..3397d37 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -120,6 +120,7 @@
     $line_templ = html::tag('li', array(
         'id' => 'rcmli%s', 'class' => 'addressbook %s'),
         html::a(array('href' => '%s',
+            'rel' => '%s',
             'onclick' => "return ".JS_OBJECT_NAME.".command('list','%s',this)"), '%s'));
 
     // currently selected is the first address source in the list
@@ -129,9 +130,11 @@
     foreach ((array)$OUTPUT->env['address_sources'] as $j => $source) {
         $id = strval($source['id'] ? $source['id'] : $j);
         $js_id = JQ($id);
-        $dom_id = preg_replace('/[^a-z0-9\-_]/i', '_', $id);
-        $out .= sprintf($line_templ, $dom_id, ($current === $id ? 'selected' : ''),
+        $out .= sprintf($line_templ,
+            html_identifier($id),
+            ($current === $id ? 'selected' : ''),
             Q(rcmail_url(null, array('_source' => $id))),
+            $source['id'],
             $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id)));
 
         $groupdata = array('out' => $out, 'jsdata' => $jsdata, 'source' => $id);
@@ -158,11 +161,16 @@
         $line_templ = html::tag('li', array(
             'id' => 'rcmliG%s', 'class' => 'contactgroup'),
             html::a(array('href' => '#',
+                'rel' => '%s:%s',
                 'onclick' => "return ".JS_OBJECT_NAME.".command('listgroup',{'source':'%s','id':'%s'},this)"), '%s'));
 
         $jsdata = array();
         foreach ($groups as $group) {
-            $args['out'] .= sprintf($line_templ, asciiwords($args['source'] . $group['ID'], true, '_'), $args['source'], $group['ID'], Q($group['name']));
+            $args['out'] .= sprintf($line_templ,
+                html_identifier($args['source'] . $group['ID']),
+                $args['source'], $group['ID'],
+                $args['source'], $group['ID'], Q($group['name'])
+            );
             $args['jsdata']['G'.$args['source'].$group['ID']] = array(
                 'source' => $args['source'], 'id' => $group['ID'],
                 'name' => $group['name'], 'type' => 'group');
diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc
index 10155a1..aa45a4e 100644
--- a/program/steps/addressbook/save.inc
+++ b/program/steps/addressbook/save.inc
@@ -249,7 +249,7 @@
     $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id);
 
     rcmail_js_contacts_list($result, 'parent.');
-    $OUTPUT->command('parent.contact_list.select', $insert_id);
+    $OUTPUT->command('parent.contact_list.select', html_identifier($insert_id));
 
     // update record count display
     $CONTACTS->reset();

--
Gitblit v1.9.1