Diff of /eeglab.m [000000] .. [422372]

Switch to side-by-side view

--- a
+++ b/eeglab.m
@@ -0,0 +1,2274 @@
+% eeglab() - Matlab graphic user interface environment for 
+%   electrophysiological data analysis incorporating the ICA/EEG toolbox 
+%   (Makeig et al.) developed at CNL / The Salk Institute, 1997-2001. 
+%   Released 11/2002- as EEGLAB (Delorme, Makeig, et al.) at the Swartz Center 
+%   for Computational Neuroscience, Institute for Neural Computation, 
+%   University of California San Diego (http://sccn.ucsd.edu/). 
+%   User feedback welcome: email eeglab@sccn.ucsd.edu
+%
+% Authors: Arnaud Delorme and Scott Makeig, with substantial contributions
+%   from Colin Humphries, Sigurd Enghoff, Tzyy-Ping Jung, plus
+%   contributions from Tony Bell, Te-Won Lee, Luca Finelli and many 
+%   other contributors. 
+%
+% Description:
+%   EEGLAB is Matlab-based software for processing continuous or event-related 
+%   EEG or other physiological data. It is designed for use by both novice and 
+%   expert Matlab users. In normal use, the EEGLAB graphic interface calls 
+%   graphic functions via pop-up function windows. The EEGLAB history mechanism 
+%   can save the resulting Matlab calls to disk for later incorporation into 
+%   Matlab scripts.  A single data structure ('EEG') containing all dataset 
+%   parameters may be accessed and modified directly from the Matlab commandline. 
+%   EEGLAB now recognizes "plugins," sets of EEGLAB functions linked to the EEGLAB
+%   main menu through an "eegplugin_[name].m" function (Ex. >> help eeplugin_besa.m). 
+%
+% Usage: 1) To (re)start EEGLAB, type
+%            >> eeglab           % Ignores any loaded datasets
+%            >> eeglab nogui     % Do not pop up GUI
+%        2) To redaw and update the EEGLAB interface, type
+%            >> eeglab redraw    % Scans for non-empty datasets
+%            >> eeglab rebuild   % Closes and rebuilds the EEGLAB window
+%            >> eeglab versions  % State EEGLAB version number
+%
+%   >> type "LICENSE"           % the EEGLAB open source license
+%   >> web http://eeglab.org    % the EEGLAB tutorial
+%   >> help eeg_checkset        % the EEG dataset structure
+%
+% GUI Functions calling eponymous processing and plotting functions:
+% ------------------------------------------------------------------
+% <a href="matlab:helpwin pop_eegfilt">pop_eegfilt</a>   - bandpass filter data (eegfilt())
+% <a href="matlab:helpwin pop_eegplot">pop_eegplot</a>   - scrolling multichannel data viewer (eegplot())
+% <a href="matlab:helpwin pop_eegthresh">pop_eegthresh</a> - simple thresholding method (eegthresh())
+% <a href="matlab:helpwin pop_envtopo">pop_envtopo</a>   - plot ERP data and component contributions (envtopo())
+% <a href="matlab:helpwin pop_epoch">pop_epoch</a>     - extract epochs from a continuous dataset (epoch())
+% <a href="matlab:helpwin pop_erpimage">pop_erpimage</a>  - plot single epochs as an image (erpimage())
+% <a href="matlab:helpwin pop_jointprob">pop_jointprob</a> - reject epochs using joint probability (jointprob())
+% <a href="matlab:helpwin pop_loadbva">pop_loadbva</a>   - load Brain Vision Analyser matlab files
+% <a href="matlab:helpwin pop_plotdata">pop_plotdata</a>  - plot data epochs in rectangular array (plotdata())
+% <a href="matlab:helpwin pop_readegi">pop_readegi</a>   - load binary EGI data file (readegi())
+% <a href="matlab:helpwin pop_rejkurt">pop_rejkurt</a>   - compute data kurtosis (rejkurt())
+% <a href="matlab:helpwin pop_rejtrend">pop_rejtrend</a>  - reject EEG epochs showing linear trends  (rejtrend())
+% <a href="matlab:helpwin pop_resample">pop_resample</a>  - change data sampling rate (resample())
+% <a href="matlab:helpwin pop_rmbase">pop_rmbase</a>    - remove epoch baseline (rmbase())
+% <a href="matlab:helpwin pop_runica">pop_runica</a>    - run infomax ICA decomposition (runica())
+% <a href="matlab:helpwin pop_newtimef">pop_newtimef</a>  - event-related time-frequency (newtimef())
+% <a href="matlab:helpwin pop_timtopo">pop_timtopo</a>   - plot ERP and scalp maps  (timtopo())
+% <a href="matlab:helpwin pop_topoplot">pop_topoplot</a>  - plot scalp maps (topoplot())
+% <a href="matlab:helpwin pop_snapread">pop_snapread</a>  - read Snapmaster .SMA files (snapread())
+% <a href="matlab:helpwin pop_newcrossf">pop_newcrossf</a> - event-related cross-coherence (newcrossf())
+% <a href="matlab:helpwin pop_spectopo">pop_spectopo</a>  - plot all channel spectra and scalp maps (spectopo())
+% <a href="matlab:helpwin pop_plottopo">pop_plottopo</a>  - plot a data epoch in a topographic array (plottopo())
+% <a href="matlab:helpwin pop_readedf">pop_readedf</a>   - read .EDF EEG data format (readedf())
+% <a href="matlab:helpwin pop_headplot">pop_headplot</a>  - plot a 3-D data scalp map (headplot())
+% <a href="matlab:helpwin pop_reref">pop_reref</a>     - re-reference data (reref())
+% <a href="matlab:helpwin pop_signalstat">pop_signalstat</a> - plot signal or component statistic (signalstat())
+%
+% Other GUI functions:
+% -------------------
+% <a href="matlab:helpwin pop_chanevent">pop_chanevent</a>      - import events stored in data channel(s)
+% <a href="matlab:helpwin pop_comments">pop_comments</a>       - edit dataset comment ('about') text
+% <a href="matlab:helpwin pop_compareerps">pop_compareerps</a>    - compare two dataset ERPs using plottopo()
+% <a href="matlab:helpwin pop_prop">pop_prop</a>           - plot channel or component properties (erpimage, spectra, map)
+% <a href="matlab:helpwin pop_copyset">pop_copyset</a>        - copy dataset
+% <a href="matlab:helpwin pop_dispcomp">pop_dispcomp</a>       - display component scalp maps with reject buttons
+% <a href="matlab:helpwin pop_editeventfield">pop_editeventfield</a> - edit event fields
+% <a href="matlab:helpwin pop_editeventvals">pop_editeventvals</a>  - edit event values
+% <a href="matlab:helpwin pop_editset">pop_editset</a>        - edit dataset information
+% <a href="matlab:helpwin pop_export">pop_export</a>         - export data or ica activity to ASCII file
+% <a href="matlab:helpwin pop_expica">pop_expica</a>         - export ica weights or inverse matrix to ASCII file
+% <a href="matlab:helpwin pop_icathresh">pop_icathresh</a>      - choose rejection thresholds (in development)
+% <a href="matlab:helpwin pop_importepoch">pop_importepoch</a>    - import epoch info ASCII file
+% <a href="matlab:helpwin pop_importevent">pop_importevent</a>    - import event info ASCII file
+% <a href="matlab:helpwin pop_importpres">pop_importpres</a>     - import Presentation info file
+% <a href="matlab:helpwin pop_importev2">pop_importev2</a>      - import Neuroscan ev2 file
+% <a href="matlab:helpwin pop_loadset">pop_loadset</a>        - load dataset
+% <a href="matlab:helpwin pop_mergeset">pop_mergeset</a>       - merge two datasets
+% <a href="matlab:helpwin pop_rejepoch">pop_rejepoch</a>       - reject pre-identified epochs in a EEG dataset
+% <a href="matlab:helpwin pop_rejspec">pop_rejspec</a>        - reject based on spectrum (computes spectrum -% eegthresh)
+% <a href="matlab:helpwin pop_saveh">pop_saveh</a>          - save EEGLAB command history
+% <a href="matlab:helpwin pop_saveset">pop_saveset</a>        - save dataset
+% <a href="matlab:helpwin pop_select">pop_select</a>         - select data (epochs, time points, channels ...)
+% <a href="matlab:helpwin pop_selectevent">pop_selectevent</a>    - select events
+% <a href="matlab:helpwin pop_subcomp">pop_subcomp</a>        - subtract components from data
+%
+% Non-GUI functions use for handling the EEG structure:
+% ----------------------------------------------------
+% <a href="matlab:helpwin eeg_checkset">eeg_checkset</a>       - check dataset parameter consistency
+% <a href="matlab:helpwin eeg_context">eeg_context</a>        - return info about events surrounding given events
+% <a href="matlab:helpwin pop_delset">pop_delset</a>         - delete dataset
+% <a href="matlab:helpwin pop_editoptions">pop_editoptions</a>    - edit the option file
+% <a href="matlab:helpwin eeg_emptyset">eeg_emptyset</a>       - empty dataset
+% <a href="matlab:helpwin eeg_epochformat">eeg_epochformat</a>    - convert epoch array to structure
+% <a href="matlab:helpwin eeg_eventformat">eeg_eventformat</a>    - convert event array to structure
+% <a href="matlab:helpwin eeg_getepochevent">eeg_getepochevent</a>  - return event values for a subset of event types
+% <a href="matlab:helpwin eeg_global">eeg_global</a>         - global variables
+% <a href="matlab:helpwin eeg_multieegplot">eeg_multieegplot</a>   - plot several rejections (using different colors)
+% <a href="matlab:helpwin eeg_options">eeg_options</a>        - option file
+% <a href="matlab:helpwin eeg_rejsuperpose">eeg_rejsuperpose</a>   - use by rejmenu to superpose all rejections
+% <a href="matlab:helpwin eeg_rejmacro">eeg_rejmacro</a>       - used by all rejection functions
+% <a href="matlab:helpwin pop_rejmenu">pop_rejmenu</a>        - rejection menu (with all rejection methods visible)
+% <a href="matlab:helpwin eeg_retrieve">eeg_retrieve</a>       - retrieve dataset from ALLEEG
+% <a href="matlab:helpwin eeg_store">eeg_store</a>          - store dataset into ALLEEG
+%
+% Help functions:
+% --------------
+% <a href="matlab:helpwin eeg_helpadmin">eeg_helpadmin</a>      - help on admin function
+% <a href="matlab:helpwin eeg_helphelp">eeg_helphelp</a>       - help on help
+% <a href="matlab:helpwin eeg_helpmenu">eeg_helpmenu</a>       - EEG help menus
+% <a href="matlab:helpwin eeg_helppop">eeg_helppop</a>        - help on pop_ and eeg_ functions
+% <a href="matlab:helpwin eeg_helpsigproc">eeg_helpsigproc</a>    - help on
+
+% Copyright (C) 2001 Arnaud Delorme and Scott Makeig, Salk Institute,
+% arno@salk.edu, smakeig@ucsd.edu.
+%
+% Copyright (C) 2001 Arnaud Delorme, SCCN/INC/UCSD, arno@salk.edu
+%
+% This file is part of EEGLAB, see http://www.eeglab.org
+% for the documentation and details.
+%
+% Redistribution and use in source and binary forms, with or without
+% modification, are permitted provided that the following conditions are met:
+%
+% 1. Redistributions of source code must retain the above copyright notice,
+% this list of conditions and the following disclaimer.
+%
+% 2. Redistributions in binary form must reproduce the above copyright notice,
+% this list of conditions and the following disclaimer in the documentation
+% and/or other materials provided with the distribution.
+%
+% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+% THE POSSIBILITY OF SUCH DAMAGE.
+
+function varargout = eeglab( onearg )
+
+persistent warningShowed;
+
+ver = version;
+if strcmpi(ver, '9.4.0.813654 (R2018a)')
+    disp('Link to install <a href="https://www.mathworks.com/downloads/web_downloads/download_update?release=R2018a&s_tid=ebrg_R2018a_2_1757132">2018a Update 2</a>');
+    errordlg( [ 'You are running Matlab version R2018a, which has important bugs' 10 'Matlab crashes when running EEGLAB in this version of Matlab' 10 'Install 2018a Update 2 to fix the issue (link on the command line)' ]);
+end
+
+if nargout > 0
+    varargout = { [] [] 0 {} [] };
+end
+
+% Warning if in toolbox folder
+% ----------------------------
+if isempty(warningShowed)
+    filterPath = fileparts(fileparts(fileparts(which('filter'))));
+    eeglabPath = fileparts(fileparts(which('eeglab')));
+    if ~isempty(strfind(filterPath, eeglabPath))
+        fprintf(2, 'Warning: Either you added the EEGLAB path with subfolders or the EEGLAB path is in the MATLAB toolbox\n');
+        fprintf(2, '         folder which is not recommended. You may experience errors if a plugin overloads a MATLAB function.\n');
+        fprintf(2, '         If you have added path with subfolders, remove all the EEGLAB path except the root EEGLAB path. \n');
+        fprintf(2, '         If EEGLAB is in the toolbox software, move it somewhere else. Then restart MATLAB and EEGLAB. \n');
+        fprintf(2, '\n');
+    end    
+    warningShowed = true;
+end
+
+% check Matlab version
+% --------------------
+vers = version;
+vers = version;
+indp = find(vers == '.');
+if str2num(vers(indp(1)+1)) > 1, vers = [ vers(1:indp(1)) '0' vers(indp(1)+1:end) ]; end
+indp = find(vers == '.');
+vers = str2num(vers(1:indp(2)-1));
+tmpv = which('version');
+if ~isempty(findstr(lower(tmpv), 'biosig'))
+    [tmpp, ~] = fileparts(tmpv);
+    rmpath(tmpp);
+end
+% remove freemat folder if it exist
+tmpPath = fileparts(fileparts(which('sread')));
+newPath = fullfile(tmpPath, 'maybe-missing', 'freemat3.5');
+if exist(newPath) == 7
+    warning('off', 'MATLAB:rmpath:DirNotFound');
+    rmpath(newPath)
+    warning('on', 'MATLAB:rmpath:DirNotFound');
+end
+if ismatlab && vers < 7
+    tmpWarning = warning('query', 'backtrace');
+    warning('off', 'backtrace');
+    warning('This Matlab version is too old to run the current EEGLAB');
+    warning('Download EEGLAB 4.3b at http://sccn.ucsd.edu/eeglab/eeglab4.5b.teaching.zip');
+    warning('This version of EEGLAB is compatible with all Matlab version down to Matlab 5.3');
+    warning(tmpWarning.state, 'backtrace');
+    return;
+end
+if ismatlab && vers < 7.06
+    tmpWarning = warning('query','backtrace');
+    warning off backtrace;
+    warning('You are using a Matlab version older than 7.6 (2008a)');
+    warning('Some of the EEGLAB functions might not be functional');
+    warning('Download EEGLAB 4.3b at http://sccn.ucsd.edu/eeglab/eeglab4.5b.teaching.zip');
+    warning('This version of EEGLAB is compatible with all Matlab version down to Matlab 5.3');
+    warning( tmpWarning.state, 'backtrace');
+end 
+if ~ismatlab
+    warning('off', 'Octave:abbreviated-property-match');
+    warning('off', 'Octave:legacy-function');
+    warning('off', 'Octave:num-to-str');
+    warning('off', 'backtrace');
+    warning('off', 'Octave:divide-by-zero');
+    try
+        pkg load statistics
+    catch
+        warning('Statistics module not found - type "pkg install -forge io" then "pkg install -forge statistics" to install it');
+    end
+    try
+        pkg load signal
+    catch
+        warning('Signal processing module not found - type "pkg install -forge control" then "pkg install -forge signal" to install it');
+    end
+end
+
+% check potential issues with strjoin
+% -----------------------------------
+strjoinPath = fileparts(which('strjoin'));
+[~,strjoinPath2] = fileparts(strjoinPath);
+if ~strcmpi(strjoinPath2, 'strfun')
+    warning(sprintf('Potential function conflict for strjoin.m located in "%s" \nWe suggest removing the path from MATLAB to avoid problems.', strjoinPath));
+end
+
+% check for duplicate versions of EEGLAB
+% --------------------------------------
+eeglabpath = mywhich('eeglab.m');
+eeglabpath = eeglabpath(1:end-length('eeglab.m'));
+if nargin < 1 && ~isdeployed
+    eeglabpath2 = '';
+    if strcmpi(eeglabpath, pwd) || strcmpi(eeglabpath(1:end-1), pwd) 
+        cd('functions');
+        warning('off', 'MATLAB:rmpath:DirNotFound');
+        rmpath(eeglabpath);
+        warning('on', 'MATLAB:rmpath:DirNotFound');
+        eeglabpath2 = mywhich('eeglab.m');
+        cd('..');
+    else
+        try rmpath(eeglabpath); catch, end
+        eeglabpath2 = mywhich('eeglab.m');
+    end
+    if ~isempty(eeglabpath2)
+        eeglabpath2 = eeglabpath2(1:end-length('eeglab.m'));
+        tmpWarning = warning('query', 'backtrace'); 
+        warning off backtrace;
+        disp('******************************************************');
+        warning('There are at least two versions of EEGLAB in your path');
+        warning(sprintf('One is at %s', eeglabpath));
+        warning(sprintf('The other one is at %s', eeglabpath2));
+        warning(tmpWarning.state, 'backtrace'); 
+    end
+    addpath(eeglabpath);
+end
+
+% add the paths
+% -------------
+if strcmpi(eeglabpath, './') || strcmpi(eeglabpath, '.\'), eeglabpath = [ pwd filesep ]; end
+
+% solve BIOSIG problem
+% --------------------
+pathtmp = mywhich('wilcoxon_test');
+if ~isempty(pathtmp)
+    try
+        rmpath(pathtmp(1:end-15));
+    catch, end
+end
+
+% test for local SCCN copy
+% ------------------------
+if ~isdeployed
+    addpathifnotinlist(eeglabpath);
+    if exist( fullfile( eeglabpath, 'functions', 'adminfunc') ) ~= 7
+        warning('EEGLAB subfolders not found');
+    end
+end
+
+% determine file format
+% ---------------------
+fileformat = 'maclinux';
+comp = computer;
+try
+    if strcmpi(comp(1:3), 'GLN') || strcmpi(comp(1:3), 'MAC') || strcmpi(comp(1:3), 'SOL')
+        fileformat = 'maclinux';
+    elseif strcmpi(comp(1:5), 'pcwin')
+        fileformat = 'pcwin';
+    end
+end
+
+% add paths
+% ---------
+if ~isdeployed
+    tmp = which('eeglab_data.set');
+    if ~isempty(which('eeglab_data.set')) && ~isempty(which('Standard-10-10-Cap47.ced'))
+        tmpWarning = warning('query', 'backtrace');
+        warning off backtrace;
+        warning(sprintf([ '\n\nPath Warning: It appears that you have added the path to all of the\n' ...
+            'subfolders to EEGLAB. This may create issues with some EEGLAB extensions\n' ...
+            'If EEGLAB cannot start or your experience a large number of warning\n' ...
+            'messages, remove all the EEGLAB paths then go to the EEGLAB folder\n' ...
+            'and start EEGLAB which will add all the necessary paths.\n\n' ]));
+        warning(tmpWarning.state, 'backtrace');
+        foldertorm = fileparts(which('fgetl.m'));
+        if ~isempty(strfind(foldertorm, 'eeglab'))
+            rmpath(foldertorm);
+        end
+        foldertorm = fileparts(which('strjoin.m'));
+        if ~isempty(strfind(foldertorm, 'eeglab'))
+            rmpath(foldertorm);
+        end
+    end
+    myaddpath( eeglabpath, 'eeg_checkset.m',   [ 'functions' filesep 'adminfunc'        ]);
+    myaddpath( eeglabpath, 'eeg_checkset.m',   [ 'functions' filesep 'adminfunc'        ]);
+    myaddpath( eeglabpath, ['@mmo' filesep 'mmo.m'], 'functions');
+    myaddpath( eeglabpath, 'readeetraklocs.m', [ 'functions' filesep 'sigprocfunc'      ]);
+    myaddpath( eeglabpath, 'supergui.m',       [ 'functions' filesep 'guifunc'          ]);
+    myaddpath( eeglabpath, 'pop_study.m',      [ 'functions' filesep 'studyfunc'        ]);
+    myaddpath( eeglabpath, 'eeglab_data.set',  [ 'sample_data'      ]);
+    myaddpath( eeglabpath, 'mheadnew.mat',     [ 'functions' filesep 'supportfiles'     ]);
+    myaddpath( eeglabpath, 'pop_loadbci.m',    [ 'functions' filesep 'popfunc'          ]);
+    myaddpath( eeglabpath, 'statcond.m',       [ 'functions' filesep 'statistics'       ]);
+    myaddpath( eeglabpath, 'timefreq.m',       [ 'functions' filesep 'timefreqfunc'     ]);
+    myaddpath( eeglabpath, 'icademo.m',        [ 'functions' filesep 'miscfunc'         ]);
+    myaddpath( eeglabpath, 'eeglab1020.ced',   [ 'functions' filesep 'supportfiles'     ]);
+    addpathifnotinlist(fullfile(eeglabpath, 'plugins'));
+    eeglab_options;
+    
+    % remove path to to fmrlab if neceecessary
+    path_runica = fileparts(mywhich('runica'));
+    if length(path_runica) > 6 && strcmpi(path_runica(end-5:end), 'fmrlab')
+        rmpath(path_runica);
+    end
+
+    % add path if toolboxes are missing
+    % ---------------------------------
+    if option_donotusetoolboxes
+        p1 = fileparts(mywhich('ttest'));
+        p2 = fileparts(mywhich('filtfilt'));
+        p3 = fileparts(mywhich('optimtool'));
+        p4 = fileparts(mywhich('gray2ind'));
+        if ~isempty(p1), rmpath(p1); end
+        if ~isempty(p2), rmpath(p2); end
+        if ~isempty(p3), rmpath(p3); end
+        if ~isempty(p4), rmpath(p4); end
+    end
+
+    % remove BIOSIG path which are not needed and might cause conflicts
+    biosigp{1} = fileparts(which('sopen.m'));
+    biosigp{2} = fileparts(which('regress_eog.m'));
+    biosigp{3} = fileparts(which('DecimalFactors.txt'));
+    removepath(fileparts(fileparts(biosigp{1})), biosigp{:})
+else
+    eeglab_options;
+end
+
+% declare the variables as global
+evalin('base', 'eeg_global;');
+eeg_global;
+
+% remove empty datasets in ALLEEG
+while ~isempty(ALLEEG) && isempty(ALLEEG(end).data)
+    ALLEEG(end) = [];
+end
+if isempty(CURRENTSET)
+    if isequal(CURRENTSTUDY, 0)
+        CURRENTSET = 1;
+    else
+        CURRENTSET = 1:length(ALLEEG);
+    end
+end
+if ~isempty(ALLEEG) && max(CURRENTSET) > length(ALLEEG)
+    CURRENTSET = 1;
+    EEG        = eeg_retrieve(ALLEEG, CURRENTSET);
+end
+
+% for the history function
+% ------------------------
+comtmp = 'warning off MATLAB:mir_warning_variable_used_as_function';
+evalin('base'  , comtmp, '');
+evalin('caller', comtmp, '');
+    
+evalin('base', 'eeg_global;');
+if nargin < 1 || exist('EEG') ~= 1
+	EEG = [];
+    ALLEEG = [];
+    CURRENTSET = [];
+    ALLCOM = [];
+    LASTCOM = [];
+    STUDY =[];
+    CURRENTSTUDY = 0;
+	EEG = eeg_emptyset;
+	eegh('[ALLEEG EEG CURRENTSET ALLCOM] = eeglab;');
+    if ismatlab && get(0, 'screendepth') <= 8
+        disp('Warning: screen color depth too low, some colors will be inaccurate in time-frequency plots');
+    end
+end
+if isempty(CURRENTSTUDY) CURRENTSTUDY = 0; end
+
+nouiflag = false;
+versL = ~option_allmenus;
+if nargin == 1
+    if strcmp(onearg, 'versions')
+        disp( [ 'EEGLAB v' eeg_getversion ] );
+	elseif strcmp(onearg, 'nogui')
+        nouiflag = true;
+        if nargout < 1, clear ALLEEG; end % do not return output var
+	elseif strcmp(onearg, 'redraw')
+		W_MAIN = findobj('tag', 'EEGLAB');
+		if ~isempty(W_MAIN)
+			updatemenu;
+            if nargout < 1, clear ALLEEG; end % do not return output var
+			return;
+		else
+			eegh('eeglab(''redraw'');');
+		end
+	elseif strcmpi(onearg, 'continuous') || strcmpi(onearg, 'cont')
+        ALLEEG = []; CURRENTSET = 0; CURRENTSTUDY = 0; STUDY = [];
+        disp('Clearing all data and loading tutorial continuous data')
+        EEG = pop_loadset(fullfile(eeglabpath, 'sample_data', 'eeglab_data.set'));
+        [ALLEEG, EEG, CURRENTSET] = eeg_store(ALLEEG, EEG, 0);
+        eeglab redraw; 
+        return
+	elseif strcmp(onearg, 'epoch')
+        ALLEEG = []; CURRENTSET = 0; CURRENTSTUDY = 0; STUDY = [];
+        disp('Clearing all data and loading tutorial epoched data')
+        EEG = pop_loadset(fullfile(eeglabpath, 'sample_data', 'eeglab_data_epochs_ica.set'));
+        [ALLEEG, EEG, CURRENTSET] = eeg_store(ALLEEG, EEG, 0);
+        eeglab redraw; 
+        return
+	elseif strcmp(onearg, 'study')
+        ALLEEG = []; CURRENTSET = 0; CURRENTSTUDY = 0; STUDY = [];
+        disp('Clearing all data and loading tutorial study')
+        [STUDY, ALLEEG] = pop_loadstudy('filename', 'stern3s.study', 'filepath', '/System/Volumes/Data/data/data/STUDIES/STERN_test_1file_per_subject');
+        EEG = ALLEEG; CURRENTSET = 1:length(EEG); CURRENTSTUDY = 1;
+        eeglab redraw; 
+        return
+    elseif strcmp(onearg, 'rebuild')
+		W_MAIN = findobj('tag', 'EEGLAB');
+        close(W_MAIN);
+        eeglab redraw;
+        return;
+    elseif strcmp(onearg, 'full')
+        versL = false;
+    else
+        if ~exist(onearg, 'file') && ~any(onearg == ';')
+            fprintf(2,['EEGLAB Warning: Invalid argument ''' onearg '''. Restarting EEGLAB interface instead.\n']);
+            eegh('[ALLEEG EEG CURRENTSET ALLCOM] = eeglab(''rebuild'');');
+        else
+            nouiflag = true;
+        end
+	end
+else 
+    onearg = 'rebuild';
+end
+ALLCOM = ALLCOM;
+try, colordef('white'); catch end % removed from MATLAB
+if versL && ~nouiflag
+    disp('Some menu items hidden. Use Preference menu to show them all.');
+end
+
+% default option folder
+% ---------------------
+if ~isdeployed
+    eeglab_options;
+    fprintf('eeglab: options file is %s%seeg_options.m\n', homefolder, filesep);
+end
+
+% checking strings
+% ----------------
+e_try             = 'try,';
+e_catch           = 'catch, eeglab_error; LASTCOM= ''''; clear EEGTMP ALLEEGTMP STUDYTMP; end;';
+nocheck           = e_try;
+ret               = 'if ~isempty(LASTCOM), if LASTCOM(1) == -1, LASTCOM = ''''; return; end; end;';
+check             = ['[EEG LASTCOM] = eeg_checkset(EEG, ''data'');' ret ' eegh(LASTCOM);' e_try];
+checkcont         = ['[EEG LASTCOM] = eeg_checkset(EEG, ''contdata'');' ret ' eegh(LASTCOM);' e_try];
+checkica          = ['[EEG LASTCOM] = eeg_checkset(EEG, ''ica'');' ret ' eegh(LASTCOM);' e_try];
+checkepoch        = ['[EEG LASTCOM] = eeg_checkset(EEG, ''epoch'');' ret ' eegh(LASTCOM);' e_try];
+checkevent        = ['[EEG LASTCOM] = eeg_checkset(EEG, ''event'');' ret ' eegh(LASTCOM);' e_try];
+checkbesa         = ['[EEG LASTCOM] = eeg_checkset(EEG, ''besa'');' ret ' eegh(''% no history yet for BESA dipole localization'');' e_try];
+checkepochica     = ['[EEG LASTCOM] = eeg_checkset(EEG, ''epoch'', ''ica'');' ret ' eegh(LASTCOM);' e_try];
+checkplot         = ['[EEG LASTCOM] = eeg_checkset(EEG, ''chanloc'');' ret ' eegh(LASTCOM);' e_try];
+checkicaplot      = ['[EEG LASTCOM] = eeg_checkset(EEG, ''ica'', ''chanloc'');' ret ' eegh(LASTCOM);' e_try];
+checkepochplot    = ['[EEG LASTCOM] = eeg_checkset(EEG, ''epoch'', ''chanloc'');' ret ' eegh(LASTCOM);' e_try];
+checkepochicaplot = ['[EEG LASTCOM] = eeg_checkset(EEG, ''epoch'', ''ica'', ''chanloc'');' ret ' eegh(LASTCOM);' e_try];
+
+% check string and backup old dataset
+% -----------------------------------
+backup =     [ 'if CURRENTSET ~= 0,' ...
+               '    [ ALLEEG EEG ] = eeg_store(ALLEEG, EEG, CURRENTSET, ''savegui'');' ...
+               '    eegh(''[ALLEEG EEG] = eeg_store(ALLEEG, EEG, CURRENTSET, ''''savedata'''');'');' ...
+               'end;' ];
+
+storenewcall = 'EEG = eegh(LASTCOM, EEG); [ALLEEG EEG CURRENTSET LASTCOM] = pop_newset(ALLEEG, EEG, CURRENTSET, ''study'', ~isempty(STUDY)+0); eegh(LASTCOM);';
+storecall    = 'EEG = eegh(LASTCOM, EEG); [ALLEEG, EEG] = eeg_store(ALLEEG, EEG, CURRENTSET); eegh(''[ALLEEG, EEG] = eeg_store(ALLEEG, EEG, CURRENTSET);'');';
+storecall    = 'EEG = eegh(LASTCOM, EEG); [ALLEEG, EEG] = eeg_store(ALLEEG, EEG, CURRENTSET);';
+testeegtmp   =  'if exist(''EEGTMP'') == 1, EEG = EEGTMP; clear EEGTMP; end;'; % for backward compatibility
+ifeeg        =  'if ~isempty(LASTCOM) && ~isempty(EEG),';
+
+% nh = no dataset history
+% -----------------------
+e_hist_noeegh   = [e_catch 'eegh(LASTCOM);'];
+
+% study checking
+% --------------
+e_check_study = 'if length(EEG) > 1 && CURRENTSTUDY == 1, STUDY = std_checkset(STUDY, ALLEEG); eegh(''STUDY = std_checkset(STUDY, ALLEEG);''); end;';
+e_load_study = [e_catch 'if ~isempty(LASTCOM), STUDY = STUDYTMP; STUDY = eegh(LASTCOM, STUDY); ALLEEG = ALLEEGTMP; EEG = ALLEEG; CURRENTSET = [1:length(EEG)]; eegh(''CURRENTSTUDY = 1; EEG = ALLEEG; CURRENTSET = [1:length(EEG)];''); CURRENTSTUDY = 1; disp(''Done.''); end; clear ALLEEGTMP STUDYTMP; eeglab(''redraw'');'];
+e_plot_study = [e_catch 'if ~isempty(LASTCOM), STUDY = STUDYTMP; STUDY = eegh(LASTCOM, STUDY); disp(''Done.''); end; clear ALLEEGTMP STUDYTMP; eeglab(''redraw'');']; % ALLEEG not modified
+
+% same as above but also save history in dataset
+% ----------------------------------------------
+e_newset   = [e_catch testeegtmp 'eeglab_new;' e_check_study ];
+e_store    = [e_catch            'eeglab_new;' ];
+e_hist     = [e_catch            'eeglab_new;' ];
+e_histdone = [e_catch            'eeglab_new; disp(''done'');' ];
+
+% build structures for plugins
+% ----------------------------
+trystrs.no_check                 = e_try;
+trystrs.check_data               = check;
+trystrs.check_ica                = checkica;
+trystrs.check_cont               = checkcont;
+trystrs.check_epoch              = checkepoch;
+trystrs.check_event              = checkevent;
+trystrs.check_epoch_ica          = checkepochica;
+trystrs.check_chanlocs           = checkplot;
+trystrs.check_epoch_chanlocs     = checkepochplot;
+trystrs.check_epoch_ica_chanlocs = checkepochicaplot;
+trystrs.check_ica_chanlocs       = checkicaplot;
+catchstrs.add_to_hist            = e_store;
+catchstrs.store_and_hist         = e_store;
+catchstrs.new_and_hist           = e_newset;
+catchstrs.new_non_empty          = e_newset;
+catchstrs.update_study           = e_plot_study;
+catchstrs.load_study             = e_load_study;
+
+% create eeglab figure
+% --------------------
+if ~nouiflag
+    eeg_mainfig(onearg);
+end
+
+% detecting icalab
+% ----------------
+if exist('icalab')
+    disp('ICALAB toolbox detected (algo. added to "run ICA" interface)');
+end
+
+if ~isdeployed
+    % check for older version of Fieldtrip and presence of topoplot
+    % -------------------------------------------------------------
+    ptopoplot  = fileparts(mywhich('cbar'));
+    ptopoplot2 = fileparts(mywhich('topoplot'));
+    if ~strcmpi(ptopoplot, ptopoplot2)
+        %disp('  Warning: duplicate function topoplot.m in Fieldtrip and EEGLAB');
+        %disp('  EEGLAB function will prevail and call the Fieldtrip one when appropriate');
+        addpath(ptopoplot);
+    end
+    pcheck  = fileparts(mywhich('finputcheck'));
+    if ~strfind(pcheck, 'guifunc')
+        rmpath(fileparts(pcheck));
+    end
+end
+
+cb_importdata  = [ nocheck '[EEG LASTCOM] = pop_importdata;'   e_newset ];
+cb_biosig      = [ nocheck '[EEG LASTCOM] = pop_biosig; '      e_newset ]; 
+cb_fileio      = [ nocheck '[EEG LASTCOM] = pop_fileio; '      e_newset ]; 
+
+cb_importepoch = [ checkepoch   '[EEG LASTCOM] = pop_importepoch(EEG);'   e_store ];
+cb_importevent = [ check        '[EEG LASTCOM] = pop_importevent(EEG);'   e_store ];
+cb_chanevent   = [ check        '[EEG LASTCOM]= pop_chanevent(EEG);'      e_store ]; 
+cb_importpres  = [ check        '[EEG LASTCOM]= pop_importpres(EEG);'     e_store ]; 
+cb_importerplab= [ check        '[EEG LASTCOM]= pop_importerplab(EEG);'   e_store ]; 
+cb_export      = [ check        'LASTCOM = pop_export(EEG);'              e_histdone ];
+cb_expica1     = [ check        'LASTCOM = pop_expica(EEG, ''weights'');' e_histdone ]; 
+cb_expica2     = [ check        'LASTCOM = pop_expica(EEG, ''inv'');'     e_histdone ];
+cb_expevents   = [ check        'LASTCOM = pop_expevents(EEG);'           e_histdone ];
+cb_expdata     = [ check        'LASTCOM = pop_writeeeg(EEG);'            e_histdone ]; 
+
+cb_loadset     = [ nocheck '[EEG LASTCOM] = pop_loadset;'                                e_newset];
+cb_saveset     = [ check   '[EEG LASTCOM] = pop_saveset(EEG, ''savemode'', ''resave'');' e_store ];
+cb_savesetas   = [ check   '[EEG LASTCOM] = pop_saveset(EEG);'                           e_store ];
+cb_delset      = [ nocheck '[ALLEEG LASTCOM] = pop_delset(ALLEEG, -CURRENTSET);'         e_hist_noeegh 'eeglab redraw;' ];
+cb_study1      = [ nocheck 'pop_stdwarn; [STUDYTMP ALLEEGTMP LASTCOM] = pop_study([], ALLEEG         , ''gui'', ''on'');' e_load_study]; 
+cb_study2      = [ nocheck 'pop_stdwarn; [STUDYTMP ALLEEGTMP LASTCOM] = pop_studywizard;' e_load_study]; 
+cb_studyerp    = [ nocheck 'pop_stdwarn; [STUDYTMP ALLEEGTMP LASTCOM] = pop_studyerp;' e_load_study]; 
+cb_loadstudy   = [ nocheck 'pop_stdwarn; [STUDYTMP ALLEEGTMP LASTCOM] = pop_loadstudy; if ~isempty(LASTCOM), STUDYTMP = std_renamestudyfiles(STUDYTMP, ALLEEGTMP); end;' e_load_study]; 
+cb_savestudy1  = [ check   '[STUDYTMP ALLEEGTMP LASTCOM] = pop_savestudy(STUDY, EEG, ''savemode'', ''resavegui'');'      e_load_study];
+cb_savestudy2  = [ check   '[STUDYTMP ALLEEGTMP LASTCOM] = pop_savestudy(STUDY, EEG);'                                e_load_study];
+cb_clearstudy  =           'LASTCOM = ''STUDY = []; CURRENTSTUDY = 0; ALLEEG = []; EEG=[]; CURRENTSET=[];''; eval(LASTCOM); eegh( LASTCOM ); eeglab redraw;';
+cb_editoptions = [ nocheck 'if isfield(ALLEEG, ''nbchan''), LASTCOM = pop_editoptions(length([ ALLEEG.nbchan ]) >1);' ...
+                           'else                            LASTCOM = pop_editoptions(0); end;'                    e_hist_noeegh ];
+cb_plugin      = [ nocheck 'if plugin_menu(PLUGINLIST) , close(findobj(''tag'', ''EEGLAB'')); eeglab redraw; end;' e_hist_noeegh ];
+
+cb_saveh1      = [ nocheck 'LASTCOM = pop_saveh(EEG.history);' e_hist_noeegh];
+cb_saveh2      = [ nocheck 'LASTCOM = pop_saveh(ALLCOM);'      e_hist_noeegh];
+cb_runsc       = [ nocheck 'LASTCOM = pop_runscript;'          e_hist   ];
+cb_quit        = [ 'close(gcf); disp(''To save the EEGLAB command history  >> pop_saveh(ALLCOM);'');' ...
+                   'clear global EEG ALLEEG LASTCOM CURRENTSET;'];
+
+cb_editset     = [ check      '[EEG LASTCOM] = pop_editset(EEG);'        e_store];
+cb_editeventf  = [ checkevent '[EEG LASTCOM] = pop_editeventfield(EEG);' e_store];
+cb_editeventv  = [ checkevent '[EEG LASTCOM] = pop_editeventvals(EEG);'  e_store];
+cb_adjustevents= [ checkevent '[EEG LASTCOM] = pop_adjustevents(EEG);'   e_store];
+cb_comments    = [ check      '[EEG LASTCOM] =pop_comments(EEG, ''About this dataset'');' e_store];
+cb_chanedit    = [ check 'disp(''IMPORTANT: After importing/modifying data channels, you must close'');' ...
+                   'disp(''the channel editing window for the changes to take effect in EEGLAB.'');' ...
+                   'disp(''TIP: Call this function directly from the prompt, ">> pop_chanedit([]);"'');' ...
+                   'disp(''     to convert between channel location file formats'');' ...
+                   '[EEG TMPINFO TMP LASTCOM] = pop_chanedit(EEG); clear TMPINFO TMP; if ~isempty(LASTCOM), EEG = eeg_checkset(EEG, ''chanlocsize''); end;' ...
+                   e_store ];
+                   %'clear TMPINFO TMP; EEG = eegh(LASTCOM, EEG);' storecall 'end; eeglab(''redraw'');'];
+cb_select      = [ check      '[EEG LASTCOM] = pop_select(EEG);'        e_newset];
+cb_rmdat       = [ checkevent '[EEG LASTCOM] = pop_rmdat(EEG);'         e_newset];
+cb_selectevent = [ checkevent '[EEG,~,LASTCOM] = pop_selectevent(EEG);' e_newset ];
+cb_copyset     = [ check      '[ALLEEG EEG CURRENTSET LASTCOM] = pop_copyset(ALLEEG, CURRENTSET); eeglab(''redraw'');' e_hist_noeegh];
+cb_mergeset    = [ check      '[EEG LASTCOM] = pop_mergeset(ALLEEG);' e_newset];
+
+cb_resample    = [ check      '[EEG LASTCOM] = pop_resample(EEG);' e_newset];
+cb_eegfilt     = [ check      '[EEG LASTCOM] = pop_eegfilt(EEG);'  e_newset];
+cb_interp      = [ check      '[EEG LASTCOM] = pop_interp(EEG); '  e_newset];
+cb_reref       = [ check      '[EEG LASTCOM] = pop_reref(EEG);'    e_newset];
+cb_eegplot     = [ check      '[LASTCOM] = pop_eegplot(EEG, 1);'   e_hist];
+cb_epoch       = [ check      '[EEG,~,LASTCOM] = pop_epoch(EEG);'  e_newset e_check_study ];
+cb_rmbase      = [ check      '[EEG LASTCOM] = pop_rmbase(EEG);'   e_newset e_check_study];
+cb_runica      = [ check      '[EEG LASTCOM] = pop_runica(EEG);'   e_store e_check_study];
+cb_subcomp     = [ checkica   '[EEG LASTCOM] = pop_subcomp(EEG);'  e_newset];
+%cb_chanrej     = [ check      'pop_rejchan(EEG); LASTCOM = '''';'  e_hist];
+cb_chanrej     = [ check      '[EEG, ~, ~, LASTCOM] = pop_rejchan(EEG);'  e_hist];
+cb_autorej     = [ checkepoch '[EEG, ~, LASTCOM] = pop_autorej(EEG);'    e_hist];
+cb_rejcont     = [ check      '[EEG, ~, ~, LASTCOM] = pop_rejcont(EEG);'  e_hist];
+
+cb_rejmenu1    = [ check      'pop_rejmenu(EEG, 1); LASTCOM = '''';'    e_hist];
+cb_eegplotrej1 = [ check      '[LASTCOM] = pop_eegplot(EEG, 1);'        e_hist];
+cb_eegthresh1  = [ checkepoch '[EEG,~,LASTCOM] = pop_eegthresh(EEG, 1);'    e_hist];
+cb_rejtrend1   = [ checkepoch '[EEG LASTCOM] = pop_rejtrend(EEG, 1);'   e_store];
+cb_jointprob1  = [ checkepoch '[EEG LASTCOM] = pop_jointprob(EEG, 1);'  e_store];
+cb_rejkurt1    = [ checkepoch '[EEG LASTCOM] = pop_rejkurt(EEG, 1);'    e_store];
+cb_rejspec1    = [ checkepoch '[EEG, ~, LASTCOM] = pop_rejspec(EEG, 1);'  e_store];
+cb_rejsup1     = [ checkepochica '[EEG LASTCOM] = eeg_rejsuperpose(EEG, 1,1,1,1,1,1,1,1); eegh(LASTCOM);' ...
+                     'LASTCOM = ''EEG.reject.icarejmanual = EEG.reject.rejglobal;''; eval(LASTCOM);' e_store ];
+cb_rejsup2     = [ checkepoch '[EEG LASTCOM] = eeg_rejsuperpose(EEG, 1,1,1,1,1,1,1,1); EEG = eegh(LASTCOM, EEG);' ...
+                   '[EEG LASTCOM] = pop_rejepoch(EEG);' e_newset];
+
+cb_selectcomps = [ checkicaplot  '[EEG LASTCOM] = pop_selectcomps(EEG);'  e_store];
+cb_rejmenu2    = [ checkepochica 'pop_rejmenu(EEG, 0); LASTCOM ='''';'    e_hist];
+cb_eegplotrej2 = [ checkica      '[LASTCOM] = pop_eegplot(EEG, 0);'       e_hist];
+cb_eegthresh2  = [ checkepochica '[TMP LASTCOM] = pop_eegthresh(EEG, 0); clear TMP;' e_hist];
+cb_rejtrend2   = [ checkepochica '[EEG LASTCOM] = pop_rejtrend(EEG, 0);'  e_store];
+cb_jointprob2  = [ checkepochica '[EEG LASTCOM] = pop_jointprob(EEG, 0);' e_store];
+cb_rejkurt2    = [ checkepochica '[EEG LASTCOM] = pop_rejkurt(EEG, 0);'   e_store];
+cb_rejspec2    = [ checkepochica '[EEG Itmp LASTCOM] = pop_rejspec(EEG, 1); clear Itmp;'   e_store];
+cb_rejsup3     = [ checkepochica '[EEG LASTCOM] = eeg_rejsuperpose(EEG, 0,1,1,1,1,1,1,1); eegh(LASTCOM);' ...
+                   'LASTCOM = ''EEG.reject.rejmanual = EEG.reject.rejglobal;''; eval(LASTCOM);' e_store ];
+cb_rejsup4     = [ checkepochica '[EEG LASTCOM] = eeg_rejsuperpose(EEG, 0,1,1,1,1,1,1,1); EEG = eegh(LASTCOM, EEG);' ...
+                   '[EEG LASTCOM] = pop_rejepoch(EEG);'             e_newset ];
+
+cb_topoblank1  = [ checkplot 'LASTCOM = [''figure; topoplot([],EEG.chanlocs, ''''style'''', ''''blank'''',  ' ...
+                   '''''electrodes'''', ''''labelpoint'''', ''''chaninfo'''', EEG.chaninfo);'']; eval(LASTCOM);' e_hist];
+cb_topoblank2  = [ checkplot 'LASTCOM = [''figure; topoplot([],EEG.chanlocs, ''''style'''', ''''blank'''',  ' ...
+                   '''''electrodes'''', ''''numpoint'''', ''''chaninfo'''', EEG.chaninfo);'']; eval(LASTCOM);' e_hist];
+cb_eegplot1    = [ check         'LASTCOM = pop_eegplot(EEG, 1, 1, 1);'   e_hist];
+cb_spectopo1   = [ check         'LASTCOM = pop_spectopo(EEG, 1);'        e_hist];
+cb_prop1       = [ checkplot     'LASTCOM = pop_prop(EEG,1);'             e_hist];
+cb_erpimage1   = [ checkepoch    'LASTCOM = pop_erpimage(EEG, 1, eegh(''find'',''pop_erpimage(EEG,1''));' e_hist];
+cb_timtopo     = [ checkplot     'LASTCOM = pop_timtopo(EEG);'            e_hist];
+cb_plottopo    = [ check         'LASTCOM = pop_plottopo(EEG);'           e_hist];
+cb_topoplot1   = [ checkplot     'LASTCOM = pop_topoplot(EEG, 1);'        e_hist];
+cb_headplot1   = [ checkplot     '[EEG LASTCOM] = pop_headplot(EEG, 1);'  e_store];
+cb_comperp1    = [ checkepoch    'LASTCOM = pop_comperp(ALLEEG);'         e_hist];
+
+cb_eegplot2    = [ checkica      '[LASTCOM] = pop_eegplot(EEG, 0, 1, 1);' e_hist];
+cb_spectopo2   = [ checkicaplot  'LASTCOM = pop_spectopo(EEG, 0);'        e_hist];
+cb_topoplot2   = [ checkicaplot  'LASTCOM = pop_topoplot(EEG, 0);'        e_hist];
+cb_headplot2   = [ checkicaplot  '[EEG LASTCOM] = pop_headplot(EEG, 0);'  e_store];
+cb_prop2       = [ checkicaplot  'LASTCOM = pop_prop(EEG,0);'             e_hist];
+cb_erpimage2   = [ checkepochica 'LASTCOM = pop_erpimage(EEG, 0, eegh(''find'',''pop_erpimage(EEG,0''));' e_hist];
+cb_envtopo1    = [ checkicaplot  'LASTCOM = pop_envtopo(EEG);'            e_hist];
+cb_envtopo2    = [ checkicaplot  'if length(ALLEEG) == 1, error(''Need at least 2 datasets''); end; LASTCOM = pop_envtopo(ALLEEG);' e_hist];
+cb_plotdata2   = [ checkepochica '[tmpeeg LASTCOM] = pop_plotdata(EEG, 0); clear tmpeeg;' e_hist];
+cb_comperp2    = [ checkepochica 'LASTCOM = pop_comperp(ALLEEG, 0);'      e_hist];
+
+cb_signalstat1 = [ check         'LASTCOM = pop_signalstat(EEG, 1);' e_hist];
+cb_signalstat2 = [ checkica      'LASTCOM = pop_signalstat(EEG, 0);' e_hist];
+cb_eventstat   = [ checkevent    'LASTCOM = pop_eventstat(EEG);'     e_hist];
+cb_timef1      = [ check         'LASTCOM = pop_newtimef(EEG, 1, eegh(''find'',''pop_newtimef(EEG,1''));'  e_hist];
+cb_crossf1     = [ check         'LASTCOM = pop_newcrossf(EEG, 1,eegh(''find'',''pop_newcrossf(EEG,1''));' e_hist];
+cb_timef2      = [ checkica      'LASTCOM = pop_newtimef(EEG, 0, eegh(''find'',''pop_newtimef(EEG,0''));'  e_hist];
+cb_crossf2     = [ checkica      'LASTCOM = pop_newcrossf(EEG, 0,eegh(''find'',''pop_newcrossf(EEG,0''));' e_hist];
+
+cb_study3      = [ nocheck '[STUDYTMP ALLEEGTMP LASTCOM] = pop_study(STUDY, ALLEEG, ''gui'', ''on'');'  e_load_study];
+cb_studydesign = [ nocheck '[STUDYTMP LASTCOM] = pop_studydesign(STUDY, ALLEEG); ALLEEGTMP = ALLEEG;'   e_plot_study];     
+cb_precomp     = [ nocheck '[STUDYTMP ALLEEGTMP LASTCOM] = pop_precomp(STUDY, ALLEEG);'                 e_plot_study];
+cb_chanplot    = [ nocheck '[STUDYTMP LASTCOM] = pop_chanplot(STUDY, ALLEEG); ALLEEGTMP=ALLEEG;'        e_plot_study];
+cb_precomp2    = [ nocheck '[STUDYTMP ALLEEGTMP LASTCOM] = pop_precomp(STUDY, ALLEEG, ''components'');' e_plot_study];
+cb_preclust    = [ nocheck '[STUDYTMP ALLEEGTMP LASTCOM] = pop_preclust(STUDY, ALLEEG);'                e_plot_study];
+cb_clust       = [ nocheck '[STUDYTMP ALLEEGTMP LASTCOM] = pop_clust(STUDY, ALLEEG);'                   e_plot_study];
+cb_clustedit   = [ nocheck 'ALLEEGTMP = ALLEEG; [STUDYTMP LASTCOM] = pop_clustedit(STUDY, ALLEEG);'     e_plot_study];
+
+% 
+% % add STUDY plugin menus
+% if exist('eegplugin_stderpimage')
+%     structure.uilist = { { } ...
+%         {'style' 'pushbutton' 'string' 'Plot ERPimage'    'Callback' 'stderpimageplugin_plot(''onecomp'', gcf);' } { }  ...
+%         {'style' 'pushbutton' 'string' 'Plot ERPimage(s)' 'Callback' 'stderpimageplugin_plot(''oneclust'', gcf);' } };
+%     structure.geometry = { [1] [1 0.3 1] };
+%     arg = vararg2str( { structure } );
+%     cb_clustedit   = [ nocheck 'ALLEEGTMP = ALLEEG; [STUDYTMP LASTCOM] = pop_clustedit(STUDY, ALLEEG, [], ' arg ');'     e_load_study];
+% end;
+
+% menu definition
+% --------------- 
+% defaults
+% --------
+% startup:on
+% study:off
+% chanloc:off
+% epoch:on
+% continuous:on
+
+on                = 'study:on';
+onnostudy         = '';
+ondata            = 'startup:off';
+ondatanoroi       = 'startup:off;roi:off';
+onepoch           = 'startup:off;continuous:off';
+onepochnoroi      = 'startup:off;continuous:off;roi:off';
+ondatastudy       = 'startup:off;study:on';
+ondatastudynoroi  = 'startup:off;study:on;roi:off';
+onchannel         = 'startup:off;chanloc:on';
+onchannelnoroi    = 'startup:off;chanloc:on;roi:off';
+onepochchan       = 'startup:off;continuous:off;chanloc:on';
+onstudy           = 'startup:off;epoch:off;continuous:off;study:on';
+onstudynoroi      = 'startup:off;epoch:off;continuous:off;study:on;roi:off';
+
+if ~nouiflag
+    W_MAIN = findobj('tag', 'EEGLAB');
+    EEGUSERDAT = get(W_MAIN, 'userdata');
+    set(W_MAIN, 'MenuBar', 'none');
+    file_m   = eegmenu( false,  W_MAIN,   'Label', 'File'                                    , 'userdata', on);
+    import_m = eegmenu( false,  file_m,   'Label', 'Import data'                             , 'userdata', onnostudy); 
+    neuro_m  = eegmenu( false,  import_m, 'Label', 'Using EEGLAB functions and plugins'      , 'tag', 'import data' , 'userdata', onnostudy); 
+    epoch_m  = eegmenu( false,  file_m,   'Label', 'Import epoch info', 'tag', 'import epoch', 'userdata', onepoch); 
+    event_m  = eegmenu( false,  file_m,   'Label', 'Import event info', 'tag', 'import event', 'userdata', ondata); 
+    exportm  = eegmenu( false,  file_m,   'Label', 'Export'           , 'tag', 'export'      , 'userdata', ondata); 
+    edit_m   = eegmenu( false,  W_MAIN,   'Label', 'Edit'                                    , 'userdata', ondatastudy);
+    tools_m  = eegmenu( false,  W_MAIN,   'Label', 'Tools',             'tag', 'tools'       , 'userdata', ondatastudy);
+    plot_m   = eegmenu( false,  W_MAIN,   'Label', 'Plot',              'tag', 'plot'        , 'userdata', ondata);
+    loc_m    = eegmenu( false,  plot_m,   'Label', 'Channel locations'                       , 'userdata', onchannel);
+    std_m    = eegmenu( false,  W_MAIN,   'Label', 'Study', 'tag', 'study'                   , 'userdata', onstudy);
+    set_m    = eegmenu( false,  W_MAIN,   'Label', 'Datasets'                                , 'userdata', ondatastudy);
+    help_m   = eegmenu( false,  W_MAIN,   'Label', 'Help'                                    , 'userdata', on);
+
+    eegmenu( false,  neuro_m, 'Label', '(for more use menu File > Manage EEGLAB extensions)', 'userdata', 'enable:off');
+    eegmenu( false,  neuro_m, 'Label', 'From ASCII/float file or MATLAB array' , 'CallBack', cb_importdata, 'separator', 'on');
+    %eegmenu( false,  neuro_m, 'Label', 'From Netstation .mff (FILE-IO toolbox)', 'CallBack', cb_fileio2,    'Separator', 'on'); 
+
+    % BIOSIG MENUS
+    % ------------
+    eegmenu( false,  neuro_m, 'Label', 'From Biosemi BDF file (BIOSIG toolbox)', 'CallBack' , cb_biosig, 'Separator', 'on'); 
+    eegmenu( false,  neuro_m, 'Label', 'From EDF/EDF+/GDF files (BIOSIG toolbox)', 'CallBack', cb_biosig); 
+
+    eegmenu( false,  epoch_m, 'Label', 'From MATLAB array or ASCII file'       , 'CallBack', cb_importepoch);
+    eegmenu( false,  event_m, 'Label', 'From MATLAB array or ASCII file'       , 'CallBack', cb_importevent);
+    eegmenu( false,  event_m, 'Label', 'From data channel'                     , 'CallBack', cb_chanevent); 
+    eegmenu( false,  event_m, 'Label', 'From Presentation .LOG file'           , 'CallBack', cb_importpres); 
+    eegmenu( false,  event_m, 'Label', 'From E-Prime ASCII (text) file'        , 'CallBack', cb_importevent);
+    eegmenu( false,  event_m, 'Label', 'From ERPLAB text files'                , 'CallBack', cb_importerplab); 
+
+    eegmenu( false,  exportm, 'Label', '(for more use menu File > Manage EEGLAB extensions)', 'userdata', 'enable:off');
+    eegmenu( false,  exportm, 'Label', 'Data and ICA activity to text file'    , 'CallBack', cb_export, 'separator', 'on');
+    eegmenu( false,  exportm, 'Label', 'Weight matrix to text file'            , 'CallBack', cb_expica1); 
+    eegmenu( false,  exportm, 'Label', 'Inverse weight matrix to text file'    , 'CallBack', cb_expica2);
+    eegmenu( false,  exportm, 'Label', 'Events to text file'                   , 'CallBack', cb_expevents);
+    eegmenu( false,  exportm, 'Label', 'Data to EDF/BDF/GDF file'              , 'CallBack', cb_expdata, 'separator', 'on'); 
+
+    eegmenu( false,  file_m, 'Label', 'Load existing dataset'                  , 'userdata', onnostudy,   'CallBack', cb_loadset, 'Separator', 'on'); 
+    eegmenu( false,  file_m, 'Label', 'Resave current dataset(s)'              , 'userdata', ondatastudy, 'CallBack', cb_saveset);
+    eegmenu( false,  file_m, 'Label', 'Save current dataset as'                , 'userdata', ondata,      'CallBack', cb_savesetas);
+    eegmenu( false,  file_m, 'Label', 'Clear dataset(s)'                       , 'userdata', ondata,      'CallBack', cb_delset);
+
+    std2_m = eegmenu( false,  file_m, 'Label', 'Create study'                  , 'userdata', on     , 'Separator', 'on'); 
+    eegmenu( false,  std2_m,  'Label', 'Using all loaded datasets'             , 'userdata', ondata , 'Callback', cb_study1); 
+    eegmenu( false,  std2_m,  'Label', 'Browse for datasets'                   , 'userdata', on     , 'Callback', cb_study2); 
+    eegmenu( false,  std2_m,  'Label', 'Simple ERP STUDY'                      , 'userdata', on     , 'Callback', cb_studyerp); 
+
+    eegmenu( false,  file_m, 'Label', 'Load existing study'                    , 'userdata', on     , 'CallBack', cb_loadstudy,'Separator', 'on' ); 
+    eegmenu( false,  file_m, 'Label', 'Save current study'                     , 'userdata', onstudy, 'CallBack', cb_savestudy1);
+    eegmenu( false,  file_m, 'Label', 'Save current study as'                  , 'userdata', onstudy, 'CallBack', cb_savestudy2);
+    eegmenu( false,  file_m, 'Label', 'Clear study / Clear all'                , 'userdata', ondatastudy, 'CallBack', cb_clearstudy);
+    eegmenu( false,  file_m, 'Label', 'Preferences'                            , 'userdata', on     , 'CallBack', cb_editoptions, 'Separator', 'on');
+
+    hist_m = eegmenu( false,  file_m, 'Label', 'History scripts'               , 'userdata', on     , 'Separator', 'on');
+    eegmenu( false,  hist_m, 'Label', 'Save dataset history script'            , 'userdata', ondata     , 'CallBack', cb_saveh1);
+    eegmenu( false,  hist_m, 'Label', 'Save session history script'            , 'userdata', ondatastudy, 'CallBack', cb_saveh2);    
+    eegmenu( false,  hist_m, 'Label', 'Run script'                             , 'userdata', on         , 'CallBack', cb_runsc);
+    if isdeployed
+        eegmenu( false,  hist_m, 'Label', 'Test compiled version'              , 'userdata', on         , 'CallBack', @test_compiled_version);
+    end
+
+    if ~isdeployed
+        eegmenu( false,  file_m,   'Label', 'Manage EEGLAB extensions'  , 'userdata', on, 'CallBack', cb_plugin);
+    end
+    eegmenu( false,  file_m, 'Label', 'Quit'                                   , 'userdata', on     , 'CallBack', cb_quit, 'Separator', 'on');
+
+    eegmenu( false,  edit_m, 'Label', 'Dataset info'                           , 'userdata', ondata, 'CallBack', cb_editset);
+    eegmenu( versL,  edit_m, 'Label', 'Event fields'                           , 'userdata', ondata, 'CallBack', cb_editeventf);
+    eegmenu( false,  edit_m, 'Label', 'Event values'                           , 'userdata', ondata, 'CallBack', cb_editeventv);
+    eegmenu( versL,  edit_m, 'Label', 'Adjust event latencies'                 , 'userdata', ondata, 'CallBack', cb_adjustevents);
+    eegmenu( false,  edit_m, 'Label', 'About this dataset'                     , 'userdata', ondata, 'CallBack', cb_comments);
+    eegmenu( false,  edit_m, 'Label', 'Channel locations'                      , 'userdata', ondatastudy, 'CallBack', cb_chanedit);
+    eegmenu( false,  edit_m, 'Label', 'Select data'                            , 'userdata', ondatastudy, 'CallBack', cb_select, 'Separator', 'on');
+    eegmenu( false,  edit_m, 'Label', 'Select data using events'               , 'userdata', ondatastudy, 'CallBack', cb_rmdat);
+    eegmenu( false,  edit_m, 'Label', 'Select epochs or events'                , 'userdata', ondatastudy, 'CallBack', cb_selectevent);
+    eegmenu( false,  edit_m, 'Label', 'Copy current dataset'                   , 'userdata', ondata, 'CallBack', cb_copyset, 'Separator', 'on');
+    eegmenu( false,  edit_m, 'Label', 'Append datasets'                        , 'userdata', ondata, 'CallBack', cb_mergeset);
+    eegmenu( false,  edit_m, 'Label', 'Delete dataset(s) from memory'          , 'userdata', ondata, 'CallBack', cb_delset);
+
+    eegmenu(~versL,  tools_m, 'Label', '(Expand tool choices via "File > Preferences")'    , 'userdata', 'enable:off');
+    eegmenu( false,  tools_m, 'Label', 'Change sampling rate'                  , 'userdata', ondatastudy, 'CallBack', cb_resample, 'Separator', 'on');
+
+    filter_m = eegmenu( false,  tools_m, 'Label', 'Filter the data'            , 'userdata', ondatastudy, 'tag', 'filter');
+    eegmenu( false,  filter_m, 'Label', 'Basic FIR filter (legacy)'            , 'userdata', ondatastudy, 'CallBack', cb_eegfilt);
+
+    eegmenu( false,  tools_m, 'Label', 'Re-reference the data'                 , 'userdata', ondatastudy, 'CallBack', cb_reref);
+    eegmenu( false,  tools_m, 'Label', 'Interpolate electrodes'                , 'userdata', ondata, 'CallBack', cb_interp);
+    eegmenu( false,  tools_m, 'Label', 'Inspect/reject data by eye'            , 'userdata', ondata, 'CallBack', cb_eegplot, 'Separator', 'on');
+    eegmenu( versL,  tools_m, 'Label', 'Automatic channel rejection'           , 'userdata', ondata, 'CallBack', cb_chanrej);
+    eegmenu( versL,  tools_m, 'Label', 'Automatic continuous rejection'        , 'userdata', ondata, 'CallBack', cb_rejcont);
+    eegmenu( versL,  tools_m, 'Label', 'Automatic epoch rejection'             , 'userdata', onepoch, 'CallBack', cb_autorej);
+    eegmenu( false,  tools_m, 'Label', 'Decompose data by ICA'                 , 'userdata', ondatastudynoroi, 'CallBack', cb_runica, 'Separator', 'on');
+    rej_m1 = eegmenu( versL,  tools_m, 'Label', 'Reject data epochs'           , 'userdata', onepoch);
+    rej_m2 = eegmenu( versL,  tools_m, 'Label', 'Reject data using ICA'        , 'userdata', ondata );
+
+    eegmenu( versL,  rej_m1, 'Label', 'Reject data (all methods)'              , 'userdata', onepoch, 'CallBack', cb_rejmenu1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject by inspection'                   , 'userdata', onepoch, 'CallBack', cb_eegplotrej1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject extreme values'                  , 'userdata', onepoch, 'CallBack', cb_eegthresh1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject by linear trend/variance'        , 'userdata', onepoch, 'CallBack', cb_rejtrend1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject by probability'                  , 'userdata', onepoch, 'CallBack', cb_jointprob1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject by kurtosis'                     , 'userdata', onepoch, 'CallBack', cb_rejkurt1);
+    eegmenu( versL,  rej_m1, 'Label', 'Reject by spectra'                      , 'userdata', onepoch, 'CallBack', cb_rejspec1);
+    eegmenu( versL,  rej_m1, 'Label', 'Export marks to ICA reject'             , 'userdata', onepoch, 'CallBack', cb_rejsup1, 'separator', 'on');
+    eegmenu( versL,  rej_m1, 'Label', 'Reject marked epochs'                   , 'userdata', onepoch, 'CallBack', cb_rejsup2, 'separator', 'on', 'foregroundcolor', 'b');
+    eegmenu(~versL,  tools_m,'Label', 'Inspect/label components by map'        , 'userdata', ondata , 'CallBack', cb_selectcomps);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject components by map'               , 'userdata', ondata , 'CallBack', cb_selectcomps);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject data (all methods)'              , 'userdata', onepoch, 'CallBack', cb_rejmenu2, 'Separator', 'on');
+    eegmenu( versL,  rej_m2, 'Label', 'Reject by inspection'                   , 'userdata', onepoch, 'CallBack', cb_eegplotrej2);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject extreme values'                  , 'userdata', onepoch, 'CallBack', cb_eegthresh2);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject by linear trend/variance'        , 'userdata', onepoch, 'CallBack', cb_rejtrend2);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject by probability'                  , 'userdata', onepoch, 'CallBack', cb_jointprob2);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject by kurtosis'                     , 'userdata', onepoch, 'CallBack', cb_rejkurt2);
+    eegmenu( versL,  rej_m2, 'Label', 'Reject by spectra'                      , 'userdata', onepoch, 'CallBack', cb_rejspec2);
+    eegmenu( versL,  rej_m2, 'Label', 'Export marks to data reject'            , 'userdata', onepoch, 'CallBack', cb_rejsup3, 'separator', 'on');
+    eegmenu( versL,  rej_m2, 'Label', 'Reject marked epochs'                   , 'userdata', onepoch, 'CallBack', cb_rejsup4, 'separator', 'on', 'foregroundcolor', 'b');
+
+    eegmenu( false,  tools_m, 'Label', 'Remove components from data'           , 'userdata', ondatastudy, 'CallBack', cb_subcomp );
+    eegmenu( false,  tools_m, 'Label', 'Extract epochs'                        , 'userdata', ondatastudy , 'CallBack', cb_epoch, 'Separator', 'on');
+    eegmenu( false,  tools_m, 'Label', 'Remove epoch baseline'                 , 'userdata', ondatastudy , 'CallBack', cb_rmbase);
+
+    eegmenu( false,  loc_m,  'Label', 'By name'                                , 'userdata', onchannel, 'CallBack', cb_topoblank1);
+    eegmenu( false,  loc_m,  'Label', 'By number'                              , 'userdata', onchannel, 'CallBack', cb_topoblank2);
+    eegmenu( false,  plot_m, 'Label', 'Channel data (scroll)'                  , 'userdata', ondata , 'CallBack', cb_eegplot1, 'Separator', 'on');
+    eegmenu( false,  plot_m, 'Label', 'Channel spectra and maps'               , 'userdata', ondata , 'CallBack', cb_spectopo1);
+    eegmenu( false,  plot_m, 'Label', 'Channel properties'                     , 'userdata', ondata , 'CallBack', cb_prop1);
+    eegmenu( false,  plot_m, 'Label', 'Channel ERP image'                      , 'userdata', onepoch, 'CallBack', cb_erpimage1);
+
+    ERP_m = eegmenu( false,  plot_m, 'Label', 'Channel ERPs'                   , 'userdata', onepoch);
+    eegmenu( false,  ERP_m,  'Label', 'With scalp maps'                        , 'CallBack', cb_timtopo);
+    eegmenu( false,  ERP_m,  'Label', 'In scalp/rect. array'                   , 'CallBack', cb_plottopo);
+
+    topo_m = eegmenu( false,  plot_m, 'Label', 'ERP map series'                , 'userdata', onepochchan);
+    eegmenu( false,  topo_m, 'Label', 'In 2-D'                                 , 'CallBack', cb_topoplot1);
+    eegmenu( false,  topo_m, 'Label', 'In 3-D'                                 , 'CallBack', cb_headplot1);
+    eegmenu( versL,  plot_m, 'Label', 'Sum/Compare ERPs'                       , 'userdata', onepoch, 'CallBack', cb_comperp1);
+    eegmenu(~versL,  plot_m, 'Label', 'Channel time-frequency'                 , 'CallBack', cb_timef1);
+
+    eegmenu( false,  plot_m, 'Label', 'Component activations (scroll)'         , 'userdata', ondata     , 'CallBack', cb_eegplot2,'Separator', 'on');
+    eegmenu( false,  plot_m, 'Label', 'Component spectra and maps'             , 'userdata', ondatanoroi, 'CallBack', cb_spectopo2);
+
+    tica_m = eegmenu( false,  plot_m, 'Label', 'Component maps'                , 'userdata', onchannelnoroi);
+    eegmenu( false,  tica_m, 'Label', 'In 2-D'                                 , 'CallBack', cb_topoplot2);
+    eegmenu( false,  tica_m, 'Label', 'In 3-D'                                 , 'CallBack', cb_headplot2);
+    eegmenu( false,  plot_m, 'Label', 'Component properties'                   , 'userdata', ondata , 'CallBack', cb_prop2);
+    eegmenu( false,  plot_m, 'Label', 'Component ERP image'                    , 'userdata', onepoch, 'CallBack', cb_erpimage2);
+
+    ERPC_m = eegmenu( false,  plot_m, 'Label', 'Component ERPs'                , 'userdata', onepoch);
+    eegmenu( false,  ERPC_m, 'Label', 'With component maps'                    , 'userdata', onepochnoroi, 'CallBack', cb_envtopo1);
+    eegmenu( false,  ERPC_m, 'Label', 'With comp. maps (compare)'              , 'userdata', onepochnoroi, 'CallBack', cb_envtopo2);
+    eegmenu( false,  ERPC_m, 'Label', 'In rectangular array'                   , 'userdata', onepoch      , 'CallBack', cb_plotdata2);
+    eegmenu( versL,  plot_m, 'Label', 'Sum/Compare comp. ERPs'                 , 'userdata', onepochnoroi, 'userdata', onepoch, 'CallBack', cb_comperp2);
+
+    stat_m = eegmenu( versL,  plot_m, 'Label', 'Data statistics', 'Separator', 'on', 'userdata', ondata );
+    eegmenu( versL,  stat_m, 'Label', 'Channel statistics'                     , 'CallBack', cb_signalstat1);
+    eegmenu( versL,  stat_m, 'Label', 'Component statistics'                   , 'CallBack', cb_signalstat2);
+    eegmenu( versL,  stat_m, 'Label', 'Event statistics'                       , 'CallBack', cb_eventstat);
+
+    spec_m = eegmenu( versL,  plot_m, 'Label', 'Time-frequency transforms', 'Separator', 'on', 'userdata', ondata);
+    eegmenu( versL,  spec_m, 'Label', 'Channel time-frequency'                 , 'CallBack', cb_timef1);
+    eegmenu( versL,  spec_m, 'Label', 'Channel cross-coherence'                , 'CallBack', cb_crossf1);
+    eegmenu( versL,  spec_m, 'Label', 'Component time-frequency'               , 'CallBack', cb_timef2,'Separator', 'on');     
+    eegmenu( versL,  spec_m, 'Label', 'Component cross-coherence'              , 'CallBack', cb_crossf2);
+    eegmenu(~versL,  plot_m, 'Label', 'Component time-frequency'               , 'CallBack', cb_timef2);     
+
+    eegmenu( false,  std_m,  'Label', 'Edit study info'                        , 'userdata', onstudy, 'CallBack', cb_study3);
+    eegmenu( false,  std_m,  'Label', 'Select/Edit study design(s)'            , 'userdata', onstudy, 'CallBack', cb_studydesign);
+    eegmenu( false,  std_m,  'Label', 'Precompute channel measures'            , 'userdata', onstudy, 'CallBack', cb_precomp, 'separator', 'on');
+    eegmenu( false,  std_m,  'Label', 'Plot channel measures'                  , 'userdata', onstudy, 'CallBack', cb_chanplot);
+    eegmenu( false,  std_m,  'Label', 'Precompute component measures'          , 'userdata', onstudy, 'CallBack', cb_precomp2, 'separator', 'on');
+    clust_m = eegmenu( false,  std_m, 'Label', 'PCA clustering (original)'     , 'userdata', onstudynoroi);
+    eegmenu( false,  clust_m,  'Label', 'Build preclustering array'            , 'userdata', onstudynoroi, 'CallBack', cb_preclust);
+    eegmenu( false,  clust_m,  'Label', 'Cluster components'                   , 'userdata', onstudynoroi, 'CallBack', cb_clust);
+    eegmenu( false,  std_m,  'Label', 'Edit/plot component clusters'           , 'userdata', onstudy, 'CallBack', cb_clustedit);
+
+    if ~isdeployed && ismatlab
+        %newerVersionMenu = eegmenu( false,  help_m, 'Label', 'Upgrade to the Latest Version'          , 'userdata', on, 'ForegroundColor', [0.6 0 0]);
+        eegmenu( false,  help_m, 'Label', 'About EEGLAB'                           , 'userdata', on, 'CallBack', 'pophelp(''eeglab'');');
+        eegmenu( false,  help_m, 'Label', 'Check for EEGLAB update'                , 'userdata', on, 'CallBack', 'eeglab_update;');
+        eegmenu( false,  help_m, 'Label', 'About EEGLAB help'                      , 'userdata', on, 'CallBack', 'pophelp(''eeg_helphelp'');');
+        eegmenu( false,  help_m, 'Label', 'EEGLAB menus'                           , 'userdata', on, 'CallBack', 'pophelp(''eeg_helpmenu'');','separator','on');
+
+        help_1 = eegmenu( false,  help_m, 'Label', 'EEGLAB functions', 'userdata', on);
+        eegmenu( false,  help_1, 'Label', 'Admin. functions'                          , 'userdata', on, 'Callback', 'pophelp(''eeg_helpadmin'');');	
+        eegmenu( false,  help_1, 'Label', 'Interactive pop_ functions'                , 'userdata', on, 'Callback', 'pophelp(''eeg_helppop'');');	
+        eegmenu( false,  help_1, 'Label', 'Signal processing functions'               , 'userdata', on, 'Callback', 'pophelp(''eeg_helpsigproc'');');	
+        eegmenu( false,  help_1, 'Label', 'Group data (STUDY) functions'              , 'userdata', on, 'Callback', 'pophelp(''eeg_helpstudy'');');	
+        eegmenu( false,  help_1, 'Label', 'Time-frequency functions'                  , 'userdata', on, 'Callback', 'pophelp(''eeg_helptimefreq'');');	
+        eegmenu( false,  help_1, 'Label', 'Statistical functions'                     , 'userdata', on, 'Callback', 'pophelp(''eeg_helpstatistics'');');	
+        eegmenu( false,  help_1, 'Label', 'Graphic interface builder functions'       , 'userdata', on, 'Callback', 'pophelp(''eeg_helpgui'');');	
+        eegmenu( false,  help_1, 'Label', 'Misc. command line functions'              , 'userdata', on, 'Callback', 'pophelp(''eeg_helpmisc'');');	
+
+        eegmenu( false,  help_m, 'Label', 'EEGLAB license'                         , 'userdata', on, 'CallBack', 'pophelp(''eeglablicense.txt'', 1);');
+        eegmenu( false,  help_m, 'Label', 'EEGLAB tutorial'                            , 'userdata', on, 'CallBack', 'tutorial;', 'Separator', 'on');
+        eegmenu( false,  help_m, 'Label', 'Email the EEGLAB team'                      , 'userdata', on, 'CallBack', 'web(''mailto:eeglab@sccn.ucsd.edu'');');
+    else
+        eegmenu( false,  help_m, 'Label', 'About EEGLAB'                           , 'userdata', on, 'CallBack', 'abouteeglab;');
+        eegmenu( false,  help_m, 'Label', 'EEGLAB license'                         , 'userdata', on, 'CallBack', 'pophelp(''eeglablicense.txt'', 1);');
+        eegmenu( false,  help_m, 'Label', 'EEGLAB tutorial'                            , 'userdata', on, 'CallBack', 'tutorial;', 'Separator', 'on');
+     end
+
+end
+
+statusconnection = 1;
+eeglabVersionStatus = [];
+if isdeployed || (exist('ismcc') && ismcc)
+    if ~nouiflag
+        disp('Loading plugins');
+        funcname = { ...
+                     @eegplugin_eepimport, ...
+                     @eegplugin_iclabel, ...
+                     @eegplugin_VisEd, ...
+                     @eegplugin_eegbids, ...
+                     @eegplugin_bva_io, ...
+                     @eegplugin_clean_rawdata, ...
+                     @eegplugin_dipfit, ...
+                     @eegplugin_egilegacy, ...
+                     @eegplugin_firfilt, ...
+                     @eegplugin_iirfilt, ...
+                     @eegplugin_musedirect, ...
+                     @eegplugin_musemonitor, ...
+                     @eegplugin_neuroscanio, ...
+                     @eegplugin_scd, ...
+                     @eegplugin_snapmaster, ...
+                     @eegplugin_xdfimport, ...
+                     @eegplugin_mffmatlabio, ...
+                   };
+        for indf = 1:length(funcname)
+            pluginfun = funcname{indf};
+            pluginname = func2str(pluginfun);
+            try
+                outargs = nargout(pluginfun);
+                if outargs == 1
+                    vers = feval(pluginfun, gcf, trystrs, catchstrs);
+                    disp(['EEGLAB: adding "' vers '" plugin' ]);
+                else
+                    feval(funcname{indf}, gcf, trystrs, catchstrs);
+                    disp(['EEGLAB: adding plugin function "' pluginname '"' ]);
+                end
+            catch e
+                disp(['EEGLAB: Could not load "' pluginname '": ' e.message]);
+            end
+        end
+    end
+else    
+    pluginlist  = [];
+    plugincount = 1;
+    
+    eeglabp = fileparts(mywhich('eeglab.m'));
+        
+    % scan plugin folder
+    % ------------------
+    dircontent  = dir(fullfile(eeglabp, 'plugins'));
+    if ~isfield(dircontent, 'folder')
+        [dircontent(:).folder] = deal(fullfile(eeglabp, 'plugins'));
+    end
+    
+    % scan local plugin folder
+    % ------------------------
+    if ~isequal(pwd, eeglabp)
+        dircontent2  = dir(fullfile(pwd, 'plugins'));
+        if ~isempty(dircontent2)
+            fprintf(2, 'WARNING: plugins in current folders may shadow plugins installed in EEGLAB plugins folder\n');
+            if ~isfield(dircontent2, 'folder')
+                [dircontent2(:).folder] = deal(fullfile(pwd, 'plugins'));
+            end
+            dircontent = [dircontent;dircontent2];
+        end
+    end
+    
+    pluginstats = [];
+	if option_checkversion && ismatlab
+        disp('Retrieving plugin versions from server...');
+        try
+            [pluginstats, eeglabVersionStatus] = plugin_getweb('startup', pluginlist);
+        catch
+            disp('Issue with retrieving statistics for extensions');
+        end
+        if ~isfield(pluginstats, 'name') || ~isfield(pluginstats, 'version')
+            pluginstats = [];
+        end
+    end
+    
+    for index = 1:length(dircontent)
+
+        % find function
+        % -------------
+        funcname = '';
+        pluginVersion = [];
+        if exist(fullfile(dircontent(index).folder, dircontent(index).name), 'dir')
+            if ~strcmpi(dircontent(index).name, '.') && ~strcmpi(dircontent(index).name, '..')
+                tmpdir = dir(fullfile(dircontent(index).folder, dircontent(index).name, 'eegplugin*.m'));
+                
+                if ~isempty(tmpdir)
+                    %myaddpath(eeglabpath, tmpdir(1).name, newpath);
+                    funcname = tmpdir(1).name(1:end-2);
+                end
+                addpathifnotinlist(fullfile(dircontent(index).folder, dircontent(index).name));
+                [ pluginName, pluginVersion ] = parsepluginname(dircontent(index).name, funcname(11:end));
+                
+                % special case of subfolder for Fieldtrip
+                % ---------------------------------------
+                if ~isempty(findstr(lower(dircontent(index).name), 'bids-matlab-tools'))
+                    fprintf(2, 'Warning: The bids-matlab-tools plugin is obsolete, uninstall and install EEG-BIDS instead\n');
+                elseif ~isempty(findstr(lower(dircontent(index).name), 'fieldtrip')) && isempty(findstr(lower(dircontent(index).name), 'rest'))
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'compat') , 'electrodenormalize' );
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'forward'), 'ft_sourcedepth.m');
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'utilities'), 'ft_datatype.m');
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'plotting'), 'ft_plot_mesh.m');
+                    ptopoplot  = fileparts(mywhich('cbar'));
+                    ptopoplot2 = fileparts(mywhich('topoplot'));
+                    if ~isequal(ptopoplot, ptopoplot2)
+                        addpath(ptopoplot);
+                    end
+                    % remove folders which should not have been added
+                    if ismatlab
+                        tmppath = fullfile(dircontent(index).folder, dircontent(index).name, 'external');
+                        if ~isempty(findstr(path, tmppath))
+                            allpaths = path;
+                            indperiod = [0 find(allpaths == ':') length(allpaths)+1 ];
+                            for iPath = 1:length(indperiod)-1
+                                curpath = allpaths(indperiod(iPath)+1:indperiod(iPath+1)-1);
+                                if contains(curpath, tmppath)
+                                    fprintf('Removing path %s\n', curpath);
+                                    rmpath(curpath);
+                                end
+                            end
+                        end
+                    end
+                end
+
+                    
+                % special case of subfolder for BIOSIG
+                % ------------------------------------
+                if ~isempty(findstr(lower(dircontent(index).name), 'biosig')) && isempty(strfind(lower(dircontent(index).name), 'biosigplot'))
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'biosig', 't200_FileAccess'), 'sopen.m');
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'biosig', 't250_ArtifactPreProcessingQualityControl'), 'regress_eog.m' );
+                    addpathifnotexist( fullfile(dircontent(index).folder, dircontent(index).name, 'biosig', 'doc'), 'DecimalFactors.txt');
+                end
+                    
+            end
+        else 
+            if ~isempty(findstr(dircontent(index).name, 'eegplugin')) && dircontent(index).name(end) == 'm'
+                funcname = dircontent(index).name(1:end-2); % remove .m
+                [ pluginName, pluginVersion ] = parsepluginname(dircontent(index).name(10:end-2));
+            end
+        end
+
+        % execute function
+        % ----------------
+        if ~isempty(pluginVersion) || ~isempty(funcname)
+            if isempty(funcname)
+                fprintf([ 'EEGLAB: adding "' pluginName '" v' pluginVersion ' to the path' ]);
+                pluginlist(plugincount).plugin     = pluginName;
+                pluginlist(plugincount).version    = pluginVersion;
+                pluginlist(plugincount).foldername = dircontent(index).name;
+                pluginlist(plugincount).status     = 'ok';
+                if ~isempty(pluginstats)
+                    indPlugin = strmatch(lower(pluginlist(plugincount).plugin), lower({ pluginstats.name }), 'exact');
+                else
+                    indPlugin = [];
+                end
+                if ~isempty(indPlugin)
+                    if ~strcmpi(pluginVersion, pluginstats(indPlugin).version)
+                        fprintf(2, ' - new version %s available\n', pluginstats(indPlugin).version);
+                    else 
+                        fprintf('\n');
+                    end
+                else
+                    fprintf('\n');
+                end
+                plugincount = plugincount+1;
+            else
+                pluginlist(plugincount).plugin     = pluginName;
+                pluginlist(plugincount).version    = pluginVersion;
+                vers2  = '';
+                status = 'ok';
+                if ~nouiflag
+                    try
+                        %eval( [ 'vers2 =' funcname '(gcf, trystrs, catchstrs);' ]);
+                        vers2 = feval(funcname, gcf, trystrs, catchstrs);
+                        [~, vers2] = parsepluginname(vers2);
+                    catch
+                        try
+                            eval( [ funcname '(gcf, trystrs, catchstrs)' ]);
+                        catch
+                            disp([ 'EEGLAB: error while adding plugin "' funcname '"' ] ); 
+                            disp([ '   ' lasterr] );
+                            status = 'error';
+                        end
+                    end
+                end
+                if isempty(pluginlist(plugincount).version)
+                    pluginlist(plugincount).version = vers2;
+                elseif ~isempty(vers2)
+                    if ~isequal(pluginlist(plugincount).version, vers2)
+                        fprintf('WARNING: for plugin "%s" version in the folder name "%s" and in the eegplugin_ file "%s" differ\n', pluginlist(plugincount).plugin, pluginlist(plugincount).version,vers2);
+                    end
+                end
+                pluginlist(plugincount).funcname   = funcname(10:end);
+                pluginlist(plugincount).foldername = dircontent(index).name;
+                if length(pluginlist(plugincount).funcname) > 1 && pluginlist(plugincount).funcname(1) == '_'
+                    pluginlist(plugincount).funcname(1) = [];
+                end 
+                if strcmpi(status, 'ok')
+                    vers   = pluginlist(plugincount).version; % version
+                    if isempty(vers), vers = '?'; end
+                    fprintf('EEGLAB: adding "%s" v%s (see >> help %s)', ...
+                        pluginlist(plugincount).plugin, vers, funcname);
+                    if ~isempty(pluginstats)
+                        indPlugin = strmatch(lower(pluginlist(plugincount).plugin), lower({ pluginstats.name }), 'exact');
+                        if length(indPlugin) == 1
+                            if ~isempty(pluginstats(indPlugin).custommsg)
+                                if length(pluginstats(indPlugin).custommsg) > 50
+                                    fprintf(2, ' - %s...\n', pluginstats(indPlugin).custommsg(1:50));
+                                else
+                                    fprintf(2, ' - %s\n', pluginstats(indPlugin).custommsg);
+                                end
+                            elseif ~strcmpi(vers, pluginstats(indPlugin).version)
+                                if isequal(pluginstats(indPlugin).critical, 1)
+                                   fprintf(2, ' - new version %s available (critical bug fix)\n', pluginstats(indPlugin).version);
+                                else
+                                   fprintf(2, ' - new version %s available\n', pluginstats(indPlugin).version);
+                                end
+                            else
+                                fprintf('\n');
+                            end
+                        else
+                            fprintf('\n');
+                        end
+                    else
+                        fprintf('\n');
+                    end
+                end
+                pluginlist(plugincount).status       = status;
+                plugincount = plugincount+1;
+            end
+        end
+    end
+    global PLUGINLIST;
+    PLUGINLIST = pluginlist;
+    
+    % add menus for plugins to install
+    % --------------------------------
+    if ismatlab && ~nouiflag
+        if ~exist('mff_import', 'file')
+            neuro_m = findobj(W_MAIN, 'tag', 'import data');
+            cb_mff = [ 'if ~plugin_askinstall(''mffmatlabio'', ''mff_import''), return; end;' ...
+                       'eval(char(get(findobj(''label'', ''Import Magstim/EGI .mff file''), ''callback'')));' ];
+            eegmenu( false,  neuro_m, 'Label', 'Import Magstim/EGI .mff file', 'CallBack', cb_mff, 'separator', 'on');
+        end
+        if ~exist('eegplugin_neuroscanio', 'file')
+            neuro_m = findobj(W_MAIN, 'tag', 'import data');
+            neuroscan_check = 'if ~plugin_askinstall(''neuroscanio'', ''eegplugin_neuroscanio''), return; end;';
+            cb_neuroscan1 = [ neuroscan_check 'eval(char(get(findobj(''label'', ''From Neuroscan .CNT file''), ''callback'')));' ];
+            cb_neuroscan2 = [ neuroscan_check 'eval(char(get(findobj(''label'', ''From Neuroscan .EEG file''), ''callback'')));' ];
+            eegmenu( false,  neuro_m, 'Label', 'From Neuroscan .CNT file', 'CallBack', cb_neuroscan1, 'Separator', 'on');
+            eegmenu( false,  neuro_m, 'Label', 'From Neuroscan .EEG file', 'CallBack', cb_neuroscan2);
+        end
+        if ~exist('eegplugin_firfilt', 'file')
+            neuro_m = findobj(W_MAIN, 'tag', 'filter');
+            cb_filter = [ 'if ~plugin_askinstall(''firfilt'', ''eegplugin_firfilt''), return; end;' ...
+                       'eval(char(get(findobj(''label'', ''Basic FIR filter (new, default)''), ''callback'')));' ];
+            eegmenu( false,  neuro_m, 'Label', 'Basic FIR filter (new, default)', 'CallBack', cb_filter, 'separator', 'on');
+        end
+        if ~exist('eegplugin_iclabel', 'file')
+            fprintf(2, 'Warning: ICLabel default plugin missing (probably due to downloading zip file from Github). Install manually.\n');
+        end
+        if ~exist('eegplugin_clean_rawdata', 'file')
+            fprintf(2, 'Warning: Clean Rawdata  plugin missing (probably due to downloading zip file from Github). Install manually.\n');
+        end
+        if ~exist('pop_dipfit_settings', 'file')
+            neuro_m = findobj(W_MAIN, 'tag', 'tools');
+            cb_dipfit =  'if ~plugin_askinstall(''dipfit'', ''pop_dipfit_settings''), return; end;'  ;
+            eegmenu( false,  neuro_m, 'Label', 'Locate dipoles using DIPFIT 2.x', 'CallBack', cb_dipfit, 'separator', 'on');
+        end
+        if ~exist('pop_loadbva', 'file')
+            neuro_m = findobj(W_MAIN, 'tag', 'import data');
+            cb_bva1 = [ 'if ~plugin_askinstall(''bva-io'', ''pop_loadbva''), return; end;' ...
+                       'eval(char(get(findobj(''label'', ''From Brain Vis. Rec. .vhdr file''), ''callback'')));' ];
+            cb_bva2 = [ 'if ~plugin_askinstall(''bva-io'', ''pop_loadbva''), return; end;' ...
+                       'eval(char(get(findobj(''label'', ''From Brain Vis. Anal. Matlab file''), ''callback'')));' ];
+            eegmenu( false,  neuro_m, 'Label', 'From Brain Vis. Rec. .vhdr file', 'CallBack', cb_bva1, 'separator', 'on');
+            eegmenu( false,  neuro_m, 'Label', 'From Brain Vis. Anal. Matlab file', 'CallBack', cb_bva2);
+        end
+    end
+end
+
+% Path exception for BIOSIG (sending BIOSIG down into the path)
+biosigpathlast; % fix str2double issue
+
+% push SIFT path last for dipplot
+dipplotpath = fileparts( which('dipplot') );
+dipfitpath  = fileparts( which('dipfit_1_to_2') );
+if ~strcmp(dipplotpath,dipfitpath)
+    addpath(dipfitpath,'-begin');
+end
+
+if exist(onearg, 'file') % execute script
+    pop_runscript(onearg);
+elseif any(onearg == ';') % execute code if there is a semicolumn in the argument
+    evalin('base', onearg);
+end
+
+if nouiflag
+    return;
+end
+
+% add other import ...
+% --------------------
+cb_others = [ 'pophelp(''troubleshooting_data_formats'');' ];
+eegmenu( false,  import_m, 'Label', 'Using the FILE-IO interface', 'CallBack', cb_fileio, 'separator', 'on'); 
+eegmenu( false,  import_m, 'Label', 'Using the BIOSIG interface' , 'CallBack', cb_biosig); 
+eegmenu( false,  import_m, 'Label', 'Troubleshooting data formats...', 'CallBack', cb_others);    
+
+% changing plugin menu color
+% --------------------------
+fourthsub_m = findobj('parent', tools_m);
+plotsub_m   = findobj('parent', plot_m);
+importsub_m = findobj('parent', neuro_m);
+epochsub_m  = findobj('parent', epoch_m);
+eventsub_m  = findobj('parent', event_m);    
+editsub_m   = findobj('parent', edit_m);
+exportsub_m = findobj('parent', exportm);
+filter_m    = findobj('parent', filter_m);
+
+% check if ERPLAB overloads icadefs
+% --------------------------
+icadefsPath = fileparts(which('icadefs'));
+if ~isempty(findstr('erplab', lower(icadefsPath)))
+    rmpath(icadefsPath);
+    if isempty(which('icadefs'))
+        addpath(icadefsPath);
+    end
+end
+
+icadefs; % containing PLUGINMENUCOLOR
+if versL, tm = 14; else tm = 16; end
+if length(fourthsub_m) > tm, set(fourthsub_m(1:end-tm), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(plotsub_m)   > 17, set(plotsub_m  (1:end-17), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(importsub_m) > 4,  set(importsub_m(1:end-4) , 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(epochsub_m ) > 3 , set(epochsub_m (1:end-3 ), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(eventsub_m ) > 4 , set(eventsub_m (1:end-4 ), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(exportsub_m) > 4 , set(exportsub_m(1:end-4 ), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(editsub_m)   > 10, set(editsub_m(  1:end-10), 'foregroundcolor', PLUGINMENUCOLOR); end
+if length(filter_m)    > 3 , set(filter_m   (1:end-1 ), 'foregroundcolor', PLUGINMENUCOLOR); end
+
+EEGMENU = eegmenu( false,  set_m, 'Label', '------', 'Enable', 'off');
+eval('set(W_MAIN, ''userdat'', { EEGUSERDAT{1} EEGMENU });');
+eeglab('redraw');
+if nargout < 1
+    clear ALLEEG;
+end
+
+% check if update is available
+if ismatlab
+    eeglab_update(eeglabVersionStatus);
+end
+
+% REMOVED MENUS
+	%eegmenu( false,  tools_m, 'Label', 'Automatic comp. reject',  'enable', 'off', 'CallBack', '[EEG LASTCOM] = pop_rejcomp(EEG); eegh(LASTCOM); if ~isempty(LASTCOM), eeg_store(CURRENTSET); end;');
+	%eegmenu( false,  tools_m, 'Label', 'Reject (synthesis)' , 'Separator', 'on', 'CallBack', '[EEG LASTCOM] = pop_rejall(EEG); eegh(LASTCOM); if ~isempty(LASTCOM), eeg_store; end; eeglab(''redraw'');');
+   
+%     
+% --------------------
+% draw the main figure
+% --------------------
+
+function eeg_mainfig(onearg)
+
+icadefs;
+COLOR = BACKEEGLABCOLOR;
+WINMINX         = 17;
+WINMAXX         = 260;
+WINYDEC			= 13;
+NBLINES         = 16;
+WINY		    = WINYDEC*NBLINES;
+
+BORDERINT       = 4;
+BORDEREXT       = 10;
+comp = computer;
+if strcmpi(comp(1:3), 'GLN') || strcmpi(comp(1:3), 'MAC') || strcmpi(comp(1:3), 'PCW')  
+    FONTNAME        = 'courier';
+    FONTSIZE        = 8;
+    % Magnify figure under MATLAB 2012a
+    vers = version;
+    dotPos = find(vers == '.');
+    vernum = str2num(vers(1:dotPos(1)-1));
+    subvernum = str2num(vers(dotPos(1)+1:dotPos(2)-1));
+    if vernum > 7 || (vernum >= 7 && subvernum >= 14)
+        FONTSIZE = FONTSIZE+2;
+        WINMAXX  = WINMAXX*1.3;
+        WINY     = WINY*1.3;
+    end
+else
+    FONTNAME        = '';
+    FONTSIZE        = 11;
+end    
+if ~ismatlab
+    WINMAXX  = WINMAXX*1.35;
+    WINY     = WINY*1.4;
+end
+
+hh = findobj('tag', 'EEGLAB');
+if ~isempty(hh)
+    disp('EEGLAB warning: there can be only one EEGLAB window, closing old one');
+    close(hh);
+end
+
+% determine the text for the revision
+[txtVersion, numVersion ] = eeg_getversion;
+if ~isempty(numVersion)
+    txtVersion = [ 'EEGLAB v' txtVersion ];
+else
+    txtVersion = [ 'EEGLAB ' txtVersion ];    
+end
+if ~ismatlab && ismac
+    txtVersion = [ txtVersion ' - menu is on the top bar' ];
+end
+
+% create figures
+if strcmpi(onearg, 'remote')
+    figure(	'name', txtVersion, ... 
+	'numbertitle', 'off', ...
+	'Position',[200 100 (WINMINX+WINMAXX+2*BORDERINT+2*BORDEREXT) 30 ], ...
+	'color', COLOR, ...
+	'Tag','EEGLAB', ...
+	'Userdata', {[] []});
+	%'resize', 'off', ...
+    return;
+end
+
+W_MAIN = figure('Units','points', ...
+... %	'Colormap','gray', ...
+	'PaperPosition',[18 180 576 432], ...
+	'PaperUnits','points', ...
+	'name', txtVersion, ... 
+	'numbertitle', 'off', ...
+	'Position',[200 100 (WINMINX+WINMAXX+2*BORDERINT+2*BORDEREXT) (WINY+2*BORDERINT+2*BORDEREXT) ], ...
+	'color', COLOR, ...
+	'Tag','EEGLAB', ...
+    'visible', 'off', ...   
+	'Userdata', {[] []});
+%	'resize', 'off', ...
+
+% java chat
+eeglab_options;
+
+try
+    set(W_MAIN, 'NextPlot','new');
+catch, end
+
+BackgroundColor = get(gcf, 'color'); %[0.701960784313725 0.701960784313725 0.701960784313725];
+H_MAIN(1) = uicontrol('Parent',W_MAIN, ...
+    'Units','points', ...
+    'BackgroundColor',COLOR, ...
+    'ListboxTop',0, ...
+    'HorizontalAlignment', 'left',...
+    'Position',[BORDEREXT   BORDEREXT  (WINMINX+WINMAXX+2*BORDERINT)  (WINY)], ...
+    'Style','frame', ...
+   'Tag','Frame1');
+set(H_MAIN(1), 'unit', 'normalized');
+geometry = { [1] [1] [1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1 1] [1] };
+listui = { { 'style', 'text', 'string', 'Parameters of the current set', 'tag', 'win0' } { } ...
+           { 'style', 'text', 'tag', 'win1', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win2', 'string', 'Channels per frame', 'userdata', 'datinfo'} ...
+           { 'style', 'text', 'tag', 'val2', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win3', 'string', 'Frames per epoch', 'userdata', 'datinfo'} ...
+           { 'style', 'text', 'tag', 'val3', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win4', 'string', 'Epochs', 'userdata', 'datinfo'} ...
+           { 'style', 'text', 'tag', 'val4', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win5', 'string', 'Events', 'userdata', 'datinfo'} ...
+           { 'style', 'text', 'tag', 'val5', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win6', 'string', 'Sampling rate (Hz)', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'val6', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win7', 'string', 'Epoch start (sec)', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'val7', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win8', 'string', 'Epoch end (sec)', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'val8', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win9', 'string', 'Average reference', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'val9', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win10', 'string', 'Channel locations', 'userdata', 'datinfo'} ...
+           { 'style', 'text', 'tag', 'val10', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win11', 'string', 'ICA weights', 'userdata', 'datinfo'  } ...
+           { 'style', 'text', 'tag', 'val11', 'string', ' ', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'win12', 'string', 'Dataset size (Mb)', 'userdata', 'datinfo' } ...
+           { 'style', 'text', 'tag', 'val12', 'string', ' ', 'userdata', 'datinfo' } {} };
+supergui(gcf, geometry, [], listui{:});
+geometry = { [1] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1 0.01] [1] };
+listui = { { } ...
+           { 'style', 'text', 'tag', 'mainwin0', 'string', ' ', 'userdata', 'fullline' } { } ...
+           { 'style', 'text', 'tag', 'mainwin1', 'string', ' ', 'userdata', 'fullline' } { } ...
+           { 'style', 'text', 'tag', 'mainwin2', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin3', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin4', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin5', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin6', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin7', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin8', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin9', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin10', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin11', 'string', ' ', 'userdata', 'fullline' } { }  ...
+           { 'style', 'text', 'tag', 'mainwin12', 'string', ' ', 'userdata', 'fullline' } { }   ...
+           { 'style', 'text', 'tag', 'mainwin13', 'string', ' ', 'userdata', 'fullline' } { } {} };
+firstElemHeight = 1;
+if ispc, firstElemHeight = 1.7; end
+supergui(gcf, geometry, [firstElemHeight 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1], listui{:});
+
+titleh   = findobj('parent', gcf, 'tag', 'win0');
+alltexth = findobj('parent', gcf, 'style', 'text');
+alltexth = setdiff_bc(alltexth, titleh);
+
+set(gcf, 'Position',[200 100 (WINMINX+WINMAXX+2*BORDERINT+2*BORDEREXT) (WINY+2*BORDERINT+2*BORDEREXT) ]);
+set(titleh, 'fontsize', TEXT_FONTSIZE_L, 'fontweight', 'bold');
+set(alltexth, 'fontname', FONTNAME, 'fontsize', FONTSIZE);
+
+set(W_MAIN, 'visible', 'on');
+    
+return;
+
+% Update EEGLAB GUI (list of datasets)
+% -----------------
+function updatemenu()
+eeg_global;
+
+W_MAIN = findobj('tag', 'EEGLAB');
+EEGUSERDAT = get(W_MAIN, 'userdata');
+H_MAIN  = EEGUSERDAT{1};
+EEGMENU = EEGUSERDAT{2};
+if exist('CURRENTSET') ~= 1, CURRENTSET = 0; end
+if isempty(ALLEEG), ALLEEG = []; end
+if isempty(EEG), EEG = []; end
+
+% test if the menu is present  
+try
+	figure(W_MAIN);
+	set_m   = findobj( 'parent', W_MAIN, 'Label', 'Datasets');
+catch, return; end
+index = 1;
+indexmenu = 1;
+
+% check if EEG has changed
+% ------------------------
+tmp = warning;
+warning off;
+clear functions;
+warning(tmp);
+eeglab_options;
+if isempty(ALLEEG) && ~isempty(EEG) && all(arrayfun(@(eeg) ~isempty(eeg.data), EEG))
+    ALLEEG = EEG;
+else
+    % check dataset
+    if ~isempty(EEG) && ~isempty(ALLEEG) && CURRENTSET(1) > 0 && ~isequaln(EEG, ALLEEG(CURRENTSET))
+        if length(EEG) > 1
+            options =  { 'EEG overwrites ALLEEG', 'ALLEEG overwrites EEG', 'Do nothing' };
+            res = questdlg2('In a STUDY, ALLEEG and EEG should be equal and they are not. How do you want EEGLAB to resolve this?', 'ALLEEG and EEG structure do not match', options{:}, options{1});
+            if isequal(res, options{1})
+                disp('Overwriting ALLEEG with EEG')
+                ALLEEG = EEG;
+            elseif isequal(res, options{2})
+                disp('Overwriting EEG with ALLEEG')
+                EEG = ALLEEG;
+            end
+        else
+            EEG.saved = 'no';
+            [ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, CURRENTSET, 'study', ~isempty(STUDY)+0, 'guistring', 'The EEG structure has changed, what do you want to do?');
+        end
+    end
+end
+
+% Maximum number of set
+% ---------------------
+MAX_SET = max(length( ALLEEG ), length(EEGMENU)-1);
+if MAX_SET > 200
+    disp('Updating menu, restricting menu selection to the first 200 datasets to speed up display...')
+    MAX_SET = 200;
+end
+
+% setting the dataset menu
+% ------------------------
+while( index <= MAX_SET)
+    try
+        set( EEGMENU(index), 'Label', '------', 'checked', 'off');
+    catch
+        if mod(index, 30) == 0
+            tag = [ 'More (' int2str(index/30) ') ->' ];
+            tmp_m = findobj('label', tag);
+            if isempty(tmp_m)
+                 set_m = eegmenu( false,  set_m, 'Label', tag, 'userdata', 'study:on'); 
+            else set_m = tmp_m;
+            end	
+        end
+        try
+            set( EEGMENU(index), 'Label', '------', 'checked', 'off');
+        catch, EEGMENU(index) = eegmenu( false,  set_m, 'Label', '------', 'Enable', 'on'); end	
+    end        
+	set( EEGMENU(index), 'Enable', 'on', 'separator', 'off' );
+	try, ALLEEG(index).data;
+		if ~isempty( ALLEEG(index).data)
+            
+            cb_retrieve = [ '[ALLEEG EEG CURRENTSET LASTCOM] = pop_newset(ALLEEG, EEG, CURRENTSET, ''retrieve'', ' int2str(index) ', ''study'', ~isempty(STUDY)+0);' ...
+                            'if CURRENTSTUDY && ~isempty(LASTCOM), CURRENTSTUDY = 0; LASTCOM = [ ''CURRENTSTUDY = 0;'' LASTCOM ]; end; eegh(LASTCOM);' ...
+                            'eeglab(''redraw'');' ];
+            
+       		menutitle   = sprintf('Dataset %d:%s', index, ALLEEG(index).setname);
+			set( EEGMENU(index), 'Label', menutitle, 'userdata', 'study:on');
+			set( EEGMENU(index), 'CallBack', cb_retrieve );
+			set( EEGMENU(index), 'Enable', 'on' );
+            if any(index == CURRENTSET), set( EEGMENU(index), 'checked', 'on' ); end
+		end
+	catch, end	
+	index = index+1;
+end
+hh = findobj( 'parent', set_m, 'Label', '------');
+set(hh, 'Enable', 'off');
+
+% menu for selecting several datasets
+% -----------------------------------
+if index ~= 0
+    cb_select = [ 'nonempty = find(~cellfun(''isempty'', { ALLEEG.data } ));' ...                  
+                  'tmpind = pop_chansel({ ALLEEG(nonempty).setname }, ''withindex'', nonempty);' ... 
+                  'if ~isempty(tmpind),' ...
+                  '    [ALLEEG EEG CURRENTSET LASTCOM] = pop_newset(ALLEEG, EEG, CURRENTSET, ''retrieve'', nonempty(tmpind), ''study'', ~isempty(STUDY)+0);' ...
+                  '    eegh(LASTCOM);' ...
+                  '    eeglab(''redraw'');' ...
+                  'end;' ...
+                  'clear tmpind nonempty;' ];
+    if MAX_SET == length(EEGMENU), EEGMENU(end+1) = eegmenu( false,  set_m, 'Label', '------', 'Enable', 'on'); end
+    
+    set(EEGMENU(end), 'enable', 'on', 'Label', 'Select multiple datasets', ...
+                      'callback', cb_select, 'separator', 'on', 'userdata', 'study:on');
+end
+
+% STUDY consistency
+% -----------------
+exist_study = 0;
+if exist('STUDY') && exist('CURRENTSTUDY')
+
+    % if study present, check study consistency with loaded datasets
+    % --------------------------------------------------------------
+    if ~isempty(STUDY)
+        if length(ALLEEG) > length(STUDY.datasetinfo) || ~isfield(ALLEEG, 'data') || any(cellfun('isempty', {ALLEEG.data}))
+            if strcmpi(STUDY.saved, 'no')
+                res = questdlg2( strvcat('The study is not compatible with the datasets present in memory', ...
+                                         'It is self consistent but EEGLAB is not be able to process it.', ...
+                                         'Do you wish to save the study as it is (EEGLAB will prompt you to', ...
+                                         'enter a file name) or do you wish to remove it'), 'Study inconsistency', 'Save and remove', 'Remove', 'Remove' );
+                if strcmpi(res, 'Remove')
+                    STUDY = [];
+                    CURRENTSTUDY = 0;
+                else
+                    pop_savestudy(STUDY, ALLEEG);
+                    STUDY = [];
+                    CURRENTSTUDY = 0;
+                end
+            else
+                warndlg2( strvcat('The study was not compatible any more with the datasets present in memory.', ...
+                                  'Since it had not changed since last saved, it was simply removed from', ...
+                                  'memory.') );
+                STUDY = [];
+                CURRENTSTUDY = 0;
+            end
+        end
+    end
+    
+    if ~isempty(STUDY)
+        exist_study = 1;
+    end
+end
+
+% menu for selecting STUDY set
+% ----------------------------
+if exist_study
+    cb_select = [ '[ALLEEG EEG CURRENTSET LASTCOM] = pop_newset(ALLEEG, EEG, CURRENTSET, ''retrieve'', [STUDY.datasetinfo.index], ''study'', 1);' ...
+                  'if ~isempty(LASTCOM), CURRENTSTUDY = 1; LASTCOM = [ LASTCOM ''CURRENTSTUDY = 1;'' ]; end;' ...
+                  'eegh(LASTCOM);' ...
+                  'eeglab(''redraw'');' ];
+    if length(EEGMENU) > 1 
+        if isnumeric(EEGMENU) 
+            if isequal( get(EEGMENU(end), 'text'), 'Select the study set')
+                delete(EEGMENU(end)); % in case it is not at the end
+                EEGMENU(end) = [];
+            end
+        elseif isequal( EEGMENU(end).Text, 'Select the study set')
+            delete(EEGMENU(end)); % in case it is not at the end
+            EEGMENU(end) = [];
+        end
+    end
+    EEGMENU(end+1) = eegmenu( false,  set_m, 'Label', 'Select the study set', 'Enable', 'on', 'userdata', 'study:on');
+    set(EEGMENU(end), 'enable', 'on', 'callback', cb_select, 'separator', 'on');        
+else 
+    if length(EEGMENU) > 1
+        if isnumeric(EEGMENU) 
+            if isequal( get(EEGMENU(end), 'text'), 'Select the study set')
+                delete(EEGMENU(end)); % in case it is not at the end
+                EEGMENU(end) = [];
+            end
+        elseif isequal( EEGMENU(end).Text, 'Select the study set')
+            delete(EEGMENU(end)); % in case it is not at the end
+            EEGMENU(end) = [];
+        end
+    end
+end
+
+EEGUSERDAT{2} = EEGMENU;
+set(W_MAIN, 'userdata', EEGUSERDAT);
+
+if (isempty(CURRENTSET) || length(ALLEEG) < CURRENTSET(1) || CURRENTSET(1) == 0 || isempty(ALLEEG(CURRENTSET(1)).data))
+	CURRENTSET = 0;
+	for index = 1:length(ALLEEG)
+		if ~isempty(ALLEEG(index).data)
+			CURRENTSET = index;
+			break;
+		end
+	end
+	if CURRENTSET ~= 0
+		eegh([ '[EEG ALLEEG CURRENTSET] = eeg_retrieve(ALLEEG,' int2str(CURRENTSET) ');' ])
+		[EEG, ALLEEG] = eeg_retrieve(ALLEEG, CURRENTSET);	
+	else 
+		EEG = eeg_emptyset;
+	end
+end
+
+if (isempty(EEG) || isempty(EEG(1).data)) && CURRENTSET(1) ~= 0
+	eegh([ '[EEG ALLEEG CURRENTSET] = eeg_retrieve(ALLEEG,' int2str(CURRENTSET) ');' ])
+	[EEG, ALLEEG] = eeg_retrieve(ALLEEG, CURRENTSET);	
+end
+
+% test if dataset has changed
+% ---------------------------
+if length(EEG) == 1 && length(CURRENTSET) == 1
+    if ~isempty(ALLEEG) && CURRENTSET~= 0 &&  ~isequal(EEG.data, ALLEEG(CURRENTSET).data)
+        if exist('isequaln','builtin') ~= 5, isequalfunc = @isequal; else  isequalfunc = @isequaln; end
+        if isequalfunc(EEG.data, ALLEEG(CURRENTSET).data)
+            disp('Warning: Your data contains NaNs.');
+        else
+            disp('Warning: The backup dataset in EEGLAB memory does not match the current dataset.');
+            disp('         The dataset in memory has been overwritten');
+            [ALLEEG, EEG, CURRENTSET] = eeg_store(ALLEEG, EEG, CURRENTSET);
+            eegh('[ALLEEG EEG CURRENTSET] = eeg_store(ALLEEG, EEG, CURRENTSET);');
+        end
+    end
+else
+    EEG = ALLEEG(CURRENTSET);
+end
+
+% print some information on the main figure
+% ------------------------------------------
+g = myguihandles(gcf);
+if ~isfield(g, 'win0') % no display
+    return;
+end
+
+study_selected = 0;
+if exist('STUDY') && exist('CURRENTSTUDY')
+    if CURRENTSTUDY == 1, study_selected = 1; end
+end
+
+menustatus = {};
+try
+    curroiFlag = unique(cellfun(@(x)getfield(x, 'eeglab_using_roi'), { EEG(:).roi }));
+    if length(curroiFlag) == 1 && curroiFlag
+        menustatus = { menustatus{:} 'roi_connect' };
+    else
+        disp('Warning: different settings for using ROIs detected in different datasets');
+    end
+catch
+end
+if study_selected
+    menustatus = { menustatus{:} 'study' };
+    
+    hh = findobj('parent', gcf, 'userdata', 'fullline'); set(hh, 'visible', 'off');
+    hh = findobj('parent', gcf, 'userdata', 'datinfo');  set(hh, 'visible', 'on');
+
+    % head string
+    % -----------
+    set( g.win0, 'String', sprintf('STUDY set: %s', STUDY.name) );
+    
+    % dataset type
+    % ------------
+    datasettype = unique_bc( [ EEG.trials ] );
+    if datasettype(1) == 1 && length(datasettype) == 1, datasettype = 'continuous';
+    elseif datasettype(1) == 1,                        datasettype = 'epoched and continuous';
+    else                                               datasettype = 'epoched';
+    end
+    
+    % number of channels and channel locations
+    % ----------------------------------------
+    chanlen    = unique_bc( [ EEG.nbchan ] );
+    chanlenstr = vararg2str( mattocell(chanlen) );
+    anyempty    = unique_bc( cellfun( 'isempty', { EEG.chanlocs }) );
+    if length(anyempty) == 2,   chanlocs = 'mixed, yes and no';
+    elseif anyempty == 0,       chanlocs = 'yes';
+    else                        chanlocs = 'no';
+    end
+
+    % ica weights
+    % -----------
+    anyempty    = unique_bc( cellfun( 'isempty', { EEG.icaweights }) );
+    if length(anyempty) == 2,   studystatus = 'Missing ICA dec.';
+    elseif anyempty == 0,       studystatus = 'Ready to precluster';
+    else                        studystatus = 'Missing ICA dec.';
+    end
+
+    % consistency && other parameters
+    % ------------------------------
+    [EEG, epochconsist] = eeg_checkset(EEG, 'epochconsist');        % epoch consistency
+    [EEG, chanconsist ] = eeg_checkset(EEG, 'chanconsist');         % channel consistency
+    [EEG, icaconsist  ] = eeg_checkset(EEG, 'icaconsist');          % ICA consistency
+    totevents = num2str(sum( cellfun( 'length', { EEG.event }) )); % total number of events
+    totsize   = whos('STUDY', 'ALLEEG');                              % total size
+    if isempty(STUDY.session),   sessionstr = ''; else sessionstr = vararg2str(STUDY.session); end
+    if isempty(STUDY.condition), condstr    = ''; else condstr    = vararg2str(STUDY.condition); end
+    
+    % determine study status
+    % ----------------------
+    if isfield(STUDY.etc, 'preclust')
+        if ~isempty( STUDY.etc.preclust )
+            studystatus = 'Pre-clustered';
+        elseif length(STUDY.cluster) > 1
+            studystatus = 'Clustered';
+        end
+    elseif length(STUDY.cluster) > 1
+        studystatus = 'Clustered';
+    end        
+    
+    % text
+    % ----
+    set( g.win2, 'String', 'Study task name');
+    set( g.win3, 'String', 'Nb of subjects');
+    set( g.win4, 'String', 'Nb of conditions');
+    set( g.win5, 'String', 'Nb of sessions');
+    set( g.win6, 'String', 'Nb of groups');
+    set( g.win7, 'String', 'Epoch consistency');
+    set( g.win8, 'String', 'Channels per frame');
+    set( g.win9, 'String', 'Channel locations');
+    set( g.win10, 'String', 'Clusters');
+    set( g.win11, 'String', 'Status');
+    set( g.win12, 'String', 'Total size (Mb)');
+    
+    % values
+    % ------
+    fullfilename = fullfile( STUDY.filepath, STUDY.filename);
+    if length(fullfilename) > 26
+        set( g.win1, 'String', sprintf('Study filename: ...%s\n', fullfilename(max(1,length(fullfilename)-26):end) ));
+    else
+        set( g.win1, 'String', sprintf('Study filename: %s\n'   , fullfilename));
+    end        	
+    condconsist  = std_checkconsist(STUDY, 'uniform', 'condition');
+    groupconsist = std_checkconsist(STUDY, 'uniform', 'group');
+    sessconsist  = std_checkconsist(STUDY, 'uniform', 'session');
+    txtcond  = fastif(condconsist , ' per subject', ' (some missing)');
+    txtgroup = fastif(groupconsist, ' per subject', ' (some missing)');
+    txtsess  = fastif(sessconsist , ' per subject', ' (some missing)');
+    set( g.val2, 'String', STUDY.task);
+    set( g.val3, 'String', int2str(max(1, length(STUDY.subject))));
+    set( g.val4, 'String', [ int2str(max(1, length(STUDY.condition))) txtcond ]);
+    set( g.val5, 'String', [ int2str(max(1, length(STUDY.session)))   txtsess ]);
+    set( g.val6, 'String', [ int2str(max(1, length(STUDY.group)))    txtgroup ]);
+    set( g.val7, 'String', char(epochconsist));
+    set( g.val8, 'String', char(chanlenstr));
+    set( g.val9, 'String', char(chanlocs));
+    set( g.val10, 'String', num2str(length(STUDY.cluster)));
+    set( g.val11, 'String', char(studystatus));
+    set( g.val12, 'String', num2str(round(sum( [ totsize.bytes] )/1E6*10)/10));        
+    
+elseif (exist('EEG') == 1) && ~isnumeric(EEG) && ~isempty(EEG(1).data) 
+
+    hh = findobj('parent', gcf, 'userdata', 'fullline'); set(hh, 'visible', 'off');
+    hh = findobj('parent', gcf, 'userdata', 'datinfo');  set(hh, 'visible', 'on');
+    
+    if length(EEG) > 1 % several datasets
+
+        menustatus = { menustatus{:} 'multiple_datasets' };
+        
+        % head string
+        % -----------
+        strsetnum = 'Datasets ';
+        for i = CURRENTSET
+            strsetnum = [ strsetnum int2str(i) ',' ];
+        end
+        strsetnum = strsetnum(1:end-1);
+        set( g.win0, 'String', strsetnum);
+        
+        % dataset type
+        % ------------
+        datasettype = unique_bc( [ EEG.trials ] );
+        if datasettype(1) == 1 && length(datasettype) == 1, datasettype = 'continuous';
+        elseif datasettype(1) == 1,                        datasettype = 'epoched and continuous';
+        else                                               datasettype = 'epoched';
+        end
+        
+        % number of channels and channel locations
+        % ----------------------------------------
+        chanlen    = unique_bc( [ EEG.nbchan ] );
+        chanlenstr = vararg2str( mattocell(chanlen) );
+        anyempty    = unique_bc( cellfun( 'isempty', { EEG.chanlocs }) );
+        if length(anyempty) == 2,   chanlocs = 'mixed, yes and no';
+        elseif anyempty == 0,       chanlocs = 'yes';
+        else                        chanlocs = 'no';
+        end
+
+        % ica weights
+        % -----------
+        anyempty    = unique_bc( cellfun( 'isempty', { EEG.icaweights }) );
+        if length(anyempty) == 2,   icaweights = 'mixed, yes and no';
+        elseif anyempty == 0,       icaweights = 'yes';
+        else                        icaweights = 'no';
+        end
+
+        % consistency & other parameters
+        % ------------------------------
+        [EEG, epochconsist] = eeg_checkset(EEG, 'epochconsist');        % epoch consistency
+        [EEG, chanconsist ] = eeg_checkset(EEG, 'chanconsist');         % channel consistency
+        [EEG, icaconsist  ] = eeg_checkset(EEG, 'icaconsist');          % ICA consistency
+        totevents = num2str(sum( cellfun( 'length', { EEG.event }) )); % total number of events
+        srate     = vararg2str( mattocell( unique( [ EEG.srate ] ) )); % sampling rate
+        totsize   = whos('EEG');                                       % total size
+                
+        % text
+        % ----
+        set( g.win2, 'String', 'Number of datasets');
+        set( g.win3, 'String', 'Dataset type');
+        set( g.win4, 'String', 'Epoch consistency');
+        set( g.win5, 'String', 'Channels per frame');
+        set( g.win6, 'String', 'Channel consistency');
+        set( g.win7, 'String', 'Channel locations');
+        set( g.win8, 'String', 'Events (total)');
+        set( g.win9, 'String', 'Sampling rate (Hz)');
+        set( g.win10, 'String', 'ICA weights');
+        set( g.win11, 'String', 'Identical ICA');
+        set( g.win12, 'String', 'Total size (Mb)');
+
+        % values
+        % ------
+        set( g.win1, 'String', sprintf('Groupname: -(soon)-\n'));
+        set( g.val2, 'String', int2str(length(EEG)));
+        set( g.val3, 'String', char(datasettype));
+        set( g.val4, 'String', char(epochconsist));
+        set( g.val5, 'String', char(chanlenstr));
+        set( g.val6, 'String', char(chanconsist));
+        set( g.val7, 'String', char(chanlocs));
+        set( g.val8, 'String', char(totevents));
+        set( g.val9, 'String', char(srate));
+        set( g.val10, 'String', char(icaweights));
+        set( g.val11, 'String', char(icaconsist));
+        set( g.val12, 'String', num2str(round(totsize.bytes/1E6*10)/10));        
+        
+    else % one continuous dataset selected
+        
+        menustatus = { menustatus{:} 'continuous_dataset' };
+        
+        % text
+        % ----
+        set( g.win2, 'String', 'Channels per frame');
+        set( g.win3, 'String', 'Frames per epoch');
+        set( g.win4, 'String', 'Epochs');
+        set( g.win5, 'String', 'Events');
+        set( g.win6, 'String', 'Sampling rate (Hz)');
+        set( g.win7, 'String', 'Epoch start (sec)');
+        set( g.win8, 'String', 'Epoch end (sec)');
+        set( g.win9, 'String', 'Reference');
+        set( g.win10, 'String', 'Channel locations');
+        set( g.win11, 'String', 'ICA weights');
+        set( g.win12, 'String', 'Dataset size (Mb)');
+        
+        if CURRENTSET == 0, strsetnum = '';
+        else                strsetnum = ['#' int2str(CURRENTSET) ': '];
+        end
+        maxchar = 28;
+        if ~isempty( EEG.setname )
+            if length(EEG.setname) > maxchar+2
+                set( g.win0, 'String', [strsetnum EEG.setname(1:min(maxchar,length(EEG.setname))) '...' ]);
+            else set( g.win0, 'String', [strsetnum EEG.setname ]);
+            end
+        else
+            set( g.win0, 'String', [strsetnum '(no dataset name)' ] );
+        end
+
+        fullfilename = fullfile(EEG.filepath, EEG.filename);
+        if ~isempty(fullfilename)
+            if length(fullfilename) > 26
+                set( g.win1, 'String', sprintf('Filename: ...%s\n', fullfilename(max(1,length(fullfilename)-26):end) ));
+            else
+                set( g.win1, 'String', sprintf('Filename: %s\n', fullfilename));
+            end        	
+        else
+            set( g.win1, 'String', sprintf('Filename: none\n'));
+        end
+        
+        set( g.val2, 'String', int2str(fastif(isempty(EEG.data), 0, size(EEG.data,1))));
+        set( g.val3, 'String', int2str(EEG.pnts));
+        set( g.val4, 'String', int2str(EEG.trials));
+        set( g.val5, 'String', fastif(isempty(EEG.event), 'none', int2str(length(EEG.event))));
+        set( g.val6, 'String', int2str( round(EEG.srate)) );
+        if round(EEG.xmin) == EEG.xmin && round(EEG.xmax) == EEG.xmax
+            set( g.val7, 'String', sprintf('%d\n', EEG.xmin));
+            set( g.val8, 'String', sprintf('%d\n', EEG.xmax));
+        else 
+            set( g.val7, 'String', sprintf('%6.3f\n', EEG.xmin));
+            set( g.val8, 'String', sprintf('%6.3f\n', EEG.xmax));
+        end
+
+        % reference
+        if isfield(EEG(1).chanlocs, 'ref')
+            [curref, ~, allinds] = unique_bc( { EEG(1).chanlocs.ref });
+            maxind = 1;
+            for ind = unique_bc(allinds)
+                if length(find(allinds == ind)) > length(find(allinds == maxind))
+                    maxind = ind;
+                end
+            end
+            curref = curref{maxind};
+            if isempty(curref), curref = 'unknown'; end
+        else curref = 'unknown';
+        end
+        set( g.val9, 'String', curref);
+        if isempty(EEG.chanlocs)
+            set( g.val10, 'String', 'No');
+        else
+            if ~isfield(EEG.chanlocs, 'theta') || all(cellfun('isempty', { EEG.chanlocs.theta }))
+                set( g.val10, 'String', 'No (labels only)');           
+            else
+                set( g.val10, 'String', 'Yes');
+            end
+        end
+        
+        set( g.val11, 'String', fastif(isempty(EEG.icasphere), 'No', 'Yes'));
+        tmp = whos('EEG');
+        if ~isa(EEG.data, 'memmapdata') && ~isa(EEG.data, 'mmo') 
+            set( g.val12, 'String', num2str(round(tmp.bytes/1E6*10)/10));
+        else
+            set( g.val12, 'String', [ num2str(round(tmp.bytes/1E6*10)/10) ' (file mapped)' ]);
+        end
+
+        if EEG.trials > 1 || EEG.xmin ~= 0
+            menustatus = { menustatus{:} 'epoched_dataset' };
+        else
+            menustatus = { menustatus{:} 'continuous_dataset' };
+        end
+        if ~isfield(EEG.chanlocs, 'theta')
+            menustatus = { menustatus{:} 'chanloc_absent' };
+        end
+        if isempty(EEG.icaweights)
+            menustatus = { menustatus{:} 'ica_absent' };
+        end
+    end
+else
+    menustatus = { 'startup' };
+    
+	hh = findobj('parent', gcf, 'userdata', 'fullline'); set(hh, 'visible', 'on');
+	hh = findobj('parent', gcf, 'userdata', 'datinfo');  set(hh, 'visible', 'off');
+	set( g.win0, 'String', 'No current dataset');
+	set( g.mainwin0, 'String', 'Suggested steps to get started', 'fontweight', 'bold');
+	set( g.mainwin1, 'String', '- Create a new or load an existing dataset:');
+	set( g.mainwin2, 'String', '   Use "File > Import data"           (new)'); 
+	set( g.mainwin3, 'String', '   Or  "File > Load existing dataset" (load)');
+	set( g.mainwin4, 'String', '   (find tutorial data in sample_data folder)');
+	set( g.mainwin5, 'String', '- If newly imported raw dataset');
+	set( g.mainwin6, 'String', '  "Edit > Channel locations" (look up locations)');
+	set( g.mainwin7, 'String', '  "File > Import event info" (for continuous data)');
+	set( g.mainwin8, 'String', '- Filter data: "Tools > Filter data"');
+	set( g.mainwin9, 'String', '- Reject data: "Tools > Reject data by eye"');
+	set( g.mainwin10,'String', '- Run ICA: "Tools > Run ICA" (can take time)');
+	set( g.mainwin11,'String', '- Reject by ICA: "Tools > Reject data using ICA"');
+	set( g.mainwin12,'String', '- Epoch data: "Tools > Extract epochs"');
+	set( g.mainwin13,'String', '- Plot ERP: "Plot > Channel ERP > In scalp array"');
+end
+
+% ERPLAB 
+if exist('ALLERP') == 1 && ~isempty(ALLERP)
+    menustatus = { menustatus{:} 'erp_dataset' };
+end
+
+if exist('ALLBEST') == 1 && ~isempty(ALLBEST)
+    menustatus = { menustatus{:} 'best_dataset' };
+end
+
+if exist('ALLMVPC') == 1 && ~isempty(ALLMVPC)
+    menustatus = { menustatus{:} 'mvpc_dataset'}; 
+end
+
+% enable selected menu items
+% --------------------------
+allmenus = findobj( W_MAIN, 'type', 'uimenu');
+allstrs  = get(allmenus, 'userdata');
+if any(strcmp(menustatus, 'startup'))
+    
+    set(allmenus, 'enable', 'on');  
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''startup:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+    
+elseif any(strcmp(menustatus, 'study'))
+    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''study:on''))), allstrs);');            
+    set(allmenus             , 'enable', 'off');  
+    set(allmenus(indmatchvar), 'enable', 'on');
+    
+elseif any(strcmp(menustatus, 'multiple_datasets'))
+    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''study:on''))), allstrs);');            
+    set(allmenus             , 'enable', 'off');  
+    set(allmenus(indmatchvar), 'enable', 'on');        
+    set(findobj('parent', W_MAIN, 'label', 'Study'), 'enable', 'off');
+
+% --------------------------------
+% Javier Lopez-Calderon for ERPLAB
+elseif any(strcmp(menustatus, 'epoched_dataset'))
+
+    set(allmenus, 'enable', 'on');  
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''epoch:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+% end, Javier Lopez-Calderon for ERPLAB
+% --------------------------------    
+elseif any(strcmp(menustatus, 'continuous_dataset'))
+    
+    set(allmenus, 'enable', 'on');  
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''continuous:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+
+    
+end
+if any(strcmp(menustatus, 'chanloc_absent'))
+    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''chanloc:on''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+    
+end
+if any(strcmp(menustatus, 'ica_absent'))
+    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''ica:on''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+    
+end
+if any(strcmp(menustatus, 'roi_connect'))
+    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''roi:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');
+    
+end
+
+% always off
+eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''enable:off''))), allstrs);');  
+set(allmenus(indmatchvar), 'enable', 'off');
+    
+% --------------------------------
+% Javier Lopez-Calderon for ERPLAB
+if any(strcmp(menustatus, 'erp_dataset'))    
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''erpset:on''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'on');
+end
+% end, Javier Lopez-Calderon for ERPLAB
+% --------------------------------
+% --------------------------------
+% Aaron Matthew Simmons for ERPLAB
+
+if any(strcmp(menustatus, 'best_dataset'))
+    set(allmenus, 'enable', 'on');  
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''bestset:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');  
+end
+if any(strcmp(menustatus, 'mvpc_dataset'))
+    set(allmenus, 'enable', 'on');  
+    eval('indmatchvar = cellfun(@(x)(~isempty(findstr(num2str(x), ''mvpcset:off''))), allstrs);');  
+    set(allmenus(indmatchvar), 'enable', 'off');  
+end
+% end, Aaron Matthew Simmons for ERPLAB
+
+
+% adjust title extent
+% -------------------
+poswin0 = get(g.win0, 'position');
+extwin0 = get(g.win0, 'extent');
+set(g.win0, 'position', [poswin0(1:2) extwin0(3) extwin0(4)]);
+
+% adjust all font sizes (RMC fix MATLAB 2014 compatibility)
+% -------------------
+% icadefs;
+% handlesname = fieldnames(g);
+% for i = 1:length(handlesname)
+%     if isprop(eval(['g.' handlesname{i}]),'Style') && ~strcmp(handlesname{i},'win0')
+%         propval = get(eval(['g.' handlesname{i}]), 'Style');
+%         if strcmp(propval,'text')
+%             set(eval(['g.' handlesname{i}]),'FontSize',TEXT_FONTSIZE);
+%         end
+%     end
+% end
+
+return;
+
+function num = popask( text )
+	 ButtonName=questdlg2( text, ...
+	        'Confirmation', 'Cancel', 'Yes','Yes');
+	 switch lower(ButtonName),
+	      case 'cancel', num = 0;
+	      case 'yes',    num = 1;
+	 end
+
+function g = myguihandles(fig)
+	g = [];
+	hh = findobj('parent', gcf);
+	for index = 1:length(hh)
+		if ~isempty(get(hh(index), 'tag'))
+			g = setfield(g, get(hh(index), 'tag'), hh(index));
+		end
+	end
+
+    
+function rmpathifpresent(newpath)
+    comp = computer;
+    if strcmpi(comp(1:2), 'PC')
+        newpath = [ newpath ';' ];
+    else
+        newpath = [ newpath ':' ];
+    end
+    p = path;
+    ind = strfind(p, newpath);
+    if ~isempty(ind)
+        rmpath(newpath);
+    end
+        
+% add path only if it is not already in the list
+% ----------------------------------------------
+function addpathifnotinlist(newpath)
+
+    comp = computer;
+    if strcmpi(comp(1:2), 'PC')
+        newpathtest = [ newpath ';' ];
+    else
+        newpathtest = [ newpath ':' ];
+    end
+    p = path;
+    ind = strfind(p, newpathtest);
+    if isempty(ind)
+        if exist(newpath) == 7
+            addpath(newpath);
+        end
+    end
+
+function addpathifnotexist(newpath, functionname)
+    tmpp = mywhich(functionname);
+        
+    if isempty(tmpp)
+        addpath(newpath);
+    end
+    
+% find a function path and add path if not present
+% ------------------------------------------------
+function myaddpath(eeglabpath, functionname, pathtoadd)
+
+    tmpp = mywhich(functionname);
+    tmpnewpath = [ eeglabpath pathtoadd ];
+    if ~isempty(tmpp)
+        tmpp = tmpp(1:end-length(functionname));
+        if length(tmpp) > length(tmpnewpath), tmpp = tmpp(1:end-1); end % remove trailing filesep
+        if length(tmpp) > length(tmpnewpath), tmpp = tmpp(1:end-1); end % remove trailing filesep
+        %disp([ tmpp '     ||        ' tmpnewpath '(' num2str(~strcmpi(tmpnewpath, tmpp)) ')' ]);
+        if ~strcmpi(tmpnewpath, tmpp)
+            warning('off', 'MATLAB:dispatcher:nameConflict');
+            addpath(tmpnewpath);
+            warning('on', 'MATLAB:dispatcher:nameConflict');
+        end
+    else
+        %disp([ 'Adding new path ' tmpnewpath ]);
+        addpathifnotinlist(tmpnewpath);
+    end
+    
+% parse plugin function name
+% --------------------------
+function [name, vers] = parsepluginname(dirName, funcname)
+    ind = find( dirName >= '0' & dirName <= '9' );
+    if isempty(ind)
+        name = dirName;
+        vers = '';
+    else
+        ind = length(dirName);
+        while ind > 0 && ((dirName(ind) >= '0' && dirName(ind) <= '9') || dirName(ind) == '.' || dirName(ind) == '_')
+            ind = ind - 1;
+        end
+        name = dirName(1:ind);
+        vers = dirName(ind+1:end);
+        vers(vers == '_') = '.';
+        if ~isempty(vers)
+            if vers(1) == '.', vers(1) = []; end
+        end
+    end
+    
+    % check with function name and change version if necessary (for loadhdf5)
+    if nargin > 1 && ~isempty(strfind(dirName, funcname))
+        name1 = funcname;
+        vers2 = dirName(length(funcname)+1:end);
+        if ~isempty(vers2)
+            vers2(vers2 == '_') = '.';
+            if ~isequal(vers, vers2) ... % differebt versions
+                && (vers2(1) >= '0' && vers2(1) <= '9') % version 2 is numerical
+                vers = vers2;
+            end
+        end
+    end
+    
+% required here because path not added yet
+% to the admin folder
+function res = ismatlab
+
+res = exist('OCTAVE_VERSION', 'builtin') == 0;
+    
+function res = mywhich(varargin)
+try
+    res = which(varargin{:});
+catch
+    fprintf('Warning: permission error accessing %s\n', varargin{1});
+end
+   
+function h = eegmenu( versL, varargin)
+    h = [];
+    if ~versL
+        h = uimenu(varargin{:});
+    end
+