Пример #1
0
        public static TrainingPage NextTrainingPage(long previousPageID, long pagesSinceScoreBoard, Agent objAgent, Campaign campaign, TrainingScheme trainingScheme)
        {
            // Choose next page randomly for now, algorithm will go here for later phase ***
            // Add WS load up list, return data set, choose from those available, not previous
            // Need to grab pages from all active schemes automatically

            DataSet         dsTrainingPages;
            CampaignService srvCampaign       = new CampaignService();
            TrainingPage    tpPage            = new TrainingPage();
            bool            scoreboardTime    = false;
            bool            isPageValid       = false;
            int             triesForValidPage = 0;

            if (pagesSinceScoreBoard >= trainingScheme.ScoreboardFrequency)
            {
                scoreboardTime       = true;
                pagesSinceScoreBoard = 0;
            }
            else
            {
                pagesSinceScoreBoard++;
            }

            ActivityLogger.WriteAgentEntry(objAgent, "Training module determining next page to build. {0} pages since last scoreboard, which is set to display every {1} pages.", pagesSinceScoreBoard, trainingScheme.ScoreboardFrequency);

            try
            {
                if (scoreboardTime)
                {
                    tpPage.PageID       = 0;
                    tpPage.DisplayTime  = 20;
                    tpPage.Content      = BuildScoreboardContent(campaign, objAgent.AgentID);
                    tpPage.Name         = "Scoreboard";
                    tpPage.IsScoreBoard = true;
                }
                else
                {
                    while (!isPageValid && triesForValidPage < 5)
                    {
                        XmlDocument xDocCampaign = new XmlDocument();
                        xDocCampaign.LoadXml(Serialize.SerializeObject(campaign, "Campaign"));
                        dsTrainingPages = srvCampaign.GetActiveTrainingPageList(xDocCampaign);
                        DataRow dr;
                        switch (dsTrainingPages.Tables[0].Rows.Count)
                        {
                        case 0:
                            ActivityLogger.WriteAgentEntry(objAgent, "Active training schemes contain no pages. Cannot return a valid training page.");
                            tpPage = null;
                            return(tpPage);

                        case 1:
                            ActivityLogger.WriteAgentEntry(objAgent, "Active training schemes contain only 1 page. The previous page will persist.");
                            dr = dsTrainingPages.Tables[0].Rows[0];
                            break;

                        case 2:
                            ActivityLogger.WriteAgentEntry(objAgent, "Active training schemes contain only 2 pages. The pages will now simply switch.");
                            dr = dsTrainingPages.Tables[0].Rows[0];
                            if ((long)dr["TrainingPageID"] != previousPageID)
                            {
                                break;
                            }
                            dr = dsTrainingPages.Tables[0].Rows[1];
                            break;

                        default:
                            // *** Randomize which record to grab.
                            Random r    = new Random();
                            int    rand = r.Next(dsTrainingPages.Tables[0].Rows.Count - 1);
                            dr = dsTrainingPages.Tables[0].Rows[rand];
                            break;
                        }
                        try
                        {
                            tpPage.PageID = (long)dr["TrainingPageID"];
                            //tpPage.TrainingSchemeID = trainingScheme.SchemeID;
                            tpPage.DisplayTime  = (int)dr["DisplayTime"];
                            tpPage.Content      = dr["TrainingPageContent"] == Convert.DBNull ? string.Empty : dr["TrainingPageContent"].ToString();
                            tpPage.Name         = (string)dr["TrainingPageName"];
                            tpPage.IsScoreBoard = false;
                        }
                        catch
                        {
                            ActivityLogger.WriteAgentEntry(objAgent, "Corrupt or misconfigured training page found, looking for another.");
                            triesForValidPage++;
                            continue;
                        }
                        if (tpPage.Content.Length < 1)
                        {
                            ActivityLogger.WriteAgentEntry(objAgent, "Training page with empty content detected. Page ID {0}, name {1}", tpPage.PageID, tpPage.Name);
                            triesForValidPage++;
                            continue;
                        }
                        else
                        {
                            if (tpPage.PageID != previousPageID)
                            {
                                isPageValid = true;
                                break;
                            }
                            triesForValidPage++;
                            continue;
                        }
                    }
                }

                ActivityLogger.WriteAgentEntry(objAgent, "Next training page routine returning page '{0}'.", tpPage.Name);
            }
            catch (Exception ex)
            {
                ActivityLogger.WriteException(ex, "Agent");
                tpPage = null;
            }
            return(tpPage);
        }
        /// <summary>
        /// Saves result code for call,
        /// update agent Stat,
        /// and update status to Ready for waiting for call agent,
        /// update call campaign fields
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbtnSave_Click(object sender, EventArgs e)
        {
            try
            {
                string exportFilePath = "";
                string exportFileName = txtFileName.Text;
                if (txtFileName.Text.Length < 1)
                {
                    Response.Write("<script>alert('You must specify a valid file name.');</script>");
                    return;
                }

                try
                {
                    exportFilePath = Path.Combine(Server.MapPath("~/campaign/DataExports/"), exportFileName);
                }
                catch
                {
                    Response.Write("<script>alert('Error creating a file path on the server.  Your filename may have invalid characters or saving on the server may not be permitted.');</script>");
                    return;
                }

                Campaign currentCampaign = new Campaign();

                if (Session["Campaign"] != null)
                {
                    // we have an existing campaign
                    currentCampaign = (Campaign)Session["Campaign"];
                }
                else
                {
                    Response.Write("<script>alert('There is no campaign selected to export from.  Please go back to Data Manager and select one.');</script>");
                    return;
                }

                if (Session["SelectStmt"] == null || Session["SelectStmt"].ToString().Length < 2)
                {
                    Response.Write("<script>alert('There is no query selected to export from.  Please go back to Data Manager and select one.');</script>");
                    return;
                }
                //Response.Write("<script>alert('Please wait for the Save As dialog to appear. \n The system is working on your export.\n Depending on your export size, this may take a few minutes. \n Only close the window after you have been prompted to save.');</script>");
                string selectStatement = Session["SelectStmt"].ToString();

                // Load up the query
                dsExportData.ConnectionString = currentCampaign.CampaignDBConnString;
                dsExportData.SelectCommand    = selectStatement;
                DataView dv = new DataView();
                dv = (DataView)dsExportData.Select(DataSourceSelectArguments.Empty);
                // add csv extension unless another extension exists

                if (exportFilePath.LastIndexOf('.') < (exportFilePath.Length - 4))
                {
                    exportFilePath = exportFilePath + ".csv";
                    exportFileName = exportFileName + ".csv";
                }

                // Make the file
                FileInfo file = new FileInfo(exportFilePath);

                file.Directory.Create();

                //Response.Write("<script>displayLoading();</script>");

                // Open the file stream object to start writing
                StreamWriter sw = new StreamWriter(exportFilePath, false);

                DataRowView drv = dv[0];

                // Write out column names
                int    iColCount     = dv.Table.Columns.Count;
                string fieldContents = "";
                for (int i = 0; i < iColCount; i++)
                {
                    fieldContents = dv.Table.Columns[i].ToString();

                    // Remove commas
                    fieldContents = fieldContents.Replace(",", " ");
                    sw.Write(fieldContents);
                    if (i < iColCount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
                ActivityLogger.WriteAdminEntry(currentCampaign, "Exporting {0} record to file '{1}'", dv.Table.Rows.Count, exportFilePath);

                // Now write all the rows.
                foreach (DataRow dr in dv.Table.Rows)
                {
                    for (int i = 0; i < iColCount; i++)
                    {
                        if (!Convert.IsDBNull(dr[i]))
                        {
                            string fieldname = dv.Table.Columns[i].ToString();
                            fieldContents = dr[i].ToString();
                            if (Session["EncryptedFields"] != null)
                            {
                                string encryptedfields = Session["EncryptedFields"].ToString();

                                string[] fieldListArray = encryptedfields.Split(',');

                                string passPhrase = "whatevesfasdfasdfr23"; // can be any string
                                string initVector = "Qt@&^SDF15F6g7H8";     // must be 16 bytes

                                // Before encrypting data, we will append plain text to a random
                                // salt value, which will be between 4 and 8 bytes long (implicitly
                                // used defaults).
                                RijndaelEnhanced rijndaelKey =
                                    new RijndaelEnhanced(passPhrase, initVector);
                                foreach (string strField in fieldListArray)
                                {
                                    if (fieldname.Trim() == strField.Trim())
                                    {
                                        int    index        = dr.Table.Columns[strField.Trim()].Ordinal;
                                        string currentvalue = dr[index].ToString();
                                        ActivityLogger.WriteAdminEntry(currentCampaign, "ExportDMData - Column and current text: '{0}'", strField + " " + currentvalue);
                                        if (currentvalue != "&nbsp;" && currentvalue != "")
                                        {
                                            fieldContents = rijndaelKey.Decrypt(currentvalue);
                                            break;
                                        }
                                    }
                                }
                            }
                            // Remove commas
                            fieldContents = fieldContents.Replace(",", " ");
                            sw.Write(fieldContents);
                        }
                        if (i < iColCount - 1)
                        {
                            sw.Write(",");
                        }
                    }
                    sw.Write(sw.NewLine);
                }
                sw.Close();

                if (rdoDelete.Checked)
                {
                    try
                    {
                        dsExportData.ConnectionString = currentCampaign.CampaignDBConnString;
                        string uniqueKeySelectStmt = string.Format("SELECT UniqueKey FROM Campaign {0}", selectStatement.Substring(selectStatement.IndexOf("WHERE"), (selectStatement.Length - selectStatement.IndexOf("WHERE"))));
                        dsExportData.SelectCommand = uniqueKeySelectStmt;
                        DataView dv1 = new DataView();
                        dv1 = (DataView)dsExportData.Select(DataSourceSelectArguments.Empty);
                        // Execute WS method to delete everything in the DB
                        List <long> keyList = new List <long>();
                        foreach (DataRow dr in dv1.Table.Rows)
                        {
                            keyList.Add(Convert.ToInt64(dr[0]));
                        }
                        ActivityLogger.WriteAdminEntry(currentCampaign, "Key List complete, contains {0} keys.", keyList.Count);

                        string deleteStatement = string.Format("DELETE {0}", selectStatement.Substring(selectStatement.IndexOf("FROM"), (selectStatement.Length - selectStatement.IndexOf("FROM"))));
                        dsExportData.SelectCommand = deleteStatement;
                        dv = (DataView)dsExportData.Select(DataSourceSelectArguments.Empty);
                        ActivityLogger.WriteAdminEntry(currentCampaign, "Bulk delete complete.");

                        long totalKeys = keyList.Count;
                        if (keyList.Count > 0)
                        {
                            int chunkSize = 1000;
                            try
                            {
                                chunkSize = Convert.ToInt32(ConfigurationManager.AppSettings["ChunkSize"]);
                            }
                            catch { }
                            CampaignService campService      = new CampaignService();
                            XmlDocument     xDocKeysToDelete = new XmlDocument();
                            campService.Timeout = System.Threading.Timeout.Infinite;
                            while (keyList.Count > 0)
                            {
                                if (keyList.Count < chunkSize)
                                {
                                    xDocKeysToDelete.LoadXml(Serialize.SerializeObject(keyList, typeof(List <long>)));
                                    campService.DeleteExportedLeads(xDocKeysToDelete, currentCampaign.CampaignDBConnString);
                                    keyList.Clear();
                                }
                                else
                                {
                                    List <long> templist = keyList.GetRange(0, chunkSize);
                                    keyList.RemoveRange(0, chunkSize);
                                    xDocKeysToDelete.LoadXml(Serialize.SerializeObject(templist, typeof(List <long>)));
                                    campService.DeleteExportedLeads(xDocKeysToDelete, currentCampaign.CampaignDBConnString);
                                    templist.Clear();
                                }
                            }
                        }
                        hdnDeleteConfirmed.Value = "False";
                        Session["ViewChanged"]   = "yes";
                    }
                    catch (Exception ex)
                    {
                        ActivityLogger.WriteException(ex, "Admin");
                    }
                }
                // Download file here

                Response.ContentType = "application/ms-excel";
                Response.AddHeader("content-disposition", "attachment; filename=" + exportFileName);
                Response.TransmitFile(exportFilePath);
                Response.End();
                //file.Delete();
            }
            catch (Exception ex)
            {
                PageMessage = "Exception saving view: " + ex.Message;
            }
        }
        /// <summary>
        /// Bind Queries.
        /// </summary>
        private void BindQueries(Campaign objCampaign, bool IsActive)
        {
            //if (IsCampaignRunning())
            //{
            //    Isrunning = true;
            //}

            DataSet dsQuerList;

            try
            {
                CampaignService objCampService = new CampaignService();
                XmlDocument     xDocCampaign   = new XmlDocument();

                xDocCampaign.LoadXml(Serialize.SerializeObject(objCampaign, "Campaign"));
                ActivityLogger.WriteAdminEntry(objCampaign, "Getting campaign query status, generic.");
                dsQuerList = objCampService.GetCampaignQueryStatus(xDocCampaign);
                DataView dvQueries = new DataView();

                try
                {
                    SetQueryStatsInPerc(objCampaign);
                }
                catch { }


                // Added 11/12/10 for preventing 0 available queries to be activated - enhancement
                DataView dvExhaustedQueries = FilterData(dsQuerList.Tables[0], "IsActive = 1 AND Available = 0");

                if (dvExhaustedQueries == null)
                {
                    PageMessage = "This campaign has no queries, please create a dialing query to begin dialing.";
                    return;
                }

                if (dvExhaustedQueries.Count > 0)
                {
                    DataRowView dr = dvExhaustedQueries[0];
                    long        campaignQueryStatusId = Convert.ToInt64(dr["CampaignQueryID"]);
                    string      queryName             = dr["QueryName"].ToString();
                    UpdateQueryStatus(campaignQueryStatusId, false, false, false);
                    ActivityLogger.WriteAdminEntry(objCampaign, "Getting campaign query status, exhausted queries exist.");
                    dsQuerList = objCampService.GetCampaignQueryStatus(xDocCampaign);

                    PageMessage = string.Format("\"{0}\" has no available numbers, it will remain on hold.", queryName, campaignQueryStatusId);
                    ActivityLogger.WriteAdminEntry(objCampaign, "Query '{0}' has no available numbers when user attempted to activate, moving to on hold.", queryName, campaignQueryStatusId);
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "QueryAlert", "alert('" + PageMessage + "');", true);
                }

                if (IsActive)
                {
                    dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 1");
                    dvQueries.Sort = "DateModified ASC";
                    grdActiveQueries.DataSource = dvQueries;
                    grdActiveQueries.DataBind();
                }
                else
                {
                    dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 1");
                    dvQueries.Sort = "DateModified ASC";
                    grdActiveQueries.DataSource = dvQueries;
                    grdActiveQueries.DataBind();

                    dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 0 AND IsStandby = 1");
                    dvQueries.Sort = "DateModified ASC";
                    grdStandbyQueries.DataSource = dvQueries;
                    grdStandbyQueries.DataBind();

                    dvQueries                = FilterData(dsQuerList.Tables[0], "IsActive = 0 OR IsActive = 1");
                    dvQueries.Sort           = "DateModified ASC";
                    grdAllQueries.DataSource = dvQueries;
                    grdAllQueries.DataBind();
                }
                if (grdActiveQueries.Items.Count < 1)
                {
                    lblNoActive.Visible      = true;
                    grdActiveQueries.Visible = false;
                }
                else
                {
                    lblNoActive.Visible      = false;
                    grdActiveQueries.Visible = true;
                }
                if (grdStandbyQueries.Items.Count < 1)
                {
                    lblNoStanByQueries.Visible = true;
                    grdStandbyQueries.Visible  = false;
                }
                else
                {
                    lblNoStanByQueries.Visible = false;
                    grdStandbyQueries.Visible  = true;
                }
                // *** Bonus add query conditions as tooltips
                dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 1");
                dvQueries.Sort = "Priority ASC";
                for (int i = 0; i < grdActiveQueries.Items.Count; i++)
                {
                    LinkButton lbtnQuery = (LinkButton)grdActiveQueries.Items[i].FindControl("lbtnQuery");

                    string strSubQueryConditions         = dvQueries.Table.Rows[i]["QueryCondition"].ToString();;
                    string strFilteredSubQueryConditions = "";

                    if (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }
                    if (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }
                    strFilteredSubQueryConditions = strFilteredSubQueryConditions.Trim();

                    lbtnQuery.ToolTip = strFilteredSubQueryConditions;
                }
                dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 0 AND IsStandby = 1");
                dvQueries.Sort = "Priority ASC";
                for (int i = 0; i < grdStandbyQueries.Items.Count; i++)
                {
                    LinkButton lbtnQuery = (LinkButton)grdStandbyQueries.Items[i].FindControl("lbtnQuery");

                    string strSubQueryConditions         = dvQueries.Table.Rows[i]["QueryCondition"].ToString();;
                    string strFilteredSubQueryConditions = "";

                    if (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }
                    if (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }

                    strFilteredSubQueryConditions = strFilteredSubQueryConditions.Trim();
                    lbtnQuery.ToolTip             = strFilteredSubQueryConditions;
                }
                dvQueries      = FilterData(dsQuerList.Tables[0], "IsActive = 0 OR IsActive = 1");
                dvQueries.Sort = "Priority ASC";
                for (int i = 0; i < grdAllQueries.Items.Count; i++)
                {
                    LinkButton lbtnQuery = (LinkButton)grdAllQueries.Items[i].FindControl("lbtnQuery");

                    string strSubQueryConditions         = dvQueries.Table.Rows[i]["QueryCondition"].ToString();;
                    string strFilteredSubQueryConditions = "";

                    if (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("And ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }
                    if (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") > 0)
                    {
                        strFilteredSubQueryConditions = strSubQueryConditions.Substring((strSubQueryConditions.IndexOf("WHERE (") + 7), (strSubQueryConditions.IndexOf("AND ((DATEPART(hour, GETDATE()) < 13") - (strSubQueryConditions.IndexOf("WHERE (") + 7)));
                    }

                    strFilteredSubQueryConditions = strFilteredSubQueryConditions.Trim();
                    lbtnQuery.ToolTip             = strFilteredSubQueryConditions;
                }
            }

            catch (Exception ex)
            {
                ActivityLogger.WriteException(ex, "Admin");
            }
        }
Пример #4
0
        /// <summary>
        /// Saves Campaign and navigate to Home Page
        /// </summary>
        private void SaveData()
        {
            Campaign  objCampaign  = new Campaign();
            CloneInfo objCloneInfo = new CloneInfo();

            long parentCampaignID = Convert.ToInt64(hdnCampaignId.Value);

            objCampaign.CampaignID       = 0;
            objCampaign.Description      = txtDescription.Text.Trim();
            objCampaign.ShortDescription = txtShortDesc.Text.Trim();
            //objCampaign.FundRaiserDataTracking = chkFundRaiser.Checked;
            //objCampaign.OnsiteTransfer = chkOnSiteCallTransfer.Checked;
            //objCampaign.EnableAgentTraining = chkTraining.Checked;
            //objCampaign.RecordLevelCallHistory = chkRecordLevel.Checked;
            objCampaign.EnableAgentTraining    = true;
            objCampaign.RecordLevelCallHistory = false;
            objCampaign.AllowDuplicatePhones   = chkDuplicatePh.Checked;
            objCampaign.Allow7DigitNums        = chkSevenDigitNums.Checked;
            objCampaign.Allow10DigitNums       = chkTenDigitNums.Checked;

            if (rdoIgnore.Checked)
            {
                objCampaign.DuplicateRule = "I";
            }
            else
            {
                objCampaign.DuplicateRule = "R";
            }

            objCampaign.OutboundCallerID = txtOutboundCallerID.Text.Trim();
            objCampaign.StatusID         = Convert.ToInt64(ConfigurationManager.AppSettings["DefaultStatusID"]);
            objCampaign.IsDeleted        = false;
            string RecordingsPath   = @"C:\recordings\";
            string ismultiboxconfig = ConfigurationManager.AppSettings["IsMultiBoxConfig"];
            string strPath          = objCampaign.ShortDescription;

            /*if (ismultiboxconfig == "yes" || ismultiboxconfig == "Yes" || ismultiboxconfig == "YES")
             * {
             *  RecordingsPath = ConfigurationManager.AppSettings["RecordingsPathMulti"];
             *  strPath = strPath.Trim();
             *  strPath = RecordingsPath + strPath;
             *  Directory.CreateDirectory(Server.MapPath(strPath));
             * }
             * else
             * {*/
            RecordingsPath = ConfigurationManager.AppSettings["RecordingsPath"];
            strPath        = strPath.Trim();
            strPath        = RecordingsPath + strPath;
            Directory.CreateDirectory(strPath);
            //}

            objCloneInfo.RecordingsPath = strPath.EndsWith(@"\") == true?strPath.Trim() : strPath.Trim() + @"\";


            objCloneInfo.ParentCampaignId   = parentCampaignID;
            objCloneInfo.ParentShortDesc    = lblCampaign.Text;
            objCloneInfo.IncludeData        = chkData.Checked;
            objCloneInfo.IncludeResultCodes = chkResultcodes.Checked;
            objCloneInfo.IncludeOptions     = chkOptions.Checked;
            objCloneInfo.IncludeQueries     = chkQueries.Checked;
            objCloneInfo.IncludeFields      = chkFields.Checked;
            objCloneInfo.IncludeScripts     = chkScripts.Checked;

            if (RdoClone.Checked)
            {
                //-----------------------------------------------------
                // Clone all data is checked.
                //-----------------------------------------------------
                objCloneInfo.IncludeData        = true;
                objCloneInfo.IncludeResultCodes = true;
                objCloneInfo.IncludeOptions     = true;
                objCloneInfo.IncludeQueries     = true;
                objCloneInfo.IncludeFields      = true;
                objCloneInfo.IncludeScripts     = true;
                objCloneInfo.FullCopy           = true;
            }
            else
            {
                objCloneInfo.IncludeData        = chkData.Checked;
                objCloneInfo.IncludeResultCodes = chkResultcodes.Checked;
                objCloneInfo.IncludeOptions     = chkOptions.Checked;
                objCloneInfo.IncludeQueries     = chkQueries.Checked;
                objCloneInfo.IncludeFields      = chkFields.Checked;
                objCloneInfo.IncludeScripts     = chkScripts.Checked;
                objCloneInfo.FullCopy           = false;
            }

            CampaignService objCampaignService = new CampaignService();
            XmlDocument     xDocCampaign       = new XmlDocument();
            XmlDocument     xDocCloneInfo      = new XmlDocument();

            try
            {
                xDocCampaign.LoadXml(Serialize.SerializeObject(objCampaign, "Campaign"));
                xDocCloneInfo.LoadXml(Serialize.SerializeObject(objCloneInfo, "CloneInfo"));

                objCampaignService.Timeout = System.Threading.Timeout.Infinite;

                objCampaign = (Campaign)Serialize.DeserializeObject(objCampaignService.CampaignClone(xDocCampaign, xDocCloneInfo), "Campaign");

                Session["Campaign"] = objCampaign;
                Response.Redirect("~/campaign/Home.aspx?CampaignID=" + objCampaign.CampaignID);
            }
            catch (Exception ex)
            {
                if (ex.Message.IndexOf("CampaignDuplicateEntityException") >= 0)
                {
                    PageMessage = "CloneCampaign.aspx SaveData Calling objCampaignService.CampaignClone threw error: " + ex.Message;
                }
                else
                {
                    PageMessage = ex.Message;
                }

                ActivityLogger.WriteException(ex, "Admin");
            }
        }