module Rules

  URI_RE = /^([a-zA-Z][0-9a-zA-Z+\-\.]*:)?\/{0,2}[0-9a-zA-Z;\/?:@&=+$\.\-_!~*'()%,#]*$/

  class Rfc2396 < DataElement
    def message
      log :InvalidLink
    end

    def validate value
      if value =~ URI_RE
        log :ValidURI
      else
        message
      end
    end
  end

  class Rfc2396_attr < Rfc2396
    def message
      log :InvalidURIAttribute
    end
  end

  class Rfc2396_rel < Rfc2396
    def message
      log :InvalidAtomLinkRel
     end
  end

  class Rfc2396_full < DataElement
    def validate value
      if value =~ /^[a-zA-Z][0-9a-zA-Z+\-\.]*:(\/\/)?[0-9a-zA-Z;\/?:@&=+$\.\-_!~*'()%,#]+$/
        log :ValidURI
      else
        log :InvalidFullLink
      end
    end
  end

  class SetXmlBase < DataElement
    def validate value
      if value =~ URI_RE
        log :ValidURI
        require 'uri'
        @parent.xmlbase = @parent.xmlbase.merge(value) if @parent.xmlbase
      else
        log :InvalidURI
      end
    end
  end

  class XmlBase < DataElement
    def validate value
      if @xmlbase
        require 'uri'
        root = parent
        root = root.parent while root.respond_to? :parent
        docbase = root.xmlbase.normalize.to_s.split('#')[0]
        elembase = @xmlbase.normalize.to_s.split('#')[0]
        value = @xmlbase.merge(value).normalize.to_s.split('#')[0]
        if (value==elembase) and (elembase!=docbase):
          log :SameDocumentReference
        end
      end
    rescue URI::InvalidURIError
    end
  end
end
