'============================
'   BB_v04_POND_v04.txt      
'============================

'...SW notes
'...BB does not allow simple javascript var xx=123, requires var xx as number: xx=123
'...BB does not like the brackets in a statement like: If (condition) then
'...BB does not allow += operator
'...BB format of IF THEN ELSEIF ELSE ENDIF Upper or Lower case usage not clear to me
'...BB uses Else If instead of ElseIf...this requires an additional Endif
'... in BB xxx= SOW_Handle_Mouse_Event()....dont forget the brackets! and a final space before the comment quote


'''''KEYVAL(PAGE_TITLE,str,Pong Gone Wrong)
'''''KEYVAL(CANVAS01_ID,str,My_Kanvas_A) 
'''''KEYVAL(CANVAS01_WIDTH,int,700)  
'''''KEYVAL(CANVAS01_HEIGHT,int,500) 
var CANVAS01_WIDTH as number 
CANVAS01_WIDTH=700

var CANVAS01_HEIGHT as number  
CANVAS01_HEIGHT=500

var maxNumBalls as number
var maxNumBallsForArray as number
maxNumBalls=2000
maxNumBallsForArray=1+maxNumBalls
var  myBalls_PosX[maxNumBallsForArray] as array 
var  myBalls_PosY[maxNumBallsForArray] as array
var  myBalls_velX[maxNumBallsForArray] as array
var  myBalls_velY[maxNumBallsForArray] as array
var  myBalls_Radius[maxNumBallsForArray] as array
var  myBalls_FillColor[maxNumBallsForArray][3] as array
var  myBalls_Mood[maxNumBallsForArray] as array

var  RposCenX[maxNumBallsForArray] as array
var  RposCenY[maxNumBallsForArray] as array
var  RposXmin[maxNumBallsForArray] as array
var  RposXmax[maxNumBallsForArray] as array
var  RposYmin[maxNumBallsForArray] as array
var  RposYmax[maxNumBallsForArray] as array
var  moiRects_VelX[maxNumBallsForArray] as array
var  moiRects_VelY[maxNumBallsForArray] as array
          
'-------------------------------------------
'... VAR statements

var iii as number '''''
var jjj as number '''''
var pos_x  as number ''''' 400
var pos_y  as number ''''' 300
var vel_X  as number ''''' 2
var vel_Y  as number ''''' 4

var i_posX  as number ''''' 20
var i_posY  as number ''''' 20
var nextBall_velX  as number ''''' 0.5
var nextBall_velY  as number ''''' 0.5
var numBalls  as number ''''' 128
var numRects  as number ''''' 12
var rad  as number ''''' 10.0
var ball_fillStyle  as number ''''' "#444444"

var VelMag  as number ''''' 1.0
var Increase_VelMag  as number ''''' IsFalse
var Decrease_VelMag  as number ''''' IsFalse

var usr_string  as string ''''' ""
var Pos_x  as number ''''' 0 
var Pos_y  as number ''''' 0

var Mov_Rect_Pos_X as number '''''0
var Mov_Rect_Pos_Y as number '''''0
var MR_dX as number '''''
var MR_dY as number '''''

var User_Click_Mode as string '''''""
var Tcolor  as string ''''' ""
var Tfont  as string ''''' ""
var Purge_Zapped_Balls  as number ''''' IsFalse

var brocol_Yellow     as string ''''' "#FFFF00"
var brocol_Cyan       as string ''''' "#00FFFF" 
var brocol_Magenta    as string ''''' "#FF00FF" 
var brocol_Red        as string ''''' "#FF0000"
var brocol_Green      as string ''''' "#00FF00" 
var brocol_Blue       as string ''''' "#0000FF" 
var brocol_White      as string ''''' "#FFFFFF" 
var brocol_Black      as string ''''' "#000000" 

Var mouse_event_Str as string	' a global button variable
Var g_mousex as number	' to hold the mouse x value
Var g_mousey as number	' to hold the y

var mouse_event_X as number
var	mouse_event_Y as number
var mouse_button_left_drag_Active as number	
var mouse_button_Left_released_softButtonNum as number

var Mouse_Mode_str as string
var Mouse_Mode_num as number
var spray_balls_wait_var as number
var spray_balls_wait_const as number
    spray_balls_wait_const = 0.02 '...wait period (secs) between spraying successive balls.

var	Buttons_Name[100] as array
var Buttons_Label[100] as array
''var	Buttons_State[100] as array  '... 1 = "ON"   0 = "OFF"
var	Buttons_Color[100] as array
var Buttons_Xmin[100] as array
var Buttons_Xmax[100] as array
var Buttons_Ymin[100] as array
var Buttons_Ymax[100] as array


var numButtons as number
var Bnum as number
var Bname as string
var BcolorON as number
var BcolorOFF as number
var Xmin as number
var Xmax as number
var Ymin as number
var Ymax as number

var SinceLoadTime as number
var SOW_ColorInt_to_RGB_OUTstr as string
var nextBallRadius as number
var deltaBallRadius as number

	var TposX as number
	var TposY as number
	var Bname as string
	var Bwidth as number
	var Bheight as number
	var Bcolor as number
	
	var xxx as number


'dolphin

''' MIXED Var and values
var bRed as number
var bGreen as number
var bBlue as number

var IsTrue as number
IsTrue=1
var IsFalse as number
IsFalse=0

var junk as number

 
 var sow_colorBits as number
 sow_colorBits=256 '...16 '...numbers of colorBits in system
 var sow_colorBits_colorBits as number

''''' ASSIGN VALUES
iii=0
jjj=0
pos_x = 400
pos_y = 300
vel_X = 2
vel_Y = 4

i_posX = 20
i_posY = 20
nextBall_velX = 0.5
nextBall_velY = 0.5
numBalls = 128
numRects = 12
rad = 10.0


VelMag = 1.0
Increase_VelMag = IsFalse
Decrease_VelMag = IsFalse


Pos_x = 0 
Pos_y = 0

Mov_Rect_Pos_X=0
Mov_Rect_Pos_Y=0
MR_dX=0
MR_dY=0

