For the first two questions:
Account-based triggers are hard to come by. One thing you could do is create a formula field in Salesforce that says If Account has an Opportunity, make equal to 1 (else 0). Then use that field as your trigger (data value changes) or a batch (Account Opportunity = 1), then it will affect all contacts that are part of that account.
For number three:
A little harder and my head hurts 🙂