<?php
# MantisBT - A PHP based bugtracking system

# MantisBT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# MantisBT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with MantisBT.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Set cookie for View all bugs page
 *
 * @package MantisBT
 * @copyright Copyright 2000 - 2002  Kenzaburo Ito - kenito@300baud.org
 * @copyright Copyright 2002  MantisBT Team - mantisbt-dev@lists.sourceforge.net
 * @link http://www.mantisbt.org
 *
 * @uses core.php
 * @uses authentication_api.php
 * @uses config_api.php
 * @uses constant_inc.php
 * @uses custom_field_api.php
 * @uses error_api.php
 * @uses filter_api.php
 * @uses filter_constants_inc.php
 * @uses gpc_api.php
 * @uses helper_api.php
 * @uses html_api.php
 * @uses logging_api.php
 * @uses print_api.php
 * @uses utility_api.php
 */

require_once( 'core.php' );
require_api( 'authentication_api.php' );
require_api( 'config_api.php' );
require_api( 'constant_inc.php' );
require_api( 'custom_field_api.php' );
require_api( 'error_api.php' );
require_api( 'filter_api.php' );
require_api( 'filter_constants_inc.php' );
require_api( 'gpc_api.php' );
require_api( 'helper_api.php' );
require_api( 'html_api.php' );
require_api( 'logging_api.php' );
require_api( 'print_api.php' );
require_api( 'utility_api.php' );

auth_ensure_user_authenticated();

$f_type					= gpc_get_int( 'type', -1 );
$f_source_query_id		= gpc_get_int( 'source_query_id', -1 );
$f_print				= gpc_get_bool( 'print' );
$f_make_temporary		= gpc_get_bool( 'temporary' );

if( $f_make_temporary && $f_type < 0 ) {
	$f_type = 1;
}

if( $f_type < 0 ) {
	print_header_redirect( 'view_all_bug_page.php' );
}

# -1 is a special case stored query: it means we want to reset our filter
if( ( $f_type == 3 ) && ( $f_source_query_id == -1 ) ) {
	$f_type = 0;
}

# Get the filter in use
$t_setting_arr = current_user_get_bug_filter();
$t_temp_filter = $f_make_temporary || filter_is_temporary( $t_setting_arr );
$t_previous_temporary_key = filter_get_temporary_key( $t_setting_arr );

# If user is anonymous, force the creation of a temporary filter
if( current_user_is_anonymous() ) {
	$t_temp_filter = true;
}


# Clear the source query id.  Since we have entered new filter criteria.
if( isset( $t_setting_arr['_source_query_id'] ) ) {
	unset( $t_setting_arr['_source_query_id'] );
}

switch( $f_type ) {
	# New cookie
	case '0':
		log_event( LOG_FILTERING, 'view_all_set.php: New cookie' );
		$t_setting_arr = array();
		break;
	# Update filters. (filter_gpc_get reads a new set of parameters)
	case '1':
		$t_setting_arr = filter_gpc_get();
		break;
	# Set the sort order and direction (filter_gpc_get is called over current filter)
	case '2':
		log_event( LOG_FILTERING, 'view_all_set.php: Set the sort order and direction.' );
		$t_setting_arr = filter_gpc_get( $t_setting_arr );

		break;
	# This is when we want to copy another query from the
	# database over the top of our current one
	case '3':
		log_event( LOG_FILTERING, 'view_all_set.php: Copy another query from database' );

		$t_setting_arr = filter_get( $f_source_query_id, null );
		if( null === $t_setting_arr ) {
			# couldn't get the filter, if we were trying to use the filter, clear it and reload
			error_proceed_url( 'view_all_set.php?type=0' );
			trigger_error( ERROR_FILTER_NOT_FOUND, ERROR );
			exit;
		} else {
			$t_setting_arr['_source_query_id'] = $f_source_query_id;
		}
		break;
	case '4':
		# Generalise the filter
		log_event( LOG_FILTERING, 'view_all_set.php: Generalise the filter' );

		$t_setting_arr[FILTER_PROPERTY_CATEGORY_ID]			= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_REPORTER_ID] 		= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_HANDLER_ID] 			= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_BUILD] 				= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_VERSION] 			= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_PRIORITY]			= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_FIXED_IN_VERSION]	= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_TARGET_VERSION]		= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_MONITOR_USER_ID] 	= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_NOTE_USER_ID]  		= array( META_FILTER_ANY );
		$t_setting_arr[FILTER_PROPERTY_RELATIONSHIP_TYPE] = -1;
		$t_setting_arr[FILTER_PROPERTY_RELATIONSHIP_BUG] 	= 0;

		$t_custom_fields 		= custom_field_get_ids(); # @@@ (thraxisp) This should really be the linked ids, but we don't know the project
		$t_custom_fields_data 	= array();
		if( is_array( $t_custom_fields ) && ( count( $t_custom_fields ) > 0 ) ) {
			foreach( $t_custom_fields as $t_cfid ) {
				$t_custom_fields_data[$t_cfid] =  array( META_FILTER_ANY );
			}
		}
		$t_setting_arr['custom_fields'] = $t_custom_fields_data;

		break;
	case '5':
		# Just set the search string value (filter_gpc_get is called over current filter)
		log_event( LOG_FILTERING, 'view_all_set.php: Search Text' );
		$t_setting_arr = filter_gpc_get( $t_setting_arr );
		break;
	case '6':
		# Just set the view_state (simple / advanced) value. (filter_gpc_get is called over current filter)
		log_event( LOG_FILTERING, 'view_all_set.php: View state (simple/advanced)' );
		$t_setting_arr = filter_gpc_get( $t_setting_arr );

		break;
	default:
		# does nothing. catch all case
		log_event( LOG_FILTERING, 'view_all_set.php: default - do nothing' );
		break;
}

$t_setting_arr = filter_ensure_valid_filter( $t_setting_arr );

# If only using a temporary filter, don't store it in the database
if( !$t_temp_filter ) {
	# Store the filter string in the database: its the current filter, so some values won't change
	filter_set_project_filter( $t_setting_arr );
}

# redirect to print_all or view_all page
if( $f_print ) {
	$t_redirect_url = 'print_all_bug_page.php';
} else {
	$t_redirect_url = 'view_all_bug_page.php';
}

if( $t_temp_filter ) {
	# keeping the $t_previous_temporary_key, and using it to save back the filter
	# The key inside the filter array may have been deleted as part of some actions
	# Note, if we reset the key here, a new filter will be created after each action.
	# This adds a lot of orphaned filters to session store, but would allow consistency
	# through browser back button, for example.
	$t_temporary_key = filter_temporary_set( $t_setting_arr, $t_previous_temporary_key );
	$t_redirect_url = $t_redirect_url . '?' . filter_get_temporary_key_param( $t_temporary_key );
}
print_header_redirect( $t_redirect_url );
