<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="Validador SAFT-PT" ValidateRequest="false" EnableEventValidation="false" ViewStateEncryptionMode="Never" %>
<script runat="server">
    protected string erro = "";
    protected bool valido = true;
    protected string resultado = "";
    private string pagina = "validador.aspx";    
    
    protected void btn_validar_Click(object sender, EventArgs e)
    {
        erro = "";
        valido = true;
        resultado = "";
        lbl_resultado.Text = "";
        lbl_erros.Text = "";
        
        bool ficheiro_texto = flp_ficheiro.HasFile;

        if (ficheiro_texto)
        { 
            if(!flp_ficheiro.FileName.ToLower().EndsWith(".xml"))
            {
                lbl_erros.Text = string.Format("<span style=\"color:#FF0000\">Seleccione um documento válido do tipo XML (*.xml).</span>");
                return;
            }                 
        }
        else if(txt_xmlsaft.Text == "")
        {

            lbl_erros.Text = string.Format("<span style=\"color:#FF0000\">Seleccione um ficheiro ou texto.</span>");
            return;
        }

                   
        try
        {
            
            System.IO.StringReader str_xml_string_reader = new System.IO.StringReader(txt_xmlsaft.Text);
            System.IO.Stream str_xml_stream = flp_ficheiro.FileContent;

            string url_xsl = string.Format("http://www.saftpt.com/docs/saf-t-pt.xsd", HttpContext.Current.Request.Url.AbsoluteUri.Replace(pagina, ""));
            string url_xsl_new = string.Format("http://www.saftpt.com/docs/saftpt_1_01.xsd", HttpContext.Current.Request.Url.AbsoluteUri.Replace(pagina, ""));

            // XmlSchemaSet
            System.Xml.Schema.XmlSchemaSet sc = new System.Xml.Schema.XmlSchemaSet();
            if (rbl_tipo_validacao.SelectedItem.Value == "Schema")
                sc.Add("urn:OECD:StandardAuditFile-Tax:PT_1.00_01", url_xsl);
            else
                sc.Add("urn:OECD:StandardAuditFile-Tax:PT_1.01_01", url_xsl_new);
            
            //validation settings
            System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings();
            settings.ProhibitDtd = false; // internet explorer error
            settings.ValidationType = (rbl_tipo_validacao.SelectedItem.Value == "Schema" || rbl_tipo_validacao.SelectedItem.Value == "NewSchema") ? System.Xml.ValidationType.Schema : System.Xml.ValidationType.None;
            settings.Schemas = sc;
            settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationCallBack);
            
            //XmlReader               
            System.Xml.XmlReader reader;
            reader = (ficheiro_texto) ? System.Xml.XmlReader.Create(str_xml_stream, settings) : System.Xml.XmlReader.Create(str_xml_string_reader, settings);
            
            //Restrição do elemento de topo
            if (!reader.IsStartElement("AuditFile"))
            {
                Exception ex1 = new Exception(@"Elemento de topo inválido.O ficheiro xml deverá inicial com o elemento:""AuditFile""");
                throw ex1;
            }
            
            //Percorre o ficheiro 
            while (reader.Read());
            reader.Close();

            if (valido)
                resultado = string.Format("Documento válido em {0} por {1}", settings.ValidationType.ToString().Replace("None", "XML"), (ficheiro_texto ? "ficheiro" : "texto"));            
            else
                resultado = string.Format("Documento não válido em {0} por {1}", settings.ValidationType.ToString().Replace("None", "XML"), (ficheiro_texto ? "ficheiro" : "texto"));
            
            lbl_resultado.Text = resultado;
            lbl_erros.Text = erro;
        }
        catch(Exception e1)
        {
            lbl_resultado.Text = "";
            lbl_erros.Text = string.Format("<span style=\"color:#FF0000\">Erro no validador</span>:</br>{0}</br><span style=\"color:#00CE18\">Teste o validador utilizando outros browsers Internet Explorer | Firefox | Opera </span>", e1.Message);            
            
        }
    }
    private void ValidationCallBack(object sender, System.Xml.Schema.ValidationEventArgs e)
    {
        valido = false;
        erro += string.Format("Erro:{0} Linha: {1} Posição: {2}.<br />", e.Message, e.Exception.LineNumber, e.Exception.LinePosition);
    }

</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<h2>Validador SAFTPT.com</h2>
<fieldset title="Validador SAFTPT.com">
<legend title="Validador SAFTPT.com">Validador de Ficheiros SAFT PT</legend>
<table width="100%">
    <tr>
        <td>Tipo de validação:</td>
        <td>
            <asp:RadioButtonList 
                ID="rbl_tipo_validacao" 
                runat="server" RepeatColumns="1">
                <asp:ListItem Selected="True" Value="Schema">Schema SAFT-PT (SAF-T-PT.XSD)</asp:ListItem>
                <asp:ListItem Value="NewSchema">Schema SAFT-PT (SAFTPT_1_01.xsd)</asp:ListItem>
                <asp:ListItem Value="XML">XML</asp:ListItem>
            </asp:RadioButtonList></td>
    </tr>
    <tr>
        <td valign="top"><b>Por ficheiro ou texto:</b></td>
        <td>
            <asp:FileUpload 
                ID="flp_ficheiro" 
                runat="server"/></td>
    </tr>
    <tr>
        <td valign="top">
            </td>
        <td>
            <asp:TextBox 
                ID="txt_xmlsaft" 
                runat="server" 
                Columns="55" 
                Rows="12" 
                SkinID="multilinha0"
                TextMode="MultiLine"/></td>
    </tr>
    <tr>
        <td valign="top">
        </td>
        <td>
            <asp:Button 
                ID="btn_validar" 
                runat="server" 
                Text="Validar" 
                OnClick="btn_validar_Click"/>
            <asp:Label 
                ID="lbl_resultado" 
                runat="server" 
                CssClass="notas0"/></td>
    </tr>
    <tr>
        <td colspan="2">
            <asp:Label 
                ID="lbl_erros" 
                runat="server"/>
        </td>
    </tr>
</table>
</fieldset>
<br />
<div class="texto">
    <p class="bottom"> <br /></p>
</div>    
</asp:Content>