Purge_Zapped_Balls = IsFalse

User_Click_Mode=""
Tcolor = ""
Tfont = ""

usr_string = ""
ball_fillStyle = "#444444"
brocol_Yellow    = "#FFFF00"
brocol_Cyan      = "#00FFFF" 
brocol_Magenta   = "#FF00FF" 
brocol_Red       = "#FF0000"
brocol_Green     = "#00FF00" 
brocol_Blue      = "#0000FF" 
brocol_White     = "#FFFFFF" 
brocol_Black     = "#000000" 

'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
' FunctionS 



Var sndDing as number	' a variable to hold the sound


'----------------------------------------------------------------------------------------------------------------------------------------------
' ONLOAD                       
'                              
'                              
Function OnLoad()

	var xxx as number

	'... this is the callback OnLoad.  It gets called one time when the web page loads
	'... put in variables that need to be initialized
	'... load sounds and images in here also
	
	'...SOUNDS
	setBackgroundColor(255,128,128)
	sndDing = SoundLoad("sfx/ding.ogg", "sfx/ding.mp3")


	'...BUTTONS
	
	xxx = SOW_Define_Buttons()
	

    '--------------------------------------
    '...initialize  Balls
	nextBallRadius=1 
	deltaBallRadius=0.25
	
    for iii = 1 to numBalls STEP 1    


        myBalls_PosX[iii] = i_posX   
        myBalls_PosY[iii] = i_posY  
        myBalls_velX[iii] = nextBall_velX   
        myBalls_velY[iii] = nextBall_velY
		
        myBalls_Radius[iii] =  nextBallRadius '12 + iii/4
        myBalls_Mood[iii] = 1
		
		bRed   = Int(255*i_posX/CANVAS01_WIDTH)
		bGreen = Int(iii+100*i_posY/CANVAS01_HEIGHT)
		bBlue  = Int(0.5* bRed + 0.3* bGreen)
		
		myBalls_FillColor[iii][0] = bRed 
		myBalls_FillColor[iii][1] = bGreen 
		myBalls_FillColor[iii][2] = bBlue
		
        '...Increment the initial values for the next ball
        i_posX = i_posX+2
        i_posY = i_posY+2
        nextBall_velX = nextBall_velX +.05
        nextBall_velY = nextBall_velY +.05
		nextBallRadius=nextBallRadius + deltaBallRadius

    next iii           

    '-------------------------------------------------------------------------
    '... Initialize Rectangles

    var Rect_Centre_i_posX as number
    var Rect_Centre_i_posY as number
    var Rect_X_width as number
    var Rect_Y_height as number
    var mmX as number
    var mmY as number
	
     Rect_Centre_i_posX = 200
     Rect_Centre_i_posY = 200
     Rect_X_width = 32
     Rect_Y_height = 16
     mmX = 16
     mmY = 12	

    for jjj =  1 to numRects 'STEP 1
        
        
        '...adjust Centre Position
        Rect_Centre_i_posX =  Rect_Centre_i_posX+mmX
        Rect_Centre_i_posY =  Rect_Centre_i_posY+mmY

        '...define XY limits
        RposXmin[jjj] = Rect_Centre_i_posX - Rect_X_width/2
        RposXmax[jjj] = Rect_Centre_i_posX + Rect_X_width/2
        RposYmin[jjj] = Rect_Centre_i_posY - Rect_Y_height/2
        RposYmax[jjj] = Rect_Centre_i_posY + Rect_Y_height/2        
        
        RposCenX[jjj] = Rect_Centre_i_posX
        RposCenY[jjj] = Rect_Centre_i_posY
        
        '...define Velocity
        moiRects_VelX[jjj] =  Rect_Centre_i_posX/100 '...or whatever
        moiRects_VelY[jjj] =  Rect_Centre_i_posY/100
            

    next jjj

    '...-------------------------------------------------
    '...Initialize LABELS
    Mov_Rect_Pos_X=0
    Mov_Rect_Pos_Y=0
    MR_dX=0.0
    MR_dY=0.2

''''' old browzic END Function   '...SOW_Init_Play_Objects() 

EndFunction '''''...Function OnLoad()


'----------------------------------------------------------------------------------------------------------------------------------------------------
'                                                                                                            
'     ON UPDATE                    ...should contain delta_time sensitive stuff                              
'                                                                                                            

Function OnUpdate(dt as number)
	
'muppet
	var ZapType as string

	SinceLoadTime = SinceLoadTime + dt	
	'--------------------------------------------------------------------
	if mouse_button_left_drag_Active == true then
		
		if Mouse_Mode_str == "Spray_New_Balls" then
		   
		   if spray_balls_wait_var < spray_balls_wait_const then
				
				spray_balls_wait_var = spray_balls_wait_var + dt
				
		   else '...time to spray a new ball at current mouse position
				
				spray_balls_wait_var = 0
				mouse_event_X = MouseX()
				mouse_event_Y = MouseY()
				
				junk = SOW_make_new_ball (mouse_event_X, mouse_event_Y)
				if junk = false then
					Mouse_Mode_str=""
				endif
		   endif
		
		endif
		
		if Mouse_Mode_str == "Flame_Old_Balls" then
		'msgbox("FLAMING")
		
				'...Get current mouse position
				mouse_event_X = MouseX()
				mouse_event_Y = MouseY()	

				'...Find youngest ball pricked by flaming mouse position and Zap it
				ZapType = "FLAME"
				xxx = SOW_Zap_Ball_at_MousePos(ZapType, mouse_event_X,mouse_event_Y)
				
		endif
		
		if Mouse_Mode_str == "Pop_Old_Balls" then
		
				'...Get current mouse position
				mouse_event_X = MouseX()
				mouse_event_Y = MouseY()			
				'...Find youngest ball pricked by flaming mouse position and Zap it
				ZapType="POP"
				xxx = SOW_Zap_Ball_at_MousePos(ZapType, mouse_event_X,mouse_event_Y)
		
		
		endif
		
	endif

