PRO MVIPLAY3, win_index, NAMES=names, HDRS=hdrs, FITSCREEN=fitscreen, SKIP=skip, $
   TIMES=times, START=start, LENGTH=length, DISK=disk, SPEED=speed

COMMON MVI_COMMON, base, imgs

   IF keyword_set(SPEED) THEN stall0 = speed ELSE stall0=90
   IF stall0 LE 0 THEN stall0=1
   IF stall0 GT 100 THEN stall0=100
   stall = (100 - stall0)/50.
   stallsave = stall
   filename = 'default.mvi'
   filepath = './'
   ftitle=''

   IF KEYWORD_SET(DISK) THEN disk=1 ELSE disk=0

   ;** have user select movie file (.mvi)
   sz = SIZE(win_index)
   IF (sz(1) EQ 0) THEN BEGIN
      file = DIALOG_PICKFILE(filter='*.mvi', /MUST_EXIST, TITLE='Select movie file to load',GET_PATH=path)
      IF (file EQ '') THEN RETURN
      BREAK_FILE, file, a, dir, name, ext
      IF (dir EQ '') THEN win_index = path+file ELSE win_index = file
   ENDIF

   ;** read movie in from movie file (.mvi)
   sz = SIZE(win_index)
   IF (sz(N_ELEMENTS(sz)-2) EQ 7) THEN BEGIN

      BREAK_FILE, win_index, a, dir, name, ext
      ftitle = name+ext
      filename = win_index
      filepath = a+dir
      OPENR,lu,filename,/GET_LUN
      READ_MVI3, lu, file_hdr, ihdrs, imgs, swapflag
      win_index = INTARR(file_hdr.nf)
      names = STRARR(file_hdr.nf)
      ahdr = {filename:'',detector:'',time_obs:'',date_obs:'',filter:'',polar:'',sector:''}
      hdrs = REPLICATE(ahdr,file_hdr.nf)
      nx = file_hdr.nx
      ny = file_hdr.ny
      IF (KEYWORD_SET(FITSCREEN)) THEN BEGIN
         orig_nx = nx
         orig_ny = ny
         max_nx = 640
         max_ny = 480
         IF (orig_nx GT orig_ny) THEN BEGIN ;** bigger in x dimension
            nx = max_nx
            ny = FLOAT(nx)/orig_nx*orig_ny
         ENDIF ELSE BEGIN           ;** bigger in y dimension
            ny = max_ny
            nx = FLOAT(ny)/orig_ny*orig_nx
         ENDELSE
      ENDIF
      IF KEYWORD_SET(SKIP) THEN BEGIN
         skip = skip
      ENDIF ELSE skip=0
      IF KEYWORD_SET(START) THEN start=start-1 ELSE start=0
      IF KEYWORD_SET(LENGTH) THEN length=start+length ELSE length=file_hdr.nf
      FOR i=start,length-1,skip+1 DO BEGIN
       IF NOT(KEYWORD_SET(DISK)) THEN BEGIN
         PRINT, '%%MVIPLAY3 reading frame ', STRING(i+1,FORMAT='(I4)'), ' of ',STRING(file_hdr.nf,FORMAT='(I4)'), $
                ' from movie file ', filename
         WINDOW, XSIZE = nx, YSIZE = ny, /PIXMAP, /FREE
         image = imgs(i)
         IF (KEYWORD_SET(FITSCREEN)) THEN image = CONGRID(image, nx, ny)
         TV, image
       ENDIF
         IF ((SIZE(win_ind))(1) eq 0) THEN win_ind = !D.WINDOW ELSE win_ind = [win_ind, !D.WINDOW]
         hdr = ihdrs(i)
         hdrs(i).date_obs = STRTRIM(hdr(0:14),2)
         hdrs(i).time_obs = STRTRIM(hdr(15:29),2)
         hdrs(i).filename = STRTRIM(hdr(30:44),2)
         hdrs(i).filter = STRTRIM(hdr(45:54),2)
         hdrs(i).detector = STRTRIM(hdr(65:74),2)
         IF (hdrs(i).detector EQ 'EIT') THEN $
            hdrs(i).sector = STRTRIM(hdr(55:64),2) $
         ELSE $
            hdrs(i).polar = STRTRIM(hdr(55:64),2)
       IF NOT(KEYWORD_SET(DISK)) THEN BEGIN
         IF KEYWORD_SET(TIMES) THEN $
            XYOUTS, 10, 10, hdrs(i).date_obs + ' ' + STRMID(hdrs(i).time_obs,0,5), CHARSIZE=1.5,/DEVICE
       ENDIF 
      ENDFOR
      win_index = win_ind
      names = hdrs.filename
     IF NOT(KEYWORD_SET(DISK)) THEN BEGIN
      CLOSE,lu
      FREE_LUN,lu
     ENDIF 
   ENDIF


   IF NOT(KEYWORD_SET(DISK)) THEN BEGIN
     ;** load movies from existing pixmaps
     WSET, win_index(0)
     hsize = !D.X_SIZE
     vsize = !D.Y_SIZE
   ENDIF ELSE BEGIN
     hsize = nx
     vsize = ny
   ENDELSE
   ;** get length of movie
   len = N_ELEMENTS(win_index)
   frames = STRARR(len) ;** array of movie frame names (empty)
   IF (KEYWORD_SET(names) NE 0) THEN frames = names

   first = 0
   last = len-1
   current = 0
   forward = 1
   dirsave = 1
   bounce = 0
   pause = 0
   dopause = 1
   deleted = BYTARR(len)
   showmenu = 0


