module Graphics.UI.Threepenny.JQuery where

import Control.Arrow
import Data.String
import Data.Char
import Data.Default
import Data.Maybe

import Graphics.UI.Threepenny.Core

{-----------------------------------------------------------------------------
    jQuery utilities
------------------------------------------------------------------------------}
data Easing = Swing | Linear
  deriving (Eq,Enum,Show)

instance Default Easing where def = Linear

-- | Fade in an element.
fadeIn :: Element -> Int -> Easing -> IO () -> UI ()
fadeIn el duration easing complete = do
    callback <- ffiExport complete
    runFunction $ ffi "$(%1).animate({opacity: 1}, %2 * 1, %3, %4)"
        el duration (map toLower (show easing)) callback

-- | Fade out an element.
fadeOut :: Element -> Int -> Easing -> IO () -> UI ()
fadeOut el duration easing complete = do
    callback <- ffiExport complete
    runFunction $ ffi "$(%1).animate({opacity: 0}, %2 * 1, %3, %4)"
        el duration (map toLower (show easing)) callback

-- | The 'sendValue' event happens whenever the return key is pressed
-- while the element has focus. Its data is the event value.
sendValue :: Element -> Event String
sendValue = fmap unsafeFromJSON . domEvent "sendvalue"

-- | Focus an element.
setFocus :: Element -> UI ()
setFocus = runFunction . ffi "$(%1).focus()"

-- | Scroll to the bottom of an element.
scrollToBottom :: Element -> UI ()
scrollToBottom = runFunction . ffi "jquery_scrollToBottom(%1)"