EndFunction '...Function OnUpdate()   
'...                                  


'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'                                                                
'       ON DRAW                                                  
'... this is the callback OnDraw, it is called once per game loop
'... Put all of your drawing commands in here                    

Function OnDraw()


	' GRAFITI
	
	'...Note that the draw order in this function  
	'...dictates the back_to_front order of drawing
	'...draw's issued earlier will be overwritten by draw''s issued later in the function
	''var fred as string
	''fred = "Hello I am fred"
	''var fred_len as number
	''...Attempt to call a function in a JS library fails as compiler doesnt know to pass it thru
	''fred_len = SOW_Len(fred)'...Undeclared function
	''Print (fred_len, 300,300)

 	setColor(0,0,0)
	usr_string = "SinceLoadTime time" + Str$(SinceLoadTime)
	Print (usr_string,300,300)

 	setColor(0,0,0)
	usr_string = "Number of Balls " + Str$(numBalls)
	Print (usr_string,300,400)

	setColor(0,0,0)
	Print("Press P key to purge zapped balls", 400, 400)
	
	usr_string = "This is a quick rough demo of a small part of the capabilities of BrowserBasic"
	Print(usr_string, 400, 200)

	 '''''        '...alert("VelMag = " + VelMag)
	 '''''        usr_string = "VelMag = waiting for codefix" '''+ Str$(VelMag)
	 '''''        Pos_x = 200
	 '''''        Pos_y = 200
	 '''''        Print  (usr_string, Pos_x, Pos_y) ''''',"","")
	 '''''   else If  Decrease_VelMag = IsTrue then
	 '''''        VelMag = VelMag/1.1
	 '''''        Decrease_VelMag = IsFalse         
		'''''	 '...alert("VelMag = " + VelMag)
	 '''''        usr_string = "VelMag = waiting for codefix" '''+ Str$(VelMag)
	 '''''       Pos_x = 200
	 '''''       Pos_y = 200
	 '''''        Print  (usr_string, Pos_x, Pos_y)
	 '''''   else
		'''''	
		'''''	VelMag=1
		'''''	
	 '''''   Endif
	 '''''   endif'....
	 '''''   
 
 
    '-----------------------------------------------------------------
    '...MOVE THE BALLS

 
   ''msgbox("Movin Balls")
   
    '...rad = rad + 0.2 '...0.001
    '...If (rad > 100 ) rad = 1

    '......Loop thru all the Balls
	var Ball_Mood as number
	
    for iii = 1 to numBalls STEP 1      '......NB we ignore item 0 in the array
    
        Ball_Mood = myBalls_Mood[iii] 
        
        If Purge_Zapped_Balls = true AND Ball_Mood = 0 then
        
            myBalls_Mood[iii] =-1 '...mood = -1  means do not display this ball again
        Endif
    
        If Ball_Mood >= 0 then
            
            pos_x = myBalls_PosX[iii]
            pos_y = myBalls_PosY[iii]
            vel_X = myBalls_velX[iii]
            vel_Y = myBalls_velY[iii]
            rad = myBalls_Radius[iii]
          
            '......update Velocities

            If pos_x + vel_X > CANVAS01_WIDTH OR pos_x + vel_X < 0 then   '...reflect velocity off a side wall
              vel_X = 0 - vel_X
            
            Endif 

            If pos_y + vel_Y > CANVAS01_HEIGHT OR pos_y + vel_Y < 0 then '...reflect vertical velocity off top or base wall
              vel_Y = 0 - vel_Y
             
            Endif
			'...
var doBang as number
var ampX as number
var ampY as number
ampX=0.1
ampY=0.1
			'...apply Pop                
			if myBalls_Mood[iii] = 99 then  '...Pop mode jet about, shrink, burst.
				
				rad = rad*0.99
				if rad < 5 then '...purge this ball
					 myBalls_Mood[iii] =-1
					 doBang = true
					 setColor (255,255,255)			
			         FillCircle(pos_x, pos_y, 30)
					 
				endif
				
				ampX=ampX* 5
				ampY=ampY* 5
				vel_X=vel_X*1.001*rand(0.98,1.02)
				vel_Y=vel_Y*1.001*rand(0.98,1.02)
				'VelMag = 1.2
						
			endif
			
            '......update Positions      

            pos_x  = pos_x+vel_X*ampX
            pos_y  = pos_y+vel_Y*ampY

            '......update array values   

            myBalls_PosX[iii] = pos_x
            myBalls_PosY[iii] = pos_y
            myBalls_velX[iii] = vel_X '* VelMag
            myBalls_velY[iii] = vel_Y '* VelMag
            myBalls_Radius[iii] = rad

            '...draw filled colored circle

			
			bRed   = myBalls_FillColor[iii][0]
			bGreen = myBalls_FillColor[iii][1]
			bBlue  = myBalls_FillColor[iii][2]
			
			setColor (bRed,bGreen,bBlue)			
			FillCircle(pos_x, pos_y, rad)
        
			if doBang == true then
				 setColor (0,0,0)			
				 FillCircle(pos_x, pos_y, 30)
				 '**** Need a sound in here !!! ****
			endif
			
        Endif
        
    next iii  '......end of for loop
    
    Purge_Zapped_Balls = IsFalse
    
   '------------------------------------------------------------------------------------------
   '...Move & Plot RECTANGLES
   '                         
 
    
    For jjj =  1 to numRects 'STEP 1
       
        pos_x = RposCenX[jjj]
        pos_y = RposCenY[jjj]
        
        vel_X = moiRects_VelX[jjj]
        vel_Y = moiRects_VelY[jjj]

        '......Update Velocities

        If pos_x + vel_X > CANVAS01_WIDTH OR pos_x + vel_X < 0 then   
          vel_X = 0 - vel_X
        
        Endif '...Endif is not required by JS 

        If pos_y + vel_Y > CANVAS01_HEIGHT OR pos_y + vel_Y < 0 then
          vel_Y = 0 - vel_Y
         
        Endif

        '......update to New Positions
		var dPosX as number
		var dPosY as number
        dPosX = vel_X
        dPosY = vel_Y

        pos_x =  pos_x+dPosX
        pos_y =  pos_y+dPosY

        '......update array values

        RposCenX[jjj] = pos_x
        RposCenY[jjj] = pos_y
        
		''RposXmin[jjj] =0'...is OK
        ''RposXmin[jjj] = RposXmin[jjj] +1 '...bad
		''RposXmin[jjj]=RposCenX[jjj] +1 '...bad
		''RposXmin[jjj]=RposCenX[jjj]'...OK
		'RposXmin[jjj] += 1 '...Expected: Match - = but got: + 
		'RposXmin[jjj] = RposCenX[jjj] + 1 '...Expected: Get Name - Name but got: 0
		
		RposXmin[jjj] = 1 + RposCenX[jjj]'...OK
		
		
		'err RposXmin[jjj] = RposXmin[jjj] + dPosX
        'err RposXmax[jjj] = RposXmax[jjj] + dPosX
        
        'RposYmin[jjj] = RposYmin[jjj] + dPosY
        'RposYmax[jjj] = RposYmax[jjj] + dPosY

		RposXmin[jjj] = dPosX + RposXmin[jjj] 
        RposXmax[jjj] = dPosX + RposXmax[jjj] 
        
        RposYmin[jjj] = dPosY + RposYmin[jjj] 
        RposYmax[jjj] = dPosY + RposYmax[jjj] 

		var pXmin as number
		var pXmax as number
		var pYmin as number
		var pYmax as number

        '***** COMPILER DOESNT LIKE THIS ****
		'pXmin = RposXmin[jjj] + dPosX
        'pXmax = RposXmax[jjj] + dPosX       
        'pYmin = RposYmin[jjj] + dPosY
        'pYmax = RposYmax[jjj] + dPosY

        'RposXmin[jjj] =pXmin 
		'RposXmax[jjj] =pXmax 
		'RposYmin[jjj] =pYmin 
		'RposYmax[jjj] =pYmax 
		
        
        moiRects_VelX[jjj] =  vel_X
        moiRects_VelY[jjj] =  vel_Y 
   
		'...CANARY
		var R_Width as number
		var R_Height as number


       '...Plot small Yellow  Rectangle
       setColor (99,99,0) '''''canvas01_2Dctx.fillStyle = "#555500" ...lemon yellow
	   
       ''''R_Width   =  RposXmax[jjj] - RposXmin[jjj]
	    R_Width   =  RposXmax[jjj]
		R_Width   =  R_Width - RposXmin[jjj]
       
	   ''''R_Height  =  RposYmax[jjj] - RposYmin[jjj]
	   R_Height  =  RposYmax[jjj] 
	   R_Height  = R_Height - RposYmin[jjj]
       
       ''jslibf_DRAW_RECT( RposXmin[jjj], RposYmin[jjj], R_Width, R_Height)
       FillRectangle( RposXmin[jjj], RposYmin[jjj], R_Width, R_Height)
       
	   '...Plot  Red Triangle
		'''''       canvas01_2Dctx.beginPath();
		'''''       canvas01_2Dctx.lineTo (RposXmin[jjj], RposYmin[jjj]);
		'''''       canvas01_2Dctx.lineTo (RposXmax[jjj], RposYmin[jjj]);
		'''''       canvas01_2Dctx.lineTo (RposXmax[jjj], RposYmax[jjj]);
		'''''       canvas01_2Dctx.stroke ();
		'''''       canvas01_2Dctx.closePath ();
			   
		'''''       canvas01_2Dctx.fillStyle = "red";
		'''''       canvas01_2Dctx.fill(); 

    next jjj
   
	'--------------------------------------------------------------------------------------------------------------------------------------
    '... Plot a   Title Banner on the Canvas
    '... as a SINGLE STATIC CYAN RECTANGLE with TEXT 
    
    '...NB as this plotted later than plot objects, it should lie in front of those other objects
    '...set canvas background color for the next draw to canvas command e.g. rect or circle.
    
    'canvas01_2Dctx   fillStyle = "#FAF7F8" ...off white
    'canvas01_2Dctx fillStyle = "#080808" ...Midnight grey
    '''''canvas01_2Dctx.fillStyle = brocol_Cyan 
	
	setColor (0,88,88)

    '''''jslibf_DRAW_RECT(20,20,200,50)...l,t,w,h
	
	FillRectangle(10,20,250,50)
    
    '...Write some Text over the rectangle
    
    '''''canvas01_2Dctx.fillStyle = brocol_Yellow 
	setColor(99,99,0)
    usr_string = "Built with BrowserBasic" 
    Pos_x = 7
    Pos_y = 25
    Tfont = "italic 18px sans-serIf"
    Tcolor = "#FFFF00"
	setColor(0,0,0)
	scale(2,2)
    Print  (usr_string, Pos_x, Pos_y) ''''',Tcolor,Tfont)
    scale(0.5,0.5)
	'Print(".",1,1)
	
   '---------------------------------------------------------------------------------------
   '...Plot a  SINGLE MOVING RECTANGLE in the Canvas                                       
       
	 '''''   var Right_Arrow_Flag as number 
		'''''Right_Arrow_Flag= IsFalse
		'''''var Left_Arrow_Flag as number
		'''''Left_Arrow_Flag= IsFalse
		'''''
	 '''''   If Right_Arrow_Flag = IsTrue then
	 '''''       Mov_Rect_Pos_X = Mov_Rect_Pos_X+10
	 '''''       Right_Arrow_Flag = IsFalse
	 '''''   Endif
	 '''''   
	 '''''   If Left_Arrow_Flag = IsTrue then
	 '''''       Mov_Rect_Pos_X =Mov_Rect_Pos_X + -10
	 '''''       Left_Arrow_Flag = IsFalse
	 '''''   Endif
	 '''''   
    Mov_Rect_Pos_X = Mov_Rect_Pos_X+ MR_dX
	
    If Mov_Rect_Pos_X > CANVAS01_WIDTH then
        Mov_Rect_Pos_X=0
        
    Endif
    
	var UserIPtext as string
	
    Mov_Rect_Pos_Y = Mov_Rect_Pos_Y + MR_dY
	
    If Mov_Rect_Pos_Y > CANVAS01_HEIGHT then
        Mov_Rect_Pos_Y=0
        UserIPtext=""
    Endif
    
    
    '...Paint the Moving Rectangle                                                                      
	
	
    '''''canvas01_2Dctx.fillStyle = "#FFFF00" '...YELLOW    
    '''''jslibf_DRAW_RECT(Mov_Rect_Pos_X,Mov_Rect_Pos_Y,180,50)...l,t,w,h
	setColor(220,190,0)
	FillRectangle(Mov_Rect_Pos_X,Mov_Rect_Pos_Y,180,50)
    
    '...Write some Text over the rectangle
	var Tx as number
	var Ty as number
    Tx = 10+ Int(Mov_Rect_Pos_X) '''''Math.floor(Mov_Rect_Pos_X)
    Ty = 10+ Int(Mov_Rect_Pos_Y) '''''Int(Mov_Rect_Pos_Y) ''''' Math floor(Mov_Rect_Pos_Y)
    
	var sTx as string
	var sTy as string

	sTx = Str$(Tx-10)
	sTy = Str$(Ty-10)	
	
    usr_string = "Yellow Box Pos: " + sTx
	usr_string = usr_string + ","
	usr_string = usr_string + sTy '''''+ sTx + ", Y: " + sTy + "  " + UserIPtext
    '...alert(usr_string)
    ''Tcolor = "#FF00FF" '...MAGENTA
    ''Tfont = "italic 14px sans-serIf" 
	setColor(0,0,0)
    Print  (usr_string, Tx, Ty)''''', Tcolor, Tfont)                
    
	'''endif ''''this is just to satisfy the compiler, i cannot pair it to any actual If statement
	
	'...DRAW BUTTONS                                                              
	
	var Nbstr as string
	Nbstr = Str$(numButtons)
	usr_string ="Number of Buttons" + Nbstr
	print(usr_string, 200,450)
	
	'...Draw MouseMode Indicator       
	junk=SOW_Draw_MouseMode_Indicators()
	
	
	'...Draw all buttons               
	For Bnum = 1 to numButtons
		junk = SOW_Draw_Button(Bnum)
	Next Bnum
	
	
	'...CHECK FOR MOUSE STUFF                                                     
	junk = SOW_Check_For_MouseLeftButtonDepressed()
	

	'...END Function ...end of SOW_MoveAndDraw Function definition

