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;
using Ionic.Zip;

public partial class Default : 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; }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
                borrartemporales_archivos(Server.MapPath("~/"));
                borrartemporales(Server.MapPath("~/HTMTemp"));
                PopulateTreeViewFromDirectory(RadTreeView1.Nodes, Server.MapPath("~/Videos"), "/Videos",1);
                PopulateTreeViewFromDirectory(RadTreeView2.Nodes, Server.MapPath("~/Imagenes"), "/Imagenes",2);
                PopulateTreeViewFromDirectory(RadTreeView3.Nodes, Server.MapPath("~/Sonidos"), "/Sonidos",3);
                PopulateTreeViewFromDirectory(RadTreeView4.Nodes, Server.MapPath("~/Widgets"), "/Widgets",4);
        }
    }
    private void PopulateTreeViewFromDirectory(RadTreeNodeCollection nodes,//metodo que carga el radtreeview
               string _path, string rutaplus, int id)
    {
        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),id);
        }
        string[] _files = Directory.GetFiles(_path);
        foreach (string _file in _files)
        {
            if (id == 1 && IsSupportedFileType(_file)) 
            {
                RadTreeNode node = new RadTreeNode();
                node.Text = Path.GetFileName(_file);//GetFileName(_file);
                node.ImageUrl = "~/imagens/iconos/iconoVideo.png";
                node.Value = rutaplus + "/" + Path.GetFileName(_file);
                nodes.Add(node);
            }//fin if IsSupportedFileType 
             else if (id == 2 && IsSupportedFileType2(_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);
             }else if(id==3 && IsSupportedFileType3(_file)){
                 RadTreeNode node = new RadTreeNode();
                node.Text = Path.GetFileName(_file);//GetFileName(_file);
                node.ImageUrl = "~/imagens/iconos/sonido.gif";
                node.Value = rutaplus + "/" + Path.GetFileName(_file);
                nodes.Add(node);
             }
            else{
                if (id == 4)
                {
                    RadTreeNode node = new RadTreeNode();
                    node.Text = Path.GetFileNameWithoutExtension(_file);//GetFileName(_file);
                    node.ImageUrl = "~/imagens/iconos/widgets.gif";
                    node.Value = rutaplus + "/" + Path.GetFileName(_file);
                    nodes.Add(node);
                }
             }
        }//fin foreach _files

    } //fin PopulateTreeViewFromDirectory

    private bool IsSupportedFileType3(string file)// este metodo booleano comprueba si los archivos son de audio
    {
        string pat = "(\\.mp3|\\.ac3|\\.wma|\\.ogg)$";
        return Regex.IsMatch(file, pat, RegexOptions.IgnoreCase);
    }//fin IsSupportedFileType
    private bool IsSupportedFileType2(string file)// este metodo booleano comprueba si los archivos son de Imagen
    {
        string pat = "(\\.jpeg|\\.jpg|\\.jpg|\\.bmp|\\.gif)$";
        return Regex.IsMatch(file, pat, RegexOptions.IgnoreCase);
    }//fin IsSupportedFileType
    private bool IsSupportedFileType(string file)// este metodo booleano comprueba si los archivos son de video
    {
        string pat = "(\\.mp4|\\.wna|\\.avi|\\.m4v)$";
        return Regex.IsMatch(file, pat, RegexOptions.IgnoreCase);
    }

    protected void RadioButton2_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView1.OnClientNodeDropping = "OnClientNodeDroppingV";  
    }

    protected void RadioButton1_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView1.OnClientNodeDropping = "OnClientNodeDropping";
    }

    protected void RadioButton3_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView2.OnClientNodeDropping = "OnClientNodeDropping2";
    }

    protected void RadioButton4_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView2.OnClientNodeDropping = "OnClientNodeDropping2V";
    }

    protected void RadioButton5_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView3.OnClientNodeDropping = "OnClientNodeDropping3";
    }

    protected void RadioButton6_CheckedChanged(object sender, EventArgs e)
    {
        RadTreeView3.OnClientNodeDropping = "OnClientNodeDropping3V";
    }

    protected void RadButton1_Click(object sender, EventArgs e)// este boton se encarga de cargar el documento htm
    {
        int bandera = 0;
        Response.Write("<script language=javascript>Paraview();</script>");
        if (RadioButton7.Checked) 
        {
            string targetFolder = Server.MapPath("~/HTMTemp ");//indicamos la ruta donde se guardara el archivo subido
            if (RadAsyncUpload1.UploadedFiles.Count > 0)
            {
               
                foreach (UploadedFile validFile in RadAsyncUpload1.UploadedFiles)//por cada archivo descargado
                {
                    if (validFile.GetExtension() == ".doc" || validFile.GetExtension() == ".docx")
                {
                    validFile.SaveAs(Path.Combine(targetFolder, validFile.GetName()), true);//guardo el arhcivo en la carpeta de temporales
                    string rutazip = Path.Combine(targetFolder, validFile.GetName());
                    if (convertirInforme(Server.MapPath("~/HTMTemp"), validFile.GetNameWithoutExtension()))
                    {//cargo el metodo que convierte el word en html
                        File.Delete(Server.MapPath("~/") + nombre(targetFolder));
                        Label2.Text = validFile.GetName();//guardo en un label con el nombre completo que utilizare para la subida ftp
                        Label3.Text = validFile.GetNameWithoutExtension();//guardo en un label con el nombre sin extension 
                        Imagestemporales(targetFolder);
                        DateTime inicio = DateTime.Now;//es un sleep de 2 seg
                        DateTime sum = inicio.AddSeconds(2);
                        while (sum > DateTime.Now) { }
                        try
                        {
                            RadEditor1.Content = ReadFile(Server.MapPath("~/HTMTemp/") + validFile.GetNameWithoutExtension() + ".html");//indico la ruta de donde cargare el html para mostralos por el radeditor al metodo readfile
                            bandera = 1;
                        }
                        catch { RadEditor1.Content = "El arhivo no se puede cargar " + Server.MapPath("~/HTMTemp/") + validFile.GetNameWithoutExtension() + ".html"; }
                    }
                   }
                      else { Response.Write("<script language=javascript>alert('El explorador de archivos no selecionado ningun elemento o el elemento es de una extension incorrecta, por favor añada un elemento con extensión .doc');</script>"); }
                }//fin foreach RadUpload1.UploadedFiles
                AddDeleteDependencyForFile(RadAsyncUpload1.UploadedFiles);// cargo el metodo que limpia el radupload
            }
            else { Response.Write("<script language=javascript>alert('El explorador de archivos no selecionado ningun elemento o el elemento es de una extension incorrecta, por favor añada un elemento con extensión .zip');</script>"); }
      
        } else
        {
            string targetFolder = Server.MapPath("~/HTMTemp ");//indicamos la ruta donde se guardara el archivo subido
            if (RadAsyncUpload1.UploadedFiles.Count > 0)
            {
                foreach (UploadedFile validFile in RadAsyncUpload1.UploadedFiles)//por cada archivo descargado
                {
                           if (validFile.GetExtension() == ".zip")
                {
                    validFile.SaveAs(Path.Combine(targetFolder, validFile.GetName()), true);//guardo el arhcivo en la carpeta de temporales
                    string rutazip = Path.Combine(targetFolder, validFile.GetName());
                    using (ZipFile zip = ZipFile.Read(rutazip))
                    {
                        foreach (ZipEntry zipfile in zip)
                        {
                            zipfile.Extract(Server.MapPath(RadAsyncUpload1.TargetFolder) + "/HTMTemp", ExtractExistingFileAction.OverwriteSilently);
                            zipfile.Extract(Server.MapPath(RadAsyncUpload1.TargetFolder), ExtractExistingFileAction.OverwriteSilently);
                        }
                    }
                    File.Delete(Server.MapPath("~/") + nombre(targetFolder));
                    Label2.Text = nombre(targetFolder);//guardo en un label con el nombre completo que utilizare para la subida ftp
                    int numnom = nombre(targetFolder).Length - 4;
                    Label3.Text = nombre(targetFolder).Substring(0, numnom);//guardo en un label con el nombre sin extension 
                    try
                    {
                        RadEditor1.Content = ReadFile(Server.MapPath("~/HTMTemp/")+ Label3.Text+".htm");//indico la ruta de donde cargare el html para mostralos por el radeditor al metodo readfile
                        bandera = 1;
                    }
                    catch { RadEditor1.Content = "El arhivo no se puede cargar o ya existe"; }
                }
                 else { Response.Write("<script language=javascript>alert('El explorador de archivos no selecionado ningun elemento o el elemento es de una extension incorrecta, por favor añada un elemento con extensión .zip');</script>"); }
                }//fin foreach RadUpload1.UploadedFiles
                AddDeleteDependencyForFile(RadAsyncUpload1.UploadedFiles);// cargo el metodo que limpia el radupload
            }
            else { Response.Write("<script language=javascript>alert('El explorador de archivos no selecionado ningun elemento o el elemento es de una extension incorrecta, por favor añada un elemento con extensión .zip');</script>"); }
       }
        if (bandera == 1) { subirDIV.Visible = false; guardarDIV.Visible = true; }
    }
        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 string ReadFile(string path)//metodo que se ocupa de leer los archivo y mostrarlos en el radeditor
        {
            if (!System.IO.File.Exists(path))
            { return string.Empty; }//fin if file exists

            using (System.IO.StreamReader sr = new System.IO.StreamReader(path, Encoding.GetEncoding(1252)))//cargamos el archivo con codificacion windows-1252
            { return sr.ReadToEnd(); }//fin using streamReader
        }//fin readfile

        protected string nombre(string ruta)//metodo auxiliar que se ocupa de obtener el nombre del doumento electronico
        {
            string nombre = "";
            string[] _files = Directory.GetFiles(ruta);
            {
                foreach (string _file in _files)
                { nombre = _file.Substring(ruta.Length + 1); }
            }
            return nombre;
        }
        protected bool convertirInforme(string ruta, string archivo)//este metodo convierte un archivo .doc en un .html
        {
            Label1.Text = "";
            try
            {
                DuoDimension.Databeam.Word conv = new DuoDimension.Databeam.Word("");
          
            if (conv.IsWordInstalled)
            {
                if (conv.OpenDoc(Path.Combine(ruta, archivo + ".doc")) == 0)//comprueba que el archivo e sun doc
                {
                    int ret = conv.DocToHtml(Path.Combine(ruta, archivo + ".html"));//lo convierte a un html en al ruta indicada
                    switch (ret)
                    {
                        case 0: return true;  
                        case 1: return false; 
                    }//fin switch
                }//fin if doc
                else { Label1.Text = "Error abrir archivo"; return false; }
            }//fin if (conv.IsWordInstalled)
            }
            catch { Response.Write("<script language=javascript>alert('No tiene instalado el Microsoft Word por lo que no se puede realizar la conversion.');</script>");  return false;}
            return false;
        }//fin convertirInforme
        private void Imagestemporales(string ruta)//este metodo copia todos los archivos de tipo imagen de la carpeta de temporales a la raiz
        {
            string[] _files = Directory.GetFiles(ruta);//creo un array con los archivos  de la carpeta de temporales
            foreach (string _file in _files)//por cada archivo en la carpeta de temporales
            {
                if (IsSupportedFileType2(_file))//si es de tipo imagen
                {
                    string fnombre;
                    RadEditor1.Content = RadEditor1.Content +_file.ToString();
                    int pos=_file.LastIndexOf(@"\");
                    RadEditor1.Content =RadEditor1.Content + pos +"/n";
                    if (pos > 1) { fnombre = _file.Substring(pos); } else {  fnombre = _file.Substring(0); }
                    string rutaf = Server.MapPath("~/") + fnombre;
                    File.Copy(_file, rutaf);//copio el archivo de imagen a la raiz
                }//fin if IsSupportedFileType2
            }//fin foreach _files
        }

        protected void RadButton2_Click(object sender, EventArgs e)
        {
            Response.Write("<script language=javascript>previewPane.innerHTML = '<p><br /><br /><br /><br />Seleciona un  video o imagen para verlo...</p>'</script>");
            Response.Write("<script language=javascript>previewPane2.innerHTML = '<p> <br /><br /><br /><br /> Seleciona un sonido para oirlo...<br />o un widget para que se muestre su explicación</p>'</script>"); Label1.Text = "";
            RadEditor1.Content = "";//vacio el radeditor
            try { borrartemporales_archivos(Server.MapPath("~/")); }
            catch { }
            if (RadioButton7.Checked) { } else { borrartemporales(Server.MapPath("~/" + Label3.Text + "_archivos")); }
            try { borrartemporales(Server.MapPath("~/HTMTemp")); }catch{ }
            subirDIV.Visible = true;
            guardarDIV.Visible = false;

        }
        private void borrartemporales(string ruta)//este metodo borrar los fichero que esten dentro de la carpeta de temporales
        {
            try
            {
                string[] _files = Directory.GetFiles(ruta);//creo un array con los archivos
                foreach (string _file in _files)//por cada archivo en la carpeta
                {
                    File.Delete(_file);//borro archivo
                }
            }
            catch { }
            try
            {
                string[] _dir = Directory.GetDirectories(ruta);
                foreach (string dir in _dir) { borrartemporales(dir); Directory.Delete(dir); }
            }
            catch { }
        }
        private void borrartemporales_archivos(string ruta)//este metodo borrar los fichero que esten dentro de la carpeta de temporales
        {
            string[] _files = Directory.GetFiles(ruta);//creo un array con los archivos
            foreach (string _file in _files)//por cada archivo en la carpeta
            {
                if (IsSupportedFileType2(_file))//si es de tipo imagen
                {
                    File.Delete(_file);//borro archivo
                }
            }
            string[] _dir = Directory.GetDirectories(ruta);
            foreach (string dir in _dir) { if (dir.IndexOf("_archivos") != -1) { borrartemporales(dir); Directory.Delete(dir); } }

        }

        protected void RadButton3_Click(object sender, EventArgs e)//boton que se encarga de guardar el documento donde se le indique
        { 
            Response.Write("<script language=javascript>previewPane.innerHTML = '<p><br /><br /><br /><br />Seleciona un  video o imagen para verlo...</p>'</script>");
            Response.Write("<script language=javascript>previewPane2.innerHTML = '<p> <br /><br /><br /><br /> Seleciona un sonido para oirlo...<br />o un widget para que se muestre su explicación</p>'</script>");
            Label1.Text = "";
            string aux = Label2.Text;//utilixo los auxiliares para guardar al informacion que tenia en los labels
             string aux2 = Label3.Text;//utilixo los auxiliares para guardar al informacion que tenia en los labels
            if (RadioButton9.Checked)
            {
                if (TextBox3.Text == "Seleciona ruta en la lista desplegable para") { Response.Write("<script language=javascript>alert('Primero elige una ruta');</script>"); }
                else
                {
                    try
                    {
                        try
                        {
                            Directory.CreateDirectory(TextBox3.Text + "/" + aux2);
                        }
                        catch { Response.Write("<script language=javascript>alert('fallo al crear" + TextBox3.Text + "/" + aux2 + "');</script>"); }
                        try
                        {
                            if (RadioButton8.Checked)
                            {
                                Directory.Move(Server.MapPath("~/HTMTemp/") + aux2 + "_archivos", TextBox3.Text + "/" + aux2 + "/" + aux2 + "_archivos");
                            }
                        else 
                        {
                            string[] _files = Directory.GetFiles(Server.MapPath("~/HTMTemp/"));//creo un array con los archivos
                            foreach (string _file in _files)//por cada archivo en la carpeta
                            {
                                int pos = _file.LastIndexOf(@"\");
                                string name = _file.Substring(pos);
                                File.Move(_file, TextBox3.Text + "/" + aux2 + "/" + name);//muevo archivo 
                            }
                        }
                            using (StreamWriter externalFile = new StreamWriter(TextBox3.Text + "/" + aux2 + "/" + aux2+".htm", false, Encoding.UTF8))//Open file for writing and write content
                            {
                                externalFile.Write(RadEditor1.Content);//guardo el contenido del radeditor
                            }
                            Response.Write("<script language=javascript>alert('El htm se guardado correctamente en la direccion local'" + TextBox3.Text + "');</script>");
                        }
                        catch { Response.Write("<script language=javascript>alert('fallo al mover " + TextBox3.Text + "/" + aux2 + "');</script>"); } 
                    }
                    catch
                    {
                        using (StreamWriter externalFile = new StreamWriter(TextBox3.Text + "/SinInforme.txt", false, Encoding.UTF8))//Open file for writing and write content
                        {
                            externalFile.Write(RadEditor1.Content);//guardo el contenido del radeditor
                        }
                        {
                        }
                    }
                }
            }
            else {
                try
                {
                    try
                    {
                        Directory.CreateDirectory(Server.MapPath("~/PáginasUSER") +"/" + aux2);
                    }
                    catch { Response.Write("<script language=javascript>alert('falla crear" + Server.MapPath("~/PáginasUSER") + "/" + aux2 + "');</script>"); }
                    try
                    {
                        if (RadioButton8.Checked)
                        {
                            Directory.Move(Server.MapPath("~/HTMTemp/") + aux2 + "_archivos", Server.MapPath("~/PáginasUSER") + "/" + aux2 + "/" + aux2 + "_archivos");
                        }
                        else
                        {
                            string[] _files = Directory.GetFiles(Server.MapPath("~/HTMTemp/"));//creo un array con los archivos
                            foreach (string _file in _files)//por cada archivo en la carpeta
                            {
                                int pos = _file.LastIndexOf(@"\");
                                string name = _file.Substring(pos);
                                File.Move(_file, Server.MapPath("~/PáginasUSER/") + aux2 + "/" + name);//muevo archivo 
                            }
                        }
                        using (StreamWriter externalFile = new StreamWriter(Server.MapPath("~/PáginasUSER") + "/" + aux2 + "/" + aux2+".htm", false, Encoding.UTF8))//Open file for writing and write content
                        {
                            externalFile.Write(RadEditor1.Content);//guardo el contenido del radeditor
                        }
                        Response.Write("<script language=javascript>alert('El htm se guardado correctamente en el servidor');</script>");
                    }
                    catch { Response.Write("<script language=javascript>alert('falla mover" + Server.MapPath("~/PáginasUSER/") + aux2 + "');</script>"); }
                    }
                catch
                {
                    using (StreamWriter externalFile = new StreamWriter(Server.MapPath("~/PáginasUSER") + "/SinInforme.txt", false, Encoding.UTF8))//Open file for writing and write content
                    {
                        externalFile.Write(RadEditor1.Content);//guardo el contenido del radeditor
                    }
                }
               }
            
        }

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

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

