      subroutine getdis
      include 'screen.inc'
      integer*2 mxdist
      parameter (mxdist=11)
      character*14 prdist(mxdist)
      integer*2 mxarea
      parameter (mxarea=mxdist+1)
      character*17 prarea(mxarea)
      character*11 label(2)
      integer*2 idist(2),odist(2),nrdist(mxdist),iarea,nrarea(mxarea),
     1   lablen(2)
      real dsconv(mxdist,mxdist),arconv(mxdist,mxarea)
      character*80 outlin(2)
      logical yesno
      external yesno
c   mxdist - number of distance units stored in prdist
c   prdist - array to hold distance units names
      data idist/0,0/,odist/0,0/
      data prdist/'kilometers','meters','centimeters','feet','yards',
     1 'miles','nautical miles','rods','inches','other','other'/
      data nrdist/10,6,11,4,5,5,14,4,6,5,5/
      data prarea/'kilometers**2','meters**2','centimeters**2',
     1 'feet**2','yards**2','miles**2','nautical miles**2','rods**2',
     2 'inches**2','acres','hectares','other'/
      data nrarea/13,9,14,7,8,8,17,7,9,5,8,5/
      data label/'DISTANCE','LINE LENGTH'/
      data lablen/8,11/
      data outlin/' ',' '/
c
c   set up distance and line length unit conversion table
c
      do 1 i=1,mxdist
         do 2 j=1,mxdist
 2       dsconv(i,j)=0.
 1       dsconv(i,i)=1.
      dsconv(1,2)=1000.
      dsconv(1,3)=100000.
      dsconv(1,4)=3280.8
      dsconv(1,5)=1093.61
      dsconv(1,6)=0.6214
      dsconv(1,7)=0.5468
      dsconv(1,8)=184.73
      dsconv(1,9)=39370.
      do 3 i=3,9
 3       dsconv(2,i)=dsconv(1,i)*0.001
      do 4 i=4,9
 4       dsconv(3,i)=dsconv(1,i)*0.00001
      dsconv(4,5)=1./3.
      dsconv(4,6)=1./5280.
      dsconv(4,7)=1./6000.
      dsconv(4,8)=1./16.5
      dsconv(4,9)=12.
      dsconv(5,6)=1./1760.
      dsconv(5,7)=1./2000.
      dsconv(5,8)=1./5.5
      dsconv(5,9)=36.
      dsconv(6,7)=6000./5280.
      dsconv(6,8)=320.
      dsconv(6,9)=5280.*12.
      dsconv(7,8)=(6000./5280.)*320.
      dsconv(7,9)=6000.*12.
      dsconv(8,9)=5.5*36.
c   opposite side of diagonal is reciprical of upper part
      do 5 i=1,8
         do 5 j=i+1,9
 5          dsconv(j,i)=1./dsconv(i,j)
c
c   set up distance to area conversion table
c
      do 6 i=1,mxarea
         do 6 j=1,mxarea
 6       arconv(i,j)=0.
      do 7 i=1,mxdist
         do 7 j=1,mxdist
         if (dsconv(i,j).gt.0.) arconv(i,j)=1./dsconv(i,j)
 7       continue
      do 9 i=1,mxdist
 9       arconv(i,i)=1.
      arconv(1,10)=0.1/sqrt(2.4710538)
      arconv(1,11)=0.1
      arconv(4,10)=sqrt(43560.)
      arconv(4,11)=arconv(4,10)*2.4710538
      do 8 j=10,11
         arconv(2,j)=arconv(1,j)*1000.
         arconv(3,j)=arconv(1,j)*100000.
         arconv(5,j)=arconv(4,j)/3.
         arconv(6,j)=arconv(4,j)/5280.
         arconv(7,j)=arconv(4,j)/6000.
         arconv(8,j)=arconv(4,j)/16.5
 8       arconv(9,j)=arconv(4,j)*12.
c
c   select input and output distance units (itime=1)
c       or line length units (itime=2)
c
 10   irow=1
      icol=1
      call cls
      do 40 itime=1,2
      if (itime.eq.1) then
         line=
     1   'Select one of the following units for distances to objects.'
      else
         line='Select one of the following units for line length.'
      endif
      irow=irow+2
      call scrlin
      line='Use the up and down arrows to position cursor, and'
      irow=irow+1
      call scrlin
      line='select correct unit with carriage return.'
      irow=irow+1
      call scrlin
      irow=irow+1
      icol=15
