private int GetProductInfoSku(HtmlAgilityPack.HtmlDocument _doc, ref ProductInfoSku PIS, ref List <string> images, ref List <String_String> name_and_des_title_img)
        {
            /* try
             * {*/
            HtmlNode jProductInfoSku = _doc.GetElementbyId("j-product-info-sku");

            IEnumerable <HtmlNode> proItems = jProductInfoSku.Elements("dl");

            foreach (HtmlNode proItem in proItems)
            {
                string name = "";
                //Gonna be added to NameVal_String
                NameValueCollection skuList = new NameValueCollection();
                int hasIMGTag = 0;

                name = proItem.Element("dt").InnerText.Replace(":", "");
                HtmlAgilityPack.HtmlNode jSkuList = proItem.Element("dd").Element("ul");
                IEnumerable <HtmlNode>   itemSkus = jSkuList.Elements("li");
                //itemSku: li element contains class item-sku-color
                foreach (HtmlNode itemSku in itemSkus)
                {
                    string dataSkuId = itemSku.FirstChild.Attributes["data-sku-id"].Value;
                    string title;
                    if (itemSku.FirstChild.Attributes.Contains("title"))
                    {
                        title = itemSku.FirstChild.Attributes["title"].Value;
                    }
                    else
                    {
                        title = itemSku.FirstChild.InnerText;
                    }
                    skuList.Add(dataSkuId, title);
                    //Images of colors

                    if (itemSku.FirstChild.Descendants("img").Count <HtmlNode>() > 0)
                    {
                        if (itemSku.FirstChild.Element("img").Attributes.Contains("bigpic"))
                        {
                            string bigpicWithTail    = itemSku.FirstChild.Element("img").Attributes["bigpic"].Value;
                            string bigpicWithoutTail = bigpicWithTail.Remove(bigpicWithTail.LastIndexOf('_'));
                            images.Add(bigpicWithoutTail);

                            string values_s = "<tr><td>" + name + ": " + title + "</td><td><img width='480' height='480' src='" + bigpicWithTail + "'></td></tr>";
                            name_and_des_title_img.Add(new String_String(name, values_s));
                        }
                        hasIMGTag = 1;
                    }

                    //Background colors
                    else if (itemSku.FirstChild.Descendants("span").Where(n => n.Attributes.Contains("class") && n.Attributes["class"].Value.Contains("sku-color-")).Count <HtmlNode>() > 0)
                    {
                        MessageBox.Show(itemSku.FirstChild.Descendants("span").First().OuterHtml);
                        HtmlNode backgroundColorCSSElem = itemSku.FirstChild.Descendants("span").Where(n => n.Attributes.Contains("class") && n.Attributes["class"].Value.Contains("sku-color-")).First();
                        string   className  = backgroundColorCSSElem.Attributes["class"].Value;
                        string   colorStyle = BackgroundColorSelector(className);
                        if (colorStyle == "")
                        {
                            return(-2);
                        }
                        string values_s = "<tr><td>" + name + ": " + title + "</td><td width='480' height='480' style='" + BackgroundColorSelector(className) + "'></td></tr>";
                        name_and_des_title_img.Add(new String_String(name, values_s));
                    }
                    else if (name.ToLower() == "color")
                    {
                        MessageBox.Show("Color not found! Liên hệ https://www.facebook.com/letruongquy96 \nOuterHTML: " + itemSku.InnerHtml);
                        return(-1);
                    }
                }
                NameVal_String skuList_hasIMGTag = new NameVal_String(skuList, hasIMGTag);
                PropertyItem   tempPI            = new PropertyItem(name, skuList_hasIMGTag);
                PIS.Add(tempPI);
            }

            /*}
             * catch(Exception ex)
             * {
             *  MessageBox.Show("GetProductInfoSku: " + ex.Message);
             *  return -7;
             * }*/

            return(0);
        }
        private int ProcessOneLink(string _link, ref StringBuilder _csv, List <string> _namesTempList)
        {
            string haha = _link;

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            HtmlWeb htWeb = new HtmlWeb();

            htWeb.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";
            doc             = htWeb.Load(_link);
            haha           += " " + doc.DocumentNode.OuterHtml;
            Clipboard.SetText(haha);
            if (doc == null)
            {
                MessageBox.Show("Error loading document. Please check the internet connection!");
                return(-6);
            }
            NameValueCollection record = new NameValueCollection();

            List <string> images = new List <string>();

            List <String_String> name_and_des_title_img = new List <String_String>();
            ProductInfoSku       PIS = new ProductInfoSku();
            int getPIS_code          = GetProductInfoSku(doc, ref PIS, ref images, ref name_and_des_title_img);

            if (getPIS_code != 0)
            {
                MessageBox.Show("GetProductInfoSku returns code: " + getPIS_code);
                return(-3);
            }
            List <string> namesOfSku = PIS.GetAllNames();

            //Description and brand
            HtmlNode desMasterNode = doc.DocumentNode.SelectSingleNode("//*[@id='j-product-desc']/div[1]/div[2]/ul");
            string   des           = ""; //+ Transfer.moreDescriptionHead + "\n";
            string   brandName     = "Unbranded";

            foreach (HtmlNode desChilds in desMasterNode.Elements("li"))
            {
                if (desChilds.InnerText.Contains("Brand Name:"))
                {
                    brandName = desChilds.Elements("span").Last().InnerText;
                }
                des += Regex.Replace(desChilds.InnerText.Replace("\n", ""), @"\s+", " ") + "\n";
            }
            des  = des.Replace("\n", "<br>");
            des += "<table style='width:100%' border='5'>";
            for (int _i = 0; _i < name_and_des_title_img.Count; _i++)
            {
                des += name_and_des_title_img.ElementAt(_i).name2; // name_and_des_title_img.Get(_i)
            }
            des += "</table><br>";
            record.Add("description", des);
            //Title
            string titleTextField = doc.DocumentNode.SelectSingleNode("//*[@id='j-product-detail-bd']/div[1]/div/h1/text()").InnerText;

            titleTextField = titleTextField.Replace(brandName, "");
            record.Add("title", titleTextField);



            HtmlNode scriptNode        = doc.DocumentNode.Descendants().Where(n => n.Name == "script" && n.InnerText.Contains("skuProducts")).First();
            string   skuProductsString = "";

            TrimStringByTwoChars('[', ']', scriptNode.InnerText, ref skuProductsString, "skuProducts");
            JArray jsonArray   = JArray.Parse(skuProductsString);
            string traitsField = "";



            //Condition
            traitsField += "[[Condition:" + Transfer.conditionStatus + "]]";

            //Weight
            string weight = "0";

            weight       = doc.DocumentNode.Descendants("li").Where(n => n.HasClass("packaging-item") && n.InnerText.Contains("Package Weight:")).First().Descendants("span").Where(m => m.InnerText.Contains("kg")).First().Attributes["rel"].Value;
            traitsField += "[[weight:" + weight + "]][[weight_unit:kg]]";

            //trait
            int totalQtt = 0;

            foreach (JToken jToken in jsonArray)
            {
                string   childTrait = "[";
                string   skuPropIds = jToken["skuPropIds"].ToString();
                string[] skuIds     = skuPropIds.Split(',');
                for (int i = 0; i < skuIds.Count <string>(); i++)
                {
                    childTrait += "[" + namesOfSku.ElementAt(i) + ":" + PIS.proItemList.ElementAt(i).skuList_hasIMGTag.skuList[skuIds.ElementAt(i)] + "]";
                }

                string displayPrice = "";
                //Discount price
                if (rdoDiscountPrice.Checked)
                {
                    if (jToken["skuVal"]["actSkuMultiCurrencyDisplayPrice"] != null)
                    {
                        displayPrice = jToken["skuVal"]["actSkuMultiCurrencyDisplayPrice"].ToString();
                    }
                    else
                    {
                        displayPrice = jToken["skuVal"]["skuMultiCurrencyDisplayPrice"].ToString();
                    }
                }
                if (rdoOriginalPrice.Checked)
                {
                    displayPrice = jToken["skuVal"]["skuMultiCurrencyDisplayPrice"].ToString();
                }

                if (displayPrice == "")
                {
                    MessageBox.Show("Error 153. Cannot continue!");
                    return(-10);
                }


                PricingMultiply(ref displayPrice);
                childTrait += "[price:" + displayPrice + "]";
                string availQuantity = jToken["skuVal"]["availQuantity"].ToString();
                if (availQuantity == "0" && FSF1.Controls.Find("chkReplaceZeroQtt", false).OfType <CheckBox>().First().Checked)
                {
                    availQuantity = FSF1.Controls.Find("mudReplaceZeroQtt", false).OfType <NumericUpDown>().First().Value.ToString();
                }
                totalQtt    += Int32.Parse(availQuantity);
                childTrait  += "[quantity:" + availQuantity + "]]";
                traitsField += childTrait;
            }
            record.Add("trait", traitsField);

            //quantity
            record.Add("quantity", totalQtt.ToString());

            //Images
            HtmlNode jImageThumbList         = doc.GetElementbyId("j-image-thumb-list");
            IEnumerable <HtmlNode> jImageLis = jImageThumbList.Elements("li");

            foreach (HtmlNode jImageLi in jImageLis)
            {
                string imgWithTail    = jImageLi.Element("span").Element("img").Attributes["src"].Value;
                string imgWithoutTail = imgWithTail.Remove(imgWithTail.LastIndexOf('_'));
                images.Add(imgWithoutTail);
            }
            string imagesField = string.Join(" ", images);

            record.Add("images", imagesField);

            //sku and id
            string gaDataString = "";

            TrimStringByTwoChars('{', '}', scriptNode.InnerText, ref gaDataString, "GaData");
            JToken productIds    = JToken.Parse(gaDataString)["productIds"];
            string IDandSKUField = "al" + productIds.ToString();

            record.Add("sku", IDandSKUField);
            record.Add("id", IDandSKUField);


            //Cheapest + fastest shipping price. shipping_price, shipping_type, shipping_service, worldwide_shipping_price, worldwide_shipping_type,
            string    baseShippingURL = @"https://freight.aliexpress.com/ajaxFreightCalculateService.htm?count=1&currencyCode=USD&sendGoodsCountry=&country=US";
            string    productID       = string.Join("", productIds.ToString().Where(char.IsDigit));
            WebClient webClient       = new WebClient();
            string    sourceString    = webClient.DownloadString(baseShippingURL + "&productid=" + productID);

            sourceString = sourceString.Remove(sourceString.IndexOf("("), 1);
            sourceString = sourceString.Remove(sourceString.LastIndexOf(")"));
            JToken shippingJsonRaw    = JToken.Parse(sourceString);
            List <ShippingMethod> SMs = new List <ShippingMethod>();
            int    cheapestInx        = -1;
            double cheapestPrice;

            decimal shortestTimeMean;
            int     shortestTimeMeanInx = -1;

            cheapestPrice = Convert.ToInt32(shippingJsonRaw["freight"][0]["price"].ToString());

            string _timeTemp = shippingJsonRaw["freight"][0]["time"].ToString();

            string[] _minMaxTimeTemp = _timeTemp.Split('-');
            shortestTimeMean = (Convert.ToInt32(_minMaxTimeTemp[0]) + Convert.ToInt32(_minMaxTimeTemp[1])) / 2m;


            for (int i = 0; i < shippingJsonRaw["freight"].Count(); i++)
            {
                string   _name       = shippingJsonRaw["freight"][i]["companyDisplayName"].ToString();
                string   _price      = shippingJsonRaw["freight"][i]["price"].ToString();
                string   _time       = shippingJsonRaw["freight"][i]["time"].ToString();
                string[] _minMaxTime = _time.Split('-');
                decimal  _timeMean   = (Convert.ToInt32(_minMaxTime[0]) + Convert.ToInt32(_minMaxTime[1])) / 2m;
                if (cheapestPrice >= Convert.ToDouble(_price))
                {
                    cheapestInx   = i;
                    cheapestPrice = Convert.ToDouble(_price);
                }
                if (shortestTimeMean >= _timeMean)
                {
                    shortestTimeMeanInx = i;
                    shortestTimeMean    = _timeMean;
                }
                SMs.Add(new ShippingMethod(_name, Convert.ToDouble(_price), _timeMean));
            }
            List <ShippingMethod> cheapestPricingSMs = new List <ShippingMethod>();

            for (int i = 0; i < SMs.Count; i++)
            {
                if (Convert.ToDouble(SMs.ElementAt(i).price) < cheapestPrice + 4)
                {
                    cheapestPricingSMs.Add(SMs.ElementAt(i));
                }
            }
            int            cheapestShortestSMInx = 0;
            ShippingMethod cheapestShortestSM    = cheapestPricingSMs.ElementAt(0);

            for (int i = 0; i < cheapestPricingSMs.Count; i++)
            {
                if (cheapestShortestSM.timeMean >= cheapestPricingSMs.ElementAt(i).timeMean)
                {
                    cheapestShortestSMInx = i;
                    cheapestShortestSM    = cheapestPricingSMs.ElementAt(i);
                }
            }
            record.Add("shipping_price", cheapestShortestSM.price.ToString());
            record.Add("shipping_type", "flat");
            if (cheapestShortestSM.timeMean > 0 && cheapestShortestSM.timeMean <= 10)
            {
                record.Add("shipping_service", "Economy shipping (1 to 10 business days)");
            }
            else if (cheapestShortestSM.timeMean > 10 && cheapestShortestSM.timeMean <= 22)
            {
                record.Add("shipping_service", "International Shipping (2 to 3 weeks)");
            }
            else if (cheapestShortestSM.timeMean > 22 && cheapestShortestSM.timeMean <= 28)
            {
                record.Add("shipping_service", "International Shipping (3 to 4 weeks)");
            }
            else if (cheapestShortestSM.timeMean > 28 && cheapestShortestSM.timeMean <= 45)
            {
                record.Add("shipping_service", "International Shipping (4 to 5 weeks)");
            }
            else
            {
                record.Add("shipping_service", "Unspecified shipping type");
            }
            record.Add("worldwide_shipping_price", FSF1.Controls.Find("nudWorldwideFlatRate", false).OfType <NumericUpDown>().First().Value.ToString());
            record.Add("worldwide_shipping_type", "flat");



            //alie_link
            record.Add("alie_id", productID);

            //force_update
            record.Add("force_update", "true");

            string newRecordString = "";

            foreach (string _name in _namesTempList)
            {
                newRecordString += "\"" + record[_name] + "\"" + ",";
            }
            _csv.AppendLine(newRecordString);

            return(0);
        }