public void put()
        {
            errors.Clear();
            if (CraftManager.main_ui.show_transfer_indicator)
            {
                errors.Add("unable to update, another craft is still uploading");
            }
            if (errors.Count == 0)
            {
                CraftManager.main_ui.close_update_kerbalx_craft_dialog();
                CraftManager.main_ui.show_transfer_indicator = true;
                CraftManager.main_ui.transfer_is_upload      = false;

                WWWForm craft_data = new WWWForm();
                craft_data.AddField("craft_name", craft_name);
                craft_data.AddField("craft_file", System.IO.File.ReadAllText(craft.path));
                craft_data.AddField("part_data", JSONX.toJSON(part_info()));

                KerbalX.api.update_craft(update_to_id, craft_data, (resp, code) => {
                    if (code == 200)
                    {
                        CraftManager.log("craft updated OK");
                        KerbalX.api.fetch_existing_craft((empty_resp, status_code) => {
                            CraftManager.main_ui.close_upload_interface();
                        });
                    }
                    else
                    {
                        CraftManager.log("craft update failed");
                    }
                    CraftManager.main_ui.show_transfer_indicator = false;
                });
            }
        }
        public void post()
        {
            if (is_valid)
            {
                CraftManager.main_ui.show_transfer_indicator = true;
                CraftManager.main_ui.transfer_is_upload      = true;
                WWWForm craft_data = new WWWForm();
                craft_data.AddField("craft_name", craft_name);
                craft_data.AddField("craft_style", craft_type);
                craft_data.AddField("craft_file", System.IO.File.ReadAllText(craft.path));
                craft_data.AddField("part_data", JSONX.toJSON(part_info()));
                craft_data.AddField("action_groups", JSONX.toJSON(action_groups));
                craft_data.AddField("hash_tags", hash_tags);

                int pic_count = 0;
                foreach (Image image in images)
                {
                    craft_data.AddField("images[image_" + pic_count++ + "]", Convert.ToBase64String(image.read_as_jpg()));
//                    craft_data.AddField("image_urls[url_" + pic_count++ + "]", "https://i.imgur.com/nSUkIe0.jpg");
                }

                KerbalX.api.upload_craft(craft_data, (resp, code) => {
                    //                        var resp_data = JSON.Parse(resp);
                    if (code == 200)
                    {
                        CraftManager.log("craft uploaded OK");
                        KerbalX.api.fetch_existing_craft((empty_resp, status_code) => {   //refresh remote craft info
                            craft.matching_remote_ids = null;
                            CraftManager.main_ui.close_upload_interface();
                        });
                    }
                    else
                    {
                        CraftManager.log("craft upload failed");
                    }

                    //return UI to craft list mode and show upload complete dialog.
                    CraftManager.main_ui.show_transfer_indicator = false;
                    //                        CraftManager.main_ui.unlock_ui();
                    CraftManager.main_ui.upload_complete_dialog(code, JSON.Parse(resp));
                });
            }
        }