Ok, you seem to be unnecessarily looking for the submit -- which, laughably, your trapping 'onsubmit' may actually be screwing with. I would check if the file exists as I said above, or a hidden input for checking the form, instead of the submit and it's value.
Of course, I'd also swing a giant axe at that idiotic MESS of error overrides. IF you have to override an error with the @ sign, you are doing things WRONG.
That said, your lack of sensible formatting had me backtracking to the wrong if statement -- the one with all those error overrides is the one that's failing.... and part of that could be that ['type'] is an array, so if there's just one upload it should be ['type']...
OH, and you shouldn't rely on ['size'] actually existing, not all servers report it on uploads.
ASSUMING ['size'] works...
($_FILES['image']['size'] < 2097152) &&
'image/jpeg', 'image/png', 'image/jpg', 'image/gif'
MIGHT work, but really I'd do a
echo '<pre>', print_r($_FILES), '</pre>';
First to make sure all those values you are trying to check even exist.