Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.771
diff -u -p -r1.771 system.module
--- modules/system/system.module	25 Aug 2009 10:07:19 -0000	1.771
+++ modules/system/system.module	25 Aug 2009 11:53:00 -0000
@@ -88,6 +88,25 @@ define('REGIONS_ALL', 'all');
 
 
 /**
+ *
+ * Output form element titles as labels before form elements. @see system_elements().
+ */
+define('FORM_ELEMENT_SHOW_TITLE_BEFORE', 'before');
+
+/**
+ *
+ * Output form element titles as labels after form elements. @see system_elements().
+ */
+define('FORM_ELEMENT_SHOW_TITLE_AFTER', 'after');
+
+/**
+ *
+ * Output form element titles as the title attribute of form elements. @see system_elements().
+ */
+define('FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE', 'attribute');
+
+
+/**
  * Implement hook_help().
  */
 function system_help($path, $arg) {
@@ -330,6 +349,7 @@ function system_elements() {
     '#process' => array('form_process_text_format', 'ajax_process_form'),
     '#theme' => 'textfield',
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['password'] = array(
@@ -339,12 +359,14 @@ function system_elements() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'password',
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['password_confirm'] = array(
     '#input' => TRUE,
     '#process' => array('form_process_password_confirm'),
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['textarea'] = array(
@@ -355,6 +377,7 @@ function system_elements() {
     '#process' => array('form_process_text_format', 'ajax_process_form'),
     '#theme' => 'textarea',
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['radios'] = array(
@@ -370,7 +393,7 @@ function system_elements() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'radio',
     '#theme_wrappers' => array('form_element'),
-    '#form_element_skip_title' => TRUE,
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_AFTER,
   );
 
   $type['checkboxes'] = array(
@@ -387,7 +410,7 @@ function system_elements() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'checkbox',
     '#theme_wrappers' => array('form_element'),
-    '#form_element_skip_title' => TRUE,
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_AFTER,
   );
 
   $type['select'] = array(
@@ -397,6 +420,7 @@ function system_elements() {
     '#process' => array('ajax_process_form'),
     '#theme' => 'select',
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['weight'] = array(
@@ -419,6 +443,7 @@ function system_elements() {
     '#size' => 60,
     '#theme' => 'file',
     '#theme_wrappers' => array('form_element'),
+    '#show_title' => FORM_ELEMENT_SHOW_TITLE_BEFORE,
   );
 
   $type['tableselect'] = array(
Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.365
diff -u -p -r1.365 form.inc
--- includes/form.inc	24 Aug 2009 14:49:08 -0000	1.365
+++ includes/form.inc	25 Aug 2009 11:53:01 -0000
@@ -1483,7 +1483,13 @@ function theme_select($element) {
   $size = $element['#size'] ? ' size="' . $element['#size'] . '"' : '';
   _form_set_class($element, array('form-select'));
   $multiple = $element['#multiple'];
-  return '<select name="' . $element['#name'] . '' . ($multiple ? '[]' : '') . '"' . ($multiple ? ' multiple="multiple" ' : '') . drupal_attributes($element['#attributes']) . ' id="' . $element['#id'] . '" ' . $size . '>' . form_select_options($element) . '</select>';
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
+
+  return '<select name="' . $element['#name'] . '' . ($multiple ? '[]' : '') . '"' . ($multiple ? ' multiple="multiple"' : '') . $title . ' ' . drupal_attributes($element['#attributes']) . ' id="' . $element['#id'] . '" ' . $size . '>' . form_select_options($element) . '</select>';
 }
 
 /**
@@ -1624,15 +1630,19 @@ function theme_fieldset($element) {
  */
 function theme_radio($element) {
   _form_set_class($element, array('form-radio'));
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
+
   $output = '<input type="radio" ';
   $output .= 'id="' . $element['#id'] . '" ';
-  $output .= 'name="' . $element['#name'] . '" ';
+  $output .= 'name="' . $element['#name'] . '"';
+  $output .= $title . ' ';
   $output .= 'value="' . $element['#return_value'] . '" ';
   $output .= (check_plain($element['#value']) == $element['#return_value']) ? ' checked="checked" ' : ' ';
   $output .= drupal_attributes($element['#attributes']) . ' />';
-  if (!is_null($element['#title'])) {
-    $output = '<label class="option" for="' . $element['#id'] . '">' . $output . ' ' . $element['#title'] . '</label>';
-  }
 
   return $output;
 }
@@ -1960,18 +1970,21 @@ function theme_text_format_wrapper($elem
  */
 function theme_checkbox($element) {
   _form_set_class($element, array('form-checkbox'));
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
+
   $checkbox = '<input ';
   $checkbox .= 'type="checkbox" ';
   $checkbox .= 'name="' . $element['#name'] . '" ';
-  $checkbox .= 'id="' . $element['#id'] . '" ' ;
+  $checkbox .= 'id="' . $element['#id'] . '"';
+  $checkbox .= $title . ' ';
   $checkbox .= 'value="' . $element['#return_value'] . '" ';
   $checkbox .= $element['#value'] ? ' checked="checked" ' : ' ';
   $checkbox .= drupal_attributes($element['#attributes']) . ' />';
 
-  if (!is_null($element['#title'])) {
-    $checkbox = '<label class="option" for="' . $element['#id'] . '">' . $checkbox . ' ' . $element['#title'] . '</label>';
-  }
-
   return $checkbox;
 }
 
@@ -2392,6 +2405,12 @@ function theme_textfield($element) {
   $maxlength = empty($element['#maxlength']) ? '' : ' maxlength="' . $element['#maxlength'] . '"';
   $class = array('form-text');
   $extra = '';
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
+
   $output = '';
 
   if ($element['#autocomplete_path'] && menu_valid_path(array('link_path' => $element['#autocomplete_path']))) {
@@ -2405,7 +2424,7 @@ function theme_textfield($element) {
     $output .= '<span class="field-prefix">' . $element['#field_prefix'] . '</span> ';
   }
 
-  $output .= '<input type="text"' . $maxlength . ' name="' . $element['#name'] . '" id="' . $element['#id'] . '"' . $size . ' value="' . check_plain($element['#value']) . '"' . drupal_attributes($element['#attributes']) . ' />';
+  $output .= '<input type="text"' . $title . $maxlength . ' name="' . $element['#name'] . '" id="' . $element['#id'] . '"' . $size . ' value="' . check_plain($element['#value']) . '"' . drupal_attributes($element['#attributes']) . ' />';
 
   if (isset($element['#field_suffix'])) {
     $output .= ' <span class="field-suffix">' . $element['#field_suffix'] . '</span>';
@@ -2444,6 +2463,11 @@ function theme_form($element) {
  */
 function theme_textarea($element) {
   $class = array('form-textarea');
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
 
   // Add resizable behavior
   if ($element['#resizable'] !== FALSE) {
@@ -2452,7 +2476,7 @@ function theme_textarea($element) {
   }
 
   _form_set_class($element, $class);
-  return '<textarea cols="' . $element['#cols'] . '" rows="' . $element['#rows'] . '" name="' . $element['#name'] . '" id="' . $element['#id'] . '" ' . drupal_attributes($element['#attributes']) . '>' . check_plain($element['#value']) . '</textarea>';
+  return '<textarea cols="' . $element['#cols'] . '" rows="' . $element['#rows'] . '" name="' . $element['#name'] . '" id="' . $element['#id'] . '"' . $title . ' ' . drupal_attributes($element['#attributes']) . '>' . check_plain($element['#value']) . '</textarea>';
 }
 
 /**
@@ -2486,9 +2510,14 @@ function theme_markup($element) {
 function theme_password($element) {
   $size = $element['#size'] ? ' size="' . $element['#size'] . '" ' : '';
   $maxlength = $element['#maxlength'] ? ' maxlength="' . $element['#maxlength'] . '" ' : '';
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
 
   _form_set_class($element, array('form-text'));
-  $output = '<input type="password" name="' . $element['#name'] . '" id="' . $element['#id'] . '" ' . $maxlength . $size . drupal_attributes($element['#attributes']) . ' />';
+  $output = '<input type="password" name="' . $element['#name'] . '" id="' . $element['#id'] . '" ' . $title . $maxlength . $size . drupal_attributes($element['#attributes']) . ' />';
   return $output;
 }
 
@@ -2522,7 +2551,13 @@ function form_process_weight($element) {
  */
 function theme_file($element) {
   _form_set_class($element, array('form-file'));
-  return '<input type="file" name="' . $element['#name'] . '"' . ($element['#attributes'] ? ' ' . drupal_attributes($element['#attributes']) : '') . ' id="' . $element['#id'] . '" size="' . $element['#size'] . "\" />\n";
+  $title = '';
+
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_ATTRIBUTE && !empty($element['#title'])) {
+  $title = ' title="' . $element['#title'] . '"';
+}
+
+  return '<input type="file" name="' . $element['#name'] . '"' . $title . ' ' . ($element['#attributes'] ? ' ' . drupal_attributes($element['#attributes']) : '') . ' id="' . $element['#id'] . '" size="' . $element['#size'] . "\" />\n";
 }
 
 /**
@@ -2552,17 +2587,27 @@ function theme_form_element($element) {
   $output = '<div class="' . implode(' ', $class) . '">' . "\n";
   $required = !empty($element['#required']) ? '<span class="form-required" title="' . $t('This field is required.') . '">*</span>' : '';
 
-  if (!empty($element['#title']) && empty($element['#form_element_skip_title'])) {
+  $label = '';
+
+  if (!empty($element['#title'])) {
     $title = $element['#title'];
     if (!empty($element['#id'])) {
-      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
+      $label = ' <label for="' . $element['#id'] . '">' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
     }
     else {
-      $output .= ' <label>' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
+      $label= ' <label>' . $t('!title !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
     }
   }
 
-  $output .= " " . $element['#children'] . "\n";
+  if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_BEFORE) {
+    $output .= $label . " " . $element['#children'] . "\n";
+  }
+  else if (isset($element['#show_title']) && $element['#show_title'] == FORM_ELEMENT_SHOW_TITLE_AFTER) {
+    $output .= $element['#children'] . " " . $label . "\n";
+  }
+  else {
+    $output .= " " . $element['#children'] . "\n";
+  }
 
   if (!empty($element['#description'])) {
     $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
