public Section(string groupBy, string titlePrefix)
 {
     GroupBy = groupBy;
     TitlePrefix = titlePrefix;
     SubSection = null;
     BackColor = Color.FromArgb(240,240,240);
     ChartValueField="Count";
     GradientBackground = false;
     ChartTitle = " ";
 }
 public Section(string groupBy, string titlePrefix, Color bgcolor)
 {
     GroupBy = groupBy;
     TitlePrefix = titlePrefix;
     SubSection = null;
     BackColor = bgcolor;
     ChartValueField="Count";
     GradientBackground = false;
     ChartTitle = " ";
 }
 /// <summary>
 /// Generates all section contents
 /// </summary>
 private void WriteSections()
 {
     if(sections.Count == 0)
     {
         Section dummySection = new Section();
         dummySection.Level=5;
         dummySection.ChartChangeOnField = this.ChartChangeOnField;
         dummySection.ChartLabelHeader = this.ChartLabelHeader;
         dummySection.ChartPercentageHeader = this.ChartPercentageHeader;
         dummySection.ChartShowAtBottom = this.ChartShowAtBottom;
         dummySection.ChartShowBorder = this.ChartShowAtBottom;
         dummySection.ChartTitle = this.ChartTitle;
         dummySection.ChartValueField = this.ChartValueField;
         dummySection.ChartValueHeader = this.ChartValueHeader;
         dummySection.IncludeChart = this.IncludeChart;
         htmlContent.Append("<TABLE Width='100%' class='TableStyle'  cellspacing=0 cellpadding=5 border=0>" + newline);
         if(this.IncludeChart && !this.ChartShowAtBottom)
             GenerateBarChart("",dummySection);
         Hashtable total = WriteSectionDetail(null,"");
         if(this.IncludeTotal)
         {
             dummySection.IncludeTotal = true;
             WriteSectionFooter(dummySection, total);
         }
         if(this.IncludeChart && this.ChartShowAtBottom)
             GenerateBarChart("",dummySection);
         htmlContent.Append("</TABLE></BODY></HTML>");
     }
     foreach(Section section in sections)
     {
         iLevel = 0;
         htmlContent.Append("<TABLE Width='100%' class='TableStyle'  cellspacing=0 cellpadding=5 border=0>" + newline);
         RecurseSections(section,"");
         htmlContent.Append("</TABLE></BODY></HTML>");
     }
 }
 public Section()
 {
     SubSection = null;
     BackColor = Color.FromArgb(240,240,240);
     ChartValueField="Count";
     GradientBackground = false;
     ChartTitle = "&nbsp;";
 }
        /// <summary>
        /// Writes the section header information.
        /// </summary>
        /// <param name="section">The section details as Section object</param>
        /// <param name="sectionValue">section group field data</param>
        private void WriteSectionHeader(Section section, string sectionValue)
        {
            string bg = section.backColor;
            string style = " style=\"font-family: " + ReportFont + "; font-weight:bold; font-size:";
            style += getFontSize(section.Level);
            if(section.GradientBackground)
                style += "; " + gradientStyle.Replace("BackColor",bg) + "\"";
            else style += "\" bgcolor='" + bg + "' ";

            htmlContent.Append("<TR><TD colspan='" + this.ReportFields.Count + "' " + style + " >");
            htmlContent.Append(section.TitlePrefix + sectionValue);
            htmlContent.Append("</TD></TR>" + newline);
        }
 /// <summary>
 /// Method to write section footer information.
 /// </summary>
 /// <param name="section">The section details</param></param>
 private void WriteSectionFooter(Section section, Hashtable totalArray)
 {
     string cellParams = "";
     //Include Total row if specified.
     if(section.IncludeTotal)
     {
         htmlContent.Append("<TR>" + newline);
         foreach(Field field in this.reportFields)
         {
             cellParams="";
             if(field.Width != 0)
                 cellParams += " WIDTH=" + field.Width + " ";
             cellParams += " style=\"font-family: " + ReportFont + "; font-size:";
             cellParams += getFontSize(section.Level+1) + "; border-style:outline; border-width:1 \" ";
             if(totalArray.Contains(field.FieldName))
             {
                 htmlContent.Append("  <TD " + cellParams + " align='right'><u>Total: " + totalArray[field.FieldName].ToString() + "</u></TD> " + newline);
             }
             else
             {
                 htmlContent.Append("  <TD " + cellParams + ">&nbsp;</TD>" + newline);
             }
         }
         htmlContent.Append("</TR>");
     }
 }
        /// <summary>
        /// Method to write Chart and Section data information
        /// </summary>
        /// <param name="section">the section details</param>
        /// <param name="criteria">the section selection criteria</param>
        private Hashtable WriteSectionDetail(Section section, string criteria)
        {
            Hashtable totalArray = new Hashtable();
            totalArray = PrepareData(totalArray);
            if(section == null)
            {
                section = new Section();
            }
            try
            {
                //Draw DetailHeader
                htmlContent.Append("<TR>" + newline);
                string cellParams="";
                foreach(Field field in this.reportFields)
                {
                    cellParams=" bgcolor='" + field.headerBackColor + "' ";
                    if(field.Width != 0)
                        cellParams += " WIDTH=" + field.Width + " ";
                    cellParams += " ALIGN='" + field.alignment + "' ";
                    htmlContent.Append("  <TD " + cellParams + " class='ColumnHeaderStyle'><b>" + field.HeaderName + "</b></TD>" + newline);
                }
                htmlContent.Append("</TR>" + newline);

                //Draw Data
                if(criteria==null || criteria.Trim() == "")
                    criteria = "";
                else
                    criteria = criteria.Substring(3);

                foreach(DataRow dr in reportSource.Tables[0].Select(criteria))
                {
                    htmlContent.Append("<TR>" + newline);
                    foreach(Field field in this.reportFields)
                    {
                        cellParams=" bgcolor='" + field.backColor + "' ";
                        if(field.Width != 0)
                            cellParams += " WIDTH=" + field.Width + " ";
                        //if total field, by default set to RIGHT align.
                        if(this.TotalFields.Contains(field.FieldName))
                            cellParams += " align='right' ";
                        cellParams += " ALIGN='" + field.alignment + "' ";
                        htmlContent.Append("  <TD " + cellParams + " VALIGN='top' class='DetailData'>" + dr[field.FieldName] + "</TD>" + newline);
                    }
                    htmlContent.Append("</TR>" + newline);
                    try
                    {
                        foreach(object totalField in TotalFields)
                        {
                            totalArray[totalField.ToString()] = float.Parse(totalArray[totalField.ToString()].ToString()) +
                                float.Parse(dr[totalField.ToString()].ToString());
                        }
                    }
                    catch(Exception exp)
                    {
                        ;//to-do: show error message at total field
                    }
                }
            }
            catch(Exception err)
            {
                htmlContent.Append("<p align=CENTER><b>Unable to generate report.<br>" + err.Message + "</b></p>");
            }
            return totalArray;
        }
        /// <summary>
        /// A recursive funtion to write all the section headers, details and footer content.
        /// </summary>
        /// <param name="section">the section details</param>
        /// <param name="criteria">section data selection criteria</param>
        private Hashtable RecurseSections(Section section, string criteria)
        {
            iLevel++;
            section.Level = iLevel;
            ArrayList result = GetDistinctValues(this.reportSource, section.GroupBy, criteria);
            Hashtable ht = new Hashtable();
            PrepareData(ht);
            foreach(object obj in result)
            {
                Hashtable sectionTotal = new Hashtable();
                PrepareData(sectionTotal);
                //Construct critiera string to select data for the current section
                string tcriteria = criteria + "and " + section.GroupBy + "='"+ obj.ToString().Replace("'","''") + "' ";
                WriteSectionHeader(section, obj.ToString());
                //If user not specified to display chart at bottom of the section
                if(section.IncludeChart && !section.ChartShowAtBottom && !section.isChartCreated)
                    GenerateBarChart(tcriteria, section);
                if(section.SubSection != null)
                {
                    sectionTotal = RecurseSections(section.SubSection, tcriteria);
                    iLevel--;
                }
                else
                {
                    sectionTotal = WriteSectionDetail(section, tcriteria);
                    ht = AccumulateTotal(ht, sectionTotal);
                }
                //If user specified to display chart at bottom of the section
                WriteSectionFooter(section,sectionTotal);
                if(section.IncludeChart && section.ChartShowAtBottom  && !section.isChartCreated)
                    GenerateBarChart(tcriteria, section);
                section.isChartCreated = false;
            }
            if(section.Level < 2)
                htmlContent.Append("<TR><TD colspan='" + this.ReportFields.Count + "'>&nbsp;</TD></TR>");

            return ht;
        }
        /// <summary>
        /// Method to generate BarChart
        /// </summary>
        /// <param name="criteria">Section data selection criteria</param>
        /// <param name="changeOnField">Y-Axis data field</param>
        /// <param name="valueField">X-Axis data field (Send "count" as value for reporting record count)</param>
        /// <param name="showBorder">Enable or disable chart border</param>
        private void GenerateBarChart(string criteria, Section section)
        {
            string changeOnField = section.ChartChangeOnField;
            string valueField = section.ChartValueField;
            bool showBorder = section.ChartShowBorder;
            section.isChartCreated = true;
            string[] colors = {"#ff0000","#ffff00","#ff00ff","#00ff00","#00ffff","#0000ff","#ff0f0f","#f0f000","#ff00f0","#0f00f0"};
            htmlContent.Append("<TR><TD colspan='" + this.ReportFields.Count + "' align=CENTER>" + newline);
            htmlContent.Append("<!--- Chart Table starts here -->" + newline);
            if(showBorder)
            {
                htmlContent.Append("<TABLE cellpadding=4 cellspacing=1 border=0 bgcolor='#f5f5f5' width=550> ");
            }
            else
            {
                htmlContent.Append("<TABLE border=0 cellspacing=5 width=550>");
            }
            if(criteria.ToUpper().StartsWith(" AND "))
            {
                criteria = criteria.Substring(3);
            }
            try
            {
                ArrayList result = GetDistinctValuesForChart(this.reportSource, criteria, changeOnField, valueField);
                ArrayList labels = (ArrayList)result[0];
                ArrayList values = (ArrayList)result[1];
                float total = 0;
                foreach(Object obj in values)
                {
                    total += float.Parse(obj.ToString());
                }
                int ChartWidth = 300;

                string barTitle = "<TR><TD class='DetailHeader' colspan=3 align='CENTER' width=550><B>ChartTitle</B></TD></TR>";
                htmlContent.Append(barTitle.Replace("ChartTitle",section.ChartTitle) + newline);

                string barTemplate = "<TR><TD Width=150 class='DetailData' align='right'>Label</TD>" + newline;
                barTemplate += " <TD  class='DetailData' Width=" + (ChartWidth+25) + ">" + newline;
                barTemplate += "    <TABLE cellpadding=0 cellspacing=0 HEIGHT='20' WIDTH=" + ChartWidth + " class='TableStyle'>" + newline;
                barTemplate += "       <TR>" + newline;
                barTemplate += "          <TD Width=ChartWidth>" + newline;
                barTemplate += "             <TABLE class='TableStyle' HEIGHT='20' Width=ChartTWidth border=NOTZERO>" + newline;
                barTemplate += "                <TR>" + newline;
                barTemplate += "                   <TD Width=ChartWidth bgcolor='BackColor' Width=ChartWidth style=\"FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=BackColor,endColorStr=#ffffff); \"></TD>" + newline;
                barTemplate += "                </TR>" + newline;
                barTemplate += "             </TABLE>" + newline;
                barTemplate += "          </TD>" + newline;
                barTemplate += "          <TD class='DetailData'>&nbsp;Percentage</TD>" + newline;
                barTemplate += "       </TR>" + newline;
                barTemplate += "    </TABLE>";
                barTemplate += "</TD><TD Width=70 class='DetailData'>Value</TD></TR>";

                string	barHTemplate = "<TR>" + newline;
                barHTemplate += " <TD Width=150  class='DetailData' align='right' bgColor='#e5e5e5'>Label</TD>" + newline;
                barHTemplate += " <TD  bgColor='#e5e5e5' class='DetailData' Width=" + (ChartWidth+25) + ">";
                barHTemplate += "Percentage</TD>" + newline;
                barHTemplate += " <TD Width=25  class='DetailData' bgColor='#e5e5e5'>Value</TD></TR>";
                barHTemplate = barHTemplate.Replace("Label",section.ChartLabelHeader);
                barHTemplate = barHTemplate.Replace("Percentage",section.ChartPercentageHeader);
                barHTemplate = barHTemplate.Replace("Value",section.ChartValueHeader);
                htmlContent.Append(barHTemplate + newline);

                string temp;
                float width = 0;
                float val = 0;
                float percent = 0;
                int cntColor = 0;
                for(int i=0; i<labels.Count; i++)
                {
                    temp = barTemplate;
                    val = float.Parse(values[i].ToString());
                    width = float.Parse(values[i].ToString()) * ChartWidth / total;
                    percent = float.Parse(values[i].ToString()) * 100 / total;

                    temp = temp.Replace("Label", labels[i].ToString());
                    if(percent == 0.0)
                    {
                        temp = temp.Replace("BackColor", "#f5f5f5");
                        temp = temp.Replace("NOTZERO","0");
                    }
                    else
                    {
                        temp = temp.Replace("BackColor", colors[cntColor]);
                        temp = temp.Replace("NOTZERO","1");
                    }
                    temp = temp.Replace("ChartTWidth", Decimal.Round((Decimal)(width+2),0).ToString());
                    temp = temp.Replace("ChartWidth", Decimal.Round((Decimal)width,0).ToString());
                    temp = temp.Replace("Value", val.ToString());
                    temp = temp.Replace("Percentage", Decimal.Round((decimal)percent,2).ToString() + "%");

                    htmlContent.Append(temp + newline);
                    cntColor++;
                    if(cntColor==10)
                        cntColor = 0;
                }
            }
            catch(Exception err)
            {
                htmlContent.Append("<TR><TD valign=MIDDLE align=CENTER><b>Unable to Generate Chart.<br>" + err.Message + "</b></TD></TR>");
            }
            htmlContent.Append("</TABLE>" + newline);
            htmlContent.Append("<!--- Chart Table ends here -->");
            htmlContent.Append("</TD></TR>");
        }