/// <summary>
        /// Called from another thread
        /// Populate the list hosts control with the new returned hosts
        /// </summary>
        /// <param name="fetchedRecords"></param>
        private void updateHostsList(JsonResponse fetchedRecords)
        {
            if (fetchedRecords == null)
                return; //bail if the fetch failed

            listViewRecords.Items.Clear();

            string[] selectedHosts = Program.settingsManager.getSetting("SelectedHosts").ToString().Split(';');

            for (int i = 0; i < Convert.ToInt32(fetchedRecords.response.recs.count); i++)
            {
                ListViewItem row = new ListViewItem();
                row.SubItems.Add(fetchedRecords.response.recs.objs[i].type);
                row.SubItems.Add(fetchedRecords.response.recs.objs[i].display_name);
                row.SubItems.Add(fetchedRecords.response.recs.objs[i].display_content);

                //Only check this if it's an A record. MX records may have the same name as the primary A record, but should never be updated with an IP.
                if ((Array.IndexOf(selectedHosts, fetchedRecords.response.recs.objs[i].display_name) >= 0) == true && fetchedRecords.response.recs.objs[i].type == "A")
                {
                    row.Checked = true;
                }

                listViewRecords.Items.Add(row);
            }

            //Grey out anything that isn't an A record.
            for(int j = 0; j < listViewRecords.Items.Count; j++)
            {
                if (listViewRecords.Items[j].SubItems[1].Text != "A")
                {
                    listViewRecords.Items[j].ForeColor = System.Drawing.Color.LightGray;
                }
            }

        }//end updateHostsList()
        /// <summary>
        /// Logic to update records
        /// </summary>
        public void updateRecords(JsonResponse fetchedRecords)
        {
            if (fetchedRecords == null) //Dont attempt updates if the fetch failed
                return;

            int up_to_date = 0, skipped = 0, failed = 0, updated = 0, ignored = 0;
            string[] selectedHosts = Program.settingsManager.getSetting("SelectedHosts").ToString().Split(';');

            for (int i = 0; i < fetchedRecords.response.recs.count; i++)
            {
                //Skip over MX and CNAME records
                //TODO: Dont skip them :)
                if (fetchedRecords.response.recs.objs[i].type != "A")
                {
                    skipped++;
                    continue;
                }


                //Ignore anything that is not checked
                if ((Array.IndexOf(selectedHosts, fetchedRecords.response.recs.objs[i].display_name) >= 0) != true)
                {
                    ignored++;
                    continue;
                }

                //Skip over anything that doesnt need an update
                if (fetchedRecords.response.recs.objs[i].content == Program.settingsManager.getSetting("ExternalAddress").ToString())
                {
                    up_to_date++;
                    continue;
                }

                string strResponse = this.updateCloudflareRecords(fetchedRecords.response.recs.objs[i]);

                JavaScriptSerializer serializer = new JavaScriptSerializer();

                JsonResponse resp = serializer.Deserialize<JsonResponse>(strResponse);

                if (resp.result != "success")
                {
                    failed++;
                    Logger.log(Properties.Resources.Logger_Failed + " " + fetchedRecords.response.recs.objs[i].name + " " + resp.msg, Logger.Level.Error);
                }
                else
                {
                    updated++;
                }
            }

            Logger.log("Update at " + DateTime.Now + " - " + updated.ToString(Program.cultureInfo) + " updated, " + up_to_date.ToString(Program.cultureInfo) + " up to date, " + skipped.ToString(Program.cultureInfo) + " skipped, " + ignored.ToString(Program.cultureInfo) + " ignored, " + failed.ToString(Program.cultureInfo) + " failed", Logger.Level.Info);

        }//end updateRecords()
        /// <summary>
        /// Logic to update records
        /// </summary>
        public void updateRecords(ICollection <DomainDnsJsonResponse> fetchedRecords)
        {
            if (fetchedRecords == null) //Dont attempt updates if the fetch failed
            {
                return;
            }

            int up_to_date = 0, skipped = 0, failed = 0, updated = 0, ignored = 0;

            string[] selectedHosts = Program.settingsManager.getSetting("SelectedHosts").ToString().Split(';');

            foreach (var fetchedRecord in fetchedRecords)
            {
                var record = fetchedRecord.Response.response;
                for (int i = 0; i < record.recs.count; i++)
                {
                    //Skip over MX and CNAME records
                    //TODO: Dont skip them :)
                    if (record.recs.objs[i].type != "A")
                    {
                        skipped++;
                        continue;
                    }


                    //Ignore anything that is not checked
                    if ((Array.IndexOf(selectedHosts, record.recs.objs[i].display_name) >= 0) != true)
                    {
                        ignored++;
                        continue;
                    }

                    //Skip over anything that doesnt need an update
                    if (record.recs.objs[i].content ==
                        Program.settingsManager.getSetting("ExternalAddress").ToString())
                    {
                        up_to_date++;
                        continue;
                    }

                    string strResponse = this.updateCloudflareRecords(record.recs.objs[i]);

                    JavaScriptSerializer serializer = new JavaScriptSerializer();

                    JsonResponse resp = serializer.Deserialize <JsonResponse>(strResponse);

                    if (resp.result != "success")
                    {
                        failed++;
                        Logger.log(
                            Properties.Resources.Logger_Failed + " " + record.recs.objs[i].name + " " +
                            resp.msg, Logger.Level.Error);
                    }
                    else
                    {
                        updated++;
                    }
                }
            }

            Logger.log("Update at " + DateTime.Now + " - " + updated.ToString(Program.cultureInfo) + " updated, " + up_to_date.ToString(Program.cultureInfo) + " up to date, " + skipped.ToString(Program.cultureInfo) + " skipped, " + ignored.ToString(Program.cultureInfo) + " ignored, " + failed.ToString(Program.cultureInfo) + " failed", Logger.Level.Info);
        }//end updateRecords()