/*------------------------------------------------------------------------------
      Author: Speedy Mercer
     Purpose: Compare 2 dRightFromte ranges.
  Parameters: INPUT  LeftFrom  AS DATE
              INPUT  LeftTo    AS DATE
              INPUT  RightFrom AS DATE
              INPUT  RightTo   AS DATE
              OUTPUT Result    AS CHARACTER
       Notes: Result: "BEFORE", "AFTER", "EQUAL", "OVERLAP", "{Error Mesage}".
              Valid for all date values and ?.
   Thanks To: Jeff Pilant for suggesting and providing verbose comments and 
              reworking the code to allow for any date.
------------------------------------------------------------------------------*/
   DEFINE INPUT  PARAMETER dLeftFrom  AS DATE        NO-UNDO.
   DEFINE INPUT  PARAMETER dLeftTo    AS DATE        NO-UNDO.
   DEFINE INPUT  PARAMETER dRightFrom AS DATE        NO-UNDO.
   DEFINE INPUT  PARAMETER dRightTo   AS DATE        NO-UNDO.
   DEFINE OUTPUT PARAMETER cResult    AS CHARACTER   NO-UNDO.

   /* If From and To are defined, require From < To */
   IF (dLeftFrom  <> ? AND dLeftTo  <> ? AND dLeftFrom  > dLeftTo)
   OR (dRightFrom <> ? AND dRightTo <> ? AND dRightFrom > dRightTo)
   THEN DO:
      ASSIGN cResult = "ERROR!" + CHR(13) 
                     + "FROM From times must be Before the TO times!".
      RETURN.
   END.

   /* Simple equality check */
   IF  dLeftFrom = dRightFrom
   AND dLeftTo   = dRightTo
   THEN DO:
      ASSIGN cResult = "EQUAL":U.
      RETURN.
   END.

   /* if both ends of either range are undefined then overlap */
   IF (dLeftFrom  = ? AND dLeftTo  = ?)
   OR (dRightFrom = ? AND dRightTo = ?)
   THEN DO:
      ASSIGN cResult = "OVERLAP":U.
      RETURN.
   END.
   
   /* Test if the left To is before the right From */
   IF  dLeftTo    <> ? 
   AND dRightFrom <> ? 
   AND dLeftTo    <  dRightFrom 
   THEN DO:
      ASSIGN cResult = "BEFORE":U.
      RETURN.
   END.

   /* Test if the left From is after the right To */
   IF  dLeftFrom <> ? 
   AND dRightTo  <> ? 
   AND dLeftFrom >  dRightTo
   THEN DO:
      ASSIGN cResult = "AFTER":U.
      RETURN.
   END.

   /* OverLap Check */
   IF (dLeftTo   <> ? AND dRightFrom <> ? AND dLeftTo   > dRightFrom)
   OR (dLeftFrom <> ? AND dRightTo   <> ? AND dLeftFrom < dRightTo)
   THEN DO:
      ASSIGN cResult = "OVERLAP":U.
      RETURN.
   END.

   /* You should NEVER get here! */
   ASSIGN cResult = "Unexpected error! Condition not allowed for!"
                  + CHR(13) + STRING(dLeftFrom, "99/99/9999") + " - " 
                  + STRING(dLeftTo, "99/99/9999") + CHR(13) 
                  + STRING(dRightFrom, "99/99/9999") + " - " 
                  + STRING(dRightTo, "99/99/9999").
