Index: htdocs/js/trac.js
===================================================================
--- htdocs/js/trac.js	(revision 2827)
+++ htdocs/js/trac.js	(working copy)
@@ -118,3 +118,78 @@
     addLinks(container.getElementsByTagName('h' + lvl));
   }
 }
+
+
+//Functions for the processing of special custom fields
+
+//Add the contents of newfield to oldfield
+function accumulateInt(oldfield,newfield)
+{
+  if (checkInt(newfield.value))
+  {
+    if (checkInt(oldfield.defaultValue))
+    {
+      oldfield.value = parseInt(oldfield.defaultValue, 10) + parseInt(newfield.value, 10); 
+    }
+    else
+    {
+      oldfield.value = newfield.value;
+    }
+    newfield.value = "0";
+  }
+  else
+  {
+    newfield.value = newfield.defaultValue;
+    oldfield.value = oldfield.defaultValue;
+  }
+}
+
+//Check whether the string can be parsed into an integer
+function checkInt(text)
+{
+  var result = true;
+  if (isBlank(text))
+  {
+    result = false;
+  }
+  for(var i=0;i<text.length;i++)
+  {
+    if(!isDigit(text.charAt(i)))
+    {
+      result = false;
+    }
+  }
+
+  return result;
+}
+
+function isDigit(num)
+{
+  if (num.length>1)
+  {
+    return false;
+  }
+  var string="-1234567890";
+  if (string.indexOf(num)!=-1)
+  {
+    return true;
+  }
+  return false;
+}
+
+function isBlank(val)
+{
+  if(val==null)
+  {
+    return true;
+  }
+  for(var i=0;i<val.length;i++) 
+  {
+    if ((val.charAt(i)!=' ')&&(val.charAt(i)!="\t")&&(val.charAt(i)!="\n")&&(val.charAt(i)!="\r"))
+    {
+      return false;
+    }
+  }
+return true;
+}
+
Index: templates/newticket.cs
===================================================================
--- templates/newticket.cs	(revision 2827)
+++ templates/newticket.cs	(working copy)
@@ -61,6 +61,22 @@
       if:field.type == 'text' ?><input type="text" id="<?cs
         var:name(field) ?>" name="<?cs
         var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>" /><?cs
+      elif:field.type == 'integer' ?><input type="text" id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>"
+        onchange="javascript:if (!checkInt(this.value)){this.value = this.defaultValue;};"/><?cs
+      elif:field.type == 'set_once_integer' ?><input type="text" id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>"
+        title="This field will not be editable once the ticket is created."
+        onchange="javascript:if (!checkInt(this.value)){this.value = this.defaultValue;};"/><?cs
+      elif:field.type == 'cumulative_integer' ?><input type="text" readonly id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>"/>
+        <input type="text" id="<?cs var:name(field) ?>_e" name="<?cs
+        var:name(field) ?>_e" value="0"
+        title="Enter value to add to total."
+        onchange="javascript:accumulateInt(document.getElementById('<?cs var:name(field) ?>'),this);"/><?cs
       elif:field.type == 'select' ?><select id="<?cs
         var:name(field) ?>" name="<?cs var:name(field) ?>"><?cs
         if:field.optional ?><option></option><?cs /if ?><?cs
Index: templates/ticket.cs
===================================================================
--- templates/ticket.cs	(revision 2827)
+++ templates/ticket.cs	(working copy)
@@ -190,6 +190,21 @@
       if:field.type == 'text' ?><input type="text" id="<?cs
         var:name(field) ?>" name="<?cs
         var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>" /><?cs
+     elif:field.type == 'integer' ?><input type="text" id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>"
+        onchange="javascript:if (!checkInt(this.value)){this.value = this.defaultValue;};"/><?cs
+     elif:field.type == 'set_once_integer' ?><input type="text" disabled id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>"/><?cs
+      elif:field.type == 'cumulative_integer' ?><input type="text" readonly id="<?cs
+        var:name(field) ?>" name="<?cs
+        var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>"/>
+        <input type="text" id="<?cs var:name(field) ?>_e" name="<?cs
+        var:name(field) ?>_e" value="0"
+        title="Enter value to add to total."
+        onchange="javascript:accumulateInt(document.getElementById('<?cs
+        var:name(field) ?>'),this);"/><?cs
       elif:field.type == 'select' ?><select id="<?cs
         var:name(field) ?>" name="<?cs
         var:name(field) ?>"><?cs
