module HJScript.Utils
(
dispNone, dispBlock,dispInline,
thisElem, thisXHTMLElement, thisNode,
hasClass, hasChild, isVisible, isInVisible,
elemById, elemsByTag, fstElemByTag, allElems, parentElem, elemVal,
msg, getElemById, getElemsByTag, getFstElemByTag, getAllElems, getParentElem,
getElemsByClass, getFstElemByClass, getSiblings, hideElem , showElem,
showInline, showBlock , remFirstChild, remChildren, remElem,
appendChildren, setChild, toggleVis, toggleVisBlock, toggleVisInline, setVal
) where
import HJScript.Lang
import HJScript.Objects.Array
import HJScript.DOM
dispNone :: JString
dispNone = string "none"
dispBlock :: JString
dispBlock = string "block"
dispInline :: JString
dispInline = string "inline"
thisElem :: Exp ElementNode
thisElem = JThis
thisXHTMLElement :: Exp ElementNode
thisXHTMLElement = JThis
thisNode :: Exp Node
thisNode = JThis
hasClass :: (IsJString e) => e -> Exp ElementNode-> JBool
hasClass name elem = (val $ elem' # className) .==. (toJString name)
where elem' = asXHTMLElement elem
hasChild :: IsElementNode e => Exp e -> JBool
hasChild elem = elem # firstChild .!=. jnull
isVisible :: IsElementNode n => Exp n -> JBool
isVisible elem = (val $ elem # style # display) .!=. dispNone
isInVisible :: IsElementNode n => Exp n -> JBool
isInVisible elem = (val $ elem # style # display) .==. dispNone
elemById :: IsJString e => e -> Exp ElementNode
elemById id = document # getElementById (toJString id)
elemsByTag :: IsJString e => e -> JArray ElementNode
elemsByTag name = document # getElementsByTagName (toJString name)
fstElemByTag :: IsJString e => e -> Exp ElementNode
fstElemByTag = val . headArr . elemsByTag
allElems :: JArray ElementNode
allElems = elemsByTag (string "*")
parentElem :: IsElementNode e => (Exp e) -> Exp ElementNode
parentElem elem = castObject $ elem # parentNode
txtNode :: IsJString s => s -> Exp TextNode
txtNode str = document # createTextNode (toJString str)
elemNode :: IsJString s => s -> Exp ElementNode
elemNode str = document # createElement (toJString str)
msg :: IsExp e t => e -> HJScript ()
msg e = window # alert (toExp e)
getElemById :: IsJString e => e -> HJScript (Exp ElementNode)
getElemById = return . elemById
getElemsByTag :: IsJString e => e -> HJScript (JArray ElementNode)
getElemsByTag = return . elemsByTag
getFstElemByTag :: IsJString e => e -> HJScript (Exp ElementNode)
getFstElemByTag = return . fstElemByTag
getAllElems :: HJScript (JArray ElementNode)
getAllElems = return allElems
getParentElem :: IsElementNode e => Exp e -> HJScript (Exp ElementNode)
getParentElem = return . parentElem
getElemsByClass :: (IsJString e) => e -> HJScript (JArray ElementNode)
getElemsByClass c = filterArray (hasClass c) allElems
getFstElemByClass :: IsJString e => e -> HJScript (JObject ElementNode)
getFstElemByClass c = do
elems <- getElemsByClass c
return $ val $ headArr elems
getSiblings :: IsElementNode e => Exp e -> HJScript (JArray Node)
getSiblings elem = do
elems <- varWith $ elem # parentElem # childNodes
filterArray (.!=. thisNode) (val elems)
hideElem :: IsElementNode e => Exp e -> HJScript ()
hideElem elem = elem # style # display .=. dispNone
showElem :: IsElementNode e => Exp e -> HJScript ()
showElem = showBlock
showInline :: IsElementNode e => Exp e -> HJScript ()
showInline elem = elem # style # display .=. dispInline
showBlock :: IsElementNode e => Exp e -> HJScript ()
showBlock elem = elem # style # display .=. dispBlock
remFirstChild :: IsElementNode e => Exp e -> HJScript ()
remFirstChild elem = elem # removeChild (elem # firstChild)
remChildren :: IsElementNode e => Exp e -> HJScript ()
remChildren elem =
while (elem # hasChild) $
remFirstChild elem
remElem :: IsElementNode e => Exp e -> HJScript ()
remElem elem = elem # parentElem # removeChild elem'
where elem' = castObject elem :: Exp Node
appendChildren :: (IsElementNode n, IsNode t) => JArray t -> Exp n -> HJScript ()
appendChildren childs elem = do
mapArrayH_ (\child -> elem # appendChild child) childs
setChild :: (IsNode n1, IsElementNode n2) => Exp n1 -> Exp n2 -> HJScript ()
setChild e1 e2 = do
e2 # remChildren
e2 # appendChild e1
toggleVis :: (IsElementNode n) => Exp n -> HJScript ()
toggleVis = toggleVisBlock
toggleVisBlock :: (IsElementNode n) => Exp n -> HJScript ()
toggleVisBlock elem =
(isInVisible elem) ? (elem # showBlock ) <|> (elem # hideElem)
toggleVisInline :: (IsElementNode n) => Exp n -> HJScript ()
toggleVisInline elem =
(isInVisible elem) ? (elem # showInline ) <|> (elem # hideElem)
elemVal :: IsElementNode n => Exp n -> JString
elemVal elem = elem # (deref "value")
setVal :: IsElementNode n => JString -> Exp n -> HJScript ()
setVal val elem = elem # (derefVar "value") .=. val
newTxtNode :: IsJString s => s -> HJScript (Exp TextNode)
newTxtNode = inVar . txtNode
newElem :: IsJString s => s -> HJScript (Exp ElementNode)
newElem = inVar . elemNode
style :: IsElementNode e => Exp e -> Exp Style
style = deref "style"
display :: Exp Style -> Var String
display = derefVar "display"