red_logon:
    call draw_window_logon	 ; at first, draw the window

still_logon:			 ; main cycle of application begins here
    mov  eax,10     ; wait here for event
    mcall

checkevent_logon:	  ; Check what event was called _logon: this will be used to return from textbox focus

    dec  eax	    ; redraw request ?
    jz	 red_logon
    dec  eax	    ; key in buffer ?
    jz	 key_logon
    dec  eax	    ; button in buffer ?
    jz	 button_logon

    jmp  still_logon

  key_logon:		 ; key event handler
    mov  al,2		 ; eax was zero so will now be 2
    mcall		 ; just read it and ignore

    cmp  ah,13
    jne  still_logon	 ; return to main loop

    ret 		 ; enter key was pressed => return to logon

  button_logon: 	 ; eax was zero so will now be 17
    mov  al,17		 ; get id
    mcall

    cmp  ah,1		 ; close ?
    jz	 close_logon
    cmp  ah,2		 ; logon ?
    je	 connect_logon
    cmp  ah,5		 ; first ?
    jz	 dstbtn_logon

  srcbtn_logon:
    mov  dword[addr],first
    jmp  rk_logon

  dstbtn_logon:
    mov  dword[addr],second

  rk_logon:
    mov  edi,[addr]	 ; load the address of the string
    xor  al,al		 ; mov  al,0          ; the symbol we will search for
    mov  ecx,STRLEN+1	 ; length of the string (+1)
    cld 		 ; search forward
  repne  scasb		 ; do search now
    inc  ecx		 ; we've found a zero or ecx became 0
    mov  eax,STRLEN+1
    sub  eax,ecx	 ; eax = address of <0> character
    mov  [temp],eax	 ; position

    cmp  dword[addr],dword second
    jne  @f
    mov  dword [passlen],eax
   @@:

    call print_text_logon

    mov  edi,[addr]	 ; address of string
    add  edi,[temp]	 ; cursor position

  .waitev_logon:
    mov  eax,10 	 ; wait for event
    mcall
    cmp  eax,2		 ; button presed ?
    jne  checkevent_logon    ; a key is pressed or redraw is nessesary, goto checkevent
    mcall		 ; eax = 2, read button
    shr  eax,8
    cmp  eax,8
    jnz  .nobs_logon	 ; BACKSPACE
    cmp  edi,[addr]
    jz	 .waitev_logon
    dec  edi
    mov  byte[edi],0

    cmp  dword[addr],second
    jne  @f
    dec  [passlen]
   @@:

    call print_text_logon
    jmp  .waitev_logon
  .nobs_logon:
    cmp  eax,13        ; ENTER
    je	 still_logon
    cmp  eax,192
    jne  .noclear_logon
    xor  al,al
    mov  edi,[addr]
    mov  ecx,STRLEN
    rep  stosb
    mov  edi,[addr]
    call print_text_logon
    jmp  .waitev_logon

  .noclear_logon:
    mov  [edi],al

    cmp  dword[addr],second
    jne  @f
    inc  [passlen]
   @@:

    call print_text_logon

    inc  edi
    mov  esi,[addr]
    add  esi,STRLEN
    cmp  esi,edi
    jnz  .waitev_logon

    jmp  still_logon


; print strings (source & destination)
print_text_logon:
pusha

    mov  eax, 8
    mov  ebx, 105*65536+200
    mov  ecx, 33*65536+12
    mov  edx, 4
    mov  esi, 0xEBEBEB
    mcall

    cmp  byte[mode],0
    je	 @f

    mov  ecx, 49*65536+12
    inc  edx
    mcall

   @@:
    mov  eax, 4 			; function 4 _logon: write text to window
    mov  ebx, 107*65536+34		; [x start] *65536 + [y start]
    xor  ecx, ecx			; color of text RRGGBB
    mov  edx, first			; pointer to text beginning
    mov  esi, STRLEN			; text length
    mcall

    cmp  byte[mode],0
    je	 dont_draw_pass

    add  ebx,16
    mov  edi,[passlen]

   @@:
    cmp  edi,0
    jle  dont_draw_pass

    dec  edi
    mov  edx, passchar
    mov  esi, 1
    mcall
    add  ebx,6*65536
    jmp  @r

  dont_draw_pass:

popa
    ret

close_logon:
    or  eax,-1
    mcall

connect_logon:
    ret

draw_window_logon:

    mov  eax, 12			; function 12_logon:tell os about windowdraw
    mov  ebx, 1 			; 1, start of draw
    mcall
    pusha
					; DRAW WINDOW
    xor  eax, eax			; function 0 _logon: define and draw window
    mov  ebx, 160*65536+330		; [x start] *65536 + [x size]
    mov  ecx, 160*65536+100		; [y start] *65536 + [y size]
    mov  edx, 0x13DDDDDD		; color of work area RRGGBB
    mov  edi, title                     ; WINDOW LABEL
    mcall

    mov  eax, 8 			; LOGON BUTTON
    mov  ebx, 220*65536+85
    mov  ecx, 63*65536+16
    mov  edx, 2
    mov  esi, 0xCCCCCC
    mcall

    call print_text_logon
					
    cmp  byte[mode],0
    je	 servermode_

    mov  eax, 4 			; function 4 _logon: write text to window
    mov  ebx, 25*65536+33		; [x start] *65536 + [y start]
    xor  ecx, ecx
    mov  edx, userstr			; pointer to text beginning
    mov  esi, passstr-userstr		; text length
    mcall

    add  bl,16
    mov  edx, passstr			; pointer to text beginning
    mov  esi, connect-passstr		; text length
    mcall

    jmp  drawtherest_

   servermode_:

    mov  ebx, 25*65536+33		; [x start] *65536 + [y start]
    xor  ecx, ecx
    mov  edx, serverstr 		; pointer to text beginning
    mov  esi, userstr-serverstr 	; text length
    mcall

   drawtherest_:

    mov  ebx, 240*65536+67		; [x start] *65536 + [y start]
    mov  edx, connect			; pointer to text beginning
    mov  esi, connect_e-connect 	; text length
    mcall

    popa
    inc   ebx
    mcall

    ret


; DATA AREA
title  db 'Kolibrios VNC client by HIDNPLAYR',0

first:	      db '192.168.1.5'
	      rb STRLEN
second:       rb STRLEN

passchar      db '*'
passlen       dd 0

addr	      dd 0
temp	      dd 0
mode	      db 0 ; 0 = connection details, 1 = authentication

serverstr:    db 'server:'
userstr:      db 'username:'
passstr:      db 'password:'
connect:      db 'connect !'
connect_e:

I_END_logon:
