<%
'=======================================================================================================================
' Validation Classes
'=======================================================================================================================

'-----------------------------------------------------------------------------------------------------------------------
' Exists Validation
'-----------------------------------------------------------------------------------------------------------------------
Class ExistsValidation_Class
    Private m_instance
    Private m_field_name
    Private m_message
    Private m_ok
    
    Public Function Initialize(instance, field_name, message)
        set m_instance  = instance
        m_field_name    = field_name
        m_message       = message
        m_ok            = true
        set Initialize  = Me
    End Function
    
    Public Sub Check
        If Len(eval("m_instance." & m_field_name)) = 0 then
            m_ok = false
        End If
    End Sub
    
    Public Property Get OK
        OK = m_ok
    End Property
    
    Public Property Get Message
        Message = m_message
    End Property
End Class

Sub ValidateExists(instance, field_name, message)
    if not IsObject(instance.Validator) then set instance.Validator = new Validator_Class
    instance.Validator.AddValidation new ExistsValidation_Class.Initialize(instance, field_name, message)
End Sub


'-----------------------------------------------------------------------------------------------------------------------
' Minimum Length Validation
'-----------------------------------------------------------------------------------------------------------------------
Class MinLengthValidation_Class
    Private m_instance
    Private m_field_name
    Private m_size
    Private m_message
    Private m_ok
    
    Public Function Initialize(instance, field_name, size, message)
        set m_instance  = instance
        m_field_name    = field_name
        m_size          = size
        m_message       = message
        m_ok            = true
        set Initialize  = Me
    End Function
    
    Public Sub Check
        If Len(eval("m_instance." & m_field_name)) < m_size then m_ok = false
    End Sub
    
    Public Property Get OK
        OK = m_ok
    End Property
    
    Public Property Get Message
        Message = m_message
    End Property
End Class

Sub ValidateMinLength(instance, field_name, size, message)
    if not IsObject(instance.Validator) then set instance.Validator = new Validator_Class
    instance.Validator.AddValidation new MinLengthValidation_Class.Initialize(instance, field_name, size, message)
End Sub

'-----------------------------------------------------------------------------------------------------------------------
' Max Length Validation
'-----------------------------------------------------------------------------------------------------------------------
Class MaxLengthValidation_Class
    Private m_instance
    Private m_field_name
    Private m_size
    Private m_message
    Private m_ok
    
    Public Function Initialize(instance, field_name, size, message)
        set m_instance  = instance
        m_field_name    = field_name
        m_size          = size
        m_message       = message
        m_ok            = true
        set Initialize  = Me
    End Function
    
    Public Sub Check
        If Len(eval("m_instance." & m_field_name)) > m_size then m_ok = false
    End Sub
    
    Public Property Get OK
        OK = m_ok
    End Property
    
    Public Property Get Message
        Message = m_message
    End Property
End Class

Sub ValidateMaxLength(instance, field_name, size, message)
    if not IsObject(instance.Validator) then set instance.Validator = new Validator_Class
    instance.Validator.AddValidation new MaxLengthValidation_Class.Initialize(instance, field_name, size, message)
End Sub

'-----------------------------------------------------------------------------------------------------------------------
' Numeric Validation
'-----------------------------------------------------------------------------------------------------------------------
Class NumericValidation_Class
    Private m_instance
    Private m_field_name
    Private m_message
    Private m_ok
    
    Public Function Initialize(instance, field_name, message)
        set m_instance  = instance
        m_field_name    = field_name
        m_message       = message
        m_ok            = true
        set Initialize  = Me
    End Function
    
    Public Sub Check
        If Not IsNumeric(eval("m_instance." & m_field_name)) then m_ok = false
    End Sub
    
    Public Property Get OK
        OK = m_ok
    End Property
    
    Public Property Get Message
        Message = m_message
    End Property
End Class

Sub ValidateNumeric(instance, field_name, message)
    if not IsObject(instance.Validator) then set instance.Validator = new Validator_Class
    instance.Validator.AddValidation new NumericValidation_Class.Initialize(instance, field_name, message)
End Sub


'-----------------------------------------------------------------------------------------------------------------------
' Regular Expression Pattern Validation
'-----------------------------------------------------------------------------------------------------------------------
Class PatternValidation_Class
    Private m_instance
    Private m_field_name
    Private m_pattern
    Private m_message
    Private m_ok
    
    Public Function Initialize(instance, field_name, pattern, message)
        set m_instance  = instance
        m_field_name    = field_name
        m_pattern       = pattern
        m_message       = message
        m_ok            = true
        set Initialize  = Me
    End Function
    
    Public Sub Check
        dim re : set re = new RegExp
        With re
            .Pattern    = m_pattern
            .Global     = true
            .IgnoreCase = true
        End With
        dim matches : set matches = re.Execute(eval("m_instance." & m_field_name))
        if matches.Count = 0 then
            m_ok = false
        end if
    End Sub
    
    Public Property Get OK
        OK = m_ok
    End Property
    
    Public Property Get Message
        Message = m_message
    End Property
End Class

Sub ValidatePattern(instance, field_name, pattern, message)
    if not IsObject(instance.Validator) then set instance.Validator = new Validator_Class
    instance.Validator.AddValidation new PatternValidation_Class.Initialize(instance, field_name, pattern, message)
End Sub



'-----------------------------------------------------------------------------------------------------------------------
' Validator Class
' This class is not intended to be used directly. Models should use the Validate* subs instead.
'-----------------------------------------------------------------------------------------------------------------------
Class Validator_Class
    Private m_validations
    Private m_errors
    
    Private Sub Class_Initialize
        m_validations = Array()
        redim m_validations(-1)
    
        m_errors = Array()
        redim m_errors(-1)
    End Sub
    
    Public Property Get Errors
        Errors = m_errors
    End Property
    
    Public Sub AddValidation(validation)
        dim n : n = ubound(m_validations) + 1
        redim preserve m_validations(n)
        set m_validations(n) = validation
    End Sub
    
    Public Sub Validate
        dim n : n = ubound(m_validations)
        dim i, V
        for i = 0 to n
            set V = m_validations(i)
            V.Check
            if not V.OK then
                AddError V.Message
            end if
        next
    End Sub
    
    Public Property Get HasErrors
        HasErrors = (ubound(m_errors) > -1)
    End Property
    
    'Public to allow other errors to be added by the controller for circumstances not accounted for by the validators
    Public Sub AddError(msg)
        redim preserve m_errors(ubound(m_errors) + 1)
        m_errors(ubound(m_errors)) = msg
    End Sub
End Class
%>