function [X, matext] = crp_plugin(x, y, m, t, e, mflag, hCRP, plugin_path, silent)
% CRP_PLUGIN   Loads and executes the extern plugin
%    Used by CRP Toolbox

% Copyright (c) 2005-2006 by AMRON
% Norbert Marwan, Potsdam University, Germany
% http://www.agnld.uni-potsdam.de
%
% $Date$
% $Revision$
%
% $Log$
% Revision 4.4  2006/02/14 11:46:53  marwan
% dimension and delay for plugin released
%
% Revision 4.3  2006/02/06 14:44:36  marwan
% plugin support for order patterns
%
% Revision 4.2  2005/04/15 09:03:03  marwan
% minor bugfix in plugin section
%
% Revision 4.1  2005/04/08 09:03:53  marwan
% plugin added
%
%
%
% This program 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 any later version.

global errcode

X = []; matext = '';

try

      tmp_xdatafile  = tempname;
      tmp_ydatafile  = tempname;
      tmp_rpdatafile = tempname;
      if ~silent, set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Export Data'),drawnow, end
      save(tmp_xdatafile,'x','-ascii','-tabs');
      if ~isequal(x,y), save(tmp_ydatafile,'y','-ascii','-tabs'); end
      
      % prepare the arguments for the external plugin
      if ~silent, set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Recurrence Points'),drawnow, end
      m_str = {'MAX', 'EUC', 'MIN', 'NR', 'FAN', 'IN', 'OM', 'OP', 'EUC'};
      dis_sign = 1; if mflag == 9, dis_sign = -1; end

      unix_str = [plugin_path,filesep,rp_plugin,' -m ',num2str(m), ...
                                    ' -t ',num2str(t), ...
                                    ' -e ',num2str(dis_sign * e), ...
                                    ' -n ',m_str{mflag}, ...
                                    ' -w ',num2str(0), ...
                                    ' -i ',tmp_xdatafile];
      if ~isequal(x,y)
          unix_str = [unix_str,' -j ',tmp_ydatafile];
      end
      
      unix_str = [unix_str,' -r ',tmp_rpdatafile, ...
                                    ' -f TIF', ...
                                    ' -s'];
      
      % call the external plugin
      system(unix_str);
      
      % import rp
      if ~silent, set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Import Recurrence Points'),drawnow, end
      X = imread(tmp_rpdatafile);
      X = (double(X)/double(max(X(:))));

      delete(tmp_rpdatafile);
      delete(tmp_xdatafile);
      if ~isequal(x,y), delete(tmp_ydatafile); end
      
      if ~silent, set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Plot Recurrence Points'),drawnow, end

      switch mflag
      %%%%%%%%%%%%%%%%% maximum norm
        case 1
          errcode=111;
          matext=[num2str(round(100*e)/100) '\sigma (fixed distance maximum norm)'];
      %%%%%%%%%%%%%%%%% euclidean norm
        case 2
          errcode=112;
          matext=[num2str(round(100*e)/100) '\sigma (fixed distance euclidean norm)'];
      %%%%%%%%%%%%%%%%% minimum norm
        case 3
          errcode=113;
          matext=[num2str(round(100*e)/100) '\sigma (fixed distance minimum norm)'];
      %%%%%%%%%%%%%%%%% order patterns
        case 8
          errcode=118;
          matext='';
      %%%%%%%%%%%%%%%%% global RP
        case 9
          errcode=119;
          X = X * ( max([max(x), max(y)]) - min([min(x), min(y)]) );
          matext='';
      end

catch   
  warning off
  delete(tmp_rpdatafile);
  delete(tmp_xdatafile);
  delete(tmp_ydatafile);
  warning on
end