EndFunction '...Function OnDraw()
'=====================================================================================================================================================


'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'                              
'...MOUSE EVENT HANDLERS       
'                              
'                              

'--------------------------------------------------------------------------------------
' SOW CHECK FOR MOUSE LEFT BUTTON DEPRESSED
'                                          

Function SOW_Check_For_MouseLeftButtonDepressed()

	var usr_string as string
	var mxs as string
	var mys as string
	var multX as number
	var multY as number
	
	'setColor(90,90,90)
	'Print("Hello from OnDraw",50,50)
		
	If MousePressed("l") then
		
		
		setColor (255,255,255)

		multX=MouseX()
		multY=MouseY()
		
		mxs=Str$(MouseX())
		mys=Str$(MouseY())	
		'usr_string = "Left mouse button pressed at " + mxs 
		'usr_string = usr_string +  "," 
		'usr_string = usr_string + mys
		'usr_string = "Left mouse button pressed at " + mxs + "," + mys '... ==> ERROR Expected: Get Name - Name but got: 0 
		'...work around ==> no spaces
		usr_string = "Left mouse button pressed at "+mxs+","+mys'... ==> ERROR Expected: Get Name - Name but got: 0 
		mouse_event_Str = "Mouse Button Left Depressed"
		'Print(usr_string, MouseX(),MouseY())
		Print(usr_string, multX,multY)
		
		junk = SOW_Handle_Mouse_Event(multX , multY , mouse_event_Str )
		
		
	EndIf