;**--------------------Create Widgets-------------------------------**
hhsize = (hsize+20) > (512+20)
title = 'MVIPLAY3: '+ftitle
winbase = WIDGET_BASE(TITLE=title)
base = WIDGET_BASE(/COLUMN, XOFFSET=275, YOFFSET=275, TITLE='MVIPLAY3 Control')

    ;** create window widget to display images in
    draw_w = WIDGET_DRAW(winbase, XSIZE=hsize, YSIZE=vsize, EVENT_PRO='WRUNMOVIE_DRAW0', $
                /FRAME, /BUTTON_EVENTS, RETAIN=2)

    base1 = WIDGET_BASE(base, /ROW)
    base2 = WIDGET_BASE(base1, /COLUMN, /FRAME)
        flabel = WIDGET_LABEL(base2, VALUE=' #   Frame')
        base25 = WIDGET_BASE(base2, /ROW)
            cframe = WIDGET_TEXT(base25, VALUE='0', XSIZE=3, YSIZE=1, /EDITABLE, UVALUE='FRAME_NUM')
            cname = WIDGET_TEXT(base25, VALUE=' ', XSIZE=12, YSIZE=1)
      slide2 = WIDGET_SLIDER(base1, TITLE='First Frame', $
           VALUE=0, UVALUE='SLIDE_FIRST', MIN=0, MAX=len)
      slide3 = WIDGET_SLIDER(base1, TITLE='Last Frame', $
           VALUE=len-1, UVALUE='SLIDE_LAST', MIN=0, MAX=len-1)
      slide1 = WIDGET_SLIDER(base1, TITLE='Playback Speed', SCROLL=1, $
           VALUE=stall0, UVALUE='SPEED', MIN=0, MAX=100, /DRAG)

    base3 = WIDGET_BASE(base, /ROW)

    tmp = CW_BGROUP(base3,  ['Forward', 'Reverse', 'Bounce'], /EXCLUSIVE, /COLUMN, IDS=dirb, $
          BUTTON_UVALUE = ['FORWARD', 'REVERSE','BOUNCE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0')

    tmp = CW_BGROUP(base3,  ['Pause At End', 'No Pause'], /EXCLUSIVE, /COLUMN, IDS=pauseb, $
          BUTTON_UVALUE = ['PAUSE','NO_PAUSE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0')

    tmp = CW_BGROUP(base3,  ['Continuous', 'Next Frame', 'Prev. Frame'], /COLUMN, $
          BUTTON_UVALUE = ['CONTINUOUS', 'NEXT','PREV'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0')

    tmp = CW_BGROUP(base3,  ['Adjust Color', 'Delete Frame'], /COLUMN, IDS=otherb, $
          BUTTON_UVALUE = ['ADJCT', 'DELETE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0')

    tmp = CW_BGROUP(base3,  [' Load Movie ', '    Quit    '], /COLUMN, $
          BUTTON_UVALUE = ['LOAD','DONE'], /FRAME, EVENT_FUNCT='WRUNMOVIE_BGROUP0')

    sliden = WIDGET_SLIDER(base, TITLE='Current Frame', VALUE=0, UVALUE='SLIDE_NUM', $
             /DRAG, /SCROLL, MIN=0, MAX=len-1)

;**--------------------Done Creating Widgets-----------------------------**

   WIDGET_CONTROL, /REAL, winbase
   WIDGET_CONTROL, draw_w, GET_VALUE=draw_win
   WIDGET_CONTROL, base, MAP=0
   WIDGET_CONTROL, /REAL, base
   WIDGET_CONTROL, dirb(0), SET_BUTTON=1
   WIDGET_CONTROL, pauseb(0), SET_BUTTON=1
   WIDGET_CONTROL, base, TIMER=.01
   WSET, draw_win

   IF (KEYWORD_SET(HDRS) NE 0) THEN img_hdrs = hdrs ELSE img_hdrs = 0
   moviev = { $
        base:base, $ 
        winbase:winbase, $ 
        current:current, $ 
        forward:forward, $ 
        dirsave:dirsave, $ 
        bounce:bounce, $ 
        first:first, $ 
        last:last, $ 
        pause:pause, $ 
        dopause:dopause, $ 
        len:len, $ 
        hsize:hsize, $ 
        vsize:vsize, $ 
        win_index:win_index, $ 
        draw_win:draw_win, $ 
        cframe:cframe, $ 
        cname:cname, $ 
        frames:frames, $ 
        deleted:deleted, $ 
                showmenu:showmenu, $
                filename:filename, $
                filepath:filepath, $
                img_hdrs:img_hdrs, $
        stallsave:stallsave, $ 
        sliden:sliden, $ 
        disk:disk, $ 
        lu:lu, $ 
        stall:stall $ 
            }


   WIDGET_CONTROL, base, SET_UVALUE=moviev


   PRINT, '%%'
   PRINT, '%%MVIPLAY3: Click any mouse button in the display window to bring up control panel.'
   PRINT, '%%MVIPLAY3: Click in display window again to hide control panel.'
   PRINT, '%%'
   PRINT, '%% If you are running out of memory when loading a mvi try a combination of these options:'
   PRINT, '%%    IDL> MVIPLAY3, "mymovie.mvi", LENGTH=30            ;** to load only the first 30 frames'
   PRINT, '%%    IDL> MVIPLAY3, "mymovie.mvi", START=20,LENGTH=30   ;** to load frames 20-49'
   PRINT, '%%    IDL> MVIPLAY3, "mymovie.mvi", SKIP=1               ;** to load every other frame'
   PRINT, '%%    IDL> MVIPLAY3, "mymovie.mvi", /DISK                ;** play from disk not RAM (slower)
   PRINT, '%%'
   XMANAGER, 'WRUNMOVIE', base, EVENT_HANDLER='WRUNMOVIE_EVENT0'

END