  rem Euro Calculator V1.3
  rem By Tommy Sools (tommy@sools.com)

  option decimalsep,.
  option fieldsep,|
  option scale,96

  directory change,@path(%0)
  %%vdsinet =
  option errortrap,skip
  external vdsinet.dll,Public Freeware Key|90257236
  %%vdsinet = 1
:skip
  option errortrap

  rem EUR = European euro
  rem ATS = Austrian schilling
  rem BEF = Belgian franc
  rem DEM = Deutsche Mark
  rem ESP = Spanish peseta
  rem FIM = Finnish markka
  rem FRF = French franc
  rem GRD = Greek drachma
  rem IEP = Irish pound
  rem ITL = Italian lira
  rem LUF = Luxembourg franc
  rem NLG = Dutch guilder
  rem PTE = Portuguese escudo

  rem the following currencies (marked with a star) are subjected to changes;
  rem look at http://www.ecb.int/home/eurofxref.htm:

  rem USD = United States dollar
  rem JPY = Japanese yen
  rem DKK = Danish krone
  rem GBP = Pound sterling
  rem SEK = Swedish krona
  rem CHF = Swiss franc
  rem ISK = Icelandic krona
  rem NOK = Norwegian krone
  rem BGN = Bulgarian lev
  rem CYP = Cyprus pound
  rem CZK = Czech koruna
  rem EEK = Estonian kroon
  rem HUF = Hungarian forint
  rem LTL = Lithuanian litas
  rem LVL = Latvian lat
  rem MTL = Maltese lira
  rem PLN = Polish zloty
  rem ROL = Romanian leu
  rem SIT = Slovenian tolar
  rem SKK = Slovakian koruna
  rem TRL = Turkish lira
  rem AUD = Australian dollar
  rem CAD = Canadian dollar
  rem HKD = Hong Kong dollar
  rem NZD = New Zealand dollar
  rem SGD = Singaporean dollar
  rem KRW = South Korean won
  rem ZAR = South African rand

  %%file = .\@name(%0).dat
  list create,1
  if @file(%%file)
    list loadfile,1,%%file
  else
    list loadtext,1
"* AUD|1.7111
"* BGN|1.9466
"* CAD|1.3531
"* CHF|1.5078
"* CYP|0.57409
"* CZK|33.878
"* DKK|7.4485
"* EEK|15.6466
"* GBP|0.61180
"* HKD|6.8451
"* HUF|249.20
"* ISK|88.54
"* JPY|108.36
"* KRW|1145.88
"* LTL|3.5113
"* LVL|0.5521
"* MTL|0.3994
"* NOK|8.0170
"* NZD|2.1239
"* PLN|3.6990
"* ROL|25825
"* SEK|9.2631
"* SGD|1.6006
"* SIT|218.9110
"* SKK|42.739
"* TRL|1150767
"* USD|0.8776
"* ZAR|7.2418
"ATS|13.7603
"BEF|40.3399
"DEM|1.95583
"ESP|166.386
"EUR|1
"FIM|5.94573
"FRF|6.55957
"GRD|340.750
"IEP|0.787564
"ITL|1936.27
"LUF|40.3399
"NLG|2.20371
"PTE|200.482
  end

  rem auto-update currencies
  if %%vdsinet
    DIALOG CREATE,Please wait...,-1,0,266,49,NOSYS
    DIALOG ADD,STYLE,sCenter,,6,C,BACKGROUND,FOREGROUND
    DIALOG ADD,TEXT,tNotice,16,8,248,16,Auto-updating...,SCENTER
    DIALOG SHOW

    option errortrap,skip2
    net http,get,http://www.ecb.int/home/eurofxref.htm
    list create,2
    repeat
      %a = @net(http)
      if @not(@both(@equal(%a,@cr()),@equal(@len(%A),1)))
        list add,2,%a
      end
    until @both(@equal(%a,@cr()),@equal(@len(%A),1))
    list seek,1,0
    repeat
      parse "%a;",@item(1)
      %a = @substr(%a,3,@len(%a))
      list seek,2,0
      %x = @match(2,<td align=@chr(34)center@chr(34)>%a</td>)
      if %x
        %x = @next(2)
        %x = @next(2)
        %b = @item(2)
        %c = @pos(>,%b)
        %d = @pos(</,%b)
        list put,1,* %a|@substr(@item(2),@succ(%c),@pred(%d))
      end
    until @not(@equal(@substr(@next(1),1,1),*))
    list close,2
