function out=conn_importspm(spmfiles)
% Imports experiment info from SPM.mat files
%

global CONN_x;
if nargin>0,
    if ~iscell(spmfiles),spmfiles=cellstr(spmfiles);end
    nsubjects=length(spmfiles);
    if nsubjects~=CONN_x.Setup.nsubjects, CONN_x.Setup.nsubjects=conn_merge(CONN_x.Setup.nsubjects,nsubjects); end
    for nsub=1:nsubjects,
        filename=fliplr(deblank(fliplr(deblank(spmfiles{nsub}))));
        CONN_x.Setup.spm{nsub}=conn_file(filename);
    end
end
%CONN_x.Setup.nsessions=zeros(1,CONN_x.Setup.nsubjects);
changed=0;err=0;
for nsub=1:CONN_x.Setup.nsubjects,
	if ~isempty(CONN_x.Setup.spm{nsub}{1}), 
		%try,
        spmfile=load(CONN_x.Setup.spm{nsub}{1});
        if isfield(spmfile.SPM,'xBF')&&isfield(spmfile.SPM.xBF,'UNITS'),
            units=spmfile.SPM.xBF.UNITS;
            if strcmp(units,'scans'), units=1;
            elseif strcmp(units,'secs'), units=2;
            else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': invalid SPM.xBF.UNITS value (assuming scans)']); err=err+1; end
        else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.xBF.UNITS not found (assuming scans)']); units=1; err=err+1; end
        if isfield(spmfile.SPM,'xY')&&isfield(spmfile.SPM.xY,'RT'), CONN_x.Setup.RT=spmfile.SPM.xY.RT; else, disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.xY.RT not found (leaving unchanged)']); err=err+1; end
        if ~isfield(spmfile.SPM,'nscan'), disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': SPM.nscan not found (stopped importing for this subject)']); err=err+1;
        else,
            nsess=length(spmfile.SPM.nscan);
            CONN_x.Setup.nsessions(nsub)=nsess;
            for nses=1:nsess,
                idx=spmfile.SPM.Sess(nses).row;
                filename=fliplr(deblank(fliplr(deblank(spmfile.SPM.xY.P(idx,:)))));
                switch(filesep),case '\',idx=find(filename=='/');case '/',idx=find(filename=='\');end; filename(idx)=filesep;
                n=0; while n<size(filename,1),
                    ok=conn_existfile(filename(n+1,:));
                    if ok, n=n+1;
                    else
                        if changed,
                            fullnamematch=strvcat(fliplr(fullname1),fliplr(fullname2));
                            m=sum(cumsum(fullnamematch(1,:)~=fullnamematch(2,:))==0);
                            m1=max(0,length(fullname1)-m); m2=max(0,length(fullname2)-m);
                            %filename=strvcat(filename(1:n,:),[repmat(fullname2(1:m2),[size(filename,1)-n,1]),filename(n+1:end,m1+1:end)]);
                            filenamet=strvcat(filename(1:n,:),[fullname2(1:m2),filename(n+1,m1+1:end)],filename(n+2:end,:));
                            if ~conn_existfile(filenamet(n+1,:)), askthis=1;
                            else
                                try
                                    disp(['conn_importspm: updating reference from ',deblank(filename(n+1,:)),' to ',deblank(filenamet(n+1,:))]);
                                    [V,str,icon]=conn_getinfo(deblank(filenamet(n+1,:)));
                                    askthis=0;filename=filenamet;
                                catch
                                    askthis=1;
                                end
                            end
                        else askthis=1;
                        end
                        if askthis,
                            disp(['conn_importspm: file ',deblank(filename(n+1,:)),' not found']);
                            fullname1=deblank(filename(n+1,:));
                            [pathname1,name1,ext1,num1]=spm_fileparts(fullname1);
                            name2='';
                            while ~strcmp(name2,[name1,ext1])
                                disp(['File not found: ',name1,ext1]);
                                [name2,pathname2]=uigetfile(['*',ext1],['File not found: ',name1,ext1],['*',name1,ext1]);
                            end
                            if all(name2==0), filename=[]; break; end
                            fullname2=fullfile(pathname2,[name2,num1]);
                            changed=1;
                            fullnamematch=strvcat(fliplr(fullname1),fliplr(fullname2));
                            m=sum(cumsum(fullnamematch(1,:)~=fullnamematch(2,:))==0);
                            m1=max(0,length(fullname1)-m); m2=max(0,length(fullname2)-m);
                            filename=strvcat(filename(1:n,:),[fullname2(1:m2),filename(n+1,m1+1:end)],filename(n+2:end,:));
                        end
                    end
                end
                [filename1_path,filename1_name,filename1_ext,filename1_num]=spm_fileparts(filename(1,:));
                filename1=fullfile(filename1_path,[filename1_name,filename1_ext]);
                [V,str,icon]=conn_getinfo(filename);
                CONN_x.Setup.functional{nsub}{nses}={filename,str,icon};
                CONN_x.Setup.nscans{nsub}{nses}=numel(V);
                if isfield(CONN_x.Setup','spmascovariate')&&CONN_x.Setup.spmascovariate
                    if isfield(spmfile.SPM.Sess(nses),'col')&&~isempty(spmfile.SPM.Sess(nses).col)
                        name='SPM effects';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.xX.X(spmfile.SPM.Sess(nses).row,spmfile.SPM.Sess(nses).col)};
                    end
                    if isfield(spmfile.SPM.Sess(nses),'C')&&~isempty(spmfile.SPM.Sess(nses).C.C)
                        name='SPM covariates';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.Sess(nses).C.C};
                    elseif ~isempty(dir(conn_prepend('rp_',filename1,'.txt'))),
                        name='realignment';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('rp_',filename1,'.txt'));
                    end
                else
                    nconditions=length(spmfile.SPM.Sess(nses).U);
                    for ncondition=1:nconditions,
                        name=spmfile.SPM.Sess(nses).U(ncondition).name{1};
                        idx=strmatch(name,CONN_x.Setup.conditions.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.conditions.names); CONN_x.Setup.conditions.names{end+1}=' '; end
                        CONN_x.Setup.conditions.names{idx}=name;
                        if units==2,
                            CONN_x.Setup.conditions.values{nsub}{idx}{nses}{1}=spmfile.SPM.Sess(nses).U(ncondition).ons;
                            CONN_x.Setup.conditions.values{nsub}{idx}{nses}{2}=spmfile.SPM.Sess(nses).U(ncondition).dur;
                        else,
                            CONN_x.Setup.conditions.values{nsub}{idx}{nses}{1}=(spmfile.SPM.Sess(nses).U(ncondition).ons-0)*CONN_x.Setup.RT;
                            CONN_x.Setup.conditions.values{nsub}{idx}{nses}{2}=spmfile.SPM.Sess(nses).U(ncondition).dur*CONN_x.Setup.RT;
                        end
                    end
                    
                    if isfield(spmfile.SPM.Sess(nses),'C')&&~isempty(spmfile.SPM.Sess(nses).C.C)
                        name='SPM covariates';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}={'[raw values]',[],spmfile.SPM.Sess(nses).C.C};
                    elseif ~isempty(dir(conn_prepend('rp_',filename1,'.txt'))),
                        name='realignment';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('rp_',filename1,'.txt'));
                    end
                    if ~isempty(dir(conn_prepend('art_regresion_outliers_',filename1,'.mat'))),
                        name='ART covariates';
                        idx=strmatch(name,CONN_x.Setup.l1covariates.names,'exact');
                        if isempty(idx), idx=length(CONN_x.Setup.l1covariates.names); CONN_x.Setup.l1covariates.names{end+1}=' '; end
                        CONN_x.Setup.l1covariates.names{idx}=name;
                        CONN_x.Setup.l1covariates.files{nsub}{idx}{nses}=conn_file(conn_prepend('art_regresion_outliers_',filename1,'.mat'));
                    end
                end
            end
            if nsub==CONN_x.Setup.nsubjects, % fills possible empty conditions for each subject/session
                nconditions=length(CONN_x.Setup.conditions.names)-1;
                for nsub2=1:nsub,
                    nsess=CONN_x.Setup.nsessions(nsub2);
                    for ncondition=1:nconditions
                        for nses=1:nsess
                            if numel(CONN_x.Setup.conditions.values{nsub2})<ncondition||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition})<nses||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses})<1,
                                CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses}{1}=[];
                            end
                            if numel(CONN_x.Setup.conditions.values{nsub2})<ncondition||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition})<nses||numel(CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses})<2,
                                CONN_x.Setup.conditions.values{nsub2}{ncondition}{nses}{2}=[];
                            end
                        end
                    end
                end
            end
        end
	%catch,
	%	disp(['warning: importing from ',CONN_x.Setup.spm{nsub}{1},': unexpected error (stopped importing for this subject)']); 
	%	err=err+1;
	%	disp(lasterr);
	%end
    end
end
if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, 
    if ~err, uiwait(msgbox([num2str(CONN_x.Setup.nsubjects),' subjects imported with no errors'],'Done'));
    else, uiwait(msgbox(['Import finished with ',num2str(err),' errors'],'WARNING!')); end
end
if nargout,out=CONN_x;end
end

function out=conn_existfile(filename)
[filepath,filename,fileext,filenum]=spm_fileparts(deblank(filename));
try
    out=spm_existfile(fullfile(filepath,[filename,fileext]));
catch
    out=~isempty(dir(fullfile(filepath,[filename,fileext])));
end
end