? fapi_admin_list.patch
Index: smileys.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/smileys/Attic/smileys.admin.inc,v
retrieving revision 1.1.2.3
diff -u -p -r1.1.2.3 smileys.admin.inc
--- smileys.admin.inc	27 Jun 2009 14:36:13 -0000	1.1.2.3
+++ smileys.admin.inc	12 Feb 2010 06:42:36 -0000
@@ -81,88 +81,165 @@ function smileys_admin_settings() {
   return system_settings_form($form);
 }
 
-function smileys_admin_list() {
-  $path = drupal_get_path('module', 'smileys');
-  drupal_add_js($path . '/scripts/admin/smileys-admin.js', 'module', 'header', FALSE, TRUE, FALSE);
-  drupal_add_css($path . '/scripts/admin/smileys-admin.css', 'module', 'all', FALSE);
+/**
+ * Implementation of Form API.
+ */
+function smileys_admin_list_form($form_state) {
+  $smileys = _smileys_list(1, " ORDER BY weight");
+  $packages = _smileys_list_packages();
+  $weight_delta = round(count($smileys) / 2);
+  $categories = array();
 
-  $header = array(t('Smiley'), t('Visibility'), t('Acronyms'), t('Description'), t('Category'), t('Weight'));
-  $rows = array();
-  $packages = array();
+  foreach ($packages as $package) {
+    $categories[$package] = t($package);
+  }
 
-  $categories = array('Miscellaneous' => 'Miscellaneous');
-  $smileyp = db_query("SELECT DISTINCT package FROM {smileys} ORDER BY package");
-  while ($pack = db_fetch_object($smileyp)) {
-    $categories[$pack->package] = $pack->package;
+  if (!in_array('Miscellaneous', $categories)) {
+    $categories['Miscellaneous'] = t('Miscellaneous');
   }
+
   ksort($categories);
-  $categories = array_unique($categories);
 
-  $output = '<form id="smileys-admin-form">';
-  $smileyp = db_query("SELECT DISTINCT package FROM {smileys} ORDER BY package");
-  while ($pack = db_fetch_object($smileyp)) {
-    $packages[] = $pack->package;
+  $form = array();
+  $form['#tree'] = TRUE;
+
+  foreach ($smileys as $key => $smiley) {
+    $form[$smiley->package][$key]['id'] = array(
+      '#type' => 'value',
+      '#value' => $smiley->id,
+    );
+    $form[$smiley->package][$key]['smiley'] = array(
+      '#value' => theme('image', check_url($smiley->image), check_plain($smiley->description), check_plain($smiley->description)),
+    );
+    $form[$smiley->package][$key]['visibility'] = array(
+      '#value' => theme('smileys_visibility', $smiley->id, $smiley->promote_to_box),
+    );
+    $form[$smiley->package][$key]['acronyms'] = array(
+      '#value' => theme('smileys_acronyms', $smiley->acronyms),
+    );
+    $form[$smiley->package][$key]['description'] = array(
+      '#value' => check_plain($smiley->description),
+    );
+    $form[$smiley->package][$key]['category'] = array(
+      '#type' => 'select',
+      '#default_value' => $smiley->package,
+      '#options' => $categories,
+      '#attributes' => array(
+        'class' => 'smiley-category smiley-category-'. _smileys_category_class($smiley->package),
+      ),
+    );
+    $form[$smiley->package][$key]['operations'] = array(
+      '#value' => l(t('Edit'), 'admin/settings/smileys/edit/'. $smiley->id, array('attributes' => array('class' => 'edit', 'title' => t('Edit this smiley')))) .' '. l(t('Delete'), 'admin/settings/smileys/delete/'. $smiley->id, array('attributes' => array('class' => 'delete', 'title' => t('Delete this smiley')))),
+    );
+    $form[$smiley->package][$key]['weight'] = array(
+      '#type' => 'weight',
+      '#default_value' => $smiley->weight,
+      '#delta' => $weight_delta,
+      '#attributes' => array(
+        'class' => 'smiley-weight smiley-weight-'. _smileys_category_class($smiley->package),
+      ),
+    );
+
+    $form['legend'] = array(
+      '#type' => 'fieldset', 
+      '#title' => t('Visibility Legend'), 
+      '#collapsible' => TRUE, 
+      '#collapsed' => FALSE,
+    );
+    $form['legend']['visibility'] = array(
+      '#value' => '<p><span class="smiley-selected"></span>'. t('Visible on select box and popup') .'</p>
+      <p><span class="smiley-middle"></span>'. t('Visible only on popup i.e. "More Smileys"') .'</p>
+      <p><span class="smiley-deselected"></span>'. t('Invisible (but not disabled)') .'</p>',
+    );
+
+    $form['submit'] = array(
+      '#type'   => 'submit',
+      '#value'  => 'Save',
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Implementation of Form API submit.
+ */
+function smileys_admin_list_form_submit($form, &$form_state) {
+  $packages = _smileys_list_packages();
+  $update = new stdClass();
 
-    $select = '';
-    foreach ($categories as $category) {
-      $select .= '<option value="' . $category . '"' . ($category == $pack->package ? 'selected="selected"' : '') . '>' . $category . '</option>' . "\n";
+  foreach ($packages as $package) {
+    foreach ($form_state['values'][$package] as $key => $value) {
+      $update->id = $form_state['values'][$package][$key]['id'];
+      $update->weight = $form_state['values'][$package][$key]['weight'];
+      $update->package = $form_state['values'][$package][$key]['category'];
+      drupal_write_record('smileys', $update, 'id');
     }
+  }
+
+  drupal_set_message(t('Smileys have been updated.'));
+}
 
-    $rows[] = array('data' => array(array('data' => '<span>' . $pack->package . '</span>', 'class' => 'category', 'colspan' => 7)), 'class' => 'category');
+/**
+ * Theme the admin list form.
+ */
+function theme_smileys_admin_list_form($form) {
+  $path = drupal_get_path('module', 'smileys');
+  drupal_add_js($path .'/scripts/admin/smileys-admin.js', 'module', 'header', FALSE, TRUE, FALSE);
+  drupal_add_css($path .'/scripts/admin/smileys-admin.css', 'module', 'all', FALSE);
 
-    $rows[] = array('data' => array(array('data' => '<em>' . t('No smileys in this category') . '</em>', 'colspan' => 7)), 'class' => "category-message category-populated category-" . str_replace(array('_', ' '), '-', drupal_strtolower($pack->package)) . "-message");
+  $output = '';
+  $packages = _smileys_list_packages();
+
+  $headers = array(
+    '',
+    t('Smiley'),
+    t('Visibility'),
+    t('Acronyms'),
+    t('Description'),
+    t('Category'),
+    t('Operations'),
+    t('Weight'),
+  );
+
+  $rows = array();
+
+  foreach ($packages as $package) {
 
-    $list = _smileys_list(1, " WHERE package = '$pack->package' ORDER BY weight");
-    foreach ($list as $smiley) {
-      $each_acronym = explode(' ', $smiley->acronyms);
-      if ($smiley->promote_to_box == -1) {
-        $promoted = '<span class="smiley-deselected" id="'. $smiley->id .'">&nbsp;</span>';
-      }
-      elseif ($smiley->promote_to_box == 0) {
-        $promoted = '<span class="smiley-middle" id="'. $smiley->id .'">&nbsp;</span>';
-      }
-      elseif ($smiley->promote_to_box == 1) {
-        $promoted = '<span class="smiley-selected" id="'. $smiley->id .'">&nbsp;</span>';
-      }
-      $acronyms = '';
-      foreach ($each_acronym as $key => $eac) {
-        $eac = str_replace("&lt;", "<", $eac);
-        $eac = str_replace("&gt;", ">", $eac);
-        $acronyms .= '<span style="color:'. ($key % 2 == 0 ? "#000000" : "#53616e") .';">'. check_plain($eac) .'</span>&nbsp;';
-      }
+    $rows[] = array(
+      'data' => array(
+        array(
+          'data' => '<span>'. $package .'</span>',
+          'class' => 'category',
+          'colspan' => 8,
+        )
+      ),
+      'class' => 'category',
+    );
+
+    $columns = &$form[$package];
+
+    foreach (element_children($columns) as $key) {
       $rows[] = array(
         'data' => array(
-          array(
-            'data' => '<div class="nub">' .
-          l(t('Edit'), 'admin/settings/smileys/edit/'. $smiley->id, array('attributes' => array('class' => 'edit', 'title' => t('Edit this smiley')))) .
-          l(t('Delete'), 'admin/settings/smileys/delete/'. $smiley->id, array('attributes' => array('class' => 'delete', 'title' => t('Delete this smiley')))) .
-          '</div>' .
-          theme('image', check_url($smiley->image), check_plain($smiley->description), check_plain($smiley->description)),
-          'class' => 'nub-td'),
-          $promoted,
-          $acronyms,
-          check_plain($smiley->description),
-          '<center><select id="edit-category" class="form-select smiley-category-select smiley-category-' . str_replace(array('_', ' '), '-', drupal_strtolower($pack->package)) . '" name="category">' . $select . '</select></center>',
-          '<center><input style="text-align: center;" size="1" id="' . $smiley->id . '" class="smiley-weight" value="' . $smiley->weight . '"></input></center>',
+          '',
+          drupal_render($columns[$key]['smiley']),
+          drupal_render($columns[$key]['visibility']),
+          drupal_render($columns[$key]['acronyms']),
+          drupal_render($columns[$key]['description']),
+          drupal_render($columns[$key]['category']),
+          drupal_render($columns[$key]['operations']),
+          drupal_render($columns[$key]['weight']),
         ),
         'class' => 'draggable',
       );
-      $acronyms = '';
     }
-  }
-
-  $form['smileys'] = array(
-    '#type' => 'markup',
-    '#value' => theme('table', $header, $rows, array('id' => 'smileys_admin_list')),
-  );
-  $output .= drupal_render($form);
 
-  foreach ($packages as $package) {
-    drupal_add_tabledrag('smileys_admin_list', 'match', 'sibling', 'smiley-category-select', 'smiley-category-' . str_replace(array('_', ' '), '-', drupal_strtolower($package)), NULL, FALSE);
-    drupal_add_tabledrag('smileys_admin_list', 'order', 'sibling', 'smiley-weight');      
+    drupal_add_tabledrag('smileys_admin_list', 'match', 'sibling', 'smiley-category', 'smiley-category-'. _smileys_category_class($package), 'smiley-category', FALSE);
+    drupal_add_tabledrag('smileys_admin_list', 'order', 'sibling', 'smiley-weight', 'smiley-weight-'. _smileys_category_class($package));
   }
 
-  if (count($rows) == 0) {
+  if (empty($rows)) {
     if (module_exists('smileys_import')) {
       $msg = t('No smileys found. You may !add, or !import.', array('!add' => l(t('add a custom smileys'), 'admin/settings/smileys/add'), '!import' => l(t('import smiley packages'), 'admin/settings/smileys/import')));
     }
@@ -170,27 +247,69 @@ function smileys_admin_list() {
       $msg = t('No smileys found. You may !add, or install smileys_import module & import smiley packages.', array('!add' => l(t('add custom smileys'), 'admin/settings/smileys/add')));
     }
     drupal_set_message($msg);
-    $output = '';
   }
   else {
-    $output .= '<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>'. t('Visibility Legend')
-     . '</i><br /><span class="smiley-selected"></span>' . t('Visible on select box + popup')
-     . '<br /><span class="smiley-middle"></span>' . t('Visible on only on popup i.e. "More Smileys"')
-     . '<br /><span class="smiley-deselected"></span>' . t('Invisible (but not disabled)');
+    $output .= theme('table', $headers, $rows, array('id' => 'smileys_admin_list'));
+    $output .= drupal_render($form);
   }
 
-  return $output . '</form>';
+  return $output;
+}
+
+/**
+ * Get a list of packages.
+ */
+function _smileys_list_packages($refresh = FALSE) {
+  static $list;
+  if (!$list || $refresh) {
+    $list = array();
+    $result = db_query("SELECT DISTINCT package FROM {smileys} ORDER BY package");
+    while ($object = db_fetch_object($result)) {
+      $list[] = $object->package;
+    }
+  }
+  
+  return $list;
 }
 
-function smileys_category_handle($orig_name, $new_name) {
-  if (!empty($orig_name) && !empty($new_name)) {
-    db_query("UPDATE {smileys} SET package='%s' WHERE package='%s'", $new_name, $orig_name);
-    exit;
+/**
+ * Theme visibility icons.
+ */
+function theme_smileys_visibility($smiley_id, $promote_to_box) {
+  if ($promote_to_box == -1) {
+    $promoted = '<span class="smiley-deselected" id="'. $smiley_id .'">&nbsp;</span>';
   }
-  else {
-    drupal_access_denied();
-    return;
+  elseif ($promote_to_box == 0) {
+    $promoted = '<span class="smiley-middle" id="'. $smiley_id .'">&nbsp;</span>';
   }
+  elseif ($promote_to_box == 1) {
+    $promoted = '<span class="smiley-selected" id="'. $smiley_id .'">&nbsp;</span>';
+  }
+  
+  return $promoted;
+}
+
+/**
+ * Theme acronyms.
+ */
+function theme_smileys_acronyms($acronyms) {
+  $each_acronym = explode(' ', $acronyms);
+  $acronyms_themed = '';
+  
+  foreach ($each_acronym as $key => $value) {
+    $value = str_replace("&lt;", "<", $value);
+    $value = str_replace("&gt;", ">", $value);
+    $acronyms_themed .= '<span style="color:'. ($key % 2 == 0 ? "#000000" : "#53616e") .';">'. check_plain($value) .'</span>&nbsp;';
+  }
+  
+  return $acronyms_themed;
+}
+
+/**
+ * Reformat category names for use as CSS classes.
+ */
+function _smileys_category_class($category) {
+  return str_replace(array('_', ' '), '-', drupal_strtolower($category));
 }
 
 function smileys_promote_handle($action, $id = NULL) {
@@ -204,16 +323,6 @@ function smileys_promote_handle($action,
   }
 }
 
-function smileys_weight_handle($weights, $ids, $categories) {
-  $ids = explode(':', $ids);
-  $weights = explode(':', $weights);
-  $categories = explode(':', $categories);
-  foreach ($ids as $key => $id) {
-    db_query("UPDATE {smileys} SET package='%s', weight=%d WHERE id=%d", $categories[$key], $weights[$key], $id);
-    $smileys[$id] = array('category' => $categories[$key], 'weight' => $weights[$key]);
-  }
-}
-
 function smileys_admin_form($form_state, $edit) {
   $form = array();
 
@@ -303,4 +412,4 @@ function smileys_admin_add($smiley_id = 
     $smiley = db_fetch_array(db_query('SELECT * FROM {smileys} WHERE id = %d', $smiley_id));
   }
   return drupal_get_form('smileys_admin_form', $smiley);
-}
+}
\ No newline at end of file
Index: smileys.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/smileys/Attic/smileys.module,v
retrieving revision 1.48.2.17
diff -u -p -r1.48.2.17 smileys.module
--- smileys.module	27 Jun 2009 15:54:50 -0000	1.48.2.17
+++ smileys.module	12 Feb 2010 06:42:36 -0000
@@ -192,6 +192,21 @@ function smileys_theme() {
     'smileys_select_table' => array(
       'arguments' => array('promoted' => FALSE),
     ),
+    'smileys_admin_list_form' => array(
+      'arguments' => array('form' => array()),
+      'file' => 'smileys.admin.inc',
+    ),
+    'smileys_visibility' => array(
+      'arguments' => array(
+        'smiley_id' => '', 
+        'promote_to_box' => '',
+      ),
+      'file' => 'smileys.admin.inc',
+    ),
+    'smileys_acronyms' => array(
+      'arguments' => array('acronyms' => ''),
+      'file' => 'smileys.admin.inc',
+    ),
   );
 }
 
@@ -300,14 +315,16 @@ function smileys_menu() {
   $items['admin/settings/smileys'] = array(
     'title' => t('Smileys'),
     'description' => t('Manage Smileys and toggle select box behavior for nodes and comments.'),
-    'page callback' => 'smileys_admin_list',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('smileys_admin_list_form'),
     'access arguments' => array('administer smileys'),
     'file' => 'smileys.admin.inc',
   );
 
   $items['admin/settings/smileys/list'] = array(
     'title' => t('List'),
-    'page callback' => 'smileys_admin_list',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('smileys_admin_list_form'),
     'type' => MENU_DEFAULT_LOCAL_TASK,
     'weight' => -10,
     'file' => 'smileys.admin.inc',
@@ -350,13 +367,6 @@ function smileys_menu() {
     'file' => 'smileys.admin.inc',
   );
 
-  $items['admin/settings/smileys/category'] = array(
-    'page callback' => 'smileys_category_handle',
-    'access arguments' => array('administer smileys'),
-    'type' => MENU_CALLBACK,
-    'file' => 'smileys.admin.inc',
-  );
-
   $items['admin/settings/smileys/promote'] = array(
     'page callback' => 'smileys_promote_handle',
     'access arguments' => array('administer smileys'),
@@ -364,13 +374,6 @@ function smileys_menu() {
     'file' => 'smileys.admin.inc',
   );
 
-  $items['admin/settings/smileys/weight'] = array(
-    'page callback' => 'smileys_weight_handle',
-    'access arguments' => array('administer smileys'),
-    'type' => MENU_CALLBACK,
-    'file' => 'smileys.admin.inc',
-  );
-
   $items['smileys/fetch'] = array(
     'page callback' => 'smileys_list',
     'access arguments' => array('use smiley select box'),
@@ -378,4 +381,4 @@ function smileys_menu() {
   );
 
   return $items;
-}
+}
\ No newline at end of file
Index: scripts/admin/smileys-admin.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/smileys/scripts/admin/Attic/smileys-admin.css,v
retrieving revision 1.1.2.5
diff -u -p -r1.1.2.5 smileys-admin.css
--- scripts/admin/smileys-admin.css	5 Jan 2009 09:04:16 -0000	1.1.2.5
+++ scripts/admin/smileys-admin.css	12 Feb 2010 06:42:36 -0000
@@ -13,24 +13,24 @@ div.smileys-progress-panel {
   -moz-border-radius-bottomright:5px;
 }
 
-#smileys-admin-form img {
+#smileys-admin-list-form img {
   vertical-align: middle;
 }
 
-#smileys-admin-form span.smiley-selected {
+#smileys-admin-list-form span.smiley-selected {
   background: transparent url(images/smileys-selected.png) no-repeat scroll 50% 0%;
   padding: 2px 35px;
   cursor: pointer;
 }
 
-#smileys-admin-form span.smiley-deselected {
+#smileys-admin-list-form span.smiley-deselected {
   background: transparent url(images/smileys-deselected.png) no-repeat scroll 50% 0%;
   padding: 2px 35px;
   cursor: pointer;
   text-align: center;
 }
 
-#smileys-admin-form span.smiley-middle {
+#smileys-admin-list-form span.smiley-middle {
   background: transparent url(images/smileys-middle.png) no-repeat scroll 50% 0%;
   padding: 2px 35px;
   cursor: pointer;
@@ -41,73 +41,7 @@ div.smileys-progress-panel {
   font-weight: normal;
   color: #999;
 }
+
 #smileys_admin_list tr.category-populated {
   display: none;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-.nub {
-  background: url(images/nub.png) no-repeat;
-  font: normal 10px/11px "Lucida Grande", verdana, arial, helvetica, sans-serif;
-  float: left;
-  padding: 7px;
-}
-
-.nub a {
-  display: block;
-  float: left;
-  height: 11px;
-  text-decoration: underline;
-}
-
-#smileys_admin_list a.save {
-  background: url(images/save.png) no-repeat;
-  font-size: 0;
-  line-height: 0;
-  margin: 0 4px 0;
-  padding: 10px;
-  text-indent: -9999px;
-  width: 10px;
-}
-
-div.nub a.delete {
-  background: url(images/delete.gif) no-repeat;
-  font-size: 0;
-  line-height: 0;
-  margin: 1px 4px 0 0;
-  text-indent: -9999px;
-  width: 10px;
-}
-
-div.nub a.edit {
-  margin: 1px 4px 0 0;
-}
-
-#smileys_admin_list a.tabledrag-handle {
-  padding-right: .4em;
-}
-
-#smileys_admin_list a.tabledrag-handle .handle {
-  background: url(images/reorder.gif) no-repeat;
-  cursor: move;
-  font-size: 0;
-  line-height: 0;
-  margin: 1px 0 0;
-  text-indent: -9999px;
-  width: 11px;
-  padding: 7px 0;
-}
-
-.nub-td {
-  min-width: 120px;
 }
\ No newline at end of file
Index: scripts/admin/smileys-admin.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/smileys/scripts/admin/Attic/smileys-admin.js,v
retrieving revision 1.1.2.4
diff -u -p -r1.1.2.4 smileys-admin.js
--- scripts/admin/smileys-admin.js	27 Jun 2009 14:36:13 -0000	1.1.2.4
+++ scripts/admin/smileys-admin.js	12 Feb 2010 06:42:36 -0000
@@ -13,54 +13,7 @@ var smileysLoader = {
   }
 };
 
-checkEnter = function(event) {
-  var e = (event) ? event : ((window.event) ? window.event : "");
-  if (e) {
-    if (e.keyCode === 13 || e.which === 13) {
-      $('td.category a.save').trigger('click');
-      $('#smileys-admin-form').submit(function() { return false; });
-    }
-  }
-}
-
 Drupal.behaviors.smileysAdmin = function() {
-  $('td.category span').bind('click', function() {
-    $(this).hide().parent().append('<input type="textfield" class="form-text"/><a href="#" class="save" title="Save category title">Save</a>')
-      .find('input').val(this.innerHTML).focus().bind('keypress', function(event) { checkEnter(event); })
-      .find('~ a').bind('click', function() {
-        var basePath = Drupal.settings.basePath;
-        var orig_span = $(this).parent().find('span');
-        var orig_name = orig_span.text();
-        var new_name = $.trim($(this).prev().val());
-        if (orig_name !== new_name && new_name !== '') {
-          $.ajax({
-            type: 'GET',
-            url: basePath + 'admin/settings/smileys/category/' + orig_name + '/' + new_name,
-            beforeSend: function() {
-              smileysLoader.start();
-            },
-            success: function(msg){
-              setTimeout(function() {
-                orig_span.html(new_name).show().find('~ input, ~ a').remove();
-                  $('table#smileys_admin_list tr td:has(select)').each(function() {
-                    $(this).find('select option').each(function() {
-                      if (this.value === orig_name) {
-                        this.value = new_name;
-                        this.innerHTML = new_name;
-                      }
-                  });
-                });
-                smileysLoader.stop();
-              }, 500);
-            },
-            error: function() {
-              smileysLoader.error();
-            }
-          });
-        }
-        return false;
-      });
-  });
   $('span.smiley-selected, span.smiley-deselected, span.smiley-middle', 'table').bind('click', function() {
     var current = $(this);
     var class_attr = current.attr('class');
@@ -98,42 +51,4 @@ Drupal.behaviors.smileysAdmin = function
     });
     return false;
   });
-};
-
-Drupal.behaviors.smileyDrag = function(context) {
-  var basePath = Drupal.settings.basePath;
-  $('table#smileys_admin_list').each(function() {
-    $('<button class="smileys-save-weights">Save</button>').insertAfter(this).bind('mousedown keydown', function() {
-      var ids = '';
-      var weights = '';
-      var categories = '';
-      $('form#smileys-admin-form input').each(function() {
-         ids = ids ? ids + ':' + this.id : this.id;
-         weights = weights ? weights + ':' + this.value : this.value;
-      });
-      $('form#smileys-admin-form select').each(function() {
-         categories = categories ? categories + ':' + this.value : this.value;
-      });
-      $.ajax({
-        type: 'GET',
-        url: basePath + 'admin/settings/smileys/weight/' + weights + '/' + ids + '/' + categories,
-        beforeSend: function() {
-          smileysLoader.start();
-        },
-        success: function(msg){
-        setTimeout(function() {
-          smileysLoader.stop();
-          window.location = window.location;
-        }, 1000);
-        },
-        error: function() {
-          smileysLoader.error();
-        }
-      });
-      return false;
-    });
-  });
-  $('#smileys_admin_list td .tabledrag-handle').each(function() {
-    $('~ .nub', this).prepend($(this));
-  });
-};
+};
\ No newline at end of file
