/// <summary>
        /// Creates an HL7 acknowledgement for a received message. If there is an
        /// error condition, the acknowledgement will be a negative acknowledgement
        /// (code AE), otherwise it will be a positive acknowedgement (code AA).
        /// </summary>
        /// <param HL7Name="message">The received message</param>
        /// <param HL7Name="facility">The facility that is returning the acknowledgement</param>
        /// <param HL7Name="application">The application that is returning the acknowledgement</param>
        /// <param HL7Name="errorCondition">Null if no error, otherwise a code and description of the error</param>
        /// <returns>The HL7 acknowledgement</returns>
        public static HL7Acknowledgement Acknowledge(HL7Message message, string facility, string application, CE errorCondition)
        {
            HL7Acknowledgement ack = new HL7Acknowledgement();

            ack.MessageHeader = new MSH();
            ack.MessageHeader.FieldSeparator     = message.MessageHeader.FieldSeparator;
            ack.MessageHeader.EncodingCharacters = message.MessageHeader.EncodingCharacters;
            ack.MessageHeader.SendingApplication = new HD()
            {
                namespaceID = application
            };
            ack.MessageHeader.SendingFacility = new HD()
            {
                namespaceID = facility
            };
            ack.MessageHeader.ReceivingApplication = message.MessageHeader.SendingApplication;
            ack.MessageHeader.ReceivingFacility    = message.MessageHeader.SendingFacility;
            ack.MessageHeader.DateTimeOfMessage    = new TS()
            {
                TimestampValue = DateTime.Now
            };
            ack.MessageHeader.Security                      = message.MessageHeader.Security;
            ack.MessageHeader.MessageType                   = message.MessageHeader.MessageType;
            ack.MessageHeader.MessageControlID              = NewMessageControlID();
            ack.MessageHeader.ProcessingID                  = message.MessageHeader.ProcessingID;
            ack.MessageHeader.VersionID                     = message.MessageHeader.VersionID;
            ack.MessageHeader.SequenceNumber                = message.MessageHeader.SequenceNumber;
            ack.MessageHeader.ContinuationPointer           = message.MessageHeader.ContinuationPointer;
            ack.MessageHeader.AcceptAcknowledgmentType      = message.MessageHeader.AcceptAcknowledgmentType;
            ack.MessageHeader.ApplicationAcknowledgmentType = message.MessageHeader.ApplicationAcknowledgmentType;
            ack.MessageHeader.CountryCode                   = message.MessageHeader.CountryCode;
            ack.MessageHeader.CharacterSet                  = message.MessageHeader.CharacterSet;
            ack.MessageHeader.PrincipalLanguageOfMessage    = message.MessageHeader.PrincipalLanguageOfMessage;
            ack.MessageHeader.AltCharsetHandlingScheme      = message.MessageHeader.AltCharsetHandlingScheme;
            ack.MessageAcknowledgement                      = new MSA();
            if (errorCondition == null)
            {
                ack.MessageAcknowledgement.AcknowledgmentCode = "AA";
            }
            else
            {
                ack.MessageAcknowledgement.AcknowledgmentCode = "AE";
                ack.MessageAcknowledgement.ErrorCondition     = errorCondition;
            }
            ack.MessageAcknowledgement.MessageControlID = message.MessageHeader.MessageControlID;
            return(ack);
        }
        /// <summary>
        /// Creates a negative HL7 acknowledgement for an unparseable message.
        /// </summary>
        /// <param HL7Name="errorMessage">A description of the error</param>
        /// <returns>The HL7 acknowledgement</returns>
        public static HL7Acknowledgement AcknowledgeUnparseableMessage(string errorMessage)
        {
            HL7Separators      typical = new HL7Separators();
            HL7Acknowledgement ack     = new HL7Acknowledgement();

            ack.MessageHeader = new MSH();
            ack.MessageHeader.FieldSeparator     = typical.FieldSeparator.ToString();
            ack.MessageHeader.EncodingCharacters = typical.EncodingCharacters;
            ack.MessageHeader.SendingApplication = new HD()
            {
                namespaceID = "HIPS"
            };
            ack.MessageHeader.SendingFacility = new HD()
            {
                namespaceID = "HIPS"
            };
            ack.MessageHeader.ReceivingApplication = new HD()
            {
                namespaceID = "HIPS"
            };
            ack.MessageHeader.ReceivingFacility = new HD()
            {
                namespaceID = "HIPS"
            };
            ack.MessageHeader.DateTimeOfMessage = new TS()
            {
                TimestampValue = DateTime.Now
            };
            ack.MessageHeader.MessageControlID            = NewMessageControlID();
            ack.MessageAcknowledgement                    = new MSA();
            ack.MessageAcknowledgement.AcknowledgmentCode = "AE";
            ack.MessageAcknowledgement.ErrorCondition     = new CE()
            {
                text = errorMessage
            };
            return(ack);
        }