private string createRealDeckMessageString(DeckCardsMessage dcm)
        {
            string retu = "{\"deck\":\"" + dcm.deck + "\",\"metadata\":\"" + dcm.metadata + "\",\"cards\":[";

            for (int i = 0; i < dcm.cards.Length; i++)
            { // example {"id":10364756,"typeId":117,"tradable":true,"isToken":false,"level":0}
                if (i > 0) retu = retu + ",";
                Card c= dcm.cards[i];
                retu = retu + "{\"id\":" + c.id + ",\"typeId\":" + c.getType() + ",\"tradeable\":" + c.tradable.ToString().ToLower() + ",\"isToken\":" + c.isToken.ToString().ToLower() + ",\"level\":" + dcm.cards[i].level + "}";
            }

            retu=retu+"],\"resources\":[";

            for(int i=0;i< dcm.resources.Length;i++)
            {
                if (i > 0) retu = retu + ",";
                retu = retu + "\"" + dcm.resources[i] + "\"";
            }

            retu=retu+"],\"valid\":false,\"msg\":\"DeckCards\"}";
            return retu;
        }
        private void createDeckCardsMessage(bool testonly)
        {
            if (this.deckCards.Count == 0) { this.noadded = true; return; }
            DeckCardsMessage dcm = new DeckCardsMessage();
            //System.Threading.Thread.Sleep(10);
            bool growthused = false, orderused = false, energyused = false, decayused = false;
            // do adding cards here
            List<Card> addedcards = new List<Card>();
            // first add the highest cardlevels

            foreach (Card c in this.level2Cards)
            {
                if (this.deckCards.Contains(c.typeId) && !(addedcards.Exists(x => x.id == c.id)))
                {
                    if (c.getResourceType() == ResourceType.GROWTH) growthused = true;
                    if (c.getResourceType() == ResourceType.ORDER) orderused = true;
                    if (c.getResourceType() == ResourceType.ENERGY) energyused = true;
                    if (c.getResourceType() == ResourceType.DECAY) decayused = true;
                    addedcards.Add(c);
                    this.deckCards.Remove(c.typeId);
                }
            }
            foreach (Card c in this.level1Cards)
            {
                if (this.deckCards.Contains(c.typeId) && !(addedcards.Exists(x => x.id == c.id)))
                {
                    if (c.getResourceType() == ResourceType.GROWTH) growthused = true;
                    if (c.getResourceType() == ResourceType.ORDER) orderused = true;
                    if (c.getResourceType() == ResourceType.ENERGY) energyused = true;
                    if (c.getResourceType() == ResourceType.DECAY) decayused = true;
                    addedcards.Add(c);
                    this.deckCards.Remove(c.typeId);
                }
            }
            // add untradeable bevor tradeable
            foreach (Card c in this.level0untradeableCards)
            {
                if (this.deckCards.Contains(c.typeId) && !(addedcards.Exists(x => x.id == c.id)))
                {
                    if (c.getResourceType() == ResourceType.GROWTH) growthused = true;
                    if (c.getResourceType() == ResourceType.ORDER) orderused = true;
                    if (c.getResourceType() == ResourceType.ENERGY) energyused = true;
                    if (c.getResourceType() == ResourceType.DECAY) decayused = true;
                    addedcards.Add(c);
                    this.deckCards.Remove(c.typeId);
                }
            }
            foreach (Card c in this.level0tradeableCards)
            {
                if (this.deckCards.Contains(c.typeId) && !(addedcards.Exists(x => x.id == c.id)))
                {
                    if (c.getResourceType() == ResourceType.GROWTH) growthused = true;
                    if (c.getResourceType() == ResourceType.ORDER) orderused = true;
                    if (c.getResourceType() == ResourceType.ENERGY) energyused = true;
                    if (c.getResourceType() == ResourceType.DECAY) decayused = true;
                    addedcards.Add(c);
                    this.deckCards.Remove(c.typeId);
                }
            }


            dcm.cards = addedcards.ToArray();

            // create resources string
            int anzressis = 0;
            if (growthused) anzressis++;
            if (orderused) anzressis++;
            if (energyused) anzressis++;
            if (decayused) anzressis++;
            ResourceType[] rt = new ResourceType[anzressis];
            int temp_res = 0;
            if (growthused) { rt[temp_res] = ResourceType.GROWTH; temp_res++; }
            if (orderused) { rt[temp_res] = ResourceType.ORDER; temp_res++; }
            if (energyused) { rt[temp_res] = ResourceType.ENERGY; temp_res++; }
            if (decayused) { rt[temp_res] = ResourceType.DECAY; temp_res++; }
            dcm.resources = rt;
            // set positions
            if (!testonly)
            {
                string meta = mtMkr.getMetaData(addedcards);
                Console.WriteLine("#meta " + meta);
                dcm.metadata = meta;
            }
            dcm.valid = false;
            dcm.deck = "";
            // add the deck!
            Console.WriteLine("set cards");

           
            //db.handleMessage(dcm); //unsave ...  was unsave, but i writed createRealDeckMessageString, so i have to use the other version (or my work would be needless)!


            string rdms = this.createRealDeckMessageString(dcm);
            Message msg = MessageFactory.create(MessageFactory.getMessageName(rdms), rdms);
            if (testonly)
            {
                this.tempmessage = rdms;
            }
            Console.WriteLine("#" + msg.getRawText());
            if (!testonly) dispatchMessages.Invoke(App.Communicator, new object[] { msg });
            this.missingCards = "";
            if (this.deckCards.Count > 0)
            {
                this.dontOwnAllCards = true;
                CardTypeManager ctm=CardTypeManager.getInstance();
                Dictionary<string, int> idNotOwnedNumber = new Dictionary<string, int>();
                foreach (int ii in deckCards)
                {
                    CardType type = ctm.get(ii);
                    if (idNotOwnedNumber.ContainsKey(type.name))
                    {
                        idNotOwnedNumber[type.name] += 1;
                    }
                    else
                    {
                        idNotOwnedNumber.Add(type.name, 1);
                    }

                }

                foreach (KeyValuePair<string, int> kvp in idNotOwnedNumber.OrderBy(i => i.Key))
                    {
                        if (this.missingCards != "") this.missingCards = this.missingCards + "\r\n";
                        CardType type = ctm.get(kvp.Key);
                        this.missingCards = this.missingCards + kvp.Value +"x "+kvp.Key;
                    }
          
            }

        }
        public void PopupCancel(string popupType)
        {
            if (popupType == "sharedeck2")
            {
                string link = this.createLink();
                link = link.Replace("http://www.UltimateDeckImporter.com/?l=", "");
                List<string> data = new List<string>();
                data.Add(App.MyProfile.ProfileInfo.name);
                data.Add(link);
                data.Add(this.choosenname);
                data.Add("");
                this.googleie.postDataToGoogleForm(data);
            }

            if (popupType == "impdeck")
            {
                DeckCardsMessage dcm = new DeckCardsMessage("");
                List<Card> cardes = new List<Card>();
                foreach (Card c in imp.allCards)
                {
                    if (this.copydeck.cards.Contains(c.id.ToString()))
                    {
                        cardes.Add(c);
                    }
                }
                dcm.cards = cardes.ToArray();
                dcm.metadata = this.copydeck.metadata;
                db.handleMessage(dcm);
            }
        }
        public void PopupOk(string popupType)
        {
            if (popupType == "deleteprivatedeckok")
            {
                this.dcksrchui.setOwnList();
            }
            if (popupType == "deletedeckprivate")
            {
                string text = System.IO.File.ReadAllText(this.deckfolder + System.IO.Path.DirectorySeparatorChar + "decks.txt");
                string[] data = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string s in data)
                {
                    if (s.Contains(this.dcksrchui.infodeck.deckname + ";"))
                    {
                        text = text.Replace(s + "\r\n", "");
                    }
                }
                System.IO.File.WriteAllText(this.deckfolder + System.IO.Path.DirectorySeparatorChar + "decks.txt", text);
                App.Popups.ShowOk(this, "deleteprivatedeckok", "Deck deleted", "Your deck was deleted.", "OK");
 
            }

            if (popupType == "savedeck2")
            {
                string text = System.IO.File.ReadAllText(this.deckfolder + System.IO.Path.DirectorySeparatorChar + "decks.txt");
                string[] data = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                foreach(string s in data)
                {
                    if (s.Contains(this.choosenname + ";"))
                    {
                        text = text.Replace(s+"\r\n","");
                    }
                }
                string link = this.createLink();
                text = text + this.choosenname + ";" + link + "\r\n";
                System.IO.File.WriteAllText(this.deckfolder + System.IO.Path.DirectorySeparatorChar + "decks.txt", text);
                Console.WriteLine("saved own deck");
                App.Popups.ShowOk(this, "decksave", "Saved Deck", "Your deck was saved.", "OK");

            }

            if (popupType == "loadOldDeck")
            {
                DeckCardsMessage dcm = new DeckCardsMessage("");
                List<Card> cardes = new List<Card>();
                foreach (Card c in imp.allCards)
                {
                    if (this.copydeck.cards.Contains(c.id.ToString()))
                    {
                        cardes.Add(c);
                    }
                }
                dcm.cards = cardes.ToArray();
                dcm.metadata = this.copydeck.metadata;
                db.handleMessage(dcm);

            }
        }
        private string createLinkFromDCM(DeckCardsMessage dcm)
        {
            string retu = "";

            List<Card> tableCards = dcm.cards.ToList();
            Dictionary<int, int> cardDic = new Dictionary<int, int>();
            foreach (Card dc in tableCards)
            {
                int type = dc.getType();
                if (cardDic.ContainsKey(type)) { cardDic[type] = cardDic[type] + 1; } else { cardDic[type] = 1; }
            }

            foreach (KeyValuePair<int, int> kvp in cardDic)
            {
                if (retu == "") { retu = kvp.Key + "," + kvp.Value; }
                else
                {
                    retu = retu + ":" + kvp.Key + "," + kvp.Value;
                }
            }
            if (retu == "") return "";
            retu = "http://www.UltimateDeckImporter.com/?l=" + retu;
            retu = retu.Replace(",3", "");
            numberScrollsOnBoard = tableCards.Count();
            return retu;
        }