-- © 2002 Peter Thiemann
module WASH.HTML.HTMLTypedBase98 
  (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase98)
  where

import Char
import WASH.HTML.HTMLBase

-- typed layer
-- attributes

data ATTRIBUTE a => ATTR a =				    -- a phantom type
  ATTR { unATTR :: ATTR_ }

class Show a => ATTRIBUTE a where
  show_name :: a -> String
-- 
  show_name = map toLower . show

-- attribute values

-- class (ATTRIBUTE a, Show v) => AttrValue a v

mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a
mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)

-- mkAttr :: (AttrValue a v) => a -> v -> ATTR a
-- mkAttr a v = 
--   mkUAttr a (av raw)
--   where raw = show v

av (str@('\"':_)) = let str1 = read str :: String in str1
av str = str

-- attr a v into = add_attr into (mkAttr a v)

uattr a vstr into = add_attr into (mkUAttr a vstr)

--  elements

data TAG t => ELT t =
    ELT { unELT :: ELEMENT_ }

class Show t => TAG t where
  make :: t -> ELT t
  show_tag :: t -> String
--
  make = make_standard
  show_tag = map toLower . show

make_standard t = ELT (element_ (show_tag t) [] [])
make_empty    t = ELT (empty_   (show_tag t) [])

--
-- class (TAG s, TAG t) => AddTo s t

-- add :: (AddTo s t) => ELT s -> ELT t -> ELT s
add (ELT e_) (ELT e'_) =
  ELT (add_ e_ e'_)

-- add' :: (AddTo s t) => ELT t -> ELT s -> ELT s
add' = flip add

-- class (TAG t) => AddAttr t a

-- add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t
add_attr (ELT e_) (ATTR att) =
  ELT (add_attr_ e_ att)

-- attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t
attr' = flip add_attr

-- --================= FUNCTIONS =================----

-- --show functions------------------

show_html (ELT e_) = show e_

-- creating text elements

class AdmitChildCDATA a where
  text, rawtext, formattedtext :: String -> ELT a -> ELT a
  text str = add' (ELT (cdata_ [] str) :: ELT CDATA)
  rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)
  formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)

data CDATA = CDATA deriving Show
instance TAG CDATA

-- creating comment elements

comment :: String -> ELT a -> ELT a
comment str (ELT e_) = ELT (add_ e_ (comment_ str))

-- creating the main document

data DOCUMENT = DOCUMENT deriving Show
instance TAG DOCUMENT where
  make DOCUMENT = 
    ELT (doctype_
  	  ["HTML"
          ,"PUBLIC"
	  ,"\"-//W3C//DTD HTML 4.01//EN\""
	  ,"\"http://www.w3.org/TR/html4/strict.dtd\""]
	  [])

-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude

show_document :: ELT DOCUMENT -> String
show_document = show_html