Indexes, indexes, indexes.
There are a couple of enhancements I would recommend.
1) It looks like you use a few scalar functions. Can these be optimized by making them into a table or cte of values that can be referenced instead of executing on each row. Can these values be cached in a variable that can be used later on thus removing all the round trips and selections done on each row.
2) Are your tables and more importantly the values in the where clause in any indexes? If not get those tables indexed.
3) You are using nested queries. Consider moving to temp or cte tables for joining to and not using nested statements.
4) Use
SQL Sentry Plan Explorer[
^] By looking at a more detailed query plan you can ascertain many optimization routes or problems that need to be addressed within the query.