--- smileys.module.original	2006-11-25 21:23:54.000000000 +0100
+++ smileys.module	2007-07-10 01:06:51.000000000 +0200
@@ -53,38 +53,56 @@ function smileys_block($op = 'list', $de
   }
 }
 
+/* Here we just decide to render smileys bar or not */
 function smileys_form_alter($form_id, &$form) {
-  if (user_access('use smiley select box') && ((isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) && variable_get('smileys_enable_for_nodes', 0)) || ('comment_form' == $form_id && variable_get('smileys_enable_for_comments', 0))) {
-    $output = '';
-    $form['smileys'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Smileys'),
-      '#collapsible' => TRUE,
-      '#weight' => 0,
-    );
-    $form['smileys']['smileys_box'] = array(
-      '#type' => 'markup',
-      '#value' => theme('smileys_select_table'),
-    );
+  if (user_access('use smiley select box') && (((isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) && variable_get('smileys_enable_for_nodes', 0)) || ('comment_form' == $form_id && variable_get('smileys_enable_for_comments', 0)) || ('privatemsg_new' == $form_id && variable_get('smileys_enable_for_privatemsg', 0)))) {
+    $GLOBALS['display_smileys_bar'] = TRUE;
+  } else {
+    $GLOBALS['display_smileys_bar'] = FALSE;
   }
   return $form;
 }
 
-function theme_smileys_select_table() {
+/**
+ * Implementation of hook_elements() - allows us to modify single textareas
+ */
+function smileys_elements() {
+  $type['textarea'] = array('#process' => array('smileys_textarea' => array()));
+  return $type;
+}
+
+/*
+ * Add smileys underneath one textarea, where wanted
+ */
+function smileys_textarea($element) {
+  if ($GLOBALS['display_smileys_bar'] && ($element['#id'] == 'edit-body' ||
+      $element['#id'] == 'edit-comment' || substr($element['#id'],0,11) == 'edit-field-' ||
+      $element['#id'] == 'edit-privatemsgbody')) {
+    $element['#suffix'] = theme('smileys_select_bar',$element['#id']).$element['#suffix'];
+  }
+  return $element;
+}
+
+/* Theme Smileys selection bar */
+function theme_smileys_select_bar($id) {
   drupal_add_js(drupal_get_path('module', 'smileys') .'/smileys.js');
   drupal_add_css(drupal_get_path('module', 'smileys') .'/smileys.css');
-  $content .= '<div id="smileys">';
+
+  $output = '<div class="smileys">';
   $list = _smileys_list();
   foreach ($list as $smiley) {
-    $acronyms = explode(' ', $smiley->acronyms);
-    $alt = check_plain(implode('  ', $acronyms));
-    $desc = implode('&nbsp; ', $acronyms);
-    $content .= '<span><img src="'. check_url(base_path() . $smiley->image) .'" title="'. check_plain($smiley->description) .'" alt="'. $acronyms[0] .'" class="smiley-class"/></span>';
+    $alt = check_plain($smiley->description);
+    $acro = check_plain($smiley->acronyms).' ';
+    $acro = substr($acro,0,strpos($acro,' '));
+    $output .= '<span class="smiley"><a href="javascript:smiley(\''. $id .
+        "',' " . $acro . ' \')"><img src="'. check_url(base_path() . $smiley->image) .
+        '" title="'. $alt .'" alt="'. $alt .'" /></a></span>';
   }
-  $content .= '</div>';
-  return $content;
+  $output .= '</div>';
+  return $output;
 }
 
+
 function smileys_table() {
   drupal_add_js(drupal_get_path('module', 'smileys') .'/smileys.js');
   drupal_add_css(drupal_get_path('module', 'smileys') .'/smileys.css');
@@ -221,7 +239,13 @@ function smileys_admin_settings() {
     '#title' => t('Comments'),
     '#default_value' => variable_get('smileys_enable_for_comments', 0),
   );
-  
+  if (module_exists('privatemsg')) {
+    $form['smileys']['smileys_enable_for_privatemsg'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Private messages'),
+      '#default_value' => variable_get('smileys_enable_for_privatemsg', 0),
+    );
+  }
  return system_settings_form($form);
 }
 
