private void handleGridHeaderClick(object sender, Infragistics.Win.UltraWinGrid.BandEventArgs e_)
    {
      if (e_.Band.SortedColumns.Count == 0)
        return;

      string key = e_.Band.SortedColumns[0].Key;

      switch (key)
      {
        case "Perf1Day": m_focus = SI.ReturnsEval.EvalComparer.TDType.OneDay; break;
        case "PerfWTD": m_focus = SI.ReturnsEval.EvalComparer.TDType.WeekToDate; break;
        case "PerfMTD": m_focus=SI.ReturnsEval.EvalComparer.TDType.MonthToDate; break;
        case "PerfQTD": m_focus = SI.ReturnsEval.EvalComparer.TDType.QuarterToDate; break;
        case "PerfYTD": m_focus = SI.ReturnsEval.EvalComparer.TDType.YearToDate; break;
        case "PerfCTD": m_focus = SI.ReturnsEval.EvalComparer.TDType.CustomToDate; break;
        case "PerfInception": m_focus = SI.ReturnsEval.EvalComparer.TDType.Inception; break;
        case "PerfOneYear": m_focus = SI.ReturnsEval.EvalComparer.TDType.OneYear; break;
        case "PerfTwoYear": m_focus = SI.ReturnsEval.EvalComparer.TDType.TwoYear; break;
      }
      reloadCumulatives();
      reloadRollingSeries();
    }
    public void DoEmail(string subject_, string fromAddress_, List<string> recipients_, List<string> dailyAttInc_, List<string> mtdAttInc_, AddToEmailDelegate adder_)
    {
      MailMessage msg = new MailMessage();
      msg.From = new MailAddress(fromAddress_);
      msg.Subject = subject_;
      foreach (string f in recipients_)
        msg.To.Add(new MailAddress(f));
      msg.IsBodyHtml = true;

      StringBuilder bodyBuilder = new StringBuilder();
      bodyBuilder.Append(string.Format("Model performance as of fix on {0}<p/>", m_comp.AsOfDate.ToString("dd-MMM-yyyy")));
      //bodyBuilder.Append(SI.BindingListExtensions.ToHTML<PerfRow>(m_perfRows));
      bodyBuilder.Append("<p/>");

      Dictionary<string, string> mapOfResources = new Dictionary<string, string>();
      string path, key;

      m_focus = SI.ReturnsEval.EvalComparer.TDType.MonthToDate;
      reloadCumulatives();
      path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
      path = path + "\\" + string.Format("{0}_cumPnls", DateTime.Today.ToString("ddMMyy"));
      dataCollectionDisplay1.Chart.SaveTo(path, System.Drawing.Imaging.ImageFormat.Bmp);
      key = "CumPnl";
      LinkedResource res = new LinkedResource(path);
      res.ContentId = key;
      mapOfResources.Add(key, path);
      bodyBuilder.Append(string.Format("MTD Cumulative Pnls:<br/> <img src=cid:{0}><p/>", key));
      

      if (dailyAttInc_ != null)
        foreach (string stratName in dailyAttInc_)
        {
          ReturnsEval.DataSeriesEvaluator e = m_comp.FindEval(stratName);
          if (e == null) continue;
          e.Evaluate(m_comp.GetDate(SI.ReturnsEval.EvalComparer.TDType.OneDay), m_comp.AsOfDate);
          innerTotalReturnAttributionDisplayChart1.Bind(e, SI.ReturnsEval.Period.Daily);
          path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
          path = path + "\\" + string.Format("{0}_1D_{1}.bmp", e.Name, DateTime.Today.ToString("ddMMyy"));
          innerTotalReturnAttributionDisplayChart1.Chart.SaveTo(path, System.Drawing.Imaging.ImageFormat.Bmp);
          key = string.Format("{0}_1D", e.Name);
          bodyBuilder.Append(string.Format("{0} 1D attribution:<br/> <img src=cid:{1}><p/>", e.Name, key));
          mapOfResources.Add(key, path);
        }

      if (mtdAttInc_ != null)
        foreach (string stratName in mtdAttInc_)
        {
          ReturnsEval.DataSeriesEvaluator e = m_comp.FindEval(stratName);
          if (e == null) continue;
          e.Evaluate(m_comp.GetDate(SI.ReturnsEval.EvalComparer.TDType.MonthToDate), m_comp.AsOfDate);
          innerTotalReturnAttributionDisplayChart1.Bind(e, SI.ReturnsEval.Period.Daily);
          path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
          path = path + "\\" + string.Format("{0}_MTD_{1}.bmp", e.Name, DateTime.Today.ToString("ddMMyy"));
          innerTotalReturnAttributionDisplayChart1.Chart.SaveTo(path, System.Drawing.Imaging.ImageFormat.Bmp);
          key = string.Format("{0}_MTD", e.Name);
          bodyBuilder.Append(string.Format("{0} MTD attribution:<br/> <img src=cid:{1}><p/>", e.Name, key));
          mapOfResources.Add(key, path);
        }

      bodyBuilder.Append(string.Format("<p/>Correlation matrix over {0} days:<br/>", m_comp.CorrelWindow.ToString()));
      bodyBuilder.Append(SI.DatatableToHtml.ConvertToHTML(dtCorrels, "##0.00%;(##0.00%);-"));

      //bodyBuilder.AppendLine(string.Format("Generated by process run by '{0}'<br/>", Common.InvestmentTeam.GetCurrentUserInfo().FullName));

      if (adder_ != null)
        adder_(bodyBuilder);

      AlternateView htmlView = AlternateView.CreateAlternateViewFromString(bodyBuilder.ToString(), null, "text/html");
      foreach (string k in mapOfResources.Keys)
      {
        LinkedResource lr = new LinkedResource(mapOfResources[k]);
        lr.ContentId = k;
        htmlView.LinkedResources.Add(lr);
      }
      msg.AlternateViews.Add(htmlView);
      //msg.Body = bodyBuilder.ToString();
      Emailer.GetClient().Send(msg);
    }
    public virtual void Create(IList<ReturnsEval.DataSeriesEvaluator> evals_,SI.ReturnsEval.EvalComparer.TDType initialFocus_=ReturnsEval.EvalComparer.TDType.Inception)
    {
      hideInnerAttributionPanel(do_: true);
      m_focus = initialFocus_;

      m_comp = new ReturnsEval.EvalComparer();
      m_comp.Create(evals_);

      m_workingEval = new ReturnsEval.DataSeriesEvaluator("working", ReturnsEval.DataSeriesType.Returns);
      for (int i = 0; i < evals_.Count; ++i)
        m_workingEval.AddInnerSeries(m_comp.PnlConstruct.Dates.ToArray(), m_comp.PnlConstruct.GetColumnValues(i), evals_[i].Name);
      m_workingEval.Evaluate();

      dateTimePickerAsOfDate.Value = m_comp.AsOfDate;
      dateTimePickerAsOfDate.ValueChanged += dateTimePickerAsOfDate_ValueChanged;
      dateTimePickerCustomStartDate.Value = m_comp.CustomStartDate;
      dateTimePickerCustomStartDate.ValueChanged += dateTimePickerCustomStartDate_ValueChanged;

      //dateTimePickerAsOfDate.DataBindings.Add("Value", m_comp, "AsOfDate", false, DataSourceUpdateMode.OnPropertyChanged);

      m_comp.PropertyChanged += handleCompChanged;

      reloadPerf();
      //reloadCorrels();

      gridPerf.ColourNegativesRed();
      gridPerf.Bind(m_perfRows, typeof(PerfRow));
      gridPerf.AutoSizeGridColumns();

      reloadCumulatives();

      setHeaderClickAction(doSort_: false);
      gridPerf.AddClickHandler("Perf1Day", new SI.Controls.RowClickedEventHandler(handle1DClicked));
      gridPerf.AddClickHandler("PerfWTD", new SI.Controls.RowClickedEventHandler(handleWTDClicked));
      gridPerf.AddClickHandler("PerfMTD", new SI.Controls.RowClickedEventHandler(handleMTDClicked));
      gridPerf.AddClickHandler("PerfYTD", new SI.Controls.RowClickedEventHandler(handleYTDClicked));
      gridPerf.AddClickHandler("PerfQTD", new SI.Controls.RowClickedEventHandler(handleQTDClicked));
      gridPerf.AddClickHandler("PerfInception", new SI.Controls.RowClickedEventHandler(handleInceptionClicked));
      gridPerf.AddClickHandler("PerfCTD", new SI.Controls.RowClickedEventHandler(handleCTDClicked));
      gridPerf.AddClickHandler("RVS_21", new SI.Controls.RowClickedEventHandler(handleRVSSharpeClicked));
      gridPerf.AddClickHandler("StrategyName", new SI.Controls.RowClickedEventHandler(handleStratNameClicked));
      gridPerf.AddClickHandler("PerfOneYear", new SI.Controls.RowClickedEventHandler(handle1YClicked));
      gridPerf.AddClickHandler("PerfTwoYear", new SI.Controls.RowClickedEventHandler(handle2YClicked));
      gridPerf.AddClickHandler("Selected", new SI.Controls.RowClickedEventHandler(handleSelectedClicked));
      gridPerf.AddClickHandler("DD", new SI.Controls.RowClickedEventHandler(handleDDClicked));
      innerTotalReturnAttributionDisplayChart1.Chart.EmptyChartText = "Click Strategy period to show attribution";

      tbWinLength.Bind(m_extraArgs, "RetVolSharpeWindowLength", new Validators.IntValidator());
      tbRollVolWin.Bind(m_extraArgs, "RollingWindowLength", new Validators.IntValidator());
      tbCorrWin.Bind(m_comp, "CorrelWindow", new Validators.IntValidator());
      cmbRollType.AddItems(typeof(ReturnsEval.RollingSeriesType));
      cmbRollType.Bind(m_extraArgs, "RollingSeriesType", new Validators.EnumDescValidator(ReturnsEval.RollingSeriesType.Vol));
      m_extraArgs.PropertyChanged += handleExtraArgsChanged;

      gridCorrs.ColourNegativesRed();
      gridPerf.Grid.DisplayLayout.Override.RowSelectors = Infragistics.Win.DefaultableBoolean.False;

      innerTotalReturnAttributionDisplayChart1.DataClicked += handleDataClicked;

      periodReturnsColumnChart1.ColumnClicked += handlePeriodReturnsChartClicked;
      periodReturnsColumnChart2.ColumnClicked += handlePeriodReturnsChartClicked;

      gridPerf.RowRightClicked += (a, b) =>
      {
        var pr = b.ListObject as PerfRow;
        if (pr == null) return;
        getContextMenu().Items.Clear();
        getContextMenu().Items.Add(new StrategyPnlDetailMenuItem(pr.StrategyName.Name, m_comp.FindEval(pr.StrategyName.Name),m_comp.GetDate(m_focus)));
        getContextMenu().Show(Cursor.Position);
      };
    }