{-# LANGUAGE CPP #-}
module Internal.FFI where

#ifdef ghcjs_HOST_OS
import           Data.JSString          (JSString)
import           GHCJS.Foreign.Callback (Callback)
import           GHCJS.Types            (JSVal)
--------------------------------------------------------------------------------


--------------------------------------------------------------------------------
-- | GHCJS' callback taking one argument.
-- Handy synonym to simplify type signatures.
type Callback1 = Callback (JSVal -> IO ())

foreign import javascript unsafe "$r = document;"
  js_document :: IO JSVal

foreign import javascript unsafe "document.body"
  js_documentBody :: IO JSVal

foreign import javascript unsafe "document.getElementById($1)"
  js_getElementById :: JSString -> IO JSVal

foreign import javascript unsafe "document.querySelectorAll($1)"
  js_querySelectorAll :: JSString -> IO JSVal

foreign import javascript unsafe "document.createElement($1)"
  js_documentCreateNode :: JSString -> IO JSVal

foreign import javascript unsafe "document.createElementNS($1,$2)"
  js_documentCreateNodeNS ::  JSString -> JSString -> IO JSVal

foreign import javascript unsafe "document.createTextNode($1)"
  js_createTextNode :: JSString -> IO JSVal

-- | Check if object is an HTML Element of current DOM.  Works with HTML
-- elements and text nodes.
-- http://stackoverflow.com/a/20476546/1749901
foreign import javascript unsafe
  "$1 !== null && !(!$1.ownerDocument) && (window === ($1.ownerDocument.defaultView || $1.ownerDocument.parentWindow))"
  js_isInCurrentDOM :: JSVal -> IO Bool


foreign import javascript unsafe "$1.parentNode"
  js_parentNode :: JSVal -> IO JSVal

foreign import javascript unsafe "$1.appendChild($2)"
  js_appendChild :: JSVal -> JSVal -> IO ()

foreign import javascript unsafe "$1.replaceChild($2,$3)"
  js_replaceChild :: JSVal -> JSVal -> JSVal -> IO ()

foreign import javascript unsafe "$1.removeChild($2)"
  js_removeChild :: JSVal -> JSVal -> IO ()

foreign import javascript unsafe
  "while ($1.hasChildNodes()) $1.removeChild($1.lastChild)"
  js_clearChildren :: JSVal -> IO ()


foreign import javascript unsafe "$1.setAttribute($2, $3)"
  js_setAttribute :: JSVal -> JSString -> JSString -> IO ()

foreign import javascript unsafe "$1.innerHTML = $2"
  js_setInnerHtml :: JSVal -> JSString -> IO ()


foreign import javascript unsafe
  "$1.addEventListener($2, $3);"
  js_addEventListener :: JSVal -> JSString -> Callback1 -> IO ()

-- | Remove event listener from element.
foreign import javascript unsafe
  "$1.removeEventListener($2, $3);"
  js_removeEventListener :: JSVal -> JSString -> Callback1 -> IO ()
--------------------------------------------------------------------------------
#endif