using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Telerik.Web.UI;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Web.SessionState;
using System.Web.Caching;
using System.Net;
using System.Collections.Generic;
using System.Web.Services;
using System.Data.SqlClient;

namespace GestorHtm
{
    public partial class GestorImagen : System.Web.UI.Page
    {
        private CacheItemRemovedCallback callBack;// se utiliza para almacenar varaible temporales
        private List<Telerik.Web.UI.UploadedFileInfo> uploadedFiles = new List<Telerik.Web.UI.UploadedFileInfo>();
        public List<Telerik.Web.UI.UploadedFileInfo> UploadedFiles
        {
            get { return uploadedFiles; }
            set { uploadedFiles = value; }
        }
        public static string Ser, Usr, Ctr;
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {
                FTPMO.Visible = false;
                PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
            }

        }

        private void PopulateTreeViewFromDirectory(RadTreeNodeCollection nodes,//metodo que carga el radtreeview
                string _path, string rutaplus)
        {
            string[] _directories = Directory.GetDirectories(_path);
            foreach (string _directory in _directories)//por cada fichero creo un nodo y le asigno nombre,imagen y un valor
            {
                RadTreeNode node = new RadTreeNode();
                node.Text = Path.GetFileName(_directory);
                node.ImageUrl = "~/imagens/iconos/folder.gif";
                node.Attributes["Category"] = "Folder";
                node.Value = rutaplus + "/" + Path.GetFileName(_directory);
                nodes.Add(node);
                PopulateTreeViewFromDirectory(node.Nodes, _directory, rutaplus + "/" + Path.GetFileName(_directory));
            }
            string[] _files = Directory.GetFiles(_path);
            foreach (string _file in _files)
            {
                if (IsSupportedFileType(_file))
                {
                    RadTreeNode node = new RadTreeNode();
                    node.Text = Path.GetFileName(_file);//GetFileName(_file);
                    node.ImageUrl = "~/imagens/iconos/Imagen.gif";
                    node.Value = rutaplus + "/" + Path.GetFileName(_file);
                    nodes.Add(node);
                }//fin if IsSupportedFileType 
            }//fin foreach _files

        } //fin PopulateTreeViewFromDirectory


        private bool IsSupportedFileType(string file)// este metodo booleano comprueba si los archivos son de Imagen
        {
            string pat = "(\\.gif|\\.bmp|\\.jpg|\\.jpeg|\\.png)$";
            return Regex.IsMatch(file, pat, RegexOptions.IgnoreCase);
        }//fin IsSupportedFileType

        protected void Button1_Click(object sender, EventArgs e)//boton que se encarga de subir imagenes al servidor
        {
            string targetFolder = Server.MapPath("~/Imagenes");
            if (direccionNodo() != null) { targetFolder = Server.MapPath("~/") + direccionNodo(); }
            if (RadAsyncUpload1.UploadedFiles.Count > 0)
            {
                foreach (UploadedFile validFile in RadAsyncUpload1.UploadedFiles)//por cada archivo descargado
                {
                    try
                    {
                        validFile.SaveAs(Path.Combine(targetFolder, validFile.GetName()), true);
                        TextBox1.Text = TextBox1.Text + "\n" + " Se ha subido correctamente el sonido " + validFile.GetName() + " al servidor en la carpeta " + direccionNodo() + ".";
                    }
                    catch
                    {
                        TextBox1.Text = TextBox1.Text + "\n" + " No se  podido subir el sonido " + validFile.GetName() + " al servidor en la carpeta " + direccionNodo() + ".";
                    }
                }

            }
            AddDeleteDependencyForFile(RadAsyncUpload1.UploadedFiles);
            Label7.Text = "Aqui aparecera la selecionada ruta";
            TextBox3.Text = "";
            TextBox4.Text = "Recuerda indicar la extension del archivo";
            RadTreeView1.Nodes.Clear();
            PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
        }//metodoRad2

