content: 
  {-# LANGUAGE TypeFamilies #-}
  
  -- | The 'Date' module provides the API for the Javascript @Date@
  --   object. The API documentation is mainly taken from 
  --   w3schools (<http://www.w3schools.com/jsref/jsref_obj_date.asp>).
  --   Deprecated methods are not supported.
  module Language.Sunroof.JS.Date
    ( JSDate
    , newDate
    , getHours, getMinutes, getSeconds
    , getDate, getDay, getFullYear
    , getMilliseconds, getMonth
    , getTime, getTimezoneOffset
    , getUTCDate, getUTCDay, getUTCFullYear
    , getUTCHours, getUTCMilliseconds
    , getUTCMinutes, getUTCMonth, getUTCSeconds
    , parseDate
    , setDate, setFullYear, setHours
    , setMilliseconds, setMinutes, setMonth
    , setSeconds, setTime
    , setUTCDate, setUTCFullYear, setUTCHours
    , setUTCMilliseconds, setUTCMinutes, setUTCMonth
    , setUTCSeconds, toDateString
    , toISOString, toJSON
    , toLocaleDateString, toLocaleTimeString
    , toLocaleString, toString
    , toTimeString, toUTCString
    ) where
  
  import Data.Boolean ( BooleanOf, IfB(..), EqB(..) )
  
  import Language.Sunroof.Classes ( Sunroof(..), SunroofArgument(..) )
  import Language.Sunroof.Types ( JS, invoke, new, cast )
  import Language.Sunroof.JS.Object ( JSObject )
  import Language.Sunroof.JS.Number ( JSNumber )
  import Language.Sunroof.JS.String ( JSString )
  import Language.Sunroof.JS.Bool ( JSBool, jsIfB )
  
  -- -------------------------------------------------------------
  -- JSDate Type
  -- -------------------------------------------------------------
  
  -- | The type of a date object.
  newtype JSDate = JSDate JSObject
  
  -- | Show the Javascript.
  instance Show JSDate where
    show (JSDate o) = show o
  
  -- | First-class values in Javascript.
  instance Sunroof JSDate where
    box = JSDate . box
    unbox (JSDate o) = unbox o
  
  -- | Associated boolean is 'JSBool'.
  type instance BooleanOf JSDate = JSBool
  
  -- | Can be returned in branches.
  instance IfB JSDate where
    ifB = jsIfB
  
  -- | Reference equality, not value equality.
  instance EqB JSDate where
    (JSDate a) ==* (JSDate b) = a ==* b
  
  -- -------------------------------------------------------------
  -- JSDate Methods
  -- -------------------------------------------------------------
  
  -- | Creates a new @Date@ object.
  --   See: <http://www.w3schools.com/jsref/jsref_obj_date.asp>
  newDate :: (SunroofArgument a) => a -> JS t JSDate
  newDate args = cast `fmap` new "Date" args
  
  -- | Returns the hour (from 0-23).
  --   See: <http://www.w3schools.com/jsref/jsref_gethours.asp>
  getHours :: JSDate -> JS t JSNumber
  getHours = invoke "getHours" ()
  
  -- | Returns the minutes (from 0-59).
  --   See: <http://www.w3schools.com/jsref/jsref_getminutes.asp>
  getMinutes :: JSDate -> JS t JSNumber
  getMinutes = invoke "getMinutes" ()
  
  -- | Returns the seconds (from 0-59).
  --   See: <http://www.w3schools.com/jsref/jsref_getseconds.asp>
  getSeconds :: JSDate -> JS t JSNumber
  getSeconds = invoke "getSeconds" ()
  
  -- | Returns the day of the month (from 1-31).
  --   See: <http://www.w3schools.com/jsref/jsref_getdate.asp>
  getDate :: JSDate -> JS t JSNumber
  getDate = invoke "getDate" ()
  
  -- | Returns the day of the week (from 0-6).
  --   See: <http://www.w3schools.com/jsref/jsref_getday.asp>
  getDay :: JSDate -> JS t JSNumber
  getDay = invoke "getDay" ()
  
  -- | Returns the year (four digits).
  --   See: <http://www.w3schools.com/jsref/jsref_getfullyear.asp>
  getFullYear :: JSDate -> JS t JSNumber
  getFullYear = invoke "getFullYear" ()
  
  -- | Returns the milliseconds (from 0-999).
  --   See: <http://www.w3schools.com/jsref/jsref_getmilliseconds.asp>
  getMilliseconds :: JSDate -> JS t JSNumber
  getMilliseconds = invoke "getMilliseconds" ()
  
  -- | Returns the month (from 0-11).
  --   See: <http://www.w3schools.com/jsref/jsref_getmonth.asp>
  getMonth :: JSDate -> JS t JSNumber
  getMonth = invoke "getMonth" ()
  
  -- | Returns the number of milliseconds since midnight Jan 1, 1970.
  --   See: <http://www.w3schools.com/jsref/jsref_gettime.asp>
  getTime :: JSDate -> JS t JSNumber
  getTime = invoke "getTime" ()
  
  -- | Returns the time difference between UTC time and local time, in minutes.
  --   See: <http://www.w3schools.com/jsref/jsref_gettimezoneoffset.asp>
  getTimezoneOffset :: JSDate -> JS t JSNumber
  getTimezoneOffset = invoke "getTimezoneOffset" ()
  
  -- | Returns the day of the month, according to universal time (from 1-31).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcdate.asp>
  getUTCDate :: JSDate -> JS t JSNumber
  getUTCDate = invoke "getUTCDate" ()
  
  -- | Returns the day of the week, according to universal time (from 0-6).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcday.asp>
  getUTCDay :: JSDate -> JS t JSNumber
  getUTCDay = invoke "getUTCDay" ()
  
  -- | Returns the year, according to universal time (four digits).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcfullyear.asp>
  getUTCFullYear :: JSDate -> JS t JSNumber
  getUTCFullYear = invoke "getUTCFullYear" ()
  
  -- | Returns the hour, according to universal time (from 0-23).
  --   See: <http://www.w3schools.com/jsref/jsref_getutchours.asp>
  getUTCHours :: JSDate -> JS t JSNumber
  getUTCHours = invoke "getUTCHours" ()
  
  -- | Returns the milliseconds, according to universal time (from 0-999).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcmilliseconds.asp>
  getUTCMilliseconds :: JSDate -> JS t JSNumber
  getUTCMilliseconds = invoke "getUTCMilliseconds" ()
  
  -- | Returns the minutes, according to universal time (from 0-59).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcminutes.asp>
  getUTCMinutes :: JSDate -> JS t JSNumber
  getUTCMinutes = invoke "getUTCMinutes" ()
  
  -- | Returns the month, according to universal time (from 0-11).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcmonth.asp>
  getUTCMonth :: JSDate -> JS t JSNumber
  getUTCMonth = invoke "getUTCMonth" ()
  
  -- | Returns the seconds, according to universal time (from 0-59).
  --   See: <http://www.w3schools.com/jsref/jsref_getutcseconds.asp>
  getUTCSeconds :: JSDate -> JS t JSNumber
  getUTCSeconds = invoke "getUTCSeconds" ()
  
  -- | Parses a date string and returns the number of milliseconds 
  --   since midnight of January 1, 1970.
  --   See: <http://www.w3schools.com/jsref/jsref_parse.asp>
  parseDate :: JSString -> JSDate -> JS t JSNumber
  parseDate str = invoke "parse" str
  
  -- | Sets the day of the month of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setdate.asp>
  setDate :: JSNumber -> JSDate -> JS t ()
  setDate n = invoke "setDate" n
  
  -- | Sets the year (four digits) of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setfullyear.asp>
  setFullYear :: JSNumber -> JSDate -> JS t ()
  setFullYear n = invoke "setFullYear" n
  
  -- | Sets the hour of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_sethours.asp>
  setHours :: JSNumber -> JSDate -> JS t ()
  setHours n = invoke "setHours" n
  
  -- | Sets the milliseconds of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setmilliseconds.asp>
  setMilliseconds :: JSNumber -> JSDate -> JS t ()
  setMilliseconds n = invoke "setMilliseconds" n
  
  -- | Set the minutes of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setminutes.asp>
  setMinutes :: JSNumber -> JSDate -> JS t ()
  setMinutes n = invoke "setMinutes" n
  
  -- | Sets the month of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setmonth.asp>
  setMonth :: JSNumber -> JSDate -> JS t ()
  setMonth n = invoke "setMonth" n
  
  -- | Sets the seconds of a date object.
  --   See: <http://www.w3schools.com/jsref/jsref_setseconds.asp>
  setSeconds :: JSNumber -> JSDate -> JS t ()
  setSeconds n = invoke "setSeconds" n
  
  -- | Sets a date and time by adding or subtracting a specified number 
  --   of milliseconds to/from midnight January 1, 1970.
  --   See: <http://www.w3schools.com/jsref/jsref_settime.asp>
  setTime :: JSNumber -> JSDate -> JS t ()
  setTime n = invoke "setTime" n
  
  -- | Sets the day of the month of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutcdate.asp>
  setUTCDate :: JSNumber -> JSDate -> JS t ()
  setUTCDate n = invoke "setUTCDate" n
  
  -- | Sets the year of a date object, according to universal time (four digits).
  --   See: <http://www.w3schools.com/jsref/jsref_setutcfullyear.asp>
  setUTCFullYear :: JSNumber -> JSDate -> JS t ()
  setUTCFullYear n = invoke "setUTCFullYear" n
  
  -- | Sets the hour of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutchours.asp>
  setUTCHours :: JSNumber -> JSDate -> JS t ()
  setUTCHours n = invoke "setUTCHours" n
  
  -- | Sets the milliseconds of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutcmilliseconds.asp>
  setUTCMilliseconds :: JSNumber -> JSDate -> JS t ()
  setUTCMilliseconds n = invoke "setUTCMilliseconds" n
  
  -- | Set the minutes of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutcminutes.asp>
  setUTCMinutes :: JSNumber -> JSDate -> JS t ()
  setUTCMinutes n = invoke "setUTCMinutes" n
  
  -- | Sets the month of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutcmonth.asp>
  setUTCMonth :: JSNumber -> JSDate -> JS t ()
  setUTCMonth n = invoke "setUTCMonth" n
  
  -- | Set the seconds of a date object, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_setutcseconds.asp>
  setUTCSeconds :: JSNumber -> JSDate -> JS t ()
  setUTCSeconds n = invoke "setUTCSeconds" n
  
  -- | Converts the date portion of a Date object into a readable string.
  --   See: <http://www.w3schools.com/jsref/jsref_todatestring.asp>
  toDateString :: JSDate -> JS t JSString
  toDateString = invoke "toDateString" ()
  
  -- | Returns the date as a string, using the ISO standard.
  --   See: <http://www.w3schools.com/jsref/jsref_toisostring.asp>
  toISOString :: JSDate -> JS t JSString
  toISOString = invoke "toISOString" ()
  
  -- | Returns the date as a string, formated as a JSON date.
  --   See: <http://www.w3schools.com/jsref/jsref_tojson.asp>
  toJSON :: JSDate -> JS t JSString
  toJSON = invoke "toJSON" ()
  
  -- | Returns the date portion of a Date object as a string, 
  --   using locale conventions.
  --   See: <http://www.w3schools.com/jsref/jsref_tolocaledatestring.asp>
  toLocaleDateString :: JSDate -> JS t JSString
  toLocaleDateString = invoke "toLocaleDateString" ()
  
  -- | Returns the time portion of a Date object as a string, 
  --   using locale conventions.
  --   See: <http://www.w3schools.com/jsref/jsref_tolocaletimestring.asp>
  toLocaleTimeString :: JSDate -> JS t JSString
  toLocaleTimeString = invoke "toLocaleTimeString" ()
  
  -- | Converts a Date object to a string, using locale conventions.
  --   See: <http://www.w3schools.com/jsref/jsref_tolocalestring.asp>
  toLocaleString :: JSDate -> JS t JSString
  toLocaleString = invoke "toLocaleString" ()
  
  -- | Converts a Date object to a string.
  --   See: <http://www.w3schools.com/jsref/jsref_tostring_date.asp>
  toString :: JSDate -> JS t JSString
  toString = invoke "toString" ()
  
  -- | Converts the time portion of a Date object to a string.
  --   See: <http://www.w3schools.com/jsref/jsref_totimestring.asp>
  toTimeString :: JSDate -> JS t JSString
  toTimeString = invoke "toTimeString" ()
  
  -- | Converts a Date object to a string, according to universal time.
  --   See: <http://www.w3schools.com/jsref/jsref_toutcstring.asp>
  toUTCString :: JSDate -> JS t JSString
  toUTCString = invoke "toUTCString" ()
  
  