:skip2
    option errortrap
    dialog hide
  end

  list savefile,1,%%file

  %%memory = 0

  DIALOG CREATE,Euro Calculator,-1,0,273,212,ONTOP
  DIALOG ADD,STYLE,sValue,,6,,BLACK,CYAN
  DIALOG ADD,STYLE,sMemory,,6,C,BACKGROUND,LTBLUE
  DIALOG ADD,STYLE,sWingdings,Wingdings,8,BC,BACKGROUND,FOREGROUND
  DIALOG ADD,STYLE,sSource,,6,L,BACKGROUND,FOREGROUND
  DIALOG ADD,STYLE,sDest,,6,R,BACKGROUND,FOREGROUND

  DIALOG ADD,EDIT,eValue,8,8,256,18,0,,READONLY,SVALUE

  DIALOG ADD,BUTTON,b7,40,8,24,14,&7
  DIALOG ADD,BUTTON,b8,40,40,24,14,&8
  DIALOG ADD,BUTTON,b9,40,72,24,14,&9
  DIALOG ADD,BUTTON,b4,64,8,24,14,&4
  DIALOG ADD,BUTTON,b5,64,40,24,14,&5
  DIALOG ADD,BUTTON,b6,64,72,24,14,&6
  DIALOG ADD,BUTTON,b1,88,8,24,14,&1
  DIALOG ADD,BUTTON,b2,88,40,24,14,&2
  DIALOG ADD,BUTTON,b3,88,72,24,14,&3
  DIALOG ADD,BUTTON,b0,112,8,24,14,&0

  DIALOG ADD,BUTTON,bDecimal,112,40,24,14,&.
  DIALOG ADD,BUTTON,bNegative,112,72,24,14,-/+

  DIALOG ADD,BUTTON,bC,40,104,24,14,&C
  DIALOG ADD,BUTTON,bResult,64,104,24,14,=,,default

  DIALOG ADD,BUTTON,bAdd,40,144,24,14,&+
  DIALOG ADD,BUTTON,bDiff,40,176,24,14,&-
  DIALOG ADD,BUTTON,bProd,40,208,24,14,&*
  DIALOG ADD,BUTTON,bDiv,40,240,24,14,&/
  DIALOG ADD,BUTTON,bMod,64,144,24,14,&%
  DIALOG ADD,BUTTON,bMoney,64,176,24,14,&$

  DIALOG ADD,BUTTON,bMAdd,88,144,24,14,M+
  DIALOG ADD,BUTTON,bMS,88,176,24,14,MS
  DIALOG ADD,BUTTON,bMR,88,208,24,14,&MR
  DIALOG ADD,BUTTON,bMC,88,240,24,14,MC

  DIALOG ADD,TEXT,tMemory,112,144,,,Memory:
  DIALOG ADD,TEXT,tMemory2,112,190,50,,%%memory,,sMemory

  DIALOG ADD,TEXT,tSource,144,8,72,16,Source:,,SSOURCE
  DIALOG ADD,TEXT,tDest,144,192,72,16,Destination:,,SDEST
  DIALOG ADD,BUTTON,bDir1,144,104,24,14,ß,,sWingdings
  DIALOG ADD,BUTTON,bDir2,144,144,24,14,à,,sWingdings
  DIALOG ADD,COMBO,cSource,168,8,120,21,cSource,,SORTED,LIST
  DIALOG ADD,COMBO,cDest,168,144,120,21,cDest,,SORTED,LIST

  DIALOG ADD,TEXT,tNotice,194,10,,,* non-euro currency

  DIALOG SHOW

  dialog focus,bResult

  list seek,1,0
  repeat
    parse "%%item;",@next(1)
    list add,cSource,%%item
  until @equal(@index(1),@count(1))

  %x = @match(cSource,* USD)
  list assign,cDest,cSource
  %x = @match(cDest,EUR)

  %%reset =

  option errortrap,error