endfunction '...SOW_Check_For_MouseLeftButtonDepressed 
'...                                                   


'-----------------------------------------------------------------------------------------------------
'  ON MOUSE MOVED      
'                      

Function OnMouseMoved(x as number, y as number) ''...from BB example ex_mouse.txt
	
	'...callback everytime the mouse is moved, SW: any slow down?
	g_mousex = x
	g_mousey = y
	
EndFunction '...OnMouseMoved
'                           

'-----------------------------------------------------------------------------------------------------
'  ON MOUSE RELEASED   
'                      

Function OnMouseReleased(x as number ,y as number, button as string) ''...from BB example ex_mouse.txt
'PANDA
	
	mouse_event_X = x
	mouse_event_Y = y
	
	'msgbox ("Mouse release event code = " + button)
	
	Select button
		Case "l"
			mouse_event_Str = "Mouse_Button_Left_Released"
			'...msgbox("I will now call the Mouse Event Handler...")
			break
		Case "r"
			mouse_event_Str = "Mouse_Button_Right_Released"
			break
		Case "m"
			mouse_event_Str = "Mouse_Button_Middle_Released"
			break
		Case "wd"
			mouse_event_Str = "Mouse_Button_Wheel_PressedDown"
			break
		Case "wu"
			mouse_event_Str = "Mouse_Button_Wheel_ReleasedUp"
			break
	EndSelect
	
	'msgbox("Hi 1")  
	var junk as number
	junk = SOW_Handle_Mouse_Event(mouse_event_X ,mouse_event_Y , mouse_event_Str ) '....dont forget the brackets, and a space before the comment quote!

	'...Does break prevent reaching here?...NO!
	'msgbox("Hi 2, return val=" + xxx)
	
EndFunction '...OnMouseReleased 
'                               


'-----------------------------------------------------------------------------------------------------
'     SOW HANDLE MOUSE EVENT     
'                                

