using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

namespace ExWeb
{
    public partial class Mod_Inline : Mod
    {
        public static string Help_Description =
            "Inline-Anzeige eines externen Text-Dokumnets";

        public static string[][] Help_Attributes = new string[][]
        {
            // Attribut, Wert, DefaultWert, Optional, Hilfe
            new string[] {"Fil", "file", "","opt1","Einzufügendes Dokument","Fil=\"datei.html\""},
            new string[] {"Pat","path", "/","opt","Pfad","Pat=\"/meinedokumente\""},
            new string[] {"Text", "string", "","opt2","Einzufügender Text","Text=\"<p>Das ist darzustellen</p>\""},
            new string[] {"Extension", "ext", "ext","opt2","Format von Text","Extension=\"<p>htm</p>\""},
            new string[] {"", "", "","","Entweder Document oder Text+Extension angeben",""},
            new string[] {"Title","string","","opt","Titel"},
            new string[] {"Mode","raw pre hex high http frame xmltree","pre","opt","none:keine Bearbeitung, pre:ohne html; high: Syntaxhighlighting;"},
            new string[] {"Scrolling","yes no auto ","auto","opt","Handhabung größerer Objekte (mode=frame)","Scrolling=\"yes\""},
            new string[] {"Expand","0 1","0","opt","TreeView aufklappen oder zuklappen (nur mode=xmltree","expand=\"1\""},
        };
        string _Fil = "";
        public string Fil
        {
            set
            {
                _Fil = value;
            }
        }
        string _Pat = "/";
        public string Pat
        {
            set
            {
                if (!value.EndsWith("/")) value += "/";
                _Pat = value;
            }
        }
        string _Text = "";
        public string Text
        {
            set
            {
                _Text = value;
            }
        }
        string _Extension = "txt";
        public string Extension
        {
            set
            {
                _Extension = value;
            }
        }
        string _Title = "";
        public string Title
        {
            set
            {
                _Title = value;
            }
        }
        enum MODE { RAW, PRE, HEX, HIGH, HTTP, FRAME, XML, XMLTREE };
        MODE _Mode = MODE.RAW;
        public string Mode
        {
            set
            {
                switch (value.ToLower())
                {
                    default:
                        break;
                    case "frame":
                        _Mode = MODE.FRAME;
                        break;
                    case "hex":
                        _Mode = MODE.HEX;
                        break;
                    case "high":
                        _Mode = MODE.HIGH;
                        break;
                    case "none":
                        _Mode = MODE.RAW;
                        break;
                    case "pre":
                        _Mode = MODE.PRE;
                        break;
                    case "http":
                        _Mode = MODE.HTTP;
                        break;
                    case "xml":
                        _Mode = MODE.XML;
                        break;
                    case "xmltree":
                        _Mode = MODE.XMLTREE;
                        break;
                }
            }
            get
            {
                return _Mode.ToString();
            }
        }
        string _Scrolling = "no";
        public string Scrolling
        {
            set
            {
                _Scrolling = value;
            }
        }
        bool _Expand = false;
        public string Expand
        {
            set
            {
                _Expand = (value == "1");
            }
        }
        protected void Page_LoadComplete(object sender, EventArgs e)
        {
            SetPanelLayout(this.Controls);

            object oLoadShScripts = Context.Items["LoadShScripts"];
            if (oLoadShScripts == null) return;
            string strLoadShScripts = oLoadShScripts.ToString();
            if (strLoadShScripts == "1")
            {
                try
                {
                    Page.Controls.Add(new LiteralControl(LoadShScripts()));
                }
                catch
                {
                }
            }
            Context.Items["LoadShScripts"] = "0";
        }
        public new void Page_Load(object sender, EventArgs e)
        {
            Page.LoadComplete += new EventHandler(Page_LoadComplete);

            Fil = Mod.GetQs_String("fil", _Fil, this.Page);
            Pat = Mod.GetQs_String("pat", _Pat, this.Page);
            Mode = Mod.GetQs_String("mode", Mode, this.Page);
            switch (_Mode)
            {
                case MODE.FRAME:
                    string FileToDisplay = _Pat + _Fil;
                    string Port = Request.ServerVariables["SERVER_PORT"];
                    FileToDisplay = "http://" + Request.ServerVariables["SERVEr_NAME"] + (Port == "80" ? "" : ":" + Port) + FileToDisplay;
                    string Tag = GetIframe(_ID, FileToDisplay, _Width, _Height, _Scrolling);
                    PlaceHolder_Inline.Controls.Add(new LiteralControl(Tag));
                    return;
                default:
                    if (((_Fil == "") && (_Text == "")) || ((_Fil != "") && (_Text != "")))
                    {
                        Panel_Module.Visible = false;
                        return;
                    }
                    break;
            }
            string CodeToInsert = "";
            switch (_Mode)
            {
                default:
                case MODE.RAW:
                case MODE.PRE:
                case MODE.HIGH:
                    {
                        string TextToDisplay = "";
                        string Extension = "";
                        if (_Fil == "")
                        {
                            TextToDisplay = _Text;
                            Extension = _Extension;
                        }
                        else
                        {
                            string AbsolutePath = Server.MapPath(_Pat);
                            if (!AbsolutePath.EndsWith("\\")) AbsolutePath += "\\";
                            Extension = Path.GetExtension(_Fil).ToLower();
                            if (Extension.StartsWith(".")) Extension = Extension.Substring(1);
                            if (!File.Exists(AbsolutePath + _Fil))
                            {
                                Panel_Module.Controls.Clear();
                                Panel_Module.Controls.Add(new LiteralControl("Datei " + AbsolutePath + _Fil + " nicht gefunden"));
                                return;
                            }
                            TextToDisplay = File.ReadAllText(AbsolutePath + _Fil);
                        }
                        switch (_Mode)
                        {
                            default:
                            case MODE.RAW:
                                CodeToInsert = TextToDisplay;
                                break;
                            case MODE.PRE:
                                CodeToInsert = GetPreformated(TextToDisplay);
                                break;
                            case MODE.HIGH:
                                CodeToInsert = GetPreformatedBrush(TextToDisplay, Extension);
                                Context.Items["LoadShScripts"] = "1";
                                break;
                        }
                        CodeToInsert = Regex.Replace(CodeToInsert, "(?i)(pass|passwort|password)=(\"|\').*(\"|\')", "$1=\"**** Dein Passwort ****\"");
                        CodeToInsert = Regex.Replace(CodeToInsert, "(?i)(key)=([\"\'])(?i)(password)([\"\'])\\s*(?i)(value)=([\"\'])(.*)([\"\'])", "$1=$2$3$4 $5=$6**** Dein Passwort ****$8");
                    }
                    break;
                case MODE.HEX:
                    {
                        if (_Fil == "")
                        {
                            CodeToInsert = "\r\n<pre>\r\n" + DumpText(_Text) + "\r\n</pre>\r\n";
                        }
                        else
                        {
                            string AbsolutePath = Server.MapPath(_Pat);
                            if (!AbsolutePath.EndsWith("\\")) AbsolutePath += "\\";
                            string Extension = Path.GetExtension(_Fil).ToLower();
                            if (Extension.StartsWith(".")) Extension = Extension.Substring(1);
                            if (!File.Exists(AbsolutePath + _Fil))
                            {
                                Panel_Module.Visible = false;
                                return;
                            }

                            CodeToInsert = "\r\n<pre>\r\n" + Dump(AbsolutePath + _Fil) + "\r\n</pre>\r\n";
                        }
                    }
                    break;
                case MODE.HTTP:
                    {
                        bool _Error = false;
                        if ((_Fil == "") && (_Pat == ""))
                        {
                            _Error = true;
                        }
                        else
                            if ((_Fil != "") && (_Pat != ""))
                            {
                            }
                            else
                                if (_Pat == "")
                                {
                                    if (!_Fil.ToLower().StartsWith("http://"))
                                        _Error = true;
                                }
                                else // Fil == ""
                                {
                                    _Error = true;
                                }
                        if (_Error)
                        {
                            CodeToInsert = "Fil=File&Pat=RelPath | Fil=Url"
                                + "<br/>Fil=" + _Fil + " Pat=" + _Pat;
                        }
                        else
                        {
                            string Url = "";
                            if (_Fil.ToLower().StartsWith("http://"))
                                Url = _Fil;
                            else
                            {
                                string ServerPort = Request.ServerVariables["SERVER_PORT"];
                                Url = "http://" + Request.ServerVariables["SERVER_NAME"] + (ServerPort == "80" ? "" : ":" + ServerPort) + _Pat + _Fil;
                            }
                            Stream s = Http.ReadUri(Url);
                            if (s == null)
                            {
                                CodeToInsert = "Error inserting " + Url;
                            }
                            else
                            {
                                CodeToInsert = Http.GetStream(s);
                                CodeToInsert = Http.StripHtml(CodeToInsert);
                            }
                        }
                    }
                    break;
                case MODE.XML:
                    {
                        string TextToDisplay = "";
                        string Extension = "";
                        if (_Fil == "")
                        {
                            TextToDisplay = _Text;
                            Extension = _Extension;
                        }
                        else
                        {
                            string AbsolutePath = Server.MapPath(_Pat);
                            if (!AbsolutePath.EndsWith("\\")) AbsolutePath += "\\";
                            Extension = Path.GetExtension(_Fil).ToLower();
                            if (Extension.StartsWith(".")) Extension = Extension.Substring(1);
                            if (!File.Exists(AbsolutePath + _Fil))
                            {
                                Panel_Module.Controls.Clear();
                                Panel_Module.Controls.Add(new LiteralControl("Datei " + AbsolutePath + _Fil + " nicht gefunden"));
                                return;
                            }
                            TextToDisplay = File.ReadAllText(AbsolutePath + _Fil);
                        }
                        Stream strm = Mod.GenerateStreamFromString(TextToDisplay);
                        StreamReader reader = new StreamReader(strm);
                        XmlDocument myXmlDocument = new XmlDocument();
                        try
                        {
                            myXmlDocument.Load(reader);
                            Mod_Xsl2TreeView transform = new Mod_Xsl2TreeView(myXmlDocument);
                            this.Controls.Clear();
                            TreeView tv = transform.tv;
                            if (_Expand)
                            {
                                tv.ExpandAll();
                            }
                            else
                            {
                                tv.CollapseAll();
                            }
                            this.Controls.Add(tv);
                        }
                        catch
                        {
                            this.Controls.Clear();
                            this.Controls.Add(new LiteralControl("XML-Format fehlerhaft"));
                        }
                    }
                    break;
                case MODE.XMLTREE:
                    {
                        string TextToDisplay = "";
                        string Extension = "";
                        if (_Fil == "")
                        {
                            TextToDisplay = _Text;
                            Extension = _Extension;
                        }
                        else
                        {
                            string AbsolutePath = Server.MapPath(_Pat);
                            if (!AbsolutePath.EndsWith("\\")) AbsolutePath += "\\";
                            Extension = Path.GetExtension(_Fil).ToLower();
                            if (Extension.StartsWith(".")) Extension = Extension.Substring(1);
                            if (!File.Exists(AbsolutePath + _Fil))
                            {
                                Panel_Module.Controls.Clear();
                                Panel_Module.Controls.Add(new LiteralControl("Datei " + AbsolutePath + _Fil + " nicht gefunden"));
                                return;
                            }
                            TextToDisplay = File.ReadAllText(AbsolutePath + _Fil);
                        }
                        Stream strm = Mod.GenerateStreamFromString(TextToDisplay);
                        StreamReader reader = new StreamReader(strm);
                        XmlDocument myXmlDocument = new XmlDocument();
                        try
                        {
                            myXmlDocument.Load(reader);
                            Mod_Xsl2TreeView transform = new Mod_Xsl2TreeView(myXmlDocument);
                            this.Controls.Clear();
                            TreeView tv = transform.tv;
                            if (_Expand)
                            {
                                tv.ExpandAll();
                            }
                            else
                            {
                                tv.CollapseAll();
                            }
                            this.Controls.Add(tv);
                        }
                        catch
                        {
                            this.Controls.Clear();
                            this.Controls.Add(new LiteralControl("XML-Format fehlerhaft"));
                        }
                    }
                    break;
            }
            LiteralControl lc = new LiteralControl(CodeToInsert);
            PlaceHolder_Inline.Controls.Add(lc);
        }
    }
}