/// <summary>
        /// Creates a relative date expression with symbol scope, context, script refernce set.
        /// The date expression can handle relative dates: 3rd monday of january
        /// </summary>
        /// <param name="daysAway">The number of days away.</param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static Expr Duration(string duration, string mode, TokenData token)
        {
            var exp = new DurationExpr();

            exp.Duration = duration;
            exp.Mode     = mode;
            SetupContext(exp, token);
            return(exp);
        }
        /// <summary>
        /// Executes the days away expresssion to get a date x days away.
        /// </summary>
        /// <param name="expr"></param>
        /// <returns></returns>
        public object VisitDuration(DurationExpr expr)
        {
            var name = expr.Duration;
            var num  = 0.0;

            // Case 1: daysAhead days away
            if (this.Ctx.Symbols.Contains(name))
            {
                var variable = this.Ctx.Memory.Get <object>(name) as LObject;
                if (variable.Type != LTypes.Number)
                {
                    throw new LangException("TypeError", "Days away must of type of number", expr.Ref.ScriptName, expr.Ref.Line, expr.Ref.CharPos);
                }
                num = ((LNumber)variable).Value;
            }

            // Case 2: 3 days away
            else
            {
                num = Convert.ToInt32(name);
            }

            // Now convert to relative "days away".
            TimeSpan duration = TimeSpan.MinValue;
            var      mode     = expr.Mode.ToLower();

            if (mode == "days")
            {
                duration = new TimeSpan(Convert.ToInt32(num), 0, 0, 0);
            }
            if (mode == "hours")
            {
                duration = new TimeSpan(0, Convert.ToInt32(num), 0, 0);
            }
            if (mode == "minutes")
            {
                duration = new TimeSpan(0, 0, Convert.ToInt32(num), 0);
            }
            if (mode == "seconds")
            {
                duration = new TimeSpan(0, 0, 0, Convert.ToInt32(num));
            }
            return(new LTime(duration));
        }
 public object VisitDuration(DurationExpr expr)
 {
     return(null);
 }