/// <summary>
        /// initialisiert Kampagne
        /// </summary>
        public Campaign(itCampus.bb.Monitor.Campaign campaign, CampaignControl campaignControl)
        {
            // Parameter initialisieren
            _key = campaign.Key;
            _callJobResultCountRcn      = new int[17];
            _callJobResultCountTtl      = new int[17];
            _incomingCallResultCountRcn = new int[5];
            _incomingCallResultCountTtl = new int[5];
            _agentModeCount             = new int[3];
            _agentStateCount            = new int[9];
            _agentStateTimeAvgCur       = new int[9];
            _agentStateTimeAvgTtl       = new int[9];
            _callJobStateCount          = new int[9];
            _incomingCallStateCount     = new int[4];

            // Verlaufsdaten initialisieren
            InitializeDataCollections();

            // Kampagne zu Kampagnenverwaltung hinzufügen
            _campaignControl = campaignControl;
            _campaignControl.AddCampaign(this);

            // Parameter aktualisiern
            RefreshParameters(campaign);
        }
        /// <summary>
        /// schließt Kampagne ab
        /// </summary>
        private void _monitor_OnRemoveCampaign(itCampus.bb.Monitor.Campaign campaign)
        {
            try
            {
                // Ereignis protokollieren
                Logger.Log.Info("[Monitor] -> [OnRemoveCampaign]" +
                                " Campaign: Campaign#" + campaign.Key);

                // Kampagne abschließen
                _campaignControl[campaign.Key].Terminate();
            }
            catch (Exception ex)
            {
                Logger.Log.Error("Error on processing event.", ex);
            }
        }
        /// <summary>
        /// aktualisiert Kampagne
        /// </summary>
        private void _monitor_OnRefreshCampaign(itCampus.bb.Monitor.Campaign campaign)
        {
            try
            {
                // Ereignis protokollieren
                Logger.Log.Info("[Monitor] -> [OnRefreshCampaign]" +
                                " Campaign: Campaign#" + campaign.Key);

                // Kampagne aktualisieren
                _campaignControl[campaign.Key].RefreshParameters(campaign);
            }
            catch (Exception ex)
            {
                Logger.Log.Error("Error on processing event.", ex);
            }
        }
        /// <summary>
        /// initialisiert Kampagne
        /// </summary>
        private void _monitor_OnAddCampaign(itCampus.bb.Monitor.Campaign campaign)
        {
            try
            {
                // Ereignis protokollieren
                Logger.Log.Info("[Monitor] -> [OnAddCampaign]" +
                                " Campaign: Campaign#" + campaign.Key);

                // Kampagne initialisieren
                new Campaign(campaign, _campaignControl);
            }
            catch (Exception ex)
            {
                Logger.Log.Error("Error on processing event.", ex);
            }
        }
        /// <summary>
        /// aktualisiert Parameter
        /// </summary>
        public void RefreshParameters(itCampus.bb.Monitor.Campaign campaign)
        {
            // alte Parameter merken
            string code = _code;
            string name = _name;

            // Parameter aktualisieren
            _code                   = campaign.Code;
            _name                   = campaign.Name;
            _state                  = campaign.State;
            _lastStateChange        = campaign.LastStateChange;
            _availabilityMode       = campaign.AvailabilityMode;
            _dialMode               = campaign.DialMode;
            _carrierCode            = campaign.CarrierCode;
            _callingNumber          = campaign.CallingNumber;
            _minRingCount           = campaign.MinRingCount;
            _maxRingCount           = campaign.MaxRingCount;
            _maxSwitchingTime       = campaign.MaxSwitchingTime;
            _maxDialRate            = campaign.MaxDialRate;
            _maxDropRate            = campaign.MaxDropRate;
            _maxLostRate            = campaign.MaxLostRate;
            _agentRelaxTarget       = campaign.AgentRelaxTarget;
            _musicOnReadyFile       = campaign.MusicOnReadyFile;
            _greetingFile           = campaign.GreetingFile;
            _waitingFile            = campaign.WaitingFile;
            _answeringMachineFile   = campaign.AnsweringMachineFile;
            _abandonmentFile        = campaign.AbandonmentFile;
            _cpaLevel               = campaign.CPALevel;
            _hotlineNumbers         = campaign.HotlineNumbers;
            _hotlineQueueSizeFactor = campaign.HotlineQueueSizeFactor;
            _hotlineGreetingFile    = campaign.HotlineGreetingFile;
            _hotlineWaitingFile     = campaign.HotlineWaitingFile;
            _hotlineAbandonmentFile = campaign.HotlineAbandonmentFile;
            _autoRecording          = campaign.AutoRecording;
            _dialRate               = campaign.DialRate;
            _preLevel               = campaign.PreLevel;
            _dropRateCur            = campaign.DropRateCur;
            _dropRateTtl            = campaign.DropRateTtl;
            _lostRateCur            = campaign.LostRateCur;
            _lostRateTtl            = campaign.LostRateTtl;
            _agentRelaxTimeCur      = campaign.AgentRelaxTimeCur;
            _agentRelaxTimeTtl      = campaign.AgentRelaxTimeTtl;
            foreach (CallJobResult callJobResult in Enum.GetValues(typeof(CallJobResult)))
            {
                _callJobResultCountRcn[(int)callJobResult] =
                    campaign.GetCallJobResultCountRcn(callJobResult);
                _callJobResultCountTtl[(int)callJobResult] =
                    campaign.GetCallJobResultCountTtl(callJobResult);
            }
            foreach (IncomingCallResult incomingCallResult in Enum.GetValues(typeof(
                                                                                 IncomingCallResult)))
            {
                _incomingCallResultCountRcn[(int)incomingCallResult] =
                    campaign.GetIncomingCallResultCountRcn(incomingCallResult);
                _incomingCallResultCountTtl[(int)incomingCallResult] =
                    campaign.GetIncomingCallResultCountTtl(incomingCallResult);
            }
            foreach (AgentMode agentMode in Enum.GetValues(typeof(AgentMode)))
            {
                _agentModeCount[(int)agentMode] =
                    campaign.GetAgentModeCount(agentMode);
            }
            foreach (AgentState agentState in Enum.GetValues(typeof(AgentState)))
            {
                _agentStateCount[(int)agentState] =
                    campaign.GetAgentStateCount(agentState);
                _agentStateTimeAvgCur[(int)agentState] =
                    campaign.GetAgentStateTimeAvgCur(agentState);
                _agentStateTimeAvgTtl[(int)agentState] =
                    campaign.GetAgentStateTimeAvgTtl(agentState);
            }
            foreach (CallJobState callJobState in Enum.GetValues(typeof(CallJobState)))
            {
                _callJobStateCount[(int)callJobState] =
                    campaign.GetCallJobStateCount(callJobState);
            }
            foreach (IncomingCallState incomingCallState in Enum.GetValues(typeof(
                                                                               IncomingCallState)))
            {
                _incomingCallStateCount[(int)incomingCallState] =
                    campaign.GetIncomingCallStateCount(incomingCallState);
            }
            _agentCount = 0;
            foreach (int count in _agentModeCount)
            {
                _agentCount += count;
            }
            _callJobCount = 0;
            foreach (int count in _callJobStateCount)
            {
                _callJobCount += count;
            }
            _incomingCallCount = 0;
            foreach (int count in _incomingCallStateCount)
            {
                _incomingCallCount += count;
            }

            // Verlaufsdaten aktualisieren
            RefreshDataCollections(campaign);

            // wenn Kampagnencode geändert
            if (code != _code)
            {
                // zugeordnete Frontends aus Kampagne entfernen
                foreach (Frontend frontend in (ArrayList)_frontends.Clone())
                {
                    frontend.UnassignCampaign();
                }

                // zugehörige Frontends suchen und Kampagne zuordnen
                foreach (Frontend frontend in _campaignControl.MainControl.FrontendControl)
                {
                    if (frontend.CampaignCode == _code)
                    {
                        frontend.AssignCampaign(this);
                    }
                }
            }
            else
            {
                // sonst, wenn Kampagnenname geändert
                if (name != _name)
                {
                    // zugeordnete Frontends aktualisieren
                    foreach (Frontend frontend in _frontends)
                    {
                        frontend.RefreshCampaign();
                    }
                }
            }

            // Kampagnenverwaltung aktualisieren
            _campaignControl.RefreshCampaign(this);
        }
        /// <summary>
        /// aktualisiert Verlaufsdaten
        /// </summary>
        private void RefreshDataCollections(itCampus.bb.Monitor.Campaign campaign)
        {
            // Verlaufsdaten Speeds aktualisieren
            _performanceSpeedsData["DialRate"].Value = campaign.DialRate;
            _performanceSpeedsData["PreLevel"].Value = campaign.PreLevel;

            // Verlaufsdaten Limits aktualisieren
            _performanceLimitsData["DropRateCur"].Value       = campaign.DropRateCur;
            _performanceLimitsData["DropRateTtl"].Value       = campaign.DropRateTtl;
            _performanceLimitsData["LostRateCur"].Value       = campaign.LostRateCur;
            _performanceLimitsData["LostRateTtl"].Value       = campaign.LostRateTtl;
            _performanceLimitsData["AgentRelaxTimeCur"].Value = campaign.AgentRelaxTimeCur;
            _performanceLimitsData["AgentRelaxTimeTtl"].Value = campaign.AgentRelaxTimeTtl;

            // Verlaufsdaten Ergebnisanzahl Calljobs absolut aktualisieren
            int processedCallJobCountRcn =
                campaign.GetCallJobResultCountRcn(CallJobResult.Busy) +
                campaign.GetCallJobResultCountRcn(CallJobResult.NoAnswer) +
                campaign.GetCallJobResultCountRcn(CallJobResult.WrongNumber) +
                campaign.GetCallJobResultCountRcn(CallJobResult.Blacklist) +
                campaign.GetCallJobResultCountRcn(CallJobResult.RouteDenied) +
                campaign.GetCallJobResultCountRcn(CallJobResult.PSTNFailure) +
                campaign.GetCallJobResultCountRcn(CallJobResult.TelcoOverload) +
                campaign.GetCallJobResultCountRcn(CallJobResult.ACR) +
                campaign.GetCallJobResultCountRcn(CallJobResult.Fax) +
                campaign.GetCallJobResultCountRcn(CallJobResult.AnsweringMachine) +
                campaign.GetCallJobResultCountRcn(CallJobResult.NoInterest) +
                campaign.GetCallJobResultCountRcn(CallJobResult.Lost) +
                campaign.GetCallJobResultCountRcn(CallJobResult.PutThrough);

            _recentCallJobResultCountAbsData["Busy"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.Busy);
            _recentCallJobResultCountAbsData["NoAnswer"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.NoAnswer);
            _recentCallJobResultCountAbsData["WrongNumber"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.WrongNumber);
            _recentCallJobResultCountAbsData["Blacklist"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.Blacklist);
            _recentCallJobResultCountAbsData["RouteDenied"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.RouteDenied);
            _recentCallJobResultCountAbsData["PSTNFailure"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.PSTNFailure);
            _recentCallJobResultCountAbsData["TelcoOverload"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.TelcoOverload);
            _recentCallJobResultCountAbsData["ACR"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.ACR);
            _recentCallJobResultCountAbsData["Fax"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.Fax);
            _recentCallJobResultCountAbsData["AnsweringMachine"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.AnsweringMachine);
            _recentCallJobResultCountAbsData["NoInterest"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.NoInterest);
            _recentCallJobResultCountAbsData["Lost"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.Lost);
            _recentCallJobResultCountAbsData["PutThrough"].Value =
                campaign.GetCallJobResultCountRcn(CallJobResult.PutThrough);
            _recentCallJobResultCountAbsData["Total"].Value = processedCallJobCountRcn;

            // Verlaufsdaten Ergebnisanzahl Calljobs relativ aktualisieren
            _recentCallJobResultCountRelData["Busy"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.Busy),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["NoAnswer"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.NoAnswer),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["WrongNumber"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.WrongNumber),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["Blacklist"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.Blacklist),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["RouteDenied"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.RouteDenied),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["PSTNFailure"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.PSTNFailure),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["TelcoOverload"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.TelcoOverload),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["ACR"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.ACR),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["Fax"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.Fax),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["AnsweringMachine"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.AnsweringMachine),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["NoInterest"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.NoInterest),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["Lost"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.Lost),
                processedCallJobCountRcn);
            _recentCallJobResultCountRelData["PutThrough"].Value = GetRelativeValue(
                campaign.GetCallJobResultCountRcn(CallJobResult.PutThrough),
                processedCallJobCountRcn);

            // Verlaufsdaten Ergebnisanzahl eingehender Anrufe absolut aktualisieren
            int processedIncomingCallCountRcn =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PSTNFailure) +
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.TelcoOverload) +
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.NoInterest) +
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.Lost) +
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PutThrough);

            _recentIncomingCallResultCountAbsData["PSTNFailure"].Value =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PSTNFailure);
            _recentIncomingCallResultCountAbsData["TelcoOverload"].Value =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.TelcoOverload);
            _recentIncomingCallResultCountAbsData["NoInterest"].Value =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.NoInterest);
            _recentIncomingCallResultCountAbsData["Lost"].Value =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.Lost);
            _recentIncomingCallResultCountAbsData["PutThrough"].Value =
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PutThrough);
            _recentIncomingCallResultCountAbsData["Total"].Value = processedIncomingCallCountRcn;

            // Verlaufsdaten Ergebnisanzahl eingehender Anrufe relativ aktualisieren
            _recentIncomingCallResultCountRelData["PSTNFailure"].Value = GetRelativeValue(
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PSTNFailure),
                processedIncomingCallCountRcn);
            _recentIncomingCallResultCountRelData["TelcoOverload"].Value = GetRelativeValue(
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.TelcoOverload),
                processedIncomingCallCountRcn);
            _recentIncomingCallResultCountRelData["NoInterest"].Value = GetRelativeValue(
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.NoInterest),
                processedIncomingCallCountRcn);
            _recentIncomingCallResultCountRelData["Lost"].Value = GetRelativeValue(
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.Lost),
                processedIncomingCallCountRcn);
            _recentIncomingCallResultCountRelData["PutThrough"].Value = GetRelativeValue(
                campaign.GetIncomingCallResultCountRcn(IncomingCallResult.PutThrough),
                processedIncomingCallCountRcn);

            // Verlaufsdaten Agentenanzahl aktualisieren
            _agentStateCountData["NotReady"].Value =
                campaign.GetAgentStateCount(AgentState.NotReady);
            _agentStateCountData["Ready"].Value =
                campaign.GetAgentStateCount(AgentState.Ready);
            _agentStateCountData["Pending"].Value =
                campaign.GetAgentStateCount(AgentState.Pending);
            _agentStateCountData["Signaling"].Value =
                campaign.GetAgentStateCount(AgentState.Signaling);
            _agentStateCountData["Preparing"].Value =
                campaign.GetAgentStateCount(AgentState.Preparing);
            _agentStateCountData["Calling"].Value =
                campaign.GetAgentStateCount(AgentState.Calling);
            _agentStateCountData["Talking"].Value =
                campaign.GetAgentStateCount(AgentState.Talking);
            _agentStateCountData["Conferencing"].Value =
                campaign.GetAgentStateCount(AgentState.Conferencing);
            _agentStateCountData["Wrapup"].Value =
                campaign.GetAgentStateCount(AgentState.Wrapup);
            _agentStateCountData["Total"].Value = _agentCount;

            // Verlaufsdaten Agentenzeiten aktualisieren
            _agentStateTimeData["NotReady"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.NotReady);
            _agentStateTimeData["Ready"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Ready);
            _agentStateTimeData["Pending"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Pending);
            _agentStateTimeData["Signaling"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Signaling);
            _agentStateTimeData["Preparing"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Preparing);
            _agentStateTimeData["Calling"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Calling);
            _agentStateTimeData["Talking"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Talking);
            _agentStateTimeData["Conferencing"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Conferencing);
            _agentStateTimeData["Wrapup"].Value =
                campaign.GetAgentStateTimeAvgCur(AgentState.Wrapup);

            // Verlaufsdaten Calljob-Anzahl aktualisieren
            _callJobStateCountData["Ready"].Value =
                campaign.GetCallJobStateCount(CallJobState.Ready);
            _callJobStateCountData["Preparing"].Value =
                campaign.GetCallJobStateCount(CallJobState.Preparing);
            _callJobStateCountData["Dialing"].Value =
                campaign.GetCallJobStateCount(CallJobState.Dialing);
            _callJobStateCountData["Alerting"].Value =
                campaign.GetCallJobStateCount(CallJobState.ForcedAlerting) +
                campaign.GetCallJobStateCount(CallJobState.FreeAlerting);
            _callJobStateCountData["CPA"].Value =
                campaign.GetCallJobStateCount(CallJobState.CPA);
            _callJobStateCountData["Greeting"].Value =
                campaign.GetCallJobStateCount(CallJobState.Greeting);
            _callJobStateCountData["Waiting"].Value =
                campaign.GetCallJobStateCount(CallJobState.Waiting);
            _callJobStateCountData["Signaling"].Value =
                campaign.GetCallJobStateCount(CallJobState.Signaling);
            _callJobStateCountData["Total"].Value = _callJobCount;

            // Verlaufsdaten Anzahl eingehender Anrufe aktualisieren
            _incomingCallStateCountData["Alerting"].Value =
                campaign.GetIncomingCallStateCount(IncomingCallState.Alerting);
            _incomingCallStateCountData["Greeting"].Value =
                campaign.GetIncomingCallStateCount(IncomingCallState.Greeting);
            _incomingCallStateCountData["Waiting"].Value =
                campaign.GetIncomingCallStateCount(IncomingCallState.Waiting);
            _incomingCallStateCountData["Signaling"].Value =
                campaign.GetIncomingCallStateCount(IncomingCallState.Signaling);
            _incomingCallStateCountData["Total"].Value = _incomingCallCount;
        }