docs: public String convertString(String string)
      {
          if (string != null)
          {
              int startTag = string.indexOf('<');
              int endTag = string.indexOf('>');
              if (startTag > -1)
                  if (endTag > startTag)
              {
                  String tag = string.substring(startTag + 1, endTag);
                  boolean bDateField = tag.toUpperCase().contains("DATE");
                  if (eomFields != null)
                  {
                      for (String token : eomFields)
                      {
                          if (tag.equals(token))
                              bDateField = true;
                      }
                  }
                  if (bDateField)
                  {
                      int endData = string.indexOf('<', endTag);
                      if (endData != -1)
                      {
                          String dateString = string.substring(endTag + 1, endData);
                          Date date = new Date();
                          int type = this.parseDate(dateString, date);
                          if (type != 0)
                          {
                              Calendar calendar = Calendar.getInstance();
                              calendar.setTime(date);
                              if (yearOffset != 0)
                              {
                                  calendar.add(Calendar.YEAR, yearOffset);                                
                              }
                              int day = 0;
                              if (monthOffset != 0)
                              {
                                  calendar.add(Calendar.DAY_OF_MONTH, 1);
                                  day = calendar.get(Calendar.DAY_OF_MONTH);  // Just want to see if this was the end of the month
                                  calendar.add(Calendar.DAY_OF_MONTH, -1);     // Restore original date
                                  calendar.add(Calendar.MONTH, monthOffset);  // Add the month offset
                                  if (eomFields != null)
                                  {
                                      for (String token : eomFields)
                                      {
                                          if (tag.equals(token))
                                          {
                                              if (day == 1)
                                              {   // end of (next) month
                                                  calendar.add(Calendar.DAY_OF_MONTH, 5);     // next month
                                                  calendar.set(Calendar.DAY_OF_MONTH, 1);     // First of next month
                                                  calendar.add(Calendar.DAY_OF_MONTH, -1);    // End of month
                                              }
                                          }
                                      }
                                  }
                              }
                              if (dayOffset != 0)
                              {
                                  calendar.add(Calendar.DAY_OF_MONTH, dayOffset);                                
                              }
                              date = calendar.getTime();
                              
                              String newDateString = this.formatDate(date, type);
                              if (newDateString != null)
                                  string = string.substring(0, endTag + 1) + newDateString + string.substring(endData);
                          }
                      }
                  }
              }
          }
          return super.convertString(string);
      }