:evloop
  wait event
  %e = @event()
  if @not(@numeric(@dlgtext(eValue))@numeric(@dlgtext(eValue)0))
    dialog set,eValue,0
  end
  if @equal(@substr(%e,1,1),b)
    %e = @strdel(%e,1,1)
    %e = @substr(%e,1,-6)
    if @numeric(%e)
      if %%reset
        %%reset =
        dialog set,eValue,0
      end
      if @zero(@dlgtext(eValue))
        dialog set,eValue,%e
      else
        dialog set,eValue,@dlgtext(eValue)%e
      end
      goto evloop
    end
    if @equal(@substr(%e,1,3),dir)
      if @equal(@strdel(%e,1,3),1)
        %%source = cDest
        %%dest = cSource
      else
        %%source = cSource
        %%dest = cDest
      end

      list seek,1,0
      %x = @match(1,@dlgtext(%%source))
      parse ";%%rate",@item(1)
      %%EUR = @fdiv(@dlgtext(eValue),%%rate)

      list seek,1,0
      %x = @match(1,@dlgtext(%%dest))
      parse ";%%rate",@item(1)
      dialog set,eValue,@fmul(%%EUR,%%rate)
      %%reset = 1
      goto evloop
    end
    if @equal(%e,C)
      dialog set,eValue,0
      %%value1 =
      %%reset =
      goto evloop
    end
    if @equal(%e,negative)
      if @not(@zero(@dlgtext(eValue)))
        if @equal(@substr(@dlgtext(eValue),1,1),-)
          dialog set,eValue,@strdel(@dlgtext(eValue),1,1)
        else
          dialog set,eValue,-@dlgtext(eValue)
        end
      end
      goto evloop
    end
    if @equal(%e,add)@equal(%e,diff)@equal(%e,prod)@equal(%e,div)@equal(%e,mod)
      if %%operation
        gosub calc
      end
      %%value1 = @dlgtext(eValue)
      %%operation = %e
      %%reset = 1
      goto evloop
    end
    if @equal(%e,result)
      if %%operation
        gosub calc
      end
      %%reset = 1
      goto evloop
    end
    if @equal(%e,money)
      dialog set,eValue,@format(@dlgtext(eValue),.2)
      %%reset = 1
      goto evloop
    end
    if @equal(%e,decimal)
      if @numeric(@dlgtext(eValue).0)
        dialog set,eValue,@dlgtext(eValue).
      end
      goto evloop
    end
    if @equal(%e,MAdd)
      if @both(@not(@numeric(@dlgtext(eValue))),@numeric(@dlgtext(eValue)0))
        dialog set,eValue,@dlgtext(eValue)0
      end
      %%memory = @fadd(%%memory,@dlgtext(eValue))
      dialog set,tMemory2,%%memory
      %%reset = 1
      goto evloop
    end
    if @equal(%e,MS)
      if @both(@not(@numeric(@dlgtext(eValue))),@numeric(@dlgtext(eValue)0))
        dialog set,eValue,@dlgtext(eValue)0
      end
      %%memory = @dlgtext(eValue)
      dialog set,tMemory2,%%memory
      %%reset = 1
      goto evloop
    end
    if @equal(%e,MR)
      dialog set,eValue,%%memory
      %%reset = 1
      goto evloop
    end
    if @equal(%e,MC)
      %%memory = 0
      dialog set,tMemory2,%%memory
      goto evloop
    end
    warn Unexpected error!
    goto evloop
  else
    goto %e
  end
:calc
  if @both(@not(@numeric(@dlgtext(eValue))),@numeric(@dlgtext(eValue)0))
    dialog set,eValue,@dlgtext(eValue)0
  end
  %%value2 = @dlgtext(eValue)
  gosub calc2
  dialog set,eValue,%%value
  %%operation =
  exit
:calc2
  if @equal(%%operation,add)
    %%value = @fadd(%%value1,%%value2)
    exit
  end
  if @equal(%%operation,diff)
    %%value = @fsub(%%value1,%%value2)
    exit
  end
  if @equal(%%operation,prod)
    %%value = @fmul(%%value1,%%value2)
    exit
  end
  if @equal(%%operation,div)
    if @zero(%%value2)
      %%value = Can't divide by zero
    else
      %%value = @fdiv(%%value1,%%value2)
    end
    exit
  end
  if @equal(%%operation,mod)
    if @zero(%%value2)
      %%value = Can't divide by zero
    else
      rem @MOD() doesn't support decimals
      %%value = @fdiv(%%value1,%%value2)

      rem truncate the value
      %%pos = @pos(.,%%value)
      if @greater(%%pos,0)
        %%value = @strdel(%%value,%%pos,@len(%%value))
      end

      %%value = @fsub(%%value1,@fmul(%%value,%%value2))
    end
    exit
  end
  warn Unexpected error "(2)"!
  exit
:error
  if @equal(@error(E),26)
    dialog set,eValue,Overflow
  else
    warn Unexpected error @error(E) at line @error(N)!
  end
  goto evloop
:close
  list close,1