Function SOW_Handle_Mouse_Event(mouse_event_X as number ,mouse_event_Y as number, mouse_event_Str as string)

	'...this excludes simple mouse move events

	'msgbox("Hi 3")
	'msgbox(mouse_event_Str + " at X:" + mouse_event_X+" Y:" +mouse_event_Y + "BZ X 0 to 600  Y: 400 to 600")
	'msgbox("Hi 4")
	'return 4
	
	'...Temp define button zone


	'var numButtons as number
	'numButtons = 1
	'Buttons_Xmin[1]=   0
	'Buttons_Xmax[1]= 600
	'Buttons_Ymin[1]= 400
	'Buttons_Ymax[1]= 600
	


	if mouse_event_Str == "Mouse_Button_Left_Released" then		
		
		mouse_button_left_drag_Active = false

		'...Check for mouse click on a Soft GUI button    
		
		mouse_button_Left_released_softButtonNum = 0
		
		var buzo as number
	
		For buzo = 1 to numButtons
			if mouse_event_X < Buttons_Xmax[buzo] then	
				if mouse_event_X > Buttons_Xmin[buzo] then
					if mouse_event_Y < Buttons_Ymax[buzo] then	
						if mouse_event_Y > Buttons_Ymin[buzo] then	
							
							mouse_button_Left_released_softButtonNum = buzo
							'...the highest numbered button will get the prize if there is conflict due to button zone overlap
							
							junk = SOW_Soft_Button_Click_Handler(mouse_button_Left_released_softButtonNum)						
						endif
					endif
				endif
			endif
		next BuZo	
	else '...some other mouse event than indic by: mouse_event_Str == "Mouse_Button_Left_Released" 	
		if mouse_event_Str = "Mouse Button Left Depressed" then
		
			mouse_button_left_drag_Active = true
			'...effect of this will be determined elsewhere qaccording to current setting of mouse mode
		endif
	endif
	mouse_event_Str = ""
	
Endfunction '...SOW_Handle_Mouse_Event

'----------------------------------------------------------------------------------------------------
'                                                      
'       SOFT BUTTONS            Define, Draw, Handle   
'                                                      
'                                                      


'------------------------------------------------------
'                                                      
'  SOW DEFINE BUTTONS                                  
'                                                      

Function SOW_Define_Buttons()
	
	var qqq as number
	var Blabel as string
	var Bcolor as number
	
	'...there is an ERROR in the BB rgb function
	
	'BcolorON = rgb(215,90,50)   '...215 + 90*255 + 50*255*255
	'BcolorOFF = rgb(55,88,99)   '...55 + 88*255 + 99*255*255
	
	'...WORKAROUND
	BcolorON = SOW_rgb_to_integer(215,90,50)   
	BcolorOFF = SOW_rgb_to_integer(66,66,66)   

	
	'setColor(BcolorON)
	'Print ("Set BcolorON",100,100)
	'msgbox("BcolorON = " + BcolorON + " BcolorOFF = " + BcolorOFF )

	var xxx as number
    Bname   = "B1"
	Blabel  = "SPRAY"
	Bcolor  = SOW_rgb_to_integer(0,90,220) 	
	qqq     =  SOW_Define_Button(Bname,Blabel, Bcolor,100,180,500,600)

	 
    Bname   = "B2"
	Blabel  = "POP"
	Bcolor  = SOW_rgb_to_integer(0,90,220)
	qqq     = SOW_Define_Button(Bname,Blabel, Bcolor,200,280,500,600)
	
	Bname   = "B3"
	Blabel  = "FLAME"
	Bcolor  = SOW_rgb_to_integer(0,90,220)
	qqq     = SOW_Define_Button(Bname,Blabel, Bcolor,300,380,500,600)
	
	Bname   = "B4"
	Blabel  = "PURGE"
	Bcolor  = SOW_rgb_to_integer(0,90,220)
	qqq     = SOW_Define_Button(Bname,Blabel, Bcolor,400,480,500,600)

endfunction '...SOW_Define_Buttons
'...                              
'                                 


'-----------------------------------------------------------------------------------------------------
'   SOW DEFINE BUTTON              
'                                  
Function SOW_Define_Button(Bname as string,Blabel as string, Bcolor as number ,Xmin as number ,Xmax as number ,Ymin as number ,Ymax as number)

	numButtons = numButtons + 1
	
	Bnum = numButtons
	Buttons_Name[Bnum]= Bname
	'...msgbox("Button name:" + Buttons_Name[Bnum])
	
	var Bnom as string
	'Bnom = Buttons_Name[Bnum]  ERROR
	'msgbox("Button name:" + Bnom)
	
	Buttons_Color[Bnum]= Bcolor
	Buttons_Label[Bnum]= Blabel	
	Buttons_Xmin[Bnum]= Xmin
	Buttons_Xmax[Bnum]= Xmax
	Buttons_Ymin[Bnum]= Ymin
	Buttons_Ymax[Bnum]= Ymax
	
	'msgbox("Defined Button with colors ON:" +BcolorON +" OFF:"+BcolorOFF)
	
endfunction '...SOW_Define_Button
'                                


'----------------------------------------------------------------------------------------------------
'                               
' SOW DRAW BUTTON               
'                               

function SOW_Draw_Button(Bnum as number)


	'msgbox("Hi1")
	
	Bcolor = Buttons_Color[Bnum]	
	junk = SOW_Set_Color(Bcolor)   
	
	'--------------------------------------------------------------
	'msgbox("Hi2")
	Xmin = Buttons_Xmin[Bnum]
	Ymin = Buttons_Ymin[Bnum]
	Xmax = Buttons_Xmax[Bnum]
	Ymax = Buttons_Ymax[Bnum]
	
	Bwidth = Xmax - Xmin
	Bheight = Ymax - Ymin
	
	FillRectangle(Xmin,Ymin,Bwidth,Bheight)
	setColor(0,0,0)
'dolphin	
	TposX = Buttons_Xmin[Bnum]+4
	TposY = Buttons_Ymin[Bnum]+24
	'Bname = Buttons_Name[Bnum]
	'Print (Bname,TposX,TposY)
	Print (Buttons_Label[Bnum],TposX,TposY)

	
	'msgbox("Hi3")