c   generate list of units
      do 14 i=1,mxdist
         call putcur(irow+i-1,icol,ivpage,ierror)
 14      call wchars(ivpage,'- '//prdist(i),16,icolor,ibckgd,0,ierror)
 15   icode=1
      irowt=irow+mxdist/2+1
      icol=45
      call putcur(irowt,icol,ivpage,ierror)
      line='Select current units'
      call wchars(ivpage,line,20,icolor,ibckgd,1,ierror)
      icol=15
      call putcur(irow,icol,ivpage,ierror)
 16   call inkey(line,keycde,nchar)
      if (keycde.eq.0) then
         continue
c     up arrow
      else if (keycde.eq.72) then
         call getcur(ivpage,irowt,icol,ierror)
         irowt=irowt-1
         if (irowt.lt.irow) irowt=irow+mxdist-1
         call putcur(irowt,icol,ivpage,ierror)
c     down arrow
      else if (keycde.eq.80) then
         call getcur(ivpage,irowt,icol,ierror)
         irowt=irowt+1
         if (irowt.gt.irow+mxdist-1) irowt=irow
         call putcur(irowt,icol,ivpage,ierror)
c     carriage return, meaning this distance is selected.
      else if (keycde.eq.28) then
         call getcur(ivpage,irowt,icol,ierror)
         i=irowt-irow+1
         if (prdist(i).eq.'other') then
            call putcur(irowt,30,ivpage,ierror)
            line='What are the units? '
            call wchars(ivpage,line,20,icolor,ibckgd,0,ierror)
            call getbuf(prdist(i),nchar,14,iatt)
            nrdist(i)=index(prdist(i),' ')-1
            if (nrdist(i).le.0) nrdist(i)=14
            call putcur(irowt,17,ivpage,ierror)
            call wchars(ivpage,prdist(i),14,icolor,ibckgd,0,ierror)
            call putcur(irowt,30,ivpage,ierror)
            line=' '
            call wchars(ivpage,line,50,icolor,ibckgd,0,ierror)
         endif
         if (icode.eq.1) then
            if (idist(itime).ne.0) then
               call putcur(irow+idist(itime)-1,8,ivpage,ierror)
               line=' '
               nchar=6
               call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror)
            endif
            idist(itime)=i
            line='input'
            line(6:6)=char(26)
            nchar=6
            call putcur(irowt,8,ivpage,ierror)
            call wchars(ivpage,line,nchar,icolor,ibckgd,1,ierror)
            go to 17
         else
            if (odist(itime).ne.0) then
               call putcur(irow+odist(itime)-1,18+nrdist(odist(itime)),
     1                 ivpage,ierror)
               line=' '
               nchar=14
               call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror)
            endif
            odist(itime)=i
            line=' converted to'
            line(1:1)=char(27)
            nchar=13
            call putcur(irowt,18+nrdist(odist(itime)),ivpage,ierror)
            call wchars(ivpage,line,nchar,icolor,ibckgd,1,ierror)
            go to 18
         endif
      endif
      go to 16
 17   continue
      icol=1
      call putcur(irow+mxdist,icol,ivpage,ierror)
      line='Now select units to convert to from above list.'
      nchar=47
      call wchars(ivpage,line,nchar,icolor,ibckgd,0,ierror)
      icode=2
      irowt=irow+mxdist/2+1
      icol=45
      call putcur(irowt,icol,ivpage,ierror)
      line='Select units to convert to'
      call wchars(ivpage,line,26,icolor,ibckgd,1,ierror)
      icol=15
      call putcur(irow,icol,ivpage,ierror)
      go to 16
 18   continue
      irowt=irow+mxdist/2+1
      icol=45
      call putcur(irowt,icol,ivpage,ierror)
      call scroll(1,0,irowt,45,irowt,80,7,ierror)
      jrow=irow
      icol=1
      irow=jrow+mxdist+1
      if (itime.eq.1) then
         line='You have specified input data are '//prdist(idist(itime))
      else
         line='You have specified line lengths are '
     1        //prdist(idist(itime))
      endif
      call scrlin
      irow=irow+1
      line='and to convert to '//prdist(odist(itime))
      call scrlin
      irow=irow+1
      line='Is this correct?'
      if (.not. yesno(0)) then
         irow=jrow
         go to 15
      endif
      irow=jrow
