The thing to understand here is that OnItemLoad is triggered for each row in the repeater, so it does not get triggered at all if filter returns no rows, and OnItemLoad is where you are setting the count.
(As an aside, this filtering model is more complicated than it needs to be. The filter depends on the values of multiple global variables, when you could be using local variables in the filter. For example, your code sets a global variable when a checkbox is checked so your filter knows its checked state, but you could just as easily examine the selected state of this checkbox directly in the filter using a local variable. You can ignore this for now, but your code would be much easier to debug that way.)
The thing you are doing that you should absolutely avoid doing is forcing the repeater to re-evaluate its filter by reloading the page. (E.g., on clicking the Submit button.) Instead, force the repeater to re-evaluate its filter by executing a do-nothing command on a repeater. (E.g., set the current page of the repeater to 1, or execute a Delete rows command that deletes no rows, like “Delete rows in repeater where [[false]]”. A filter, once created, remains in effect until it is deleted.
So instead of reloading the page to force the filter to re-evaluate, you can do the following:
On Click (of submit button)
Set text on Count to 0
Set items per page of (repeater) to 1
The first command sets Count to 0 in case OnItemLoad never executes.
The second command forces the repeater to re-evaluate its filter.