//------------------------------------------------------------------------------//
        //                          Update Element Methods                              //
        //------------------------------------------------------------------------------//
        private void UpdateElementColor(Tag t)
        {
            MyObjectInfo moi = (MyObjectInfo)t.MyObject;

            switch (moi.TagName)
            {
                //=====================
                //Maintenance Switches
                //=====================

                case "G_ES_GENERAL":
                    MaintenanceSwitches.SetColor1 = Convert.ToInt32(t.Value);
                    break;

                case "=A-0011-SHE01":
                    MaintenanceSwitches.SetColor2 = Convert.ToInt32(t.Value);
                    break;

                case "=A-0013-SHE01":
                    MaintenanceSwitches.SetColor3 = Convert.ToInt32(t.Value);
                    break;

                case "=A-0014-SHE01":
                    MaintenanceSwitches.SetColor4 = Convert.ToInt32(t.Value);
                    break;

                //case "175S2":
                //    MaintenanceSwitches.SetColor5 = Convert.ToInt32(t.Value);
                //    break;

                //case "175S3":
                //    MaintenanceSwitches.SetColor6 = Convert.ToInt32(t.Value);
                //    break;

                //=====================
                //Plant Switches
                //=====================

                case "G_FUSE_SWITCHED":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor1 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C110 FUSE SWITCH INTERRUPTED!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor1 = Convert.ToInt32(t.Value);
                    }
                    break;

                case "G_FUSE_NSWITCHED":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor2 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C110 FUSE SWITCH NOT INTERRUPTED!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor2 = Convert.ToInt32(t.Value);
                    }
                    break;

                case "+C110:OMF":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor3 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C110 OVERVOLTAGE MONITOR FAILURE!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor3 = Convert.ToInt32(t.Value);
                    }
                    break;

                case "+C120:OMF":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor4 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C120 OVERVOLTAGE MONITOR FAILURE!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor4 = Convert.ToInt32(t.Value);
                    }
                    break;

                case "+C110":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor5 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C110 POWER COMSUMPTION MEASUREMENT!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor5 = Convert.ToInt32(t.Value);
                    }
                    break;

                case "+C120":
                    if (Convert.ToInt32(t.Value) == 32)
                    {
                        PlantSwitches.SetColor6 = Convert.ToInt32(t.Value);
                        LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, moi.TagDescription + "   " + "(" + t.Value + ")", 20);
                        alLoggerToSQL.Add(li);
                        alLoggerToUI.Add(li);

                        stat_sFault = "+C120 POWER COMSUMPTION MEASUREMENT!!!";

                        bFault = true;
                    }
                    else
                    {
                        PlantSwitches.SetColor6 = Convert.ToInt32(t.Value);
                    }
                    break;

                ////=====================
                ////Bag Packer Bin 411
                ////=====================

                //case "=A-5074-KCL10SA":
                //    BagPacker411.SetColor1 = Convert.ToInt32(t.Value);
                //    break;

                //case "=A-5074-KCL10RBP":
                //    BagPacker411.SetColor2 = Convert.ToInt32(t.Value);
                //    break;

                //case "=A-5074-KCL10RBC":
                //    BagPacker411.SetColor3 = Convert.ToInt32(t.Value);
                //    break;

                //case "=A-5074-KCL10PO":
                //    BagPacker411.SetColor4 = Convert.ToInt32(t.Value);

                //    //If the signal is on, colour all other packing machines green, else gray
                //    if (Convert.ToInt32(t.Value) == 3)
                //    {
                //        pageBPL2._5069.MotorColor = 3;
                //        pageBPL2._5070_1.MotorColor = 3;
                //        pageBPL2._5070_2.MotorColor = 3;
                //        pageBPL2._5075.ScaleColor = 3;
                //        pageBPL2._5071.BaggingStationColor = 3;
                //        pageBPL2._5072.MotorColor = 3;
                //    }
                //    else
                //    {
                //        pageBPL2._5069.MotorColor = 1;
                //        pageBPL2._5070_1.MotorColor = 1;
                //        pageBPL2._5070_2.MotorColor = 1;
                //        pageBPL2._5075.ScaleColor = 1;
                //        pageBPL2._5071.BaggingStationColor = 1;
                //        pageBPL2._5072.MotorColor = 1;
                //    }

                //    break;

                //case "=A-5074-KCL10SE":
                //    BagPacker411.SetColor5 = Convert.ToInt32(t.Value);
                //    break;

                //case "=A-5074-KCL10A":
                //    pageBPL2._5074A.MonitorColor = Convert.ToInt32(t.Value);
                //    string sStatus2 = pageBPL2._5074A.Status_Alarm;
                //    pageBPL2._5074A.Description_Alarm = moi.TagName + " " + moi.TagDescription;
                //    string sFaultString2 = moi.TagDescription + " (" + sStatus2 + ")";
                //    bool bIsInFault2 = pageBPL2._5074A.Fault_Alarm;
                //    RegisterEvent(bIsInFault2, sFaultString2, moi.TagName, Convert.ToInt32(t.Value), !bFirstTagRead);
                //    break;

            }
        }
        //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Handles additional Element Tag Change events
        /// </summary>
        private void INGEARS7_AdditionalTag_Changed(object sender, EventArgs e)
        {
            if (bPLCCommsGood & PLC1_R.IsConnected)
            {
                Tag t = sender as Tag;
                MyObjectInfo moi = (MyObjectInfo)t.MyObject;

                //
                //Tag is a bad read
                //
                if (t.QualityCode == 0)
                {
                    if (!alBadTags.Contains(moi.TagName))
                    {
                        lblBadTags.Dispatcher.BeginInvoke(
                          System.Windows.Threading.DispatcherPriority.Normal,
                          new Action(
                            delegate()
                            {
                                lblBadTags.Content += "  *" + moi.TagName;
                            }
                          ));

                        alBadTags.Add(moi.TagName);
                    }
                }
                else
                {
                    UpdateAdditionalElementColor(t);

                    //
                    //Update the values in the Reporting OnTick hashtable
                    //
                    if (moi.RecOnTick == 1)
                    {
                        htRecTickTagValues[moi.TagName] = t.Value.ToString();
                    }

                    //
                    //Only start logging after all smart tags have been loaded for the first time
                    //
                    if (!bFirstAdditionalTagRead)
                    {
                        if (moi.RecOnChange == 1)
                        {
                            LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), moi.TagName, t.Value);
                            alReportingLog.Add(li);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Writes all data in the Arraylist to SQL
        /// </summary>
        public void WriteReportingLogToSQL()
        {
            try
            {
                ArrayList alReportingLogLOCAL = new ArrayList();
                alReportingLogLOCAL.AddRange(alReportingLog);
                alReportingLog.Clear();

                Hashtable htLOCAL = new Hashtable(htRecTickTagValues);

                foreach (string sKey in htLOCAL.Keys)
                {
                    LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), sKey, htLOCAL[sKey]);
                    alReportingLogLOCAL.Add(li);
                }

                if (alReportingLogLOCAL.Count > 0 && bRunSQLCleanup == false)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append("INSERT INTO HistoricLog VALUES ");

                    for (int i = 0; i < alReportingLogLOCAL.Count; i++)
                    {
                        LogItem li = (LogItem)alReportingLogLOCAL[i];
                        sb.Append("('" + li.ts_DateTime + "'," + li.OADate + ",'" + li.ObjectName + "','" + li.Value + "'),");
                    }

                    sb.Remove(sb.Length - 1, 1); //remove Last ,

                    try
                    {
                        using (SqlConnection conn = new SqlConnection(SqlConnectionString))
                        {
                            conn.Open();
                            SqlCommand cmd = conn.CreateCommand();
                            cmd.CommandText = sb.ToString();
                            int rowsInserted = cmd.ExecuteNonQuery();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Insert To HistoricLog --> " + ex.Message, "Error Adding Log Item", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
                alReportingLogLOCAL.Clear();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error Writing Log --> " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        //OVERLOAD
        public void UIInteraction_Change(object sender, string Message)
        {
            Control c = (Control)sender;

            string ControlName = c.Name;
            DateTime EventTime = DateTime.Now;

            if (ControlName == "btnControlAcknowledge")
            {
                LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush();
                myLinearGradientBrush.StartPoint = new Point(0, 0);
                myLinearGradientBrush.EndPoint = new Point(0, 10);
                myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.White, 0.0));
                myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Lime, 0.1));
                txtAlarms.Background = myLinearGradientBrush;

                txtAlarms.Text = "No Active Alarms";
                txtAlarms.FontSize = 10;

                timerAlarmFlash.Stop();
                txtAlarms.Foreground = Brushes.Black;
            }

            LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), ControlName, Message, 30);
            alLoggerToSQL.Add(li);
        }
        /// <summary>
        /// Log any change that is made by the user of the system
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void UIInteraction_Change(object sender, RoutedEventArgs e)
        {
            Control c = (Control)sender;

            string ControlName = c.Name;
            string ControlSource = e.Source.ToString();
            string ControlEvent = e.RoutedEvent.ToString();
            DateTime EventTime = DateTime.Now;

            if (ControlName == "btnControlAcknowledge")                                 //Stop the alarm flash timer and set the active alarm tab to green
            {
                LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush();
                myLinearGradientBrush.StartPoint = new Point(0, 0);
                myLinearGradientBrush.EndPoint = new Point(0, 10);
                myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.White, 0.0));
                myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Lime, 0.1));
                txtAlarms.Background = myLinearGradientBrush;

                txtAlarms.Text = "No Active Alarms";
                txtAlarms.FontSize = 10;

                timerAlarmFlash.Stop();
                txtAlarms.Foreground = Brushes.Black;
            }

            LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), ControlName, "Button Pressed [" + stat_iActiveLineNumber + "]", 30);
            alLoggerToSQL.Add(li);
        }
        /// <summary>
        /// Registers the Tag that has just changed to the Logger (UI and SQL)
        /// </summary>        
        public void RegisterEvent(bool bIsInFault, string sFaultString, string Tagname, int iStateCode, bool bLogThisChange)
        {
            if (bIsInFault)
            {
                txtAlarms.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate()
                {
                    LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush();
                    myLinearGradientBrush.StartPoint = new Point(0, 0);
                    myLinearGradientBrush.EndPoint = new Point(0, 10);
                    myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.White, 0.0));
                    myLinearGradientBrush.GradientStops.Add(new GradientStop(Colors.Red, 0.1));

                    txtAlarms.Background = myLinearGradientBrush;

                    txtAlarms.Text = sFaultString;
                    txtAlarms.FontSize = 12;
                }));

                timerAlarmFlash.Start();
            }

            if (!bFirstTagRead && bLogThisChange)
            {
                int ErrorCode;

                //Check if error code is fault or event
                if (!bIsInFault)
                {
                    ErrorCode = 10; //Event
                }
                else
                {
                    ErrorCode = 20; //Fault
                }

                LogItem li = new LogItem(DateTime.Now, DateTime.Now.ToOADate(), Tagname, sFaultString + "(" + iStateCode + ")", ErrorCode);
                alLoggerToSQL.Add(li);
                alLoggerToUI.Add(li);

            }
        }