private static StringBuilder GetParametersForTemplate(ReportTask task)
        {
            ReportDef rdef = task.Definition;
            NotificationDef ndef = task.Notification;

            Dictionary<string, string> map = rdef.ReportParameters.KeyStringMap(false);
            IDictionary newmap = new HybridDictionary(false);
            foreach (string key in map.Keys)
                newmap[key + '$'] = map[key]; // $=indicate that value has to be interpreted as string
            string typedReportParameters = newmap.KeyValueString();
            _Log.InfoFormat("Typed Report Parameters = {0}", typedReportParameters);

            TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(task.TimeZoneID);

            StringBuilder sb = new StringBuilder()
                .AppendKV("StartTime", TimeZoneInfo.ConvertTimeToUtc(task.StartTime, tzi))
                .AppendKV("Priority", ndef.Priority)
                .AppendKV("FirstDay", TimeZoneInfo.ConvertTimeToUtc(rdef.PeriodBegin, tzi), "z")
                .AppendKV("LastDay", TimeZoneInfo.ConvertTimeToUtc(rdef.PeriodEnd.AddHours(-3).Date, tzi), "z")
                // make sure before midnight, then take Date
                .AppendKV("Offset", rdef.Offset)
                .AppendKV("Scale", rdef.TimeScale.ToString())
                .AppendKV("Locale", rdef.Locale)
                .AppendKV("RepDesc", rdef.Description ?? "")
                .AppendKV("Format", rdef.RenderFormat.ToString())
                .AppendKV("UnitSys", CultureHelper.EnglishNameExtended(rdef.UnitSystemID))
                .Append("||").Append(typedReportParameters); // report specific parameters are concatenated here
            return sb;
        }