function varargout=sompak_rb_control(str)

%SOMPAK_RB_CONTROL  An auxiliary function for SOMPAK_*_GUI functions.
%
% This is an auxiliary function for SOMPAK_GUI, SOMPAK_INIT_GUI, 
% SOMPAK_SAMMON_GUI and SOMPAK_TRAIN_GUI functions. It controls the 
% radio buttons in the GUIs.
%  
% See also SOMPAK_GUI, SOMPAK_INIT_GUI, SOMPAK_SAMMON_GUI, SOMPAK_TRAIN_GUI.

% Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas
% Copyright (c) by Juha Parhankangas
% http://www.cis.hut.fi/projects/somtoolbox/

% Juha Parhankangas 050100

data=get(gcf,'UserData');
switch str
  case {'rand','linear'}
   h=cat(2,findobj(get(gcf,'Children'),'Tag','RANDOM'),...
	   findobj(get(gcf,'Children'),'Tag','LINEAR'));
   set(h,'Value',0);
   set(gcbo,'Value',1);
   data.inittype=str;
  case {'bubble','gaussian'}
   h=cat(2,findobj(get(gcf,'Children'),'Tag','BUBBLE'),...
           findobj(get(gcf,'Children'),'Tag','GAUSSIAN'));
   set(h,'Value',0);
   set(gcbo,'Value',1);
   data.neigh=str;
  case {'hexa','rect'}
   h=cat(2,findobj(get(gcf,'Children'),'Tag','HEXA'),...
           findobj(get(gcf,'Children'),'Tag','RECT'));
   set(h,'Value',0);
   set(gcbo,'Value',1);
   data.topol=str;
  case {'out_ft'}
   value=get(gcbo,'Value');
   switch value
     case 1
      h=findobj(get(gcf,'Children'),'Tag','OUT_FILE');
      data.out_file_type='';
      set(h,'String','');
     case 2
      data.out_file_type='box';
     case 3
      data.out_file_type='pak';
   end
  case {'input_ft'}
   value=get(gcbo,'Value');
   switch value
     case 1
      data.input_file_type='';
     case 2
      data.input_file_type='box';
     case 3
      data.input_file_type='pak';
   end
  case {'map_ft'}
   value=get(gcbo,'Value');
   switch value
     case 1
      data.map_type='';
     case 2
      data.map_type='box';
     case 3
      data.map_type='pak';
   end
  case {'out_file'}
   if isempty(data.out_file_type)
     data.out_file='';
     h=findobj(get(gcf,'Children'),'Tag','OUT_FILE');
     set(h,'String','');
   else
     data.out_file=get(findobj(get(gcf,'Children'),'Tag','OUT_FILE'),'String');
     if isempty(data.out_file)
       h=findobj(get(gcf,'Children'),'Tag','OUT_FILE_TYPE');
       set(h,'Value',1);
     end
   end

  case {'out_var'}
   h=findobj(get(gcf,'Children'),'Tag','OUT_VAR');
   if ~isempty(get(h,'String'))
     data.out_var=get(h,'String');
   else
     data.out_var=[];
     set(h,'String','''ans''');
   end
  case {'xdim'}
   h=findobj(get(gcf,'Children'),'Tag','XDIM');
   data.xdim=str2num(get(h,'String'));
  case {'ydim'}
   h=findobj(get(gcf,'Children'),'Tag','YDIM');
   data.ydim=str2num(get(h,'String'));
  case {'radius'}
   h=findobj(get(gcf,'Children'),'Tag','RADIUS');
   data.radius=str2num(get(h,'String'));
  case {'data'}
   h=findobj(get(gcf,'Children'),'Tag','DATA');
   data.data=get(h,'String');
  case {'rlen'}
   h=findobj(get(gcf,'Children'),'Tag','RLEN');
   data.rlen=str2num(get(h,'String'));
  case {'alpha'}
   h=findobj(get(gcf,'Children'),'Tag','ALPHA');
   data.alpha=str2num(get(h,'String'));
  case {'map'}
   h=findobj(get(gcf,'Children'),'Tag','MAP');
   data.map=get(h,'String');
  case 'init_ok'
   if isempty(data.xdim) | ~is_positive_integer(data.xdim)
     errordlg('Argument ''xdim'' must be positive integer.');
     return;
   end
   if isempty(data.ydim) | ~is_positive_integer(data.ydim)
     errordlg('Argument ''ydim'' must be positive integer.');
     return;
   end
   if isempty(data.data)
     errordlg('Argument ''Workspace data'' must be a string.');
     return;
   end

   if isempty(data.input_file_type)
     sData=evalin('base',data.data);
   else 
     sData=data.data;
   end
   if isempty(data.out_file)
     if ~isempty(data.out_file_type)
       errordlg('Argument ''Output file'' is not defined.');
       return;
     end
     data.out_file=[];
   end
   answer=sompak_init(sData,...
                      data.input_file_type,...
                      data.inittype,...
                      data.out_file,...
                      data.out_file_type,...
                      data.xdim,...
                      data.ydim,...
                      data.topol,...
                      data.neigh);
   if any(strcmp(data.out_var,{'ans','''ans'''})) | isstr(answer)
     varargout{1}=answer; 
   else
     assignin('base',data.out_var,answer);
     disp(sprintf('Map is set to workspace as ''%s''.',data.out_var));
   end
   close(findobj(get(0,'Children'),'Tag','InitGUI'));
   return;
  case 'train_ok'
   if isempty(data.rlen) | ~is_positive_integer(data.rlen)
     errordlg('Argument ''Running Length'' must be positive integer.');
     return;
   end
   if isempty(data.alpha) | data.alpha <= 0
     errordlg('Argument ''Initial Alpha Value'' must be a positive float.');
     return;
   end
   if isempty(data.radius) | data.radius <= 0
     errordlg('Argument ''Neighborhood Radius'' must be a positive float.');
     return;
   end
   if isempty(data.data)
     errordlg('Argument ''Teaching Data'' must be a string.');
     return;
   end
   if isempty(data.input_file_type)
     sData=evalin('base',data.data);
   else 
     sData=data.data;
   end
   if isempty(data.out_file);
     data.outfile = [];
   end
   if isempty(data.map)
     errordlg('Argument ''Workspace Map'' must be a string.');
     return;
   end
   if isempty(data.map_type)
     sMap=evalin('base',data.map);
   else
     sMap=data.map;
   end

   answer=sompak_train(sMap,...
                       data.map_type,...
                       data.out_file,...
                       data.out_file_type,...
                       data.data,...
                       data.input_file_type,...
                       data.rlen,...
                       data.alpha,...
                       data.radius);
   if any(strcmp(data.out_var,{'''ans''','ans'})) | isstr(answer)
     varargout{1}=answer;
   else
     assignin('base',data.out_var,answer);
     disp(sprintf('Map is set to workspace as ''%s''.',data.out_var));
   end
   close(findobj(get(0,'Children'),'Tag','TrainGUI')); 
   return;
  case 'sammon_ok'
   if isempty(data.map)
    errordlg('Argument ''Workspace Map'' must be a string.');
    return;
   end
   if isempty(data.map_type)
     sMap=evalin('base',data.map);
   else
     sMap=data.map;
   end
   if isempty(data.out_file);
     data.outfile = [];
   end
   answer=sompak_sammon(sMap,...
                        data.map_type,...
                        data.out_file,...
                        data.out_file_type,...
                        data.rlen);
   if strcmp(data.out_var,'''ans''')|strcmp(data.out_var,'ans')|isstr(answer)
     varargout{1}=answer;
   else
     assignin('base',data.out_var,answer);
     disp(sprintf('Codebook is set to workspace as ''%s''.',data.out_var));
   end
   close(findobj(get(0,'Children'),'Tag','SammonGUI')); 
   return;
end

set(gcf,'UserData',data);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function bool = is_positive_integer(x)

bool = ~isempty(x) & isreal(x) & all(size(x) == 1) & x > 0;
if ~isempty(bool)
  if bool & x~=round(x)
    bool = 0;
  end
else
  bool = 0;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%