{-# LANGUAGE OverlappingInstances, UndecidableInstances #-}
module HJScript.Objects.JQuery where

import HJScript.Lang
import HJScript.DOM.Window
import HJScript.DOM.ElementNode

data JQuery = JQuery deriving Show
instance IsClass JQuery


-- | Constructors for Date
instance HasConstructor JQuery JString String

jQuery :: Exp JQuery
jQuery = JConst "jQuery"

selectExpr :: Exp c -> JObject JQuery
selectExpr e = methodCall "jQuery" e window

jSize :: JObject JQuery -> JInt
jSize = methodCallNoArgs "size"

length :: JObject JQuery -> JInt
length = deref "length"

get ::  JInt -> JObject JQuery -> Exp ElementNode
get = methodCall "get"

empty :: JObject JQuery -> Exp JQuery
empty = methodCall "empty" ()

jVal :: JObject JQuery -> JString
jVal = methodCall "val" ()

jSetVal :: JString -> JObject JQuery -> JString
jSetVal = methodCall "val"

jText :: JObject JQuery -> JString
jText = methodCall "text" ()

jSetText :: JString -> JObject JQuery -> Exp JQuery
jSetText = methodCall "text"

append :: Exp a -> JObject JQuery -> Exp JQuery
append = methodCall "append"

prepend :: Exp a -> JObject JQuery -> Exp JQuery
prepend = methodCall "prepend" 

ready :: HJScript () -> HJScript ()
ready script
    = do fn <- procedure $ \() -> script
         runExp $ methodCall "jQuery" fn window

change :: HJScript () -> JObject JQuery -> HJScript ()
change script query
    = do fn <- procedure $ \() -> script
         runExp $ methodCall "change" fn query

submit :: HJScript () -> JObject JQuery -> HJScript ()
submit script query
    = do fn <- procedure $ \() -> script
         runExp $ methodCall "submit" fn query

select :: HJScript () -> JObject JQuery -> HJScript ()
select script query
    = do fn <- procedure $ \() -> script
         runExp $ methodCall "select" fn query

runExp :: Exp a -> HJScript ()
runExp = outputStmt . ExpStmt