function [result, dummy]=EyelinkInit(dummy, enableCallbacks)
% USAGE: [result dummy]=EyelinkInit([dummy=0][enableCallbacks=1])
%
% Initialize Eyelink system and connection. Optional arguments:
%
% dummy: Omit, or set to 0 to attempt real initialization,
%        set to 1 to enforce to use initializedummy for dummy mode.
%
%        If regular initialization fails, it will provide option
%        for dummy initilization.
%
% enableCallbacks: Set to 0 for operation without callbacks and
%                  without display of eye camera images on the Subject PC.
%                  Omit or set to 1 for callback and video display operations
%                  during tracker setup, drift correction with the default callback
%                  dispatcher function PsychEyelinkDispatchCallback.m.
%                  Provide namestring of your own dispatcher function if
%                  you want to enable callbacks and video display with a
%                  non-standard, customized dispatcher.
%
% Optional return arguments:
%
% Returns result=1 when succesful, 0 otherwise
% Returns dummy=1 when initialized in dummy mode, 0 otherwise.
%

% history
% 28-10-02	fwc	extracted it from other program
% 09-12-02	fwc	updated to use EyelinkDummyModeDlg instead of Screen('dialog')
%			    a little more testing for erroneous initialization
% 28-06-06  fwc Updated for OSX version
% 21-02-07  fwc Now also returns dummy parameter. Latter has
%               possibly changed.
% 11-04-09  mk  Accept optional 'enableCallbacks' argument. If provided and
%               a string, then use that string as function name for a
%               Eyelink callback function and assign it. If provided and
%               non-zero value, enable callbacks with our default callback
%               function PsychEyelinkDispatchCallback().
%
%               Callbacks are disabled by default to retain backward
%               compatibility.
% 15-06-10 fwc  for consistency, changed PsychEyelinkDispatchCallback to EyelinkDispatchCallback
%               Enabled callbacks by default, because presence of eye image
%               is much desired and expected behaviour
% 15-03-12  mk  Make help text consistent with actual behaviour wrt. to callbacks.

result=0;

% Perform real init by default, if 'dummy' is not provided:
if ~exist('dummy', 'var')
    dummy=[];
end

if isempty(dummy)
    dummy=0;
end

if ~exist('enableCallbacks', 'var')
    % Callbacks enabled by default:
    enableCallbacks = 1;
end

% Callback argument provided and non-empty?
if ~isempty(enableCallbacks)
    % A string with a callback function name? If so, we use it as is:
    if ~ischar(enableCallbacks)
        % Nope. Enable argument 1?
        if enableCallbacks > 0
            % Assign our default callback function:
            enableCallbacks = 'PsychEyelinkDispatchCallback';
        else
            % Callbacks disabled on request:
            enableCallbacks = [];
        end
    end
end

% Dummy init explicitely requested?
if dummy==1
    % Try dummy connection init:
    if Eyelink('InitializeDummy', enableCallbacks) ~=0
        return;
    end
else
    % Try real init of tracker connection:
    if Eyelink('Initialize', enableCallbacks) ~= 0
        % Failed. Ask user if she wants to continue in dummy mode:
        if 1==EyelinkDummyModeDlg
            % Try dummy init:
            if Eyelink('InitializeDummy', enableCallbacks) ~=0
                % Failed as well :-(
                return;
            end

            % Dummy mode active:
            dummy=1;
        else
            % Abort.
            return;
        end
    end
end

result=1;

% Ready:
return;