I'd go for both client and serverside movement. the serverside movement should depend on the keystates on the client, and, if you're good, calculate the ping into it somehow. then the position should be sent back to the client who then checks how different the server side movement was. Shooting is more complicated, you once sent me the link where they explained how css did it, with the server using the ping to calculate if the trace the client sends out would have hit something if the sending of packets were instant. I'd attempt to go for that method, if you want to make it real accurate, even though it's a pain: you'll have to remember the positions of the players during the past second or so to make sure all clients have an equal chance of hitting something, even when their shot arrives late on the server.

as for movement: send keystates from client to server and let both calculate the movement. then send back the positions from the server to all clients. let the client who's playing the character check if his movement was correct, and let all other clients simply interpolate and predict what position will be next, depending either on the last positions or on the keystates that the client sends. The animations I'd do entirely locally, I don't think you'd even need to send animation states or types, instead check in what direction the player moved during the last frame and play the corresponding animation.

Just my idea.
Good luck.


~"I never let school interfere with my education"~
-Mark Twain