module WASH.CGI.Frames where
import WASH.Utility.Auxiliary
import qualified WASH.CGI.HTMLWrapper as H hiding (map)
import WASH.CGI.CookieIO
import WASH.CGI.CGIConfig
import WASH.CGI.CGIMonad
import WASH.CGI.CGIOutput
import WASH.CGI.CGITypes
import WASH.CGI.EventHandlers
import WASH.CGI.Fields
import WASH.CGI.Images
import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))
import qualified WASH.Utility.URLCoding as URLCoding
import WASH.Utility.JavaScript
data FrameLayout = ROWS | COLS
deriving Show
data FrameSpacing = FrameAbsolute Int
| FrameRelative Int
| FramePercent Int
instance Show FrameSpacing where
showsPrec _ (FrameAbsolute n) = shows n
showsPrec _ (FrameRelative n) = shows n . showChar '*'
showsPrec _ (FramePercent n) = shows n . showChar '%'
showList [] = id
showList [ffmt] = shows ffmt
showList (ffmt:ffmts) = shows ffmt . showChar ',' . showList ffmts
data FrameSet = FrameSet { unFrameSet :: H.WithHTML () IO () }
makeFrameset :: (CGIMonad cgi) =>
FrameLayout
-> [(FrameSpacing, cgi FrameSet)]
-> cgi FrameSet
makeFrameset layout subframes =
do nested <- mapM snd subframes
return $ FrameSet $
H.frameset_S (foldr (( >> ) . unFrameSet)
(H.attr_SD (show layout) (show (map fst subframes)))
nested)
makeFrame :: (CGIMonad cgi) =>
H.WithHTML x IO ()
-> cgi ()
-> cgi FrameSet
makeFrame attrs subAction =
do n <- incFrame
subAction
baseUrl <- getUrl
parm <- getParm
let url = baseUrl ++ '?' : URLCoding.encode (frameFileName parm n)
name = ("FRAME"++show n)
return $ FrameSet $
H.frame_S (do attrs
H.attr_SD "SRC" url
H.attr_SD "NAME" name)
frameFileName parm frameno =
"FRAME:" ++ show frameno ++ ":" ++ (URLCoding.encode $ show $ parm)
frameFullPath parm frameno =
frameDir ++ frameFileName parm frameno
framesetPage :: (CGIMonad cgi) => String -> cgi FrameSet -> cgi ()
framesetPage ttl framesetgen =
do resetFrame
FrameSet pagegen <- framesetgen
let ma = H.htmlHeader ttl pagegen
resetFrame
wrapCGI $ \ cgistate ->
do elem <- H.build_document ma
(nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)