EndFunction '...SOW_Draw_Button    
'                                  
'                                  

'---------------------------------------------------------------------
'      SOW_Draw_MouseMode_Indicators                                  
'                                                                     

Function SOW_Draw_MouseMode_Indicators()

	if Mouse_Mode_num==0 then

		'...draw no indicator
	else

		Bcolor = Buttons_Color[Mouse_Mode_num]	
		''junk = SOW_Set_Color(Bcolor)   				
		setColor(250,200,0)
		Xmin = Buttons_Xmin[Mouse_Mode_num]-5
		Ymin = Buttons_Ymin[Mouse_Mode_num]-5
		Xmax = Buttons_Xmax[Mouse_Mode_num]+5
		Ymax = Buttons_Ymax[Mouse_Mode_num]+5	
		Bwidth = Xmax - Xmin
		Bheight = Ymax - Ymin				
		FillRectangle(Xmin,Ymin,Bwidth,Bheight)
		'setColor(0,0,0)
		'TposX = Xmin+4
		'TposY = Ymin+24
		'Print (Mouse_Mode_str,TposX,TposY)		
	endif
   
   

endfunction   '...   SOW_Draw_MouseMode_Indicators                    
'                                                                     



'------------------------------------------------------------------------------------------------------------------------
'                                          
'   SOW SOFT BUTTON CLICK HANDLER          
'                                          

Function SOW_Soft_Button_Click_Handler( Bnum as number)
	
		If Bnum = Mouse_Mode_num then
			Mouse_Mode_num=0
			Mouse_Mode_str =""
		else
		
				If Bnum == 1 then
					Mouse_Mode_num = 1 
					Mouse_Mode_str = "Spray_New_Balls" 
					nextBallRadius = 3
				endif
				
				if Bnum == 2 then
					Mouse_Mode_num = 2
					Mouse_Mode_str = "Pop_Old_Balls" 
				endif

				if Bnum == 3 then
					Mouse_Mode_num = 3
					Mouse_Mode_str = "Flame_Old_Balls" 
				endif

				if Bnum == 4 then
					Mouse_Mode_num = Mouse_Mode_num
					Purge_Zapped_Balls = true
					Mouse_Mode_str = Mouse_Mode_str
				endif

			endif


		
		'...play sound
		SoundPlay(sndDing)
	
	
	'...re-drawing will be done by the OnDraw loop anyway using SOW_Draw_Button
	
		



endfunction '...SOW_Soft_Button_Click_Handler()
'...                                           





'----------------------------------------------------------------------------------------------------
'   ON KEY PRESSED        Handler callback that gets triggered anytime a key is pressed              
'                                                                                                    

Function OnKeyPressed(key as string, code as number)

	'msgbox("You pressed key with code=" +STR$(code))
	
	'...Change color of balls
	'for iii = 1 to numBalls
	'	if myBalls_Mood[iii] > 0 then
	'		myBalls_FillColor[iii][0] = code+iii
	'		myBalls_FillColor[iii][1] = code*2+iii
	'		myBalls_FillColor[iii][2] = code*3+iii
	'	endif
	'next iii

	var code_P as number
	code_P = 80
	
	if code = code_P then
	
		Purge_Zapped_Balls = true
	endif
	
	'...play sound
	SoundPlay(sndDing)
	


EndFunction '...OnKeyPressed
'...                        


'-------------------------------------------------------------------
'  MESSING ABOUT  
'            	  

'-------------------------------------------------------------------
Function Junk()
   var $fred as number '...ok
   $fred=12'...ok
   
	junk = $Alex(12)
	
endfunction

'-------------------------------------------------------------------
Function $Alex(Anum as number) 

 print ("Hello from Alex",1,1)
 
endfunction

'-------------------------------------------------------------------
'    SOW MAKE NEW BALL           
'                                

Function SOW_make_new_ball (mouseX as number,mouseY as number)

	if numBalls == maxNumBalls then
	    setColor(255,125,0)
		msgbox("Reached Maximum Number of Balls")
	    print ("Reached Maximum Number of Balls", 700,100)
		return false

	else
		'...Check mouse pos is within the desired box
	ELLA	
	var Point_In_Box as number
	
		Point_In_Box = SOW_Check_if_2Dpoint_Inside_2Dbox(mouseX,mouseY,0,CANVAS01_WIDTH ,0,CANVAS01_HEIGHT)
		
		'(Px as number,Py as number,BXmin as number,BXmax as number,BYmin as number,BYmax as number)
		
		if Point_In_Box == true then
		
			iii =  numBalls + 1    
			numBalls = iii

			myBalls_PosX[iii] = mouseX   
			myBalls_PosY[iii] = mouseY  
			myBalls_velX[iii] = nextBall_velX   
			myBalls_velY[iii] = nextBall_velY   
			myBalls_Radius[iii] =  nextBallRadius
			myBalls_Mood[iii] = 1
			
			bRed   = Int(255*mouseX/CANVAS01_WIDTH)
			bGreen = Int(iii+100*mouseY/CANVAS01_HEIGHT)
			bBlue  = Int(0.5* bRed + 0.3* bGreen)

			
			myBalls_FillColor[iii][0] = bRed 
			myBalls_FillColor[iii][1] = bGreen 
			myBalls_FillColor[iii][2] = bBlue
			
			'...increment the initial values for the next ball

			nextBall_velX = nextBall_velX +.05
			nextBall_velY = nextBall_velY +.05
			nextBallRadius = nextBallRadius + deltaBallRadius
		
		endif '...xxx = true
		
	endif   '...numBalls == maxNumBalls
            

endfunction '...SOW_make_new_ball
'...                             

'-------------------------------------------------------------------------------
'                      
'   SOW SET COLOR      
'                      