c   get conversion for units not in conversion table
      if (dsconv(idist(itime),odist(itime)).eq.0.) then
          call scroll(0,0,irow+mxdist+3,1,irow+mxdist+5,80,7,ierror)
          irowt=irow+mxdist+4
          icol=15
          call putcur(irowt,icol,ivpage,ierror)
          line='What is the conversion factor to use? '
          call wchars(ivpage,line,38,icolor,ibckgd,0,ierror)
          call getbuf(line,nchar,14,iatt)
          read(line,'(f14.0)') dsconv(idist(itime),odist(itime))
          dsconv(odist(itime),idist(itime))=1.
     1        /dsconv(idist(itime),odist(itime))
      endif
      write(unit=outlin(itime),fmt='(a1,a,a,a,a,a1,a,a1,a1,1x,g14.8)')
     1 '*',label(itime)(1:lablen(itime)),' is in ',
     2 prdist(idist(itime))(1:nrdist(idist(itime))),
     3 ' converted to ','.',
     4 prdist(odist(itime))(1:nrdist(odist(itime))),'.','*',
     5 dsconv(idist(itime),odist(itime))
      irow=irow-3
      icol=1
      call scroll(1,0,irow,1,25,80,7,ierror)
      call putcur(irow,icol,ivpage,ierror)
      write(line,fmt='(a,a,a,a,a)')
     1 label(itime)(1:lablen(itime)),' is in ',
     2 prdist(idist(itime))(1:nrdist(idist(itime))),' converted to ',
     3 prdist(odist(itime))(1:nrdist(odist(itime)))
      call wchars(ivpage,line,70,icolor,ibckgd,0,ierror)
      irow=irow+1
      write(line,fmt='(a,g14.8)') 'with the conversion factor ',
     1 dsconv(idist(itime),odist(itime))
      call putcur(irow,icol,ivpage,ierror)
      call wchars(ivpage,line,70,icolor,ibckgd,0,ierror)
 40   continue
      irow=irow+3
      call putcur(irow,1,ivpage,ierror)
      call wchars(ivpage,'Now select units for area:',26,
     1   icolor,ibckgd,0,ierror)
      irow=irow+1
      icol=15
      do 50 i=1,mxarea
         irowt=irow+i
         call putcur(irowt,icol,ivpage,ierror)
         call wchars(ivpage,'- '//prarea(i)(1:nrarea(i)),nrarea(i)+2,
     1      icolor,ibckgd,0,ierror)
 50      continue
      irow=irow+1
      call putcur(irow,icol,ivpage,ierror)
 60   call inkey(line,keycde,nchar)
      if (keycde.eq.0) then
         continue
c     up arrow
      else if (keycde.eq.72) then
         call getcur(ivpage,irowt,icol,ierror)
         irowt=irowt-1
         if (irowt.lt.irow) irowt=irow+mxarea-1
         call putcur(irowt,icol,ivpage,ierror)
c     down arrow
      else if (keycde.eq.80) then
         call getcur(ivpage,irowt,icol,ierror)
         irowt=irowt+1
         if (irowt.gt.irow+mxarea-1) irowt=irow
         call putcur(irowt,icol,ivpage,ierror)
c     carriage return, meaning this area is selected.
      else if (keycde.eq.28) then
         call getcur(ivpage,irowt,icol,ierror)
         iarea=irowt-irow+1
         if (prarea(iarea).eq.'other') then
            call putcur(irowt,35,ivpage,ierror)
            line='What are the units? '
            call wchars(ivpage,line,20,icolor,ibckgd,0,ierror)
            call getbuf(prarea(iarea),nchar,14,iatt)
            nrarea(iarea)=index(prarea(iarea),' ')-1
            if (nrarea(iarea).le.0) nrarea(iarea)=14
            call putcur(irowt,17,ivpage,ierror)
            call wchars(ivpage,prarea(iarea),17,icolor,ibckgd,0,ierror)
            call putcur(irowt,30,ivpage,ierror)
            line=' '
            call wchars(ivpage,line,50,icolor,ibckgd,0,ierror)
         endif
         go to 70
      endif
      go to 60
c   get conversion for units not in conversion table
 70   if (arconv(odist(1),iarea).eq.0. .or.
     1    arconv(odist(2),iarea).eq.0.) then
          call scroll(0,0,irow+mxarea+3,1,irow+mxarea+5,80,7,ierror)
          irowt=24
          icol=15
          call putcur(irowt,icol,ivpage,ierror)
          line='What is the conversion factor to use? '
          call wchars(ivpage,line,38,icolor,ibckgd,0,ierror)
          call getbuf(line,nchar,14,iatt)
          read(line,'(f14.0)') areacv
      else
          areacv=arconv(odist(1),iarea)*arconv(odist(2),iarea)
      endif
      irow=irow-3
      icol=1
      call scroll(1,0,irow,1,25,80,7,ierror)
      line='Area converted to '//prarea(iarea)(1:nrarea(iarea))
      call scrlin
      irow=irow+1
      write(line,fmt='(a,g14.8)') 'with the conversion factor ',areacv
      call scrlin
      irow=irow+2
      line='Are these units OK, and ready to proceed?'
      if (.not. yesno(0)) go to 10
      do 80 itime=1,2
   80    write(unit=iout,fmt='(a)') outlin(itime)
      write(unit=iout,fmt='(a1,a,a1,a,a1,a1,1x,g14.8)')
     1 '*','AREA converted to ','.',
     2 prarea(iarea)(1:nrarea(iarea)),'.','*',areacv
c   save units in common for use in getting numeric values
      disunt=prdist(idist(1))
      ndisut=nrdist(idist(1))
      linunt=prdist(idist(2))
      nlinut=nrdist(idist(2))
      araunt=prarea(iarea)
      naraut=nrarea(iarea)
      return
      end
