 
             var pos:FlxPoint;
 
-            //Handle input.
-            if (FlxG.keys.justPressed("SPACE") && player.x == curBase.x && player.y == curBase.y)
-            { //run the filling animation
+            /* -- Input Handling --
+                deals with keyboard events and mouse events.
+                This lets controls be either keyboard or mouse or even touchscreen.
+            */
+
+            var pressedTapper:Boolean = !isFilling && player.x == curBase.x && player.y == curBase.y && 
+                                            (FlxG.keys.SPACE || (FlxG.mouse.pressed() &&
+                                                taps[barNum].overlapsPoint(FlxG.mouse.x, FlxG.mouse.y)));
+
+            var releasedTapper:Boolean = isFilling && (FlxG.keys.justReleased("SPACE") || FlxG.mouse.justReleased());
+
+            var canceledTapper:Boolean = isFilling && FlxG.mouse.pressed() && !taps[barNum].overlapsPoint(FlxG.mouse.x, FlxG.mouse.y);
+            
+            var choseTapUp:Boolean = !isSwitching && (FlxG.keys.justPressed("UP") || (FlxG.mouse.pressed() && 
+                                                            taps[(barNum + 3) % 4].overlapsPoint(FlxG.mouse.x, FlxG.mouse.y)));
+
+            var choseTapDown:Boolean = !isSwitching && (FlxG.keys.justPressed("DOWN") || (FlxG.mouse.pressed() && 
+                                                            taps[(barNum + 1) % 4].overlapsPoint(FlxG.mouse.x, FlxG.mouse.y)));
+
+            var goLeft:Boolean = player.x > curBar.left && (FlxG.keys.LEFT || (FlxG.mouse.pressed() && FlxG.mouse.x < player.x));
+            var goRight:Boolean = player.x < curBase.x && (FlxG.keys.RIGHT || (FlxG.mouse.pressed() && FlxG.mouse.x > player.right));
+
+            //run the filling animation
+            if (pressedTapper) //(FlxG.keys.justPressed("SPACE") && player.x == curBase.x && player.y == curBase.y)
+            {
                 isFilling=true;
                 taps[barNum].play("filling");
                 player.frame=11;
-            }
-            if (isFilling && !taps[barNum].finished && FlxG.keys.justReleased("SPACE"))
-            { //mug didn't fill - player let go of tap too early.
+                player.facing = FlxSprite.RIGHT;
+            }
+            //mug didn't fill - player let go of tap too early or canceled.
+            if ((releasedTapper && !taps[barNum].finished) || canceledTapper) //(isFilling && !taps[barNum].finished && FlxG.keys.justReleased("SPACE"))
+            { 
                 player.frame=0;
                 taps[barNum].frame=0;
                 isFilling=false;
             }
-            else if (isFilling && FlxG.keys.justReleased("SPACE"))
-            { //run the throwing animation, and throw a mug.
+            //run the throwing animation, and throw a mug.
+            else if (releasedTapper) //(isFilling && FlxG.keys.justReleased("SPACE"))
+            { 
                 player.play("throwing");
                 taps[barNum].frame=0;
                 isFilling=false;

                        //object that isn't in play. 
                        pos = patronPositions[i];
                        var patron:Patron = curPatrons.getFirstAvail() as Patron;
                        if (!patron) //I don't think this will ever be run,
                        { // now that maximum patrons for each bar are deployed from the start.
                            //there isn't one available, so make a new one with right props
                            patron = new Patron(pos.x, pos.y, curBar.left, curBar.right);

            //create bar background
            add(new FlxSprite(0, 0, BarSprite));

            //FlxG.mouse.hide();

            //set life count
            lifeCounter = new FlxText(400, 5, 200, lives.toString());
