function idx = tests2idx(db, dim_num, tests)

% tests2idx - Find dimension indices from a test names/numbers specification.
%
% Usage:
% idx = tests2idx(db, dim_num, tests)
%
% Description:
%
%   Parameters:
%	db: A tests_db object.
%	dim_num: Number between 1-3 to choose dimension: row, column, or page.
%	tests: Either a single or array of column numbers, or a single
%		test name or a cell array of test names. If ':', all
%		tests. For name strings, regular expressions are
%		supported if quoted with slashes (e.g., '/a.*/')
%		
%   Returns:
%	idx: Array of column indices.
%
% Example:
% >> cols = tests2idx(a_db, 2, {'col1', '/col2+/'});
% will return indices of col1 and columns like col2, col22, col22, etc.
%
% See also: tests_db, tests2cols, regexp
%
% $Id$
%
% Author: Cengiz Gunay <cgunay@emory.edu>, 2004/10/07

% Copyright (c) 2007 Cengiz Gunay <cengique@users.sf.net>.
% This work is licensed under the Academic Free License ("AFL")
% v. 3.0. To view a copy of this license, please look at the COPYING
% file distributed with this software or visit
% http://opensource.org/licenses/afl-3.0.php.

% note: page_idx only exists in tests_3D_db
%dim_name_str = struct('row', 1, 'col', 2, 'page', 3);

if ~ isnumeric(dim_num) || dim_num < 1 || dim_num > 3
  error('dim_num must be within [1,3]');
end

dim_names = {'row', 'col', 'page'};
dim_name = dim_names{dim_num};

%strmatch(dim_name, possible_dim_names, 'exact');
% $$$ try 
% $$$   dim_num = dim_name_str.(dim_name);
% $$$ catch
% $$$   % sanity check
% $$$   %if isempty(dim_num)
% $$$   lasterror
% $$$   names = strcat(fieldnames(dim_name_str)', ', ')';
% $$$   error([ 'dim_name "' dim_name '" not recognized. It can only be one of these: ' ...
% $$$           strcat(names{:}) '.' ] );
% $$$ end


% Parse tests
idx = [];
if ischar(tests) && strcmp(tests, ':')
  idx = 1:dbsize(db, dim_num);
elseif islogical(tests)
  idx = find(tests);
elseif isnumeric(tests) 
  idx = tests;
elseif ischar(tests)
  ind_struct = db.([ dim_name '_idx']);
  % check if regexp first
  if tests(1) == '/'
    idx = findRegExpIdx(tests, fieldnames(ind_struct)');
  else
    idx = getfuzzyfield(ind_struct, tests, NaN, 1);
    if isempty(idx) || isnan(idx)
      error(['Field ''' tests ''' not found in db']);
    end
  end
elseif iscell(tests)
  tests={tests{:}}; % add by Li Su, change the array to a row vector.
  ind_struct = db.([ dim_name '_idx']);
  all_names = fieldnames(ind_struct);
  for test1=tests
    test = test1{1}; % unwrap the cell
    if ischar(test)
      if test(1) == '/'
        ind = findRegExpIdx(test, all_names');
      else
        ind = getfuzzyfield(ind_struct, test, NaN, 1);
        if isempty(ind) || isnan(ind)
          error(['Field ''' test ''' not found in db']);
        end
      end
    elseif isnumeric(test)
      ind = test;
    else
      display(test);
      error('Test not recognized.');
    end

    idx = [idx, ind];
  end
else
  error(['tests can either be '':'', column number or array of numbers,'...
	 ' column name or cell array of names.']);
end