REM **********************************
REM Title: Text Viewer
REM Author: Phaelax
REM Last Updated: Jan. 19, 2009 9:43am
REM **********************************
 
set display mode 800,600,32
 
set text font "Courier", 1
set text size 10
 
rem array to hold lines of text
restore book
read Window_lineCount
dim viewport$(Window_lineCount)
 
for i = 1 to Window_lineCount
   read z$
   viewport$(i) = z$
   Window_maxTextWidth = getMax(Window_maxTextWidth,text width(z$))
next i
 
 
Theme_borderColor = rgb(66,75,82)            : `color of border around window components
Theme_backgroundColor = rgb(114,122,128)     : `background color of window body (and spacing between components)
Theme_foregroundColor = 0                    : `foreground color for text in viewport
Theme_listBackgroundColor = rgb(195,202,208) : `background color of the viewport component
Theme_titleFontColor = rgb(22,69,110)        : `text color for title bar
Theme_titleGradient1 = rgb(115,132,145)      : `title bar fades from this color
Theme_titleGradient2 = rgb(74,100,120)       : `title bar fades into this color
Theme_scrollBarTrackColor = rgb(93,103,111)  : `scrollbar track color
Theme_scrollBarThumbColor = rgb(66,75,82)    : `color of scrollbar thumb
Theme_menuBackgroundColor = rgb(93,103,111)  : `background color of the menu bar
Theme_menuForegroundColor = rgb(162,177,189) : `text color for menu bar items
Theme_iconColor = rgb(0,0,0)                 : `color used for window icons
Theme_windowBorderSize = 2                   : `size of border around the window
Theme_componentMargins = 2                   : `spacing between window components
Theme_componentBorderSize = 1                : `size of border around each component
 
 
Window_x = 200
Window_y = 100
Window_width = 398
Window_height = 298
Window_vThumb# = 0.0
Window_hThumb# = 0.0
 
 
sync on
 
 
DO
   cls
 
   gosub _drawTextViewer
 
   sync
LOOP
 
 
 
 
_drawTextViewer:
 
   _windowBorderSize    = Theme_windowBorderSize
   _componentMargins    = Theme_componentMargins
   _componentBorderSize = Theme_componentBorderSize
 
   _componentPadding    = 2   : `mainly used to offset displayed text from border edge
   _numberedLineWidth   = text width(str$(Window_lineCount))
   _lineHeight          = 16  : `spacing between lines of text
 
   _contentPaneWidth  = Window_maxTextWidth              : `overall width of content that can be displayed in the viewport
   _contentPaneHeight = Window_lineCount * _lineHeight   : `overall height of content that can be displayed in the viewport
 
   rem toggle maximize window
   if changeWindow = 1
      if isMaximized = 1
         delta = (Window_width - _viewportWidth) + _numberedLineWidth + _componentPadding*3
         Window_oldX = Window_x
         Window_oldY = window_y
         Window_oldWidth = Window_width
         Window_oldHeight = Window_height
         Window_x = 0
         Window_y = 0
         Window_width = getMin(_contentPaneWidth+delta, screen width()-2)
         Window_height = getMin(_contentPaneHeight, screen height()-2)
      else
         Window_x = Window_oldX
         Window_y = Window_oldY
         Window_width = Window_oldWidth
         Window_height = Window_oldHeight
      endif
      changeWindow = 0
   endif
 
 
   _titleX        = Window_x + _windowBorderSize       : `x-position of title bar
   _titleY        = Window_y + _windowBorderSize       : `y-position of title bar
   _titleTextX    = _titleX + _componentMargins        : `x-position of title text
   _titleTextY    = _titleY + _componentMargins        : `y-position of title text
   _titleWidth    = Window_width - _windowBorderSize*2 : `width of title bar
   _titleHeight   = 16                                 : `height of title bar
 
   _menuX         = Window_x + _windowBorderSize + _componentMargins + _componentBorderSize     : `x-position of menu bar
   _menuY         = _titleY + _titleHeight + _componentMargins + _componentBorderSize           : `y-position of menu bar
   _menuWidth     = Window_width - (_windowBorderSize+_componentBorderSize+_componentMargins)*2 : `width of menu bar (excludes the component's border size)
   _menuHeight    = text height("A")                                                            : `height of menu bar (excludes the component's border size)
 
   _charWidth     = text width("A")
 
   _vTrackWidth   = 12                                                                                                  : `width of vertical scrollbar track
   _hTrackHeight  = 12                                                                                                  : `height of horizontal scrollbar track
   _hTrackX       = Window_x + _windowBorderSize + _componentMargins + _componentBorderSize                             : `x-position of horizontal scrollbar
   _hTrackWidth   = Window_width - _windowBorderSize*2 - _componentBorderSize*2 - _componentMargins*4 - _vTrackWidth    : `width of horizontal scrollbar
   _hTrackY       = Window_y + Window_height - (_hTrackHeight+_windowBorderSize+_componentMargins+_componentBorderSize) : `y-position horizontal scrollbar
   _vTrackX       = (Window_x + Window_width) - (_windowBorderSize+_componentMargins+_vTrackWidth)                      : `x-position of scroll bar track
   _vTrackY       = _menuY + _menuHeight + _componentBorderSize*2 + _componentMargins                                   : `y-position of scroll bar track
   _vTrackHeight  = (_hTrackY - _vTrackY) - _componentMargins - _componentBorderSize*2                                  : `height of scroll bar track
 
   _viewportX      = Window_x + _windowBorderSize + _componentMargins + _componentBorderSize                            : `x-position of file view list
   _viewportY      = _menuY + _menuHeight + _componentBorderSize*2 + _componentMargins                                  : `y-position of file view list
   _viewportWidth  = Window_width - (_windowBorderSize*2 + _componentBorderSize*4+_componentMargins*3) - _vTrackWidth   : `width of the viewport (visible width)
   _viewportHeight = _hTrackY - _viewportY - _componentMargins - _componentBorderSize*2                                 : `height of viewport (visible height)
 
   f# = (_viewportHeight+0.0)/_contentPaneHeight
   _vThumbWidth     = _vTrackWidth                                                : `width of scrollbar thumb (should be no larger than track width)
   _vThumbHeight    = getMin(getMax(12, int(_vTrackHeight*f#)),_vTrackHeight)     : `height of scrollbar thumb
   _vThumbX         = _vTrackX                                                    : `x-position of scrollbar thumb
   _vThumbY         = _vTrackY + (_viewportHeight-_vThumbHeight)*Window_vThumb#   : `y-position of scrollbar thumb
 
   f# = (_viewportWidth+0.0)/_contentPaneWidth
   _hThumbWidth     = getMin(getMax(12, int(_hTrackWidth*f#)),_hTrackWidth)       : `width of scrollbar thumb
   _hThumbHeight    = _hTrackHeight                                               : `height of scrollbar thumb (should be no larger than track height)
   _hThumbY         = _hTrackY                                                    : `x-position of scrollbar thumb
   _hThumbX         = _hTrackX + (_viewportWidth-_hThumbWidth)*Window_hThumb#     : `y-position of scrollbar thumb
 
   _resizeX         = _hTrackX+_hTrackWidth+_componentBorderSize
   _resizeY         = _vTrackY+_vTrackHeight+_componentBorderSize
   _resizeX2        = Window_x+Window_width-_windowBorderSize
   _resizeY2        = Window_y+Window_height-_windowBorderSize
 
   _maximizeSize    = 14
   _maximizeX       = _titleX+_titleWidth-(_maximizeSize+_componentMargins)
   _maximizeY       = _titleY + (_titleHeight-_maximizeSize)/2
 
 
   _wheelDelay = 35  : `mouse wheel scroll speed (lower is faster)
   _wheelStep  = 12  : `how much to scroll with mouse wheel
 
   _scrollSensitivity = 10 : `1 or higher; lower number means faster scrolling
 
   _showCount                    = getMin(ceil((_viewportHeight+0.0) / _lineHeight), Window_lineCount)   : `number of visible text lines shown within the viewport
   _offscreenContentHeight       = getMax(_contentPaneHeight-_viewportHeight, 0)                         : `how much viewable content is off-screen
   _viewportPixelOffsetY         = _offscreenContentHeight*Window_vThumb#                                : `Y-offset of viewable content pane (in pixels)
 
   _startingIndex                = _viewportPixelOffsetY / _lineHeight + 1                               : `line index to show first in the viewable text
   _endingIndex                  = getMin(_startingIndex + _showCount, Window_lineCount)                 : `last text index to be displayed in the viewable text
 
   _offscreenContentWidth        = getMax(_contentPaneWidth-(_viewportWidth-_numberedLineWidth-_componentPadding*3),0)  : `how much viewable content is offsecreen
   _viewportPixelOffsetX         = _offscreenContentWidth * Window_hThumb#                                              : `X-offset of viewable content pane (in pixels)
 
 
 
   rem draw background of entire window
   ink Theme_backgroundColor,0
   box Window_x,Window_y,Window_x+Window_width,Window_y+Window_height
 
   rem draw border around window
   drawOutline(Window_x,Window_y,Window_x+Window_width,Window_y+Window_height,_windowBorderSize,Theme_borderColor)
 
   rem draw viewport background
   ink Theme_listBackgroundColor,0
   box _viewportX, _viewportY, _viewportX+_viewportWidth, _viewportY+_viewportHeight
 
 
   rem display lines of text
   ink Theme_foregroundColor, 0
   for lineNumber = _startingIndex to _endingIndex
      hidden = _viewportPixelOffsetX / _charWidth
      extra = _viewportPixelOffsetX - hidden*_charWidth
      x = (_viewportX+_componentPadding)-extra
      y = _viewportY+_lineHeight*(lineNumber-1) - _viewportPixelOffsetY
      t$ = right$(viewport$(lineNumber),len(viewport$(lineNumber))-hidden)
      if y < _viewportY+_viewportHeight then text x+_numberedLineWidth+_componentPadding*2, y, capLength$(t$, _viewportWidth-_componentPadding*2)
   next lineNumber
 
   rem display line number border
   ink Theme_backgroundColor,0
   box _viewportX, _viewportY, _viewportX+_numberedLineWidth+_componentPadding*2, _viewportY+_viewportHeight
   ink Theme_titleFontColor,0
   for lineNumber = _startingIndex to _endingIndex
      x = _viewportX + _componentPadding
      y = _viewportY+_lineHeight*(lineNumber-1) - _viewportPixelOffsetY
      if y < _viewportY+_viewportHeight then text x, y, str$(lineNumber)
   next lineNumber
   ink Theme_borderColor, 0
   line _viewportX+_numberedLineWidth+_componentPadding*2, _viewportY, _viewportX+_numberedLineWidth+_componentPadding*2, _viewportY+_viewportHeight
 
 
 
   rem redraw background between components above and below the viewport
   rem this is to give the appearance that the text stays within the list view
   rem (which is also why the title and scrollbars are drawn after the viewport)
   ink Theme_backgroundColor,0
   fillY = _menuY+_menuHeight+_componentBorderSize
   box Window_x+_windowBorderSize, fillY, Window_x+Window_width-_windowBorderSize*2, fillY+_componentMargins
   fillY = _viewportY+_viewportHeight+_componentBorderSize
   box _viewportX, fillY, _viewportX+_viewportWidth, fillY+_componentMargins
   fillX = _vTrackX - _componentBorderSize - _componentMargins
   box fillX, _vTrackY-_componentBorderSize, fillX+_componentMargins-1, _vTrackY+_vTrackHeight+_componentBorderSize
   fillY = _viewportY+_viewportHeight+_componentBorderSize + 1
   box _viewportX-_componentBorderSize, fillY, _viewportX+_viewportWidth+_componentMargins+_componentBorderSize, fillY + _componentMargins - 2
   box _resizeX, _resizeY, _resizeX2, _resizeY2
 
   rem draw border around viewport
   drawOutline(_viewportX-_componentBorderSize, _viewportY-_componentBorderSize, _viewportX+_viewportWidth+_componentBorderSize, _viewportY+_viewportHeight+_componentBorderSize,_componentBorderSize,Theme_borderColor)
 
   rem draw title bar
   ink Theme_titleGradient2,0
   drawVerticalGradient(_titleX, _titleY, _titleX+_titleWidth, _titleY+_titleHeight, Theme_titleGradient1,Theme_titleGradient2)
   ink Theme_titleFontColor,0
   text _titleTextX, _titleTextY, capLength$("To Infinity and Beyond! ~Buzz Lightyear", _maximizeX-Window_x)
 
   rem draw maximize icon
   ink Theme_iconColor,0
   drawMaximize(_maximizeX, _maximizeY, _maximizeSize)
 
   rem draw menu bar
   ink Theme_menuBackgroundColor,0
   box _menuX, _menuY, _menuX+_menuWidth, _menuY+_menuHeight
   rem draw border around menu bar
   drawOutline(_menuX-_componentBorderSize, _menuY-_componentBorderSize, _menuX+_menuWidth+_componentBorderSize, _menuY+_menuHeight+_componentBorderSize,_componentBorderSize,Theme_borderColor)
   ink Theme_menuForegroundColor,0
   text _menuX+6,_menuY, "File   Edit   View   Tools   Help"
 
   rem handle non-functional drop-down menus with mouse hover (just a little eye-candy)
   if showScrollMouse = 0
      textWidth = text width("File")
      if mouseWithin(_menuX+6,_menuY,_menuX+6+textWidth,_menuY+_menuHeight)
         drawFileMenu(_menuX+6,_menuY,_menuX+6+textWidth,_menuY+_menuHeight,Theme_menuBackgroundColor,Theme_menuForegroundColor)
      endif
      textWidth = text width("Edit")
      offset = text width("File   ")+6
      if mouseWithin(_menuX+offset,_menuY,_menuX+offset+textWidth,_menuY+_menuHeight)
         drawEditMenu(_menuX+offset,_menuY,_menuX+offset+textWidth,_menuY+_menuHeight,Theme_menuBackgroundColor,Theme_menuForegroundColor)
      endif
   endif
 
   rem draw vertical scrollbar track
   ink Theme_scrollBarTrackColor,0
   box _vTrackX, _vTrackY, _vTrackX+_vTrackWidth, _vTrackY+_vTrackHeight
   rem draw vertical scrollbar thumb
   ink Theme_scrollBarThumbColor,0
   box _vThumbX, _vThumbY, _vThumbX+_vThumbWidth, _vThumbY+_vThumbHeight
   rem draw border around scrollbar track
   drawOutline(_vTrackX-_componentBorderSize, _vTrackY-_componentBorderSize, _vTrackX+_vTrackWidth, _vTrackY+_vTrackHeight+_componentBorderSize,_componentBorderSize,Theme_borderColor)
 
   rem draw horizontal scrollbar track
   ink Theme_scrollBarTrackColor,0
   box _hTrackX, _hTrackY, _hTrackX+_hTrackWidth, _hTrackY+_hTrackHeight
   rem draw horizontal scrollbar thumb
   ink Theme_scrollBarThumbColor,0
   box _hThumbX, _hThumbY, _hThumbX+_hThumbWidth, _hThumbY+_hThumbHeight
   rem draw border around scrollbar track
   drawOutline(_hTrackX-_componentBorderSize, _hTrackY-_componentBorderSize, _hTrackX+_hTrackWidth+_componentBorderSize, _hTrackY+_hTrackHeight+_componentBorderSize,_componentBorderSize,Theme_borderColor)
 
 
   _M_C = mouseclick()
   rem mouse events
   if _M_C = 1
 
      rem turn off mouse scrolling if mouse button was clicked
      if Window_mFlag = 0 then showScrollMouse = 0
 
      rem if clicked on title bar
      if mouseWithin(_titleX, _titleY, _titleX+_titleWidth, _titleY+_titleHeight)=1  and mouseWithin(_maximizeX,_maximizeY,_maximizeX+_maximizeSize,_maximizeY+_maximizeSize)=0 and Window_mFlag = 0 and isMaximized = 0
         Window_mFlag = 1
         Window_titleIsDragging = 1
         Window_tx = Window_x - mousex()
         Window_ty = Window_y - mousey()
      endif
 
      rem if clicked on vertical scrollbar thumb
      if mouseWithin(_vThumbX, _vThumbY, _vThumbX+_vThumbWidth, _vThumbY+_vThumbHeight) and Window_mFlag = 0
         Window_mFlag = 1
         Window_ty = _vThumbY - mousey()
         Window_verticalScrollIsDragging = 1
      endif
 
      rem if clicked on horizontal scrollbar thumb
      if mouseWithin(_hThumbX, _hThumbY, _hThumbX+_hThumbWidth, _hThumbY+_hThumbHeight) and Window_mFlag = 0
         Window_mFlag = 1
         Window_tx = _hThumbX - mousex()
         Window_horizontalScrollIsDragging = 1
      endif
 
      rem if clicked on corner to resize window
      if mouseWithin(_resizeX, _resizeY, _resizeX2, _resizeY2) and Window_mFlag = 0 and isMaximized = 0
         Window_mFlag = 1
         Window_tx = (Window_x + Window_width) - mousex()
         Window_ty = (Window_y + Window_height) - mousey()
         Window_isResizing = 1
      endif
 
      rem if mouse clicked on maximize icon
      if mouseWithin(_maximizeX,_maximizeY,_maximizeX+_maximizeSize,_maximizeY+_maximizeSize) and Window_mFlag = 0
         Window_mFlag = 1
         Window_maxClick = 1
      endif
 
      rem if dragging vertical scrollbar thumb
      if Window_verticalScrollIsDragging = 1
         _vThumbY = (mousey() + Window_ty) - _viewportY
         Window_vThumb# = ((mousey() + Window_ty) - _viewportY) / (_viewportHeight-_vThumbHeight+0.0)
         if Window_vThumb# < 0.0 then Window_vThumb# = 0.0
         if Window_vThumb# > 1.0 then Window_vThumb# = 1.0
      endif
 
      rem if dragging vertical scrollbar thumb
      if Window_horizontalScrollIsDragging = 1
         _hThumbX = (mousex() + Window_tx) - _viewportX
         Window_hThumb# = ((mousex() + Window_tx) - _viewportX) / (_viewportWidth-_hThumbWidth+0.0)
         if Window_hThumb# < 0.0 then Window_hThumb# = 0.0
         if Window_hThumb# > 1.0 then Window_hThumb# = 1.0
      endif
 
      rem if resizing the window
      if Window_isResizing = 1
         Window_width = (mousex() - Window_X) + Window_tx
         Window_height = (mousey() - Window_Y) + Window_ty
         if Window_width < 284 then Window_width = 284
         if Window_height < 100 then Window_height = 100
      endif
 
      rem if dragging title bar
      if Window_titleIsDragging = 1
         Window_x = mousex() + Window_tx
         Window_y = mousey() + Window_ty
      endif
 
   endif
 
   if _M_C = 0
      rem reset flag states
      Window_mFlag = 0
      Window_isResizing = 0
      Window_titleIsDragging = 0
      Window_verticalScrollIsDragging = 0
      Window_horizontalScrollIsDragging = 0
      if Window_maxClick = 1
         Window_maxClick = 0
         rem if mouseclick was pressed AND released over maximize icon
         if mouseWithin(_maximizeX,_maximizeY,_maximizeX+_maximizeSize,_maximizeY+_maximizeSize)
            isMaximized = abs(isMaximized-1)
            changeWindow = 1
         endif
      endif
   endif
 
 
   rem only allow wheel scrolling if mouse scrolling is not currently in progress
   if showScrollMouse = 0
      rem detect if mouse wheel was used and determine which direction it was scrolled
      scrollWheel = mousemovez()
      if scrollWheel <> thingy
         direction = scrollWheel - thingy
         thingy = scrollWheel
         if direction > 0
            if Window_vThumb# = 0.0 : Window_wheelFlag = 0 : else : Window_wheelFlag = -1 : endif
         else
            if Window_vThumb# = 1.0 : Window_wheelFlag = 0 : else : Window_wheelFlag = 1 : endif
         endif
         Window_wheelStep = _wheelStep
      endif
 
      rem if mouse wheel was triggered, adjust smooth scroll
      if Window_wheelFlag <> 0
         if Window_wheelTimer + _wheelDelay <= timer()
            Window_wheelTimer = timer()
            _viewportPixelOffsetY = _viewportPixelOffsetY + Window_wheelStep*Window_wheelFlag
            Window_vThumb# = _viewportPixelOffsetY / (_offscreenContentHeight+0.0)
            if Window_vThumb# < 0.0 then Window_vThumb# = 0.0 : Window_wheelFlag = 0
            if Window_vThumb# > 1.0 then Window_vThumb# = 1.0 : Window_wheelFlag = 0
            Window_wheelStep = Window_wheelStep - 1
            if Window_wheelStep = 0 then Window_wheelFlag = 0
         endif
      endif
   endif
 
   rem if middle mouse button (scroll button) is clicked
   if _M_C = 4 and Window_mFlag = 0
      Window_mFlag = 1
      showScrollMouse = abs(showScrollMouse-1)
      _mScrollX = mousex()
      _mScrollY = mousey()
   endif
 
   if showScrollMouse = 1
      drawScrollIcon(_mScrollX,_mScrollY)
      _viewportPixelOffsetX = _viewportPixelOffsetX + (mousex()-_mScrollX)/_scrollSensitivity
      if _offscreenContentWidth = 0
         Window_hThumb# = 0
      else
         Window_hThumb# = _viewportPixelOffsetX / (_offscreenContentWidth+0.0)
      endif
      if Window_hThumb# < 0.0 then Window_hThumb# = 0.0
      if Window_hThumb# > 1.0 then Window_hThumb# = 1.0
      _viewportPixelOffsetY = _viewportPixelOffsetY + (mousey()-_mScrollY)/_scrollSensitivity
      if _offscreenContentHeight = 0
         Window_vThumb# = 0
      else
         Window_vThumb# = _viewportPixelOffsetY / (_offscreenContentHeight+0.0)
      endif
      if Window_vThumb# < 0.0 then Window_vThumb# = 0.0
      if Window_vThumb# > 1.0 then Window_vThumb# = 1.0
   endif
 
   rem if nothing triggered mouse flag, throw it anyway to avoid "click wander"
   if _M_C > 0 : Window_mFlag = 1 : else : Window_mFlag = 0 : endif
 
 
RETURN
 
 
 
 
REM **************************************************
REM Draws the 'File' dropdown menu
REM **************************************************
function drawFileMenu(x1,y1,x2,y2,foreground,background)
   thickness = 1
   expand = 3
   height = 100
   width = 64
   ext = width - ((x2+expand) - (x1-expand))
   rem shadow
   ink rgb(48,48,48), 0
   box (x1-expand)+2,(y1-expand)+2,(x2+expand)+2,(y2+expand)+2
   box (x1-expand)+2,(y2+expand)+2,(x2+expand+ext)+2,(y2+expand+height)+2
   rem background
   ink background, 0
   box x1-expand,y1-expand,x2+expand,y2+expand
   box x1-expand,y2+expand,x2+expand+ext,y2+expand+height
   rem menu items
   y3 = y2+expand+4
   ink foreground, 0
   text x1,y1,"File"
   text x1,y3,"New"
   text x1,y3+16,"Open"
   text x1,y3+32,"Save"
   text x1,y3+48,"Save As"
   text x1,y3+64,"Print"
   text x1,y3+80,"Exit"
   rem outline
   box x1-expand,y1-expand,x2+expand,y1-expand
   box x1-expand,y1-expand,x1-expand,y2+expand+height
   box x2+expand,y1-expand,x2+expand,y2+expand
   box x2+expand,y2+expand,x2+expand+ext,y2+expand
   box x2+expand+ext,y2+expand,x2+expand+ext,y2+expand+height
   box x1-expand,y2+expand+height,x2+expand+ext,y2+expand+height
endfunction
 
 
REM **************************************************
REM Draws the 'Edit' dropdown menu
REM **************************************************
function drawEditMenu(x1,y1,x2,y2,foreground,background)
   thickness = 1
   expand = 3
   height = 132
   width = 112
   ext = width - ((x2+expand) - (x1-expand))
   rem shadow
   ink rgb(48,48,48), 0
   box (x1-expand)+2,(y1-expand)+2,(x2+expand)+2,(y2+expand)+2
   box (x1-expand)+2,(y2+expand)+2,(x2+expand+ext)+2,(y2+expand+height)+2
   rem background
   ink background, 0
   box x1-expand,y1-expand,x2+expand,y2+expand
   box x1-expand,y2+expand,x2+expand+ext,y2+expand+height
   rem menu items
   y3 = y2+expand+4
   ink foreground, 0
   text x1,y1,"Edit"
   text x1,y3,"Undo"
   text x1,y3+16,"Redo"
   text x1,y3+32,"Cut"
   text x1,y3+48,"Copy"
   text x1,y3+64,"Paste"
   text x1,y3+80,"Delete"
   text x1,y3+96,"Select All"
   text x1,y3+112,"Edit Options"
   rem outline
   box x1-expand,y1-expand,x2+expand,y1-expand
   box x1-expand,y1-expand,x1-expand,y2+expand+height
   box x2+expand,y1-expand,x2+expand,y2+expand
   box x2+expand,y2+expand,x2+expand+ext,y2+expand
   box x2+expand+ext,y2+expand,x2+expand+ext,y2+expand+height
   box x1-expand,y2+expand+height,x2+expand+ext,y2+expand+height
endfunction
 
 
REM **************************************************
REM Draws the mouse scroll icon
REM **************************************************
function drawScrollIcon(x,y)
   rem shadow
   ink rgb(48,48,48),0
   fillCircle(x+2,y+2,10)
   rem center
   ink rgb(114,122,128),0
   fillCircle(x,y,10)
   ink 0,0
   rem arrows
   line x,y-8,x,y+8
   line x-8,y,x+8,y
   line x,y-8,x-3,y-5
   line x,y-8,x+3,y-5
   line x,y+8,x-3,y+5
   line x,y+8,x+3,y+5
   line x-8,y,x-5,y-3
   line x-8,y,x-5,y+3
   line x+8,y,x+5,y-3
   line x+8,y,x+5,y+3
   rem outline
   ink rgb(66,75,82), 0
   circle x,y,10
endfunction
 
 
REM **************************************************
REM Draws a filled in circle
REM **************************************************
function fillCircle(x,y,r)
   for yy = y-r to y
      for xx = x-r to x
         d# = sqrt((xx-x)^2 + (yy-y)^2)
         if d# <= r
            box xx,yy,x+(x-xx),yy+1
            if yy <> y then box xx,y+(y-yy),x+(x-xx),y+(y-yy)+1
            exit
         endif
      next xx
   next yy
endfunction
 
 
REM **************************************************
REM Draws the window maximize icon at [X,Y] with the
REM given 'size'.
REM **************************************************
function drawMaximize(x, y, size)
   box x, y, x+size, y+3
   box x,y,x+1,y+size
   box x+size-1,y,x+size,y+size
   box x, y+size-1, x+size, y+size
endfunction
 
 
REM **************************************************
REM Returns the string truncated to a specified width
REM in pixels.
REM **************************************************
function capLength$(string$, width)
   if text width(string$) < width then exitfunction string$
   L = len(string$)
   min = width / text width("A")
   for j = min to L
      if text width(left$(string$,j)) > width then exitfunction left$(string$,j-1)
   next j
endfunction string$
 
 
REM **************************************************
REM Checks to see if mouse is within the specified
REM coordinates
REM **************************************************
function mouseWithin(x1,y1,x2,y2)
   if mousex() > x1 and mousex() < x2 and mousey() > y1 and mousey() < y2 then exitfunction 1
endfunction 0
 
 
REM **************************************************
REM Returns a linear interpolated color between base
REM color and target color. Percent ranges from 0 to 1
REM **************************************************
function getTransitionalColor(base, target, percent#)
   br = rgbr(base)
   bg = rgbg(base)
   bb = rgbb(base)
   tr = rgbr(target)
   tg = rgbg(target)
   tb = rgbb(target)
   tr = br + (tr-br)*percent#
   tg = bg + (tg-bg)*percent#
   tb = bb + (tb-bb)*percent#
   color = rgb(tr,tg,tb)
endfunction color
 
 
REM **************************************************
REM Get smallest of two values
REM **************************************************
function getMin(x,y)
   if x > y then exitfunction y
endfunction x
 
 
REM **************************************************
REM Get smallest of two values
REM **************************************************
function getMax(x,y)
   if x < y then exitfunction y
endfunction x
 
 
REM **************************************************
REM Returns a color with an alpha value
REM **************************************************
function argb(a,r,g,b)
   c = (a*16777216)+(r*65536)+(g*256)+b
endfunction c
 
REM **************************************************
REM Draws a filled box with a color fading from color1
REM to color2 going from top to bottom
REM **************************************************
function drawVerticalGradient(x1,y1,x2,y2, color1, color2)
   height# = y2-y1
   for y = 1 to height#
      p# = y / height#
      ink getTransitionalColor(color1, color2, p#), 0
      box x1, y1+y-1, x2, y1+y
   next y
endfunction
 
REM **************************************************
REM Draws an outline inside the given box dimensions
REM **************************************************
function drawOutline(x1,y1,x2,y2,thickness,color)
   ink color,0
   box x1,y1,x2-1,y1+thickness-1
   box x1,y1,x1+thickness-1,y2-1
   box x2-(thickness-1),y1,x2,y2
   box x1,y2-(thickness-1),x2,y2
endfunction
 
 
REM **************************************************
REM Rounds a decimal up to the nearest whole number
REM **************************************************
function ceil(x#)
   a = int(x#)
   if (x# - a) > 0 then a = a+1
endfunction a
 
rem 40-book, 62-tab
 
book:
DATA 40
DATA "Welcome to the world of IDG Books Worldwide."
DATA ""
DATA "IDG Books Worldwide, Inc., is a subsidiary of International Data Group,"
DATA "the worlds largest publisher of business and computer-related information"
DATA "and the leading global provider of information services on information"
DATA "technology. IDG was founded over 25 years ago and now employs more"
DATA "than 5,700 people worldwide. IDG publishes over 195 publications in 62"
DATA "countries. Forty million people read one or more IDG publications each"
DATA "month."
DATA ""
DATA "Launched in 1990, IDG Books is today the fastest growing publisher of"
DATA "computer and business books in the United States. We are proud to have"
DATA "received 3 awards from the Computer Press Association in recognition of"
DATA "editorial excellence, and our best-selling 'For Dummies' series has over"
DATA "7 million copies in print with translations in more than 20 languages. IDG"
DATA "Books, through a recent joint venture with IDGís Hi-Tech Beijing, became"
DATA "the first U.S. publisher to publish a computer book in The Peopleís Repub-"
DATA "lic of China. In record time, IDG Books has become the first choice for"
DATA "millions of readers around the world who want to learn how to better man-"
DATA "age their businesses."
DATA ""
DATA "Our mission is simple: Every IDG book is designed to bring extra value"
DATA "and skill-building instruction to the reader. Our books are written by"
DATA "experts who understand and care about our readers. The knowledge base of"
DATA "our editorial staff comes from years of experience in publishing, education,"
DATA "and journalismóexperience which we use to produce books for the 90s. In"
DATA "short, we care about books, so we attract the best people. We devote special"
DATA "attention to details such as audience, interior design, use of icons, and illus-"
DATA "trations. And because we write, edit, and produce our books electronically,"
DATA "we can spend more time ensuring superior content and spend less time on"
DATA "the technicalities of making books."
DATA ""
DATA "You can count on our commitment to deliver high quality books at compet-"
DATA "itive prices on topics you want to read about. At IDG, we value quality, and"
DATA "we have been delivering quality for over 25 years. Youíll find no better"
DATA "book on a subject than an IDG book."
DATA ""
DATA "John Kilcullen"
DATA "President and CEO"
DATA "IDG Books Worldwide, Inc."