Function SOW_Set_Color(Bcolor as number)  	

	 var rr as number
	 var gg as number
	 var gg1 as number
	 var gg2 as number
	 var bb as number
	 var bb1 as number
	 var bb2 as number

	 
	'...convert from number into separate R G and B
	'...whereas inbuilt BB function rgb(255,0,255) gives a unicolor code
	sow_colorBits_colorBits = sow_colorBits * sow_colorBits
	rr = int(Bcolor/sow_colorBits_colorBits)
	gg1 = rr*sow_colorBits_colorBits
	gg2 = Bcolor - gg1
	gg = int(gg2/sow_colorBits)
	bb1 = gg*sow_colorBits	
	bb2 = rr*sow_colorBits_colorBits
	bb = Bcolor - bb1 - bb2
	
	'msgbox("Bcolor="+ Bcolor + " RGB are " + rr + "," + gg + "," + bb)
	setColor(rr,gg,bb)

endfunction '...SOW_Set_Color
'                            



'-------------------------------------------------------------------
'                                                                   
' SOW COLORINT TO RGB                                               

Function SOW_ColorInt_to_RGB(colorInt as number)
	'...convert from number into separate R G and B
	'...whereas inbuilt BB function rgb(255,0,255) gives a unicolor code
	
 var gg1 as number
 var rr0 as number
 var gg0 as number
 var gg1 as number
 var gg2 as number
 var bb0 as number
 var bb1 as number
 var bb2 as number
 var RGB_Out_str as string
	
	sow_colorBits_colorBits = sow_colorBits * sow_colorBits
	rr0 = int(colorInt/sow_colorBits_colorBits)
	gg1 = rr0*sow_colorBits_colorBits
	gg2 = colorInt - gg1
	gg0 = int(gg2/sow_colorBits)
	bb1 = gg0*sow_colorBits	
	bb2 = rr0*sow_colorBits_colorBits
	bb0 = colorInt - bb1 - bb2
	
	

    RGB_Out_str = " ==> R_"+Str$(rr0)+"_G_"+Str$(gg0)+"_B_"+Str$(bb0)
	'msgbox("colorInt="+ colorInt + " ==> " + RGB_Out_str)
	
	'...cannot return a string in BB at present return RGB_Out_str
	'...so pop the value into a global variable
	SOW_ColorInt_to_RGB_OUTstr=RGB_Out_str

endfunction ' SOW COLORINT TO RGB 
'                                 



'-------------------------------------------------------------------
'                                                                   
'  SOW RGB TO INTEGER                                               
'                                                                   

Function SOW_rgb_to_integer(rr as number, gg as number, bb as number)   

	var RGB_number as number
	var gg1 as number
	var rred1 as number
	
	rred1      = rr*256*256
	gg1        = gg*256
	RGB_number = rred1+gg1+bb

    return RGB_number

endfunction '...     SOW RGB TO INTEGER  
'                                        

'NEW STUFF                                       
'-------------------------------------
'... SOW_Check_if_2Dpoint_Inside_2Dbox
'                                     

function SOW_Check_if_2Dpoint_Inside_2Dbox(Px as number,Py as number,BXmin as number,BXmax as number,BYmin as number,BYmax as number)
    
	var Point_Inside_Box as number
    Point_Inside_Box=false
    if Px > BXmin AND Px < BXmax then   '...Point Xpos is within Box Xpos limits 
        if Py > BYmin AND Py < BYmax then '...Point Ypos is within Box Ypos limits 
             Point_Inside_Box = true
        endif
    endif
    return Point_Inside_Box

ENDFUNCTION '...SOW_Check_if_2Dpoint_Inside_2Dbox 

'-----------------------------
' SOW_Zap_Ball_at_MousePos              
'                             

function SOW_Zap_Ball_at_MousePos(ZapType as string, Mxxx as number,Myyy as number)

                var fff as number
				var iii as number
				var Any_Zaps as number
				Any_Zaps = false
				var searchDone as number
                searchDone = false
				fff=0
                    
                    '//...Go thru all balls and see if any contain this click point in their disc area
                    '//...if so set their color to black
                    '...Javascript code should turn out like this..........for (iii=1;iii<=numBalls;iii++)
                      
					  while searchDone = false

					  
						  fff = fff + 1
                          iii = numBalls - fff + 1 '...start with the youngest balls
						  
                                                            
							var Ball_Rad as number
							var BallPos_X as number
							var BallXmin as number
							var BallXmax as number
							var BallPos_Y as number
							var BallYmin as number
							var BallYmax as number          
								
								Ball_Rad  = myBalls_Radius[iii]								
                                BallPos_X = myBalls_PosX[iii]
                                BallXmin = BallPos_X - Ball_Rad
                                BallXmax = BallPos_X + Ball_Rad                                   
                                BallPos_Y = myBalls_PosY[iii]
                                BallYmin = BallPos_Y - Ball_Rad
                                BallYmax = BallPos_Y + Ball_Rad
								var Point_Inside_BallBox as number                                       
                                Point_Inside_BallBox = false
                                Point_Inside_BallBox = SOW_Check_if_2Dpoint_Inside_2Dbox (Mxxx,Myyy,BallXmin,BallXmax,BallYmin,BallYmax)
                                

                                 if Point_Inside_BallBox == true then
								 
									if ZapType = "FLAME" then
										if myBalls_Mood[iii] > 0 then '....ZAP IT!!!
                                    
											searchDone = true
											myBalls_Mood[iii] = 0        '...= Zapped
											myBalls_FillColor[iii][0]=0 
											myBalls_FillColor[iii][1]=0
											myBalls_FillColor[iii][2]=0
											
											Any_Zaps   = true
											
										endif
                                    endif
									
									if ZapType = "POP" then
										if myBalls_Mood[iii] > 0 then '...only POP live balls
											searchDone = true
											myBalls_Mood[iii] = 99
											myBalls_FillColor[iii][0]=255 
											myBalls_FillColor[iii][1]=0
											myBalls_FillColor[iii][2]=0
										endif
									endif
									
								endif '...Point_Inside_BallBox == true 

								if fff = numBalls then
									searchDone = true
								endif
								
                        endwhile '...searchDone = false
			

endfunction '... SOW_Zap_Ball_at_MousePos       
'...                                                 
                                      