module HJScript.DOM.Node (
        Node(..), IsNode(..),
        
        NodeType(..), nodeTypeVal,
        
        nodeName, nodeType, nodeValue, 
        ownerDocument, prefix, cloneNode
        ) where

import HJScript.Lang

--import HJScript.DOM.Document
import HJScript.DOM.NodeTypes

----------------------------------------------------
-- the Node object type
----------------------------------------------------
-- data Node = Node deriving Show (is in NodeTypes)

instance IsClass Node

class IsClass n => IsNode n where
 castToNode :: JObject n -> JObject Node
 castToNode = castObject
 castFromNode :: JObject Node -> JObject n
 castFromNode = castObject

instance IsNode Node where
 castToNode   = id
 castFromNode = id



----------------------------------------------------
-- Properties for Nodes
----------------------------------------------------

-- We move all properties dealing with children, siblings
-- and parents to ElementNode, since in our simple model 
-- they only make sense on (subclasses of) Element nodes 
-- anyway.

nodeName :: IsNode n => Exp n -> JString 
nodeName = deref "nodeName"

nodeType :: IsNode n => Exp n -> JInt 
nodeType = deref "nodeType"

nodeValue :: IsNode n => Exp n -> Var String 
nodeValue = derefVar "nodeValue"

ownerDocument ::  IsNode n => Exp n -> Exp Document
ownerDocument = deref "ownerDocument"

prefix :: IsNode n => Exp n -> Exp String
prefix = deref "prefix"

----------------------------------------------------
-- Methods for Nodes
----------------------------------------------------

cloneNode ::  IsNode n => JBool -> Exp n -> Exp n
cloneNode = methodCall "cloneNode"