Index: trac/Ticket.py
===================================================================
--- trac/Ticket.py	(revision 1036)
+++ trac/Ticket.py	(working copy)
@@ -212,7 +212,8 @@
             'name': name,
             'type': items[name],
             'label': items.get(name + '.label', ''),
-            'value': items.get(name + '.value', '')
+            'value': items.get(name + '.value', ''),
+            'hint': items.get(name + '.hint', '')
         }
         if field['type'] == 'select' or field['type'] == 'radio':
             field['options'] = items.get(name + '.options', '').split('|')
@@ -235,6 +236,7 @@
         hdf.setValue('%s.type' % pfx, f['type'])
         hdf.setValue('%s.label' % pfx, f['label'])
         hdf.setValue('%s.value' % pfx, val)
+        hdf.setValue('%s.hint' % pfx, f['hint'])
         if f['type'] == 'select' or f['type'] == 'radio':
             j = 0
             for option in f['options']:
Index: templates/macros.cs
===================================================================
--- templates/macros.cs	(revision 1036)
+++ templates/macros.cs	(working copy)
@@ -160,24 +160,24 @@
  each c=ticket.custom ?>
   <div class="field custom_<?cs var c.name ?>"><?cs
    if c.type == 'text' || c.type == 'select' ?>
-    <label for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
+    <label title="<?cs var c.hint ?>" for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
       var c.name ?><?cs /alt ?></label>:<?cs
    /if ?><?cs
    if c.type == 'text' ?>
-    <input type="text" id="custom_<?cs var c.name ?>" name="custom_<?cs
+    <input title="<?cs var c.hint ?>" type="text" id="custom_<?cs var c.name ?>" name="custom_<?cs
       var c.name ?>" value="<?cs var c.value ?>" /><?cs
    elif c.type == 'textarea' ?>
-    <label for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
+    <label title="<?cs var c.hint ?>" for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
       var c.name ?><?cs /alt ?></label>:<br />
-    <textarea cols="<?cs alt c.width ?>60<?cs /alt ?>" rows="<?cs
+    <textarea title="<?cs var c.hint ?>"  cols="<?cs alt c.width ?>60<?cs /alt ?>" rows="<?cs
       alt c.height ?>12<?cs /alt ?>" name="custom_<?cs var c.name ?>"><?cs
       var c.value ?></textarea><?cs
    elif c.type == 'checkbox' ?>
     <input type="hidden" name="checkbox_<?cs var c.name ?>" value="custom_<?cs
       var c.name ?>" />
-    <input type="checkbox" id="custom_<?cs var c.name ?>" name="custom_<?cs
+    <input title="<?cs var c.hint ?>" type="checkbox" id="custom_<?cs var c.name ?>" name="custom_<?cs
       var c.name ?>" value="1" <?cs if c.selected ?>checked="checked"<?cs /if ?> />
-    <label for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
+    <label title="<?cs var c.hint ?>" for="custom_<?cs var c.name ?>"><?cs alt c.label ?><?cs
       var c.name ?><?cs /alt ?></label><?cs
    elif c.type == 'select' ?>
     <select name="custom_<?cs var c.name ?>"><?cs each v = c.option ?>
@@ -186,12 +186,12 @@
     </select><?cs
    elif c.type == 'radio' ?>
     <fieldset class="radio">
-     <legend><?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:</legend><?cs
+     <legend title="<?cs var c.hint ?>"><?cs alt c.label ?><?cs var c.name ?><?cs /alt ?>:</legend><?cs
      each v = c.option ?>
-      <input type="radio" id="custom_<?cs var c.name ?>_<?cs
+      <input title="<?cs var c.hint ?>" type="radio" id="custom_<?cs var c.name ?>_<?cs
         var v ?>" name="custom_<?cs var c.name ?>"<?cs
         if v.selected ?> checked="checked"<?cs /if ?> value="<?cs var v ?>"/>
-      <label for="custom_<?cs var c.name ?>_<?cs var v ?>"><?cs
+      <label title="<?cs var c.hint ?>" for="custom_<?cs var c.name ?>_<?cs var v ?>"><?cs
         var v ?></label><?cs
      /each ?>
     </fieldset><?cs

