using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ShiftOS
{
    public partial class SkinLoader : Form
    {
        public SkinLoader()
        {
            InitializeComponent();
        }

        public Skinning.Skin PreviewSkin = null;
        public Skinning.Images PreviewImages = null;

        private void btnclose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        public string LoadedSkinFile = "fail";

        public void LoadSkin(string res)
        {
            LoadedSkinFile = res;
            ExtractSkin(res);
            SetupDesktop();
            setupborders();
            setuptitlebar();
            setskin();
        }

        private void ExtractSkin(string file)
        {
            if(Directory.Exists(Paths.ToBeLoaded))
            {
                Directory.Delete(Paths.ToBeLoaded, true);
            }
            API.ExtractFile(file, Paths.ToBeLoaded, false);
            PreviewSkin = JsonConvert.DeserializeObject<Skinning.Skin>(File.ReadAllText(Paths.ToBeLoaded + "data.json"));
            LoadImages();
        }

        private void LoadImages()
        {
            PreviewImages = new Skinning.Images();
            PreviewImages.applauncherclick = GetImage(PreviewSkin.applauncherclickpath);
            PreviewImages.panelbutton = GetImage(PreviewSkin.panelbuttonpath);
            PreviewImages.applaunchermouseover = GetImage(PreviewSkin.applaunchermouseoverpath);
            PreviewImages.applauncher = GetImage(PreviewSkin.applauncherpath);
            PreviewImages.panelclock = GetImage(PreviewSkin.panelclockpath);
            PreviewImages.desktopbackground = GetImage(PreviewSkin.desktopbackgroundpath);
            PreviewImages.desktoppanel = GetImage(PreviewSkin.desktoppanelpath);
            PreviewImages.minbtnhover = GetImage(PreviewSkin.minbtnhoverpath);
            PreviewImages.minbtnclick = GetImage(PreviewSkin.minbtnclickpath);
            PreviewImages.rightcorner = GetImage(PreviewSkin.rightcornerpath);
            PreviewImages.titlebar = GetImage(PreviewSkin.titlebarpath);
            PreviewImages.borderright = GetImage(PreviewSkin.borderrightpath);
            PreviewImages.borderleft = GetImage(PreviewSkin.borderleftpath);
            PreviewImages.borderbottom = GetImage(PreviewSkin.borderbottompath);
            PreviewImages.closebtn = GetImage(PreviewSkin.closebtnpath);
            PreviewImages.closebtnhover = GetImage(PreviewSkin.closebtnhoverpath);
            PreviewImages.closebtnclick = GetImage(PreviewSkin.closebtnclickpath);
            PreviewImages.rollbtn = GetImage(PreviewSkin.rollbtnpath);
            PreviewImages.rollbtnhover = GetImage(PreviewSkin.rollbtnhoverpath);
            PreviewImages.rollbtnclick = GetImage(PreviewSkin.rollbtnclickpath);
            PreviewImages.minbtn = GetImage(PreviewSkin.minbtnpath);
            PreviewImages.leftcorner = GetImage(PreviewSkin.leftcornerpath);
            PreviewImages.bottomleftcorner = GetImage(PreviewSkin.bottomleftcornerpath);
            PreviewImages.bottomrightcorner = GetImage(PreviewSkin.bottomrightcornerpath);
        }

        private Bitmap GetImage(string fileName)
        {
            Bitmap ret;
            if (File.Exists(Paths.ToBeLoaded + fileName))
            {
                using (Image img = Image.FromFile(Paths.ToBeLoaded + fileName))
                {
                    ret = new Bitmap(img);
                }
            }
            else
            {
                ret = null;
            }
            return ret;
        }

        private void btnloadskin_Click(object sender, EventArgs e)
        {
            API.CreateFileSkimmerSession(".skn;.spk", File_Skimmer.FileSkimmerMode.Open);
            API.FileSkimmerSession.FormClosing += (object s, FormClosingEventArgs a) =>
            {
                string res = API.GetFSResult();
                if(res != "fail")
                {
                    if(res.EndsWith(".skn"))
                    {
                        LoadedSkinFile = res;
                        ExtractSkin(res);
                        SetupDesktop();
                        setupborders();
                        setuptitlebar();
                        setskin();
                    }
                    else if(res.EndsWith(".spk"))
                    {
                        LoadedPack = res;
                        SetupPackUI();
                    }
                }
            };
        }

        public string LoadedPack = "";

        public void SetupPackUI()
        {
            pgcontents.Hide();
            pnlskinpacks.Show();

            txtpackpath.Text = LoadedPack;

            if(Directory.Exists(Paths.SkinDir + "_packdata"))
            {
                Directory.Delete(Paths.SkinDir + "_packdata", true);
            }
            API.ExtractFile(LoadedPack, Paths.SkinDir + "_packdata", false);
            cbpackfiles.Items.Clear();
            foreach (string file in Directory.GetFiles(Paths.SkinDir + "_packdata"))
            {
                var finf = new FileInfo(file);
                cbpackfiles.Items.Add(finf.Name);

            }
        }

        private void ScanForSkinFiles(string dir, ref List<string> files)
        {
            foreach(string file in Directory.GetFiles(dir))
            {
                var finf = new FileInfo(file);
                if(finf.Extension == ".skn")
                {
                    files.Add(finf.FullName);
                }
            }
            foreach(string dirname in Directory.GetDirectories(dir))
            {
                ScanForSkinFiles(dirname, ref files);
            }
        }

        private void btnapplyskin_Click(object sender, EventArgs e)
        {
            if(LoadedSkinFile != "fail")
            {
                try
                {
                    if (Viruses.InfectedWith("skininceptor"))
                    {
                        var rnd = new Random();
                        switch(rnd.Next(0, 10))
                        {
                            case 1:
                            case 3:
                            case 5:
                            case 7:
                            case 9:
                                //Load another random skin.
                                List<string> skinfiles = new List<string>();
                                ScanForSkinFiles(Paths.SaveRoot, ref skinfiles);
                                string fname = skinfiles[rnd.Next(0, skinfiles.Count - 1)];
                                Skinning.Utilities.loadsknfile(fname);
                                Skinning.Utilities.loadskin();
                                API.CurrentSession.SetupDesktop();
                                API.UpdateWindows();
                                break;
                            default:
                                File.Delete(LoadedSkinFile);
                                //Corrupting binary is fun.
                                API.CreateInfoboxSession("Skin Loader - Error", "It appears that the provided skin file is either corrupted or not supported by this version of ShiftOS.", infobox.InfoboxMode.Info);
                                Skinning.Utilities.loadedSkin = new Skinning.Skin();
                                Skinning.Utilities.loadedskin_images = new Skinning.Images();
                                API.UpdateWindows();
                                break;
                        }
                    }
                    else {
                        Skinning.Utilities.loadsknfile(LoadedSkinFile);
                        Skinning.Utilities.loadskin();
                        API.CurrentSession.SetupDesktop();
                        API.UpdateWindows();
                        PreviewSkin = API.CurrentSkin;
                        PreviewImages = API.CurrentSkinImages;
                        SetupDesktop();
                        setupborders();
                        setuptitlebar();
                        setskin();
                    }
                }
                catch (Exception ex)
                {
                    if (API.DeveloperMode == false)
                    {
                        API.CreateInfoboxSession("Skin Loader - Error", "It appears that the provided skin file is either corrupted or not supported by this version of ShiftOS.", infobox.InfoboxMode.Info);
                    }
                    else
                    {
                        API.CreateInfoboxSession("Skin Loader - Error", ex.Message, infobox.InfoboxMode.Info);
                    }
                }
            }
            else
            {
                API.CreateInfoboxSession("Skin Loader - Error", "You have not selected a skin file to load! Try pressing \"Load Skin\" and selecting a .skn file.", infobox.InfoboxMode.Info);
            }
        }

        private void SkinLoader_Load(object sender, EventArgs e)
        {

            PreviewSkin = API.CurrentSkin;
            PreviewImages = API.CurrentSkinImages;
            LoadPreview();
            pnlskinpacks.Hide();
            pgcontents.Show();
        }

        private void LoadPreview()
        {
            SetupDesktop();
            setupborders();
            setuptitlebar();
            setskin();

        }

        #region Preview Skinning

        public void SetupDesktop()
        {

            if (API.Upgrades["desktoppanel"] == true)
            {
                if (PreviewImages.desktoppanel == null)
                {
                    predesktoppanel.BackColor = PreviewSkin.desktoppanelcolour;
                    predesktoppanel.BackgroundImage = null;
                }
                else {
                    predesktoppanel.BackgroundImage = PreviewImages.desktoppanel;
                    predesktoppanel.BackgroundImageLayout = (ImageLayout)PreviewSkin.desktoppanellayout;
                    predesktoppanel.BackColor = Color.Transparent;
                }

                predesktoppanel.Size = new Size(predesktoppanel.Size.Width, PreviewSkin.desktoppanelheight);
                switch (PreviewSkin.desktoppanelposition)
                {
                    case "Top":
                        predesktoppanel.Dock = DockStyle.Top;
                        predesktopappmenu.Dock = DockStyle.Top;
                        break;
                    case "Bottom":
                        predesktoppanel.Dock = DockStyle.Bottom;
                        predesktopappmenu.Dock = DockStyle.Bottom;
                        break;
                }
                predesktoppanel.Show();
            }
            else {
                predesktoppanel.Hide();
            }


            if (API.Upgrades["applaunchermenu"] == true)
            {
                ApplicationsToolStripMenuItem.Font = new Font(PreviewSkin.applicationbuttontextfont, PreviewSkin.applicationbuttontextsize, PreviewSkin.applicationbuttontextstyle);
                ApplicationsToolStripMenuItem.Text = PreviewSkin.applicationlaunchername;



                ApplicationsToolStripMenuItem.Height = PreviewSkin.applicationbuttonheight;
                if (PreviewImages.applauncher != null)
                {
                    ApplicationsToolStripMenuItem.Text = "";
                    ApplicationsToolStripMenuItem.BackColor = Color.Transparent;
                }
                else {
                    ApplicationsToolStripMenuItem.Text = PreviewSkin.applicationlaunchername;
                    ApplicationsToolStripMenuItem.BackColor = PreviewSkin.applauncherbackgroundcolour;
                    ApplicationsToolStripMenuItem.BackgroundImage = null;
                }

                preapplaunchermenuholder.Width = PreviewSkin.applaunchermenuholderwidth;
                predesktopappmenu.Width = PreviewSkin.applaunchermenuholderwidth;
                ApplicationsToolStripMenuItem.Width = PreviewSkin.applaunchermenuholderwidth;
                preapplaunchermenuholder.Height = PreviewSkin.applicationbuttonheight;
                predesktopappmenu.Height = PreviewSkin.applicationbuttonheight;
                ApplicationsToolStripMenuItem.Height = PreviewSkin.applicationbuttonheight;

                if (PreviewImages.applauncher != null)
                {
                    ApplicationsToolStripMenuItem.BackgroundImage = PreviewImages.applauncher;
                }
                else {
                    ApplicationsToolStripMenuItem.BackColor = PreviewSkin.applauncherbackgroundcolour;
                    ApplicationsToolStripMenuItem.BackgroundImageLayout = (ImageLayout)PreviewSkin.applauncherlayout;
                }
            }
            else {
                ApplicationsToolStripMenuItem.Visible = false;
            }

            if (API.Upgrades["desktoppanelclock"] == true)
            {

                prepaneltimetext.ForeColor = PreviewSkin.clocktextcolour;

                if (PreviewImages.panelclock == null)
                {
                    pretimepanel.BackColor = PreviewSkin.clockbackgroundcolor;
                    pretimepanel.BackgroundImage = null;
                }
                else {
                    pretimepanel.BackColor = Color.Transparent;
                    pretimepanel.BackgroundImage = PreviewImages.panelclock;
                    pretimepanel.BackgroundImageLayout = (ImageLayout)PreviewSkin.panelclocklayout;
                }
                prepaneltimetext.Font = new Font(PreviewSkin.panelclocktextfont, PreviewSkin.panelclocktextsize, PreviewSkin.panelclocktextstyle);
                pretimepanel.Size = new Size(prepaneltimetext.Width + 3, pretimepanel.Height);
                prepaneltimetext.Location = new Point(0, PreviewSkin.panelclocktexttop);
                pretimepanel.Show();
            }
            else {
                pretimepanel.Hide();
            }


            ApplicationsToolStripMenuItem.BackColor = PreviewSkin.applauncherbuttoncolour;

            pnldesktoppreview.BackColor = PreviewSkin.desktopbackgroundcolour;
            pnldesktoppreview.BackgroundImage = PreviewImages.desktopbackground;
            pnldesktoppreview.BackgroundImageLayout = (ImageLayout)PreviewSkin.desktopbackgroundlayout;

            if (API.Upgrades["panelbuttons"] == true)
            {
                prepnlpanelbutton.Visible = API.Upgrades["panelbuttons"];

                pretbicon.Image = Properties.Resources.iconTerminal;
                pretbctext.Text = "Terminal";

                prepnlpanelbutton.Margin = new Padding(0, PreviewSkin.panelbuttonfromtop, PreviewSkin.panelbuttongap, 0);

                if (API.Upgrades["appicons"] == true)
                {
                    pretbicon.Show();
                }
                else
                {
                    pretbicon.Hide();
                }
                pretbicon.Location = new Point(PreviewSkin.panelbuttoniconside, PreviewSkin.panelbuttonicontop);
                pretbicon.Size = new Size(PreviewSkin.panelbuttoniconsize, PreviewSkin.panelbuttoniconsize);
                prepnlpanelbutton.Size = new Size(PreviewSkin.panelbuttonwidth, PreviewSkin.panelbuttonheight);
                prepnlpanelbutton.BackColor = PreviewSkin.panelbuttoncolour;
                prepnlpanelbutton.BackgroundImage = PreviewImages.panelbutton;
                prepnlpanelbutton.BackgroundImageLayout = (ImageLayout)PreviewSkin.panelbuttonlayout;
                pretbctext.ForeColor = PreviewSkin.panelbuttontextcolour;
                pretbctext.Font = new Font(PreviewSkin.panelbuttontextfont, PreviewSkin.panelbuttontextsize, PreviewSkin.panelbuttontextstyle);
                pretbctext.Location = new Point(PreviewSkin.panelbuttontextside, PreviewSkin.panelbuttontexttop);


                pretbicon.Size = new Size(PreviewSkin.panelbuttoniconsize, PreviewSkin.panelbuttoniconsize);

            }
            prepnlpanelbuttonholder.Padding = new Padding(PreviewSkin.panelbuttoninitialgap, 0, 0, 0);


        }



        public void setskin()
        {

            //disposals
            preclosebutton.BackgroundImage = null;
            pretitlebar.BackgroundImage = null;
            prerollupbutton.BackgroundImage = null;
            prepgtoplcorner.BackgroundImage = null;
            prepgtoprcorner.BackgroundImage = null;
            preminimizebutton.BackgroundImage = null;
            //apply new skin
            if (PreviewImages.closebtn == null)
                preclosebutton.BackColor = PreviewSkin.closebtncolour;
            else
                preclosebutton.BackgroundImage = PreviewImages.closebtn;
            preclosebutton.BackgroundImageLayout = (ImageLayout)PreviewSkin.closebtnlayout;
            if (PreviewImages.titlebar == null)
                pretitlebar.BackColor = PreviewSkin.titlebarcolour;
            else
                pretitlebar.BackgroundImage = PreviewImages.titlebar;
            pretitlebar.BackgroundImageLayout = (ImageLayout)PreviewSkin.titlebarlayout;
            if (PreviewImages.rollbtn == null)
                prerollupbutton.BackColor = PreviewSkin.rollbtncolour;
            else
                prerollupbutton.BackgroundImage = PreviewImages.rollbtn;
            prerollupbutton.BackgroundImageLayout = (ImageLayout)PreviewSkin.rollbtnlayout;
            if (PreviewImages.leftcorner == null)
                prepgtoplcorner.BackColor = PreviewSkin.leftcornercolour;
            else
                prepgtoplcorner.BackgroundImage = PreviewImages.leftcorner;
            prepgtoplcorner.BackgroundImageLayout = (ImageLayout)PreviewSkin.leftcornerlayout;
            if (PreviewImages.rightcorner == null)
                prepgtoprcorner.BackColor = PreviewSkin.rightcornercolour;
            else
                prepgtoprcorner.BackgroundImage = PreviewImages.rightcorner;
            prepgtoprcorner.BackgroundImageLayout = (ImageLayout)PreviewSkin.rightcornerlayout;
            if (PreviewImages.minbtn == null)
                preminimizebutton.BackColor = PreviewSkin.minbtncolour;
            else
                preminimizebutton.BackgroundImage = PreviewImages.minbtn;
            preminimizebutton.BackgroundImageLayout = (ImageLayout)PreviewSkin.minbtnlayout;
            if (PreviewImages.borderleft == null)
                prepgleft.BackColor = PreviewSkin.borderleftcolour;
            else
                prepgleft.BackgroundImage = PreviewImages.borderleft;
            prepgleft.BackgroundImageLayout = (ImageLayout)PreviewSkin.borderleftlayout;
            if (PreviewImages.borderright == null)
                prepgright.BackColor = PreviewSkin.borderrightcolour;
            else
                prepgright.BackgroundImage = PreviewImages.borderright;
            prepgleft.BackgroundImageLayout = (ImageLayout)PreviewSkin.borderrightlayout;
            if (PreviewImages.borderbottom == null)
                prepgbottom.BackColor = PreviewSkin.borderbottomcolour;
            else
                prepgbottom.BackgroundImage = PreviewImages.borderbottom;
            prepgbottom.BackgroundImageLayout = (ImageLayout)PreviewSkin.borderbottomlayout;
            if (PreviewSkin.enablebordercorners == true)
            {
                if (PreviewImages.bottomleftcorner == null)
                    prepgbottomlcorner.BackColor = PreviewSkin.bottomleftcornercolour;
                else
                    prepgbottomlcorner.BackgroundImage = PreviewImages.bottomleftcorner;
                prepgbottomlcorner.BackgroundImageLayout = (ImageLayout)PreviewSkin.bottomleftcornerlayout;
                if (PreviewImages.bottomrightcorner == null)
                    prepgbottomrcorner.BackColor = PreviewSkin.bottomrightcornercolour;
                else
                    prepgbottomrcorner.BackgroundImage = PreviewImages.bottomrightcorner;
                prepgbottomrcorner.BackgroundImageLayout = (ImageLayout)PreviewSkin.bottomrightcornerlayout;
            }
            else {
                prepgbottomlcorner.BackColor = PreviewSkin.borderrightcolour;
                prepgbottomrcorner.BackColor = PreviewSkin.borderrightcolour;
                prepgbottomlcorner.BackgroundImage = null;
                prepgbottomrcorner.BackgroundImage = null;
            }

            //set bottom border corner size
            prepgbottomlcorner.Size = new Size(PreviewSkin.borderwidth, PreviewSkin.borderwidth);
            prepgbottomrcorner.Size = new Size(PreviewSkin.borderwidth, PreviewSkin.borderwidth);
            prepgbottomlcorner.Location = new Point(0, pnlwindowpreview.Height - PreviewSkin.borderwidth);
            prepgbottomrcorner.Location = new Point(pnlwindowpreview.Width, pnlwindowpreview.Height - PreviewSkin.borderwidth);
        }

        private void setupborders()
        {
            if (API.Upgrades["windowborders"] == false)
            {
                prepgleft.Hide();
                prepgbottom.Hide();
                prepgright.Hide();
            }
        }

        private void setuptitlebar()
        {
            setupborders();

            prepgleft.Width = PreviewSkin.borderwidth;
            prepgright.Width = PreviewSkin.borderwidth;
            prepgbottom.Height = PreviewSkin.borderwidth;
            pretitlebar.Height = PreviewSkin.titlebarheight;

            if (PreviewSkin.enablecorners == true)
            {
                prepgtoplcorner.Show();
                prepgtoprcorner.Show();
                prepgtoprcorner.Width = PreviewSkin.titlebarcornerwidth;
                prepgtoplcorner.Width = PreviewSkin.titlebarcornerwidth;
            }
            else {
                prepgtoplcorner.Hide();
                prepgtoprcorner.Hide();
            }

            if (API.Upgrades["titlebar"] == false)
            {
                pretitlebar.Hide();
            }

            if (API.Upgrades["titletext"] == false)
            {
                pretitletext.Hide();
            }
            else {
                pretitletext.Font = new Font(PreviewSkin.titletextfontfamily, PreviewSkin.titletextfontsize, PreviewSkin.titletextfontstyle, GraphicsUnit.Point);
                pretitletext.Text = "Your app name here";
                pretitletext.Show();
            }

            if (API.Upgrades["closebutton"] == false)
            {
                preclosebutton.Hide();
            }
            else {
                preclosebutton.BackColor = PreviewSkin.closebtncolour;
                preclosebutton.Size = PreviewSkin.closebtnsize;
                preclosebutton.Show();
            }

            if (API.Upgrades["rollupbutton"] == false)
            {
                prerollupbutton.Hide();
            }
            else {
                prerollupbutton.BackColor = PreviewSkin.rollbtncolour;
                prerollupbutton.Size = PreviewSkin.rollbtnsize;
                prerollupbutton.Show();
            }

            if (API.Upgrades["minimizebutton"] == false)
            {
                preminimizebutton.Hide();
            }
            else {
                preminimizebutton.BackColor = PreviewSkin.minbtncolour;
                preminimizebutton.Size = PreviewSkin.minbtnsize;
                preminimizebutton.Show();
            }

            if (API.Upgrades["windowborders"] == true)
            {
                preclosebutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.closebtnfromside - preclosebutton.Size.Width, PreviewSkin.closebtnfromtop);
                prerollupbutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.rollbtnfromside - prerollupbutton.Size.Width, PreviewSkin.rollbtnfromtop);
                preminimizebutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.minbtnfromside - preminimizebutton.Size.Width, PreviewSkin.minbtnfromtop);
                switch (PreviewSkin.titletextpos)
                {
                    case "Left":
                        pretitletext.Location = new Point(PreviewSkin.titletextfromside, PreviewSkin.titletextfromtop);
                        break;
                    case "Centre":
                        pretitletext.Location = new Point((pretitlebar.Width / 2) - pretitletext.Width / 2, PreviewSkin.titletextfromtop);
                        break;
                }
                pretitletext.ForeColor = PreviewSkin.titletextcolour;
            }
            else {
                preclosebutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.closebtnfromside - prepgtoplcorner.Width - prepgtoprcorner.Width - preclosebutton.Size.Width, PreviewSkin.closebtnfromtop);
                prerollupbutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.rollbtnfromside - prepgtoplcorner.Width - prepgtoprcorner.Width - prerollupbutton.Size.Width, PreviewSkin.rollbtnfromtop);
                preminimizebutton.Location = new Point(pretitlebar.Size.Width - PreviewSkin.minbtnfromside - prepgtoplcorner.Width - prepgtoprcorner.Width - preminimizebutton.Size.Width, PreviewSkin.minbtnfromtop);
                switch (PreviewSkin.titletextpos)
                {
                    case "Left":
                        pretitletext.Location = new Point(PreviewSkin.titletextfromside + prepgtoplcorner.Width, PreviewSkin.titletextfromtop);
                        break;
                    case "Centre":
                        pretitletext.Location = new Point((pretitlebar.Width / 2) - pretitletext.Width / 2, PreviewSkin.titletextfromtop);
                        break;
                }
                pretitletext.ForeColor = PreviewSkin.titletextcolour;
            }

            //Change when Icon skinning complete
            // Change to program's icon
            if (API.Upgrades["appicons"] == true)
            {
                prepnlicon.Visible = true;
                prepnlicon.Location = new Point(PreviewSkin.titleiconfromside, PreviewSkin.titleiconfromtop);
                prepnlicon.Size = new Size(PreviewSkin.titlebariconsize, PreviewSkin.titlebariconsize);
                prepnlicon.Image = Properties.Resources.iconShifter;

            }

        }

        #endregion

        private void btnsaveskin_Click(object sender, EventArgs e)
        {
            API.CreateFileSkimmerSession(".skn", File_Skimmer.FileSkimmerMode.Save);
            API.FileSkimmerSession.FormClosing += (object s, FormClosingEventArgs a) =>
            {
                string res = API.GetFSResult();
                if (res != "fail")
                {
                    Skinning.Utilities.saveskintofile(res);
                    API.CreateInfoboxSession("Skin Loader", "The skin has been saved successfully.", infobox.InfoboxMode.Info);
                }
            };
        }

        private void btnbacktoskinloader_Click(object sender, EventArgs e)
        {
            pnlskinpacks.Hide();
            pgcontents.Show();
        }

        private void cbpackfiles_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cbpackfiles.Text.EndsWith(".skn"))
            {
                string dirsepchar = "\\";
                switch(OSInfo.GetPlatformID())
                {
                    case "microsoft":
                        dirsepchar = "\\";
                        break;
                    default:
                        dirsepchar = "/";
                        break;
                }
                LoadedSkinFile = Paths.SkinDir + "_packdata" + dirsepchar + cbpackfiles.Text;
            }
        }

        private void btnbrowse_Click(object sender, EventArgs e)
        {
            API.CreateFileSkimmerSession(".spk", File_Skimmer.FileSkimmerMode.Open);
            API.FileSkimmerSession.FormClosing += (object s, FormClosingEventArgs a) =>
            {
                string res = API.GetFSResult();
                if(res != "fail")
                {
                    LoadedPack = res;
                    SetupPackUI();
                }
            };
        }
    }
}