        protected string direccionNodo()//metodo auxiliar para devolver la ruta del nodo
        {
            if (RadTreeView1.CheckedNodes.Count == 1)
            {
                foreach (RadTreeNode nodo in RadTreeView1.CheckedNodes)
                {

                    return nodo.Value;
                }
            }
            else { TextBox1.Text = TextBox1.Text + "\n" + " Has selecionado mas de un nodo!"; return null; }
            return null;
        }
        protected string NombreNodo()//metodo auxiliar para devolver el nombre del nodo
        {
            if (RadTreeView1.CheckedNodes.Count == 1)
            {
                foreach (RadTreeNode nodo in RadTreeView1.CheckedNodes)
                {

                    return nodo.Text;
                }
            }
            else { TextBox1.Text = TextBox1.Text + "\n" + " Has selecionado mas de un nodo!"; return null; }
            return null;
        }
        protected bool Nododirectory()//metodo auxiliar que comprueba si el nodo es un directorio
        {
            if (RadTreeView1.CheckedNodes.Count == 1)
            {
                foreach (RadTreeNode nodo in RadTreeView1.CheckedNodes)
                {
                    if (nodo.Attributes["Category"] == "Folder") { return true; }
                }
            }
            else { TextBox1.Text = TextBox1.Text + "\n" + " Has selecionado mas de un nodo!"; return false; }
            return false;
        }
        private void AddDeleteDependencyForFile(UploadedFileCollection uploadedFileCollection)//este metodo se ocupa de vaciar al cache de radupload
        {
            foreach (UploadedFile uploadedFile in uploadedFileCollection)//por cada archivo subido
            {
                TimeSpan timeOut = TimeSpan.FromMinutes(10);
                callBack = new CacheItemRemovedCallback(delegate(string key, object path, CacheItemRemovedReason reason)
                {
                    File.Delete((string)path);//borra su temporal
                });
                string fullPath = Path.Combine(Server.MapPath(RadAsyncUpload1.TargetFolder), uploadedFile.GetName());
                Context.Cache.Insert(uploadedFile.FileName, fullPath, null, DateTime.Now.Add(timeOut), TimeSpan.Zero,
                CacheItemPriority.Default, callBack);
            }//fin foreach uploadedFileCollection
        }//fin AddDeleteDependencyForFile

        protected void Button3_Click(object sender, EventArgs e)//boton para borrar imagenes
        {
            Label7.Text = TextBox5.Text;
            if (Label7.Text == "Aqui aparecera la selecionada ruta") { Response.Write("<script language=javascript>alert('Primero selecione un elemento de la lista');</script>"); }
            else
            {
                if (Label7.Text.IndexOf(".gif") != -1 || Label7.Text.IndexOf(".jpeg") != -1 || Label7.Text.IndexOf(".jpg") != -1 || Label7.Text.IndexOf(".bmp") != -1 || Label7.Text.IndexOf(".png") != -1)
                {
                    try
                    {
                        File.Delete(Server.MapPath("~/") + Label7.Text);
                        TextBox1.Text = TextBox1.Text + "\n" + " Se ha borrado correctamente el sonido " + Label7.Text + ".";
                    }
                    catch { TextBox1.Text = TextBox1.Text + "\n" + " No se podido borrar el sonido o no hay ningun Imagen selecionado."; }
                }
                else
                {
                    try
                    {
                        Borradorecursivo(Server.MapPath("~/") + Label7.Text);
                        Directory.Delete(Server.MapPath("~/") + Label7.Text);
                        TextBox1.Text = TextBox1.Text + "\n" + " Se ha borrado correctamente la carpeta " + Label7.Text + ".";
                    }
                    catch { TextBox1.Text = TextBox1.Text + "\n" + " No se podido borrar la carpeta o no hay ninguna carpeta selecionada."; }
                }
                Label7.Text = "Aqui aparecera la selecionada ruta";
                TextBox3.Text = "";
                TextBox4.Text = "Recuerda indicar la extension del archivo";
                RadTreeView1.Nodes.Clear();
                PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
            }
        }

        protected void Borradorecursivo(string ruta) //metodo auxiliar que borra en cascada
        {
            string[] _Files = Directory.GetFiles(ruta);
            foreach (string _file in _Files)
            {
                File.Delete(_file);
            }
            string[] _directories = Directory.GetDirectories(ruta);
            foreach (string _directory in _directories)
            {
                Borradorecursivo(_directory);
                Directory.Delete(_directory);
            }
        }
        protected void RadButton1_Click(object sender, EventArgs e)//boton para crear carpetas en el servidor
        {
           
                if (RadioButton1.Checked == true)
                {
                    try
                    {
                        Directory.CreateDirectory(Server.MapPath("~/Imagenes/") + TextBox3.Text);
                        TextBox1.Text = TextBox1.Text + "\n" + "Se ha creardo la carpeta " + TextBox3.Text + " en la raíz.";
                    }
                    catch { TextBox1.Text = TextBox1.Text + "\n" + "No se podido crear la carpeta en la raíz."; }
                }
                else if (RadioButton2.Checked == true)
                {
                    if (Nododirectory())
                    {
                    try
                    {
                        Directory.CreateDirectory(Server.MapPath("~/") + direccionNodo() + "/" + TextBox3.Text);

                        TextBox1.Text = TextBox1.Text + "\n" + "Se ha creado la carpeta " + TextBox3.Text + " dentro de la carpeta " + direccionNodo();
                    }
                    catch { TextBox1.Text = TextBox1.Text + "\n" + "Nose podido crear la carpeta en " + direccionNodo() + "."; }
                }
                else { TextBox1.Text = TextBox1.Text + "\n" + "Elige primero el destino de la carpeta."; }
            }
            else { TextBox1.Text = TextBox1.Text + "\n" + "Elige primero el destino de la carpeta."; }
            Label7.Text = "Aqui aparecera la selecionada ruta";
            TextBox3.Text = "";
            TextBox4.Text = "Recuerda indicar la extension del archivo";
            RadTreeView1.Nodes.Clear();
            PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
        }
        protected void RadButton2_Click(object sender, EventArgs e)//boton para limpiar el cuadro de dialogo informativo
        {
            TextBox1.Text = "";
        }

        protected void RadButton3_Click(object sender, EventArgs e)//boton para remonbrar elementos del servidor
        {
            if (direccionNodo() != null)
            {

                string ruta = direccionNodo().Substring(0, direccionNodo().IndexOf(NombreNodo()));
                if (NombreNodo().IndexOf(".jpeg") != -1 || NombreNodo().IndexOf(".gif") != -1 || NombreNodo().IndexOf(".jpg") != -1 || NombreNodo().IndexOf(".bmp") != -1 || Label7.Text.IndexOf(".png") != -1)
                {

                    File.Move(Server.MapPath("~/") + direccionNodo(), Server.MapPath("~/") + ruta + TextBox4.Text);
                    TextBox1.Text = TextBox1.Text + "\n" + "Se ha renombrado el sonido " + NombreNodo() + " a " + TextBox4.Text;
                }
                else
                {
                    if (TextBox4.Text.IndexOf(".") == -1)
                    {
                        Directory.Move(Server.MapPath("~/") + direccionNodo(), Server.MapPath("~/") + ruta + TextBox4.Text);
                        TextBox1.Text = TextBox1.Text + "\n" + "Se ha renombrado la carpeta " + NombreNodo() + " a " + TextBox4.Text;
                    }
                    else { Response.Write("<script language=javascript>alert('Las extensiones permitidas son .gif, .jpeg, .jpg, .png y .bmp');</script>"); }
                }
                Label7.Text = "Aqui aparecera la selecionada ruta";
                TextBox3.Text = "";
                TextBox4.Text = "Recuerda indicar la extension del archivo";
                RadTreeView1.Nodes.Clear();
                PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
            }
        }

        protected void RadButton4_Click(object sender, EventArgs e)//conexión ftp
        {
            if (RadTextBox2.Text != "") { Ser = RadTextBox2.Text; }
            if (RadTextBox1.Text != "") { Usr = RadTextBox1.Text; }
            if (RadTextBox3.Text != "") { Ctr = RadTextBox3.Text; }

            Label12.Text = "";
            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + Ser);
                request.Method = WebRequestMethods.Ftp.ListDirectory;
                request.Credentials = new NetworkCredential(Usr, Ctr);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);

                string lsdirectory = reader.ReadLine();
                ArrayList lsnames = new ArrayList();
                while (lsdirectory != null)
                {

                    lsnames.Add(lsdirectory);
                    lsdirectory = reader.ReadLine();

                }
                CargartreeviewFTP(RadTreeView2.Nodes, lsnames, Ser, Ser.Length);
                RadTextBox1.ReadOnly = true;
                RadTextBox2.ReadOnly = true;
                RadTextBox3.ReadOnly = true;
                RadButton4.Visible = false;
                RadButton6.Visible = true;
                Label13.Enabled = true;
                RadioButton3.Enabled = true;
                RadTextBox6.Enabled = true;
                RadButton7.Enabled = true;
            }
            catch { Label12.Text = "Los datos introducidos son incorrectos,por favor vuelva a intentarlo"; }
        }
        private void CargartreeviewFTP(RadTreeNodeCollection nodes,//metodo que carga el radtreeview
            ArrayList _path, string rutaplus, int serv)
        {
            try
            {
                foreach (string _file in _path)//por cada fichero creo un nodo y le asigno nombre,imagen y un valor
                {
                    string nodoaux;
                    if (IsSupportedFileType(_file))
                    {
                        RadTreeNode node = new RadTreeNode();
                        node.Text = Path.GetFileName(_file);
                        node.ImageUrl = "~/imagens/iconos/Imagen.png";
                        nodoaux = rutaplus + "/" + Path.GetFileName(_file);
                        node.Value = nodoaux.Substring(serv + 1);
                        nodes.Add(node);
                    }//fin if IsSupportedFileType
                    else
                    {
                        RadTreeNode node = new RadTreeNode();
                        node.Text = Path.GetFileName(_file);
                        node.ImageUrl = "~/imagens/iconos/folder.gif";
                        node.Attributes["Category"] = "Folder";
                        nodoaux = rutaplus + "/" + Path.GetFileName(_file);
                        node.Value = nodoaux.Substring(serv + 1);
                        nodes.Add(node);
                        try
                        {
                            CargartreeviewFTP(node.Nodes, redirFTP(rutaplus + "/" + Path.GetFileName(_file)), rutaplus + "/" + Path.GetFileName(_file), serv);
                        }
                        catch { }
                    }
                }//fin foreach _files
            }
            catch { }
        } //fin PopulateTreeViewFromDirectory
        protected ArrayList redirFTP(string path)//metodo que guarda en un array el contenido del servidor externo
        {
            try
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + path);
                request.Method = WebRequestMethods.Ftp.ListDirectory;
                request.Credentials = new NetworkCredential(Usr, Ctr);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);

                string lsdirectory = reader.ReadLine();
                ArrayList lsnames = new ArrayList();
                while (lsdirectory != null)
                {

                    lsnames.Add(lsdirectory);
                    lsdirectory = reader.ReadLine();

                }
                return lsnames;
            }
            catch { Label12.Text = "Error al leer los archivos ftp"; }
            return null;
        }

        protected void RadButton6_Click(object sender, EventArgs e)//boton mostrar ftp
        {
            Ser = "";
            Usr = "";
            Ctr = "";
            RadTextBox1.ReadOnly = false;
            RadTextBox2.ReadOnly = false;
            RadTextBox3.ReadOnly = false;
            RadTextBox1.Text = "";
            RadTextBox2.Text = "";
            RadTextBox3.Text = "";
            RadTreeView2.Nodes.Clear();
            RadButton4.Visible = false;
            RadButton6.Visible = true;
            Label12.Text = "";
            RadTextBox6.Enabled = false;
            Label13.Enabled = false;
            RadioButton3.Enabled = false;
            RadTextBox6.Enabled = false;
            RadButton7.Enabled = false;
        }


        protected void RadioButton3_CheckedChanged(object sender, EventArgs e)
        {
            RadTextBox6.Enabled = true;
        }

        protected void RadioButton4_CheckedChanged(object sender, EventArgs e)
        {
            RadTextBox6.Enabled = false;
        }

        protected void RadButton7_Click(object sender, EventArgs e)//boton que se encarga de subir archivos al servidor local del servidor externo por ftp
        {
            Label13.Text = RadTextBox5.Text; Label14.Text = TextBox6.Text;


            if (Label14.Text != "Marque la casilla" && Label13.Text != " Seleciona el archivo de la lista a subir")
            {
                if (Label13.Text.IndexOf(".gif") != -1 || Label13.Text.IndexOf(".jpg") != -1 || Label13.Text.IndexOf(".jpeg") != -1 || Label13.Text.IndexOf(".bmp") != -1 || Label7.Text.IndexOf(".png") != -1)
                {
                    int pos = Label13.Text.LastIndexOf("/");

                    string ruta = Label13.Text.Substring(0, pos + 1);
                    string nombre = Label13.Text.Substring(pos + 1);
                    if (RadioButton3.Checked)
                    {
                        try
                        {
                            TextBox1.Text = TextBox1.Text + "\n" + Server.MapPath("~") + direccionNodo() + "/" + nombre;
                            string uri = "ftp://" + Ser + Label13.Text;
                            Uri serverUri = new Uri(uri);
                            if (serverUri.Scheme != Uri.UriSchemeFtp)
                            {
                                return;
                            }
                            FtpWebRequest reqFTP;
                            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + Ser + Label13.Text));
                            reqFTP.Credentials = new NetworkCredential(Usr, Ctr);
                            reqFTP.KeepAlive = false;
                            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                            reqFTP.UseBinary = true;
                            reqFTP.Proxy = null;
                            reqFTP.UsePassive = false;
                            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                            Stream responseStream = response.GetResponseStream();
                            FileStream writeStream = new FileStream(Server.MapPath("~") + direccionNodo() + "/" + RadTextBox6.Text, FileMode.Create);

                            int Length = 2048;
                            Byte[] buffer = new Byte[Length];
                            int bytesRead = responseStream.Read(buffer, 0, Length);
                            while (bytesRead > 0)
                            {
                                writeStream.Write(buffer, 0, bytesRead);
                                bytesRead = responseStream.Read(buffer, 0, Length);
                            }
                            writeStream.Close();
                            response.Close();
                            RadTreeView1.Nodes.Clear();
                            PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
                            TextBox1.Text = TextBox1.Text + "\n" + " Se descargado correctamente el sonido " + nombre + " al servidor en la carpeta " + direccionNodo() + "  y se ha renombrando a" + RadTextBox6.Text + ".";
                        }
                        catch
                        {
                            TextBox1.Text = TextBox1.Text + "\n" + " No se  podido subir el sonido " + nombre + " al servidor en la carpeta " + direccionNodo() + ".";
                        }
                    }
                    else
                    {
                        try
                        {
                            TextBox1.Text = TextBox1.Text + "\n" + Server.MapPath("~") + direccionNodo() + "/" + nombre;
                            string uri = "ftp://" + Ser + Label13.Text;
                            Uri serverUri = new Uri(uri);
                            if (serverUri.Scheme != Uri.UriSchemeFtp)
                            {
                                return;
                            }
                            FtpWebRequest reqFTP;
                            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + Ser + Label13.Text));
                            reqFTP.Credentials = new NetworkCredential(Usr, Ctr);
                            reqFTP.KeepAlive = false;
                            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                            reqFTP.UseBinary = true;
                            reqFTP.Proxy = null;
                            reqFTP.UsePassive = false;
                            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                            Stream responseStream = response.GetResponseStream();
                            FileStream writeStream = new FileStream(Server.MapPath("~") + direccionNodo() + "/" + nombre, FileMode.Create);

                            int Length = 2048;
                            Byte[] buffer = new Byte[Length];
                            int bytesRead = responseStream.Read(buffer, 0, Length);
                            while (bytesRead > 0)
                            {
                                writeStream.Write(buffer, 0, bytesRead);
                                bytesRead = responseStream.Read(buffer, 0, Length);
                            }
                            writeStream.Close();
                            response.Close();
                            RadTreeView1.Nodes.Clear();
                            PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes");
                            TextBox1.Text = TextBox1.Text + "\n" + " Se descargado correctamente el sonido " + nombre + " al servidor en la carpeta " + direccionNodo() + ".";
                        }
                        catch
                        {
                            TextBox1.Text = TextBox1.Text + "\n" + " No se  podido subir el sonido " + nombre + " al servidor en la carpeta " + direccionNodo() + ".";
                        }
                    }
                }
                else { TextBox1.Text = TextBox1.Text + "\n" + " La ruta elegida no tiene un archivo válido"; }
            }
            else { TextBox1.Text = TextBox1.Text + "\n" + " No se han elegido alguno o ambas rutas de origen i destino"; }
            Label14.Text = "Marque la casilla";
            Label13.Text = " Seleciona el archivo de la lista a subir";
        }

        protected void RadButton8_Click(object sender, EventArgs e)
        {
            RadButton5.Visible = true;
            FTPMO.Visible = false;
        }

        protected void RadButton5_Click(object sender, EventArgs e)
        {
            RadButton5.Visible = false;
            FTPMO.Visible = true;
        }

    }

}