public static void ReportBuilder(List<ListGrowerTareItem> hdrList, int cropYear, bool isPosted, bool isPreview, bool isHardCopy, bool isEmail,
			bool isFax, FileStream fs, string filePath)
        {
            const string METHOD_NAME = "ReportBuilder";
            const int RESET_FLAG = 0;

            Document document = null;
            PdfWriter writer = null;
            DailyGrowerTareDetailEvent pgEvent = null;
            List<ListGrowerTareItem> emailFaxList = null;
            List<ListGrowerTareItem> hardCopyList = null;

            int lastContractID = 0, lastStationID = 0;
            int index = 0;
            string firstDeliveryDate = "", busName = "", address1 = "", address2 = "", CSZ = "", emailAddress = "", faxNumber = "";

            string rptTitle = "Western Sugar Cooperative\nDaily Grower Tare Detail Report";

            try {

                if (!isPreview) {
                    emailFaxList = hdrList.FindAll(item => item.RptType == "E" || item.RptType == "F");
                    hardCopyList = hdrList.FindAll(item => item.RptType == "M");
                }
                else {
                    // In preview mode we're going to lump these all together and print them.
                    hardCopyList = hdrList;
                }

                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BeetConn"].ToString())) {

                    if (emailFaxList != null && emailFaxList.Count > 0) {
                        GrowerTareReportEmailFax(conn, filePath, ref emailFaxList, rptTitle, cropYear);
                    }

                    for (index = 0; index < hardCopyList.Count; index++) {

                        ListGrowerTareItem hdrItem = hardCopyList[index];

                        //----------------------------------------------------------------
                        // Changed contract or station, start a new print out.
                        //----------------------------------------------------------------
                        if (hdrItem.ContractID != lastContractID || hdrItem.Delivery_Station_ID != lastStationID) {

                            if (document == null) {

                                GetAddressInfo(conn, hdrItem.ContractID, out busName, out address1, out address2, out CSZ,
                                               out emailAddress, out faxNumber);

                                // IF YOU CHANGE MARGINS, CHANGE YOUR TABLE LAYOUTS !!!
                                //  ***  US LETTER: 612 X 792  ***
                                document = new Document(PortraitPageSize.PgPageSize, PortraitPageSize.PgLeftMargin,
                                                        PortraitPageSize.PgRightMargin, PortraitPageSize.PgTopMargin,
                                                        PortraitPageSize.PgBottomMargin);

                                // we create a writer that listens to the document
                                // and directs a PDF-stream to a file
                                writer = PdfWriter.GetInstance(document, fs);

                                // Attach my override event handler(s)
                                pgEvent = new DailyGrowerTareDetailEvent();
                                pgEvent.FillEvent(hdrItem.Contract_No, busName, hdrItem.Delivery_Factory_No, address1, address2, CSZ,
                                                  RESET_FLAG, rptTitle + (!isPreview ? "" : " - " + hdrItem.RptType));
                                writer.PageEvent = pgEvent;

                                // Open the document
                                document.Open();
                            }

                            if (lastContractID != 0) {

                                //--------------------------------------------------------------------------
                                // Display Truck information for the first delivery day.
                                //--------------------------------------------------------------------------
                                int loadCount = 0;
                                //if (nextDeliveryDate == firstDeliveryDate) {

                                try {
                                    // Get the truck data.
                                    SqlParameter[] spParams = null;
                                    using (
                                        SqlDataReader drTrucks = WSCReportsExec.GrowerDetailReportASH(conn,
                                        lastContractID, lastStationID, firstDeliveryDate, ref spParams)) {

                                        rptDailyGrowerTareDetail.AddTruckDetail(ref document, drTrucks, pgEvent);
                                        drTrucks.Close();

                                        loadCount = Convert.ToInt32(spParams[3].Value);

                                        if (loadCount > 0) {

                                            rptDailyGrowerTareDetail.AddTruckTotals(ref document, loadCount.ToString(),
                                                Convert.ToInt32(spParams[4].Value).ToString("#,##0"),
                                                Convert.ToInt32(spParams[5].Value).ToString("#,##0"), pgEvent);
                                        }
                                    }
                                }
                                catch {
                                    hardCopyList[index-1].Success += "Fail: Truck Detail ";
                                }
                                GetAddressInfo(conn, hdrItem.ContractID, out busName, out address1, out address2, out CSZ,
                                               out emailAddress, out faxNumber);

                                // New Page !: in Preview mode, append the report type to the title of the report.
                                pgEvent.FillEvent(hdrItem.Contract_No, busName, hdrItem.Delivery_Factory_No, address1, address2, CSZ,
                                                  RESET_FLAG, rptTitle + (!isPreview ? "" : " - " + hdrItem.RptType));
                                document.NewPage();

                            }

                            firstDeliveryDate = hdrItem.Delivery_Date;
                            lastStationID = hdrItem.Delivery_Station_ID;
                            lastContractID = hdrItem.ContractID;
                        }

                        try {
                            AddSampleHdr(ref document, hdrItem, cropYear, pgEvent);

                            using (
                                SqlDataReader drSamples = WSCReportsExec.GrowerDetailReportTares(conn, hdrItem.ContractID, hdrItem.Delivery_Date)) {
                                rptDailyGrowerTareDetail.AddSampleDetail(ref document, drSamples, pgEvent);
                            }
                        }
                        catch {
                            hardCopyList[index].Success += "Fail: Sample Detail ";
                        }
                    }

                    if (lastContractID != 0) {

                        //--------------------------------------------------------------------------
                        // Display Truck information for the first delivery day.
                        //--------------------------------------------------------------------------
                        int loadCount = 0;

                        try {
                            // Get the truck data.
                            SqlParameter[] spParams = null;
                            using (SqlDataReader drTrucks = WSCReportsExec.GrowerDetailReportASH(conn,
                                lastContractID, lastStationID, firstDeliveryDate, ref spParams)) {

                                rptDailyGrowerTareDetail.AddTruckDetail(ref document, drTrucks, pgEvent);
                                drTrucks.Close();

                                loadCount = Convert.ToInt32(spParams[3].Value);

                                if (loadCount > 0) {

                                    rptDailyGrowerTareDetail.AddTruckTotals(ref document, loadCount.ToString(),
                                        Convert.ToInt32(spParams[4].Value).ToString("#,##0"), Convert.ToInt32(spParams[5].Value).ToString("#,##0"),
                                        pgEvent);
                                }
                            }
                        }
                        catch {
                            hardCopyList[index-1].Success += "Fail: Truck Detail ";
                        }
                    }
                }

                //------------------------------------
                // Print a Process Summary
                //------------------------------------
                if (document != null && writer != null) {

                    pgEvent.IsSummary = true;
                    document.NewPage();

                    PdfPTable procSumTab = null;
                    PrintSummary(document, ref procSumTab, hdrList, isPreview);
                    PdfReports.AddTableNoSplit(document, pgEvent, procSumTab);

                } else {

                    document = new Document(PortraitPageSize.PgPageSize, PortraitPageSize.PgLeftMargin,
                                            PortraitPageSize.PgRightMargin, PortraitPageSize.PgTopMargin,
                                            PortraitPageSize.PgBottomMargin);

                    // we create a writer that listens to the document
                    // and directs a PDF-stream to a file
                    writer = PdfWriter.GetInstance(document, fs);

                    // Attach my override event handler(s)
                    pgEvent = new DailyGrowerTareDetailEvent();
                    pgEvent.IsSummary = true;
                    writer.PageEvent = pgEvent;

                    // Open the document
                    document.Open();

                    PdfPTable procSumTab = null;
                    PrintSummary(document, ref procSumTab, hdrList, isPreview);
                    PdfReports.AddTableNoSplit(document, pgEvent, procSumTab);
                }

            // ======================================================
                // Close document
                // ======================================================
                if (document != null) {
                    pgEvent.IsDocumentClosing = true;
                    document.Close();
                    document = null;
                }
            }
            catch (Exception ex) {
                string errMsg = "document is null: " + (document == null).ToString() + "; " +
                    "writer is null: " + (writer == null).ToString();
                CException wscex = new CException(METHOD_NAME + errMsg, ex);
                throw (wscex);
            }
            finally {

                if (document != null) {
                    pgEvent.IsDocumentClosing = true;
                    document.Close();
                }
                if (writer != null) {
                    writer.Close();
                }
            }
        }
        private static void PrintSummary(Document document, ref PdfPTable table, List<ListGrowerTareItem> hdrList, bool isPreview)
        {
            table = PdfReports.CreateTable(_processSummaryLayout, 1);
            Paragraph p;
            Phrase ph;

            if (isPreview) {
                p = new Paragraph("Note: Preview mode was active, so all documents were printed and none were emailed or faxed.\n\n", _normalFont);
                PdfReports.AddText2Table(table, p);
            }

            //-------------------
            // Printed
            //-------------------
            string prefixSep = "";
            Font font = _normalFont;
            p = new Paragraph("\nPrinted:\n", _labelFont);

            var mailList = hdrList.FindAll(item => item.RptType == "M");
            foreach (ListGrowerTareItem item in mailList) {

                if (String.IsNullOrEmpty(item.Success)) {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " + DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + ")", _normalFont);
                } else {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " +
                        DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + " : " + item.Success + ")", _failFont);
                }

                p.Add(ph);

                if (prefixSep.Length == 0) {
                    prefixSep = ", ";
                }
            }
            PdfReports.AddText2Table(table, p);

            //-------------------
            // Email
            //-------------------
            prefixSep = "";
            p = new Paragraph("\nEmail:\n", _labelFont);

            var emailList = hdrList.FindAll(item => item.RptType == "E");
            foreach (ListGrowerTareItem item in emailList) {

                if (String.IsNullOrEmpty(item.Success)) {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" + item.Delivery_Station_No + ": " +
                    DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + ")", _normalFont);
                } else {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " +
                        DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + " : " + item.Success + ")", _failFont);
                }

                p.Add(ph);

                if (prefixSep.Length == 0) {
                    prefixSep = ", ";
                }
            }
            PdfReports.AddText2Table(table, p);

            //-------------------
            // Fax
            //-------------------
            prefixSep = "";
            p = new Paragraph("\nFax:\n", _labelFont);

            var faxList = hdrList.FindAll(item => item.RptType == "F");
            foreach (ListGrowerTareItem item in faxList) {

                if (String.IsNullOrEmpty(item.Success)) {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " + DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + ")", _normalFont);
                } else {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " +
                        DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + " : " + item.Success + ")", _failFont);
                }

                p.Add(ph);

                if (prefixSep.Length == 0) {
                    prefixSep = ", ";
                }
            }
            PdfReports.AddText2Table(table, p);

            //-------------------
            // Web View by Member
            //-------------------
            prefixSep = "";
            p = new Paragraph("\nMember Web View (WSCI):\n", _labelFont);

            var webList = hdrList.FindAll(item => item.RptType == "W");
            foreach (ListGrowerTareItem item in webList) {

                if (String.IsNullOrEmpty(item.Success)) {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " + DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + ")", _normalFont);
                } else {
                    ph = new Phrase(prefixSep + item.Contract_No + " (" +
                        item.Delivery_Station_No + ": " +
                        DateTime.Parse(item.Delivery_Date).ToString("MM/dd") + " : " + item.Success + ")", _failFont);
                }

                p.Add(ph);

                if (prefixSep.Length == 0) {
                    prefixSep = ", ";
                }
            }

            PdfReports.AddText2Table(table, p);
        }