I would take a look at this page on the Codex:
http://codex.wordpress.org/Class_Reference/WP_Query
I think you need to override your query_posts() for your landing page, and controlling different queries with if() statements, depending on what areas of a form (guessing you’re using a form?) has filled in. For example:
// Carry pagination through
$args = array(
'paged' => ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1
);
// Check if 'story-type' was searched for
if ( !empty( $_POST['story_type'] ) )
$args['story-type'] = $_POST['story_type'];
// Check if 'story-tags' was searched for
if ( !empty( $_POST['story_tags'] ) )
$args['story-tags'] = $_POST['story_tags'];
// Check if a year was selected
if ( !empty( $_POST['date_year'] ) )
$args['year'] = $_POST['date_year'];
// Check if a month was selected
if ( !empty( $_POST['date_month'] ) )
$args['month'] = $_POST['date_month'];
// Override $wp_query
query_posts( $args );
The sorting is done in the same way – check out ‘order’ and ‘orderby’.