%%
function tsgqc
% TSGQC: Thermosalinograph (TSG) Quality Control software
%
% $Id$


%% COPYRIGHT & LICENSE
%  Copyright 2007 - IRD US191, all rights reserved.
%
%  This file is part of tsgqc.
%
%    TSG-QC is free software; you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as published by
%    the Free Software Foundation; either version 2 of the License, or
%    (at your option) any later version.
%
%    tsgqc is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with Datagui; if not, write to the Free Software
%    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

%% TIPS
%  To get tsg anywhere during debug:
%  tsg = getappdata( findobj('Tag', 'TAG_TSG-QC_GUI'), 'tsg_data')

%% Define global variables for VERSIONING
% ---------------------------------------
global VERSION
global CHAR_VERSION
global NETCDF_FORMAT_VERSION

% version number, may be used to initialize some files when it change
% 0.90x -> 1.0RCx
% -------------------------------------------------------------------
VERSION = 1.2;  % -> 1.2
CHAR_VERSION = '1.2';

% netcdf file version, see DATA FORMAT TSG document:
% CORTSG_format_gosud_1.5.doc
% --------------------------------------------------
NETCDF_FORMAT_VERSION     = '2.0';

%%  Initialization tasks
%   ********************

% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
clc;

% Find program directory.
% functions (icons) should be store at a lower level
% add directories to Matlab search path, works on UNIX
% and Windows host
% ---------------------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');

% regular expression expr if it occurs at the end of the input string
% -------------------------------------------------------------------
expr = strcat(tsgqcname, '$');

% get pathname
% ------------
DEFAULT_PATH_FILE =  regexprep(fulltsgqcname, expr, '');

% update Matlab pathdef only for session
% --------------------------------------
p = [pathsep,...
  DEFAULT_PATH_FILE,[ 'tsg_util' pathsep],...
  DEFAULT_PATH_FILE,[ 'tsg_data' pathsep],...
  DEFAULT_PATH_FILE,[ 'tsg_io'   pathsep]
  ];
addpath( p, '-BEGIN' );
rehash;

% define 'HandleVisibility' property for all objects
% --------------------------------------------------
handleVisibility = 'on';

% % get screen dimensions (pixels)
% % ------------------------------
% set(0,'Units','pixels');
% screenSize = get(0,'ScreenSize');
% 
% % set default font size
% % ---------------------
% if screenSize(3) <= 1024
%   tsg.fontSize = 9;
% else
%   tsg.fontSize = 11;
% end

% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;


%% Main TSGQC GUI
% ---------------

% Check if main TSGQC figure exist
% --------------------------------
hMainFig = findobj('Tag', 'TAG_TSG-QC_GUI');

% if TSGQC figure exist and still running, don't create a new instance
% --------------------------------------------------------------------
if ~isempty(hMainFig)

  % display error dialog box and quit
  % ---------------------------------
  errordlg({'An instance of TSGQC is still running !!!', ...
    'Open it from you task bar'}, 'Warning TSGQC');
  return;

end

% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
  'Name', 'TSG Validation', ...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Menubar', 'none', ...
  'Toolbar', 'none', ...
  'UserData', 'ButtonMotionOff', ...
  'WindowButtonMotionFcn', @MouseMotion, ...
  'CloseRequestFcn', @QuitMenuCallback,...
  'HandleVisibility', handleVisibility,...
  'Visible','on',...
  'Tag','TAG_TSG-QC_GUI',...
  'Units', 'normalized',...
  'Position',guiLimits, ...
  'Color', get( 0, 'DefaultUIControlBackgroundColor' ));
  
%% Check Matlab version for use of KeyPressFcn and KeyReleaseFcn properties
% -------------------------------------------------------------------------
switch ( version('-release') )
  case { '11', '12', '13', '14', '2006a', '2006b' }
    % dont process KeyPressFcn and KeyReleaseFcn events
  otherwise
    
   % show crossline when shitf key is pressed, vertical bar when ctrl key
   % --------------------------------------------------------------------
   set( hMainFig, 'KeyPressFcn',   @keyPressFcnCallback,...
                  'KeyReleaseFcn', @keyReleaseFcnCallback);
end  

%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE);

% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');


%%  Menu File
%   -----------------------------------------------------------------------
hFileMenu = uimenu(...
  'Parent', hMainFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'File');
hOpenMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Open',...
  'Accelerator','O',...
  'HandleVisibility', handleVisibility,...
  'UserData', 'off',...
  'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Save',...
  'Accelerator','S',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility,...
  'Callback',@SaveMenuCallback);
hExportMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Export',...
  'Accelerator','E',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility);
hExportTSG = uimenu(...
  'Parent', hExportMenu,...
  'Label','Tsg ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportTsgCallback);
hExportSAMPLE = uimenu(...
  'Parent', hExportMenu,...
  'Label','Sample ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportSampleCallback);

hQuitMenu = uimenu(...
  'Parent',hFileMenu,...
  'Label','Quit',...
  'Separator','on',...
  'Accelerator','Q',...
  'HandleVisibility', handleVisibility,...
  'Callback',@QuitMenuCallback);

%%  Menu Edit with Undo/Redo submenu
% ---------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
  'Accelerator','Z',...
  'Tag','UIMENU_UNDO',...
  'Enable', 'off',...
  'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
  'Accelerator','R',...
  'Tag','UIMENU_REDO',...
  'Enable', 'off',...
  'Callback',@RedoMenuCallback);

%%  Menu Climatology with Annual/Seasonal/Monthly submenu
% --------------------------------------------------------

% define structure s stored in userdata
% -------------------------------------
s = struct('type', 'annual', 'time', 1);

hClimatoMenu = uimenu(hMainFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_CLIMATO_MAIN', ...
  'UserData', s);

% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...
  'Checked','on',...
  'Tag','TAG_UIMENU_CLIMATO_ANNUAL',...
  'Enable', 'on',...
  'Callback', {@ClimatoSelectMenuCallback, 'annual', 1});

% declare top-level seasonal menu
% -------------------------------
hClimatoSeasonalMenu = uimenu(hClimatoMenu,'Label','Seasonal');

% declare label for seasonal submenu
% ----------------------------------
label = {'jan-feb-mar','apr-may-jun','jul-aug-sept','oct-nov-dec'};

% loop over the four submenu
% --------------------------
for i = 1:4
  uimenu(hClimatoSeasonalMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_SEASONAL_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'seasonal', i});
end

% declare top-level monthly menu
% -------------------------------
hClimatoMonthlyMenu = uimenu(hClimatoMenu,'Label','Monthly');

% declare label for monthly submenu
% ----------------------------------
label = {'january','february','march','april','may','june','july','august',...
  'september','october','november','december'};

% loop over the four submenu
% --------------------------
for i = 1:12
  uimenu(hClimatoMonthlyMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_MONTHLY_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end

%%  Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
  'Tag','TAG_UIMENU_OPTION_PREFERENCES',...
  'Enable', 'on',...
  'Callback', {@PreferencesMenuCallback});

%%  Menu QC automatic
%   Dependent functions : preferenceForm.m; tsg_preference.m,
%   @QCMenuCallback
%   ----------------------------------------------------------
hQCMenu = uimenu(...
  'Parent', hMainFig, 'Enable', 'off', 'HandleVisibility', handleVisibility,...
  'Label', 'QCauto');
hFlowMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Flow', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Flow'});
hPressMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Press', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Press'});
hSpeedMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Ship Speed', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Speed'});
hSSPSminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmin'});
hSSPSmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmax'});
hSSJTminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmin'});
hSSJTmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmax'});
hSSTPminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmin'});
hSSTPmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmax'});

%%  Menu Help with F1 Help and About submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Help');
uimenu(hOptionMenu,'Label','Help',...
  'Tag','TAG_UIMENU_HELP_HELP',...
  'Enable', 'on',...
  'Callback', {@HelpMenuCallback});
uimenu(hOptionMenu,'Label','About TSGQC',...
  'Tag','TAG_UIMENU_HELP_ABOUT',...
  'Enable', 'on',...
  'Callback', {@AboutMenuCallback});

%%  Toolbar pushbuttons
%   -----------------------------------------------------------------------
hToolbar       =   uitoolbar(...   % Toolbar for Open and Print buttons
  'Parent',hMainFig, ...
  'HandleVisibility','on');
hOpenPushtool  =   uipushtool(...   % Opendoc toolbar button
  'Parent',hToolbar,...
  'TooltipString','Open file',...
  'CData', iconRead(fullfile(matlabroot, ...
  '/toolbox/matlab/icons/opendoc.mat')),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_OPEN',...
  'UserData', 'off',...
  'Enable', 'on',...
  'ClickedCallback', @OpenMenuCallback);
hSavePushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Save NetCDF file',...
  'CData',iconRead( ...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_SAVE',...
  'Enable', 'off',...
  'ClickedCallback', @SaveMenuCallback);
hPrintFigPushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Print figures',...
  'CData',iconRead( ...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'printdoc.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PRINTFIG',...
  'visible', 'on', 'Enable', 'on',...
  'ClickedCallback', @PrintFigMenuCallback);
hZoomInToggletool = uitoggletool(...   % Open Zoom In (increase) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom In (increase)',...
  'CData', iconRead(fullfile(matlabroot,...
  '/toolbox/matlab/icons/zoomplus.mat')),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_IN',...
  'OnCallback',  @ZoomIn_OnMenuCallback,...
  'OffCallback',  @ZoomIn_OffMenuCallback);
hZoomOutToggletool = uitoggletool(...   % Open Zoom Out (decrease) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom Out (decrease)',...
  'CData', iconRead(fullfile(matlabroot,...
  '/toolbox/matlab/icons/zoomminus.mat')),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_OUT',...
  'OnCallback',  @ZoomOut_OnMenuCallback,...
  'OffCallback',  @ZoomOut_OffMenuCallback);
hPanToggletool  =   uitoggletool(...   % Open Pan toolbar button
  'Parent',hToolbar,...
  'TooltipString','Pan',...
  'CData',iconRead(fullfile(matlabroot, ...
  '/toolbox/matlab/icons/pan.mat')),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PAN',...
  'Enable', 'off',...
  'OffCallback', @Pan_OffMenuCallback,...
  'OnCallback',  @Pan_OnMenuCallback);
hQCToggletool  =   uitoggletool(...   % Open QC toolbar button
  'Parent',hToolbar,...
  'TooltipString','Validation codes',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_QC',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @QC_OffMenuCallback,...
  'OnCallback',  @QC_OnMenuCallback);
hTimelimitToggletool  = uitoggletool(...
  'Parent',hToolbar,...
  'TooltipString','Select time limit',...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'selecttime.mat']),...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_STARTTIME', ...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @SelectTime_OffMenuCallback,...
  'OnCallback',  @SelectTime_OnMenuCallback);
hMapToggletool  =   uitoggletool(...   % Open Map toolbar button
  'Parent',hToolbar,...
  'TooltipString','Map and ship track',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_MAP',...
  'UserData', 'off', ...
  'Enable', 'off',...
  'OffCallback', @Map_OffMenuCallback,...
  'OnCallback',  @Map_OnMenuCallback);
hClimToggletool  =   uitoggletool(...   % Open Climatology toolbar button
  'Parent',hToolbar,...
  'TooltipString','Climatology',...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CLIM',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Clim_OffMenuCallback,...
  'OnCallback',  @Clim_OnMenuCallback);
hCalToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Calibration sensors',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'outils.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CAL',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Cal_OffMenuCallback,...
  'OnCallback',  @Cal_OnMenuCallback);
hInterpToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Interpolate missing position',...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'interp.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_INTERP',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Inter_OffMenuCallback,...
  'OnCallback',  @Inter_OnMenuCallback);
hBottleToggletool  = uitoggletool(...   % Correction module toolbar button
  'Parent',hToolbar,...
  'TooltipString','Correct the SSS TSG data',...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_BOTTLE',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Bottle_OffMenuCallback,...
  'OnCallback',  @Bottle_OnMenuCallback);

hHeaderPushtool  = uipushtool(...   % Open headerForm button
  'Parent',hToolbar,...
  'TooltipString','Fill the header form',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_HEADER',...
  'Enable', 'off',...
  'ClickedCallback', @HeaderMenuCallback);

hReportPushtool  = uipushtool(...   % Open Report saving button
  'Parent',hToolbar,...
  'TooltipString','Save a report',...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'reporticon.mat']),...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_REPORT',...
  'Enable', 'off',...
  'ClickedCallback', @ReportMenuCallback);

%% Dynamic text area
%   -----------------------------------------------------------------------
%  Dynamic text area that displays the loaded filename, date, position and
%  salinity, temperature
%  ------------------------------------------------------------------------

% Create an uipanel
% -----------------
hInfoPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'none',...
  'Visible', 'on', ...
  'Position',[.01, .96, .98, .04]);

% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.01, .25, .04, .6], ...
  'String', 'File:');
hInfoFileText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'No file loaded', ...
  'Position', [.05, .25, .1, .6]);

% Text area that displays the date
% --------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.15, .25, .04, .6], ...
  'String', 'Date:');
hInfoDateText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.20, .25, .13, .6]);

% Text area that displays the latitude
% ------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.33, .25, .06, .6], ...
  'String', 'Latitude:');
hInfoLatText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.4, .25, .9, .6]);

% Text area that displays the longitude
% -------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.495, .25, .08, .6], ...
  'String', 'Longitude:');
hInfoLongText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.585, .25, .09, .6]);

% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position', [.68, .25, .05, .6], ...
  'String', 'SSPS:');
hInfoSSPSText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.73, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.785, .25, .05, .6], ...
  'String', 'SSJT:');
hInfoSSJTText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.835, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.89, .25, .05, .6], ...
  'String', 'SSTP:');
hInfoSSTPText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.94, .25, .05, .6]);

%% Plot axes
%   -----------------------------------------------------------------------
% The axes 1,2 and 3 will be plot in a uipanel
% axe 1 as propertie 'HandleVisibility' set to 'on' to prevent hidden
% visibility when first plot is empty
%--------------------------------------------------------------------
hPlotsPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'etchedin',...
  'Visible', 'on',...
  'Position',[0.15, 0.0, .85, .95]);
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
  'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
  'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
  'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
  'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
  'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
  'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);


% The map will be plot in a uipanel
% ---------------------------------
% hMapPanel = uipanel( ...
%   'Parent', hMainFig, ...
%   'Units', 'normalized', ...
%   'Visible', 'off', ...
%   'Position',[0.15, 0, .85, .58]);

% The map will be plot  a new figure
% ---------------------------------
hMapFig = figure(...
  'BackingStore','off',...
  'Name', 'TSG SHIP TRACK', ...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Menubar','figure', ...
  'Toolbar', 'none', ...
  'Tag', 'MAP_FIGURE', ...
  'Visible','off',...
  'WindowStyle', 'normal', ...
  'CloseRequestFcn', @QuitMapCallback,...
  'Units', 'normalized',...
  'Position',[0.17, 0.05, .8, .44],...
  'Color', get(0, 'DefaultUIControlBackgroundColor'));

hPlotAxes(4) = axes(...     % the axes for plotting ship track map
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'Tag', 'TAG_AXES_MAP', ...
  'Color', 'none', ...
  'UserData', 'off', ...
  'HandleVisibility','on', ...
  'Position',[.05, .05, .9, .9]);

%% uipanel for Quality Control Buttons - uibutton group
%   -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
  'Parent', hMainFig, ...
  'Title', 'Validation Codes', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_QC_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .71, .15, .25]);

% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);

%% Context Menu and RadioButtons for Quality control
%   -----------------------------------------------------------------------
hQcCmenu = uicontextmenu(...
  'Parent', hMainFig, ...
  'HandleVisibility','on' );

% get list of keys from hashtable tsg.qc.hash, defined inside
% tsg_initialisation.m
% -----------------------------------------------------------
qc_list = keys(tsg.qc.hash);

% internal loop count with state to on
% ------------------------------------
count = 0;

% iterate (loop) on each key store inside hastable
% ------------------------------------------------
for key = qc_list

  % get key and some values in hashtable tsg.qc.hash
  % ------------------------------------------------
  label = tsg.qc.hash.(key).label;
  color = tsg.qc.hash.(key).color;
  state = tsg.qc.hash.(key).state;

  % construct context menu with only code set to 'on' (valid)
  % ---------------------------------------------------------
  if strcmp( state, 'on')

    % add menu to hQcCmenu uicontextmenu
    % ----------------------------------
    uimenu(...
      'Parent', hQcCmenu,...
      'HandleVisibility','on', ...
      'Label', label,...
      'ForegroundColor', color,...
      'Callback', {@Qc, key});

    % add button QC to hbgQc uibuttongroup
    % ------------------------------------
    uicontrol(...
      'Parent', hbgQc,...
      'Style', 'radiobutton',...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'HorizontalAlignment', 'left', ...
      'HandleVisibility','on', ...
      'String', label,...
      'Tag', ['TAG_QC_RADIO_' char(key)], ...
      'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);

    % add text QC display statistic on hQcPanel
    % -----------------------------------------
    uicontrol(...
      'Parent', hbgQc,...
      'Style', 'text',...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'HorizontalAlignment', 'right', ...
      'HandleVisibility','on', ...
      'String', 'N/A ',...
      'Tag', ['TAG_QC_TEXT_' char(key)],...
      'Units', 'normalized', 'Position', [.61, .85-count*.12, .37, 0.09]);

    % increment count
    % ---------------
    count = count + 1;
  end
  
end % end of for loop

%% uipanel for checkboxes
%   --------------------------------------
hCorPanel = uipanel(...
  'Parent', hMainFig, ...
  'Title', 'Correction applied to ...', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_CORRECTION_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .001, .15, .24]);

% internal loop count with state to on
% ------------------------------------
count = 0;

% iterate (loop) on each key store inside hastable
% ------------------------------------------------
for key = qc_list

  % get key and some values in hashtable tsg.qc.hash
  % ------------------------------------------------
  label = tsg.qc.hash.(key).label;
  color = tsg.qc.hash.(key).color;
  state = tsg.qc.hash.(key).state;

  value = 0;
  if strcmp(char(key), 'NO_CONTROL') || strcmp(char(key), 'GOOD') ||...
      strcmp(char(key), 'PROBABLY_GOOD')
    value = 1;
  end

  % construct context menu with only code set to 'on' (valid)
  % ---------------------------------------------------------
  if strcmp( state, 'on')

    % add button QC to hbgQc uibuttongroup
    % ------------------------------------
    cbCorr(i) = uicontrol(...
      'Parent', hCorPanel, ...
      'Style', 'checkbox', ...
      'String', label, ...
      'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
      'Value', value, ...
      'Tag',  ['TAG_CHECK_CORRECTION_' char(key)], ...
      'HandleVisibility', 'on',...
      'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);

    % increment count
    % ---------------
    count = count + 1;
  end
  
end %end for loop

%% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT)
%   POP_UP filled in with the function "initParameterChoice"
%   -----------------------------------------------------------------------
hbgParameter = uibuttongroup(...
  'Parent', hMainFig, ...
  'Title', 'TSG Parameter', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'tag', 'TAG_PARA_DISPLAY_PANEL',...
  'HandleVisibility','on',...
  'Visible', 'off',...
  'BorderType', 'etchedin',...
  'Units', 'normalized', 'Position', [.0, .78, .15, .18]);

text= {'Validation - Top'; 'Middle plot'; 'Bottom plot'};
ybottom = [.7 .38 .05];
for ipmh= 1 : 3
  pmhPara(ipmh) = uicontrol(...
    'Parent', hbgParameter, 'Style', 'popupmenu', ...
    'String', { 'NONE' }, 'Value', 1, ...
    'HandleVisibility', handleVisibility, ...
    'Callback', {@SelectParameter, ipmh}, ...
    'Units', 'normalized', 'Position', [.01, ybottom(ipmh), .3, 0.25]);
  htParameter(ipmh) = uicontrol( ...
    'Parent', hbgParameter, 'Style', 'Text', ...
    'String', text{ipmh}, ...
    'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
    'Units', 'normalized',  'Position',[.35, ybottom(ipmh), .6, 0.25]);
end

% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgParameter,'SelectionChangeFcn',@RadiobuttonParameter);


%% uiButtonGroup set to choose the Correction method
% -------------------------------------------------------------------------

% Create the button group
hbgCorMethod = uibuttongroup( ...
  'Parent',hMainFig, ...
  'Title','Correction Method', ...
  'Units', 'normalized', ...
  'FontSize',tsg.fontSize-1, 'Fontweight', 'bold',...
  'Visible', 'off', ...
  'Position',[.0, .24, .15, .29]);

% Create 4 radio buttons in the button group
hrbCorCancel = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Cancel all',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CANCEL_PUSH', ...
  'pos',[.05 .04 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', {@cancelCorrectionCallback,'total'});
hrbPartCorCancel = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String',{'Cancel within Date Limits'},...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_PART_CANCEL_PUSH', ...
  'pos',[.05 .19 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', {@cancelCorrectionCallback,'part'});
hrbCorBiais = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Bias adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_BIAIS_PUSH', ...
  'pos',[.05 .41 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', @biasCorrectionCallback);
hrbCorGradient = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Gradient adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_GRADIENT_PUSH', ...
  'pos',[.05 .56 .9 .13],...
  'HandleVisibility', handleVisibility, ...
  'Callback', @gradientCorrectionCallback);
hrbCorLinear = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Linear adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_LINEAR_PUSH', ...
  'pos',[.05 .71 .9 .13], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @linearCorrectionCallback);
hrbCorMedian = uicontrol( ...
  'Style','pushbutton', ...
  'Parent',hbgCorMethod, ...
  'Units', 'normalized', ...
  'String','Median filter adjustment',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_MEDIAN_PUSH', ...
  'pos',[.05 .86 .9 .13], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @medianCorrectionCallback);

%% uiPanel for the Date limits used in the Correction module

% Choose the date limits for the correction
% --------------------------------------------------
% Create the uipanel
hpDateLimit = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Date Limits', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...
  'Position', [.0, .53, .15, .18]);

htDateMin = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'Text', ...
  'String', 'Min : yyyy-mm-dd hh:mm:ss', ...
  'HorizontalAlignment', 'left', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, ...
  'Position',[.01 .8 .95 .15]);
hetDateMin = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'edit', ...
  'Units', 'normalized', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'Tag', 'CORRECT_DATEMIN_EDIT',...
  'Position',[.01 .6 .95 .17]);

htDateMax = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'Text', ...
  'String', 'Max : yyyy-mm-dd hh:mm:ss', ...
  'HorizontalAlignment', 'left', ...
  'Units', 'normalized', ...
  'FontSize', tsg.fontSize-1, ...
  'Position',[.01 .35 .95 .15]);
hetDateMax = uicontrol( ...
  'Parent', hpDateLimit, ...
  'Style', 'edit', ...
  'Units', 'normalized', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'Tag', 'CORRECT_DATEMAX_EDIT',...
  'Position',[.01 .15 .95 .17]);

%% uiPanel for the Calibration coefficient used the Correction module

% Create the uipanel
hpCalCoef = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Calibration', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...
  'Units', 'normalized','Position', [.0, .46, .15, .50]);

htCalCNDC1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'Conductivity : C = A*C + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .925 .95 .05]);
htCalCNDC2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .85 .08 .05]);
hetCalCNDCSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'Tag', 'CORRECT_CAL_CNDC_A',...
  'HandleVisibility','on', ...
  'Units', 'normalized', 'Position',[.1 .85 .85 .05]);
htCalCNDC3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left',  'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .775 .08 .05]);
hetCalCNDCOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_CNDC_B',...
  'Units', 'normalized', 'Position',[.1 .775 .85 .05]);

htCalSSJT1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'SSJT : T = A*T + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .675 .95 .05]);
htCalSSJT2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .6 .08 .05]);
hetCalSSJTSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_A',...
  'Units', 'normalized', 'Position',[.1 .6 .85 .05]);
htCalSSJT3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .525 .08 .05]);
hetCalSSJTOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_B',...
  'Units', 'normalized', 'Position',[.1 .525 .85 .05]);

htCalSSTP1 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'SSPT : T = A*T + B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .425 .95 .05]);
htCalSSTP2 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'A', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .35 .08 .05]);
hetCalSSTPSlope = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'BackgroundColor', 'white',...
  'FontSize', tsg.fontSize, ...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_A',...
  'Units', 'normalized', 'Position',[.1 .35 .85 .05]);
htCalSSTP3 = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'Text', 'String', 'B', ...
  'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
  'Units', 'normalized', 'Position',[.01 .275 .08 .05]);
hetCalSSTPOffset = uicontrol( ...
  'Parent', hpCalCoef, ...
  'Style', 'edit', ...
  'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_CAL_SSJT_B',...
  'Units', 'normalized', 'Position',[.1 .275 .85 .05]);

hrbCal = uicontrol( ...
  'Style','pushbutton', 'Parent',hpCalCoef, ...
  'String','Calibrate',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CAL_PUSH', ...
  'Units', 'normalized','pos',[.05 .15 .9 .075], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @CalibrateCallback);
hrbCancelCal = uicontrol( ...
  'Style','pushbutton', 'Parent',hpCalCoef, ...
  'String','Cancel calibration',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'CORRECT_CAL_PUSH', ...
  'Units', 'normalized','pos',[.05 .05 .9 .075], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @CancelCalibrationCallback);


%% uiPanel for Interpolation of position

% Create the uipanel
hpInterpPos = uipanel( ...
  'Parent', hMainFig, ...
  'Title', 'Lat-Lon interpolation', ...
  'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
  'Visible', 'off', ...
  'Units', 'normalized','Position', [.0, .75, .15, .21]);
hrbInterpLinear = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Linear interpolation',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_LINEAR', ...
  'Units', 'normalized','pos',[.05 .65 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosLinearCallback);
hrbInterpOther = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Other method',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_OTHER', ...
  'Units', 'normalized','pos',[.05 .35 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosOtherCallback);
hrbInterpCancel = uicontrol( ...
  'Style','pushbutton', 'Parent',hpInterpPos, ...
  'String','Cancel interpolation',...
  'FontSize',tsg.fontSize-1,...
  'Tag', 'TAG_PUSH_INTERP_CANCEL', ...
  'Units', 'normalized','pos',[.05 .05 .9 .25], ...
  'HandleVisibility', handleVisibility, ...
  'Callback', @InterpPosCancelCallback);

%
% end of main function (GUI definition)
% 

%% *************************** CALLBACKS **********************************
%  All following callback are in nested functions

%----------------------------------------------------------------------
%% OpenMenuCallback function run when the Open menu item is selected
%----------------------------------------------------------------------
  function OpenMenuCallback(hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,            'Visible', 'off' );
    set( hpDateLimit,          'Visible', 'off' );
    set( hpInterpPos,          'Visible', 'off' );
    %     set( hMapFig,            'Visible', 'off' );
    %    set( hbgParameter,         'Visible', 'off');

    % Toggle button
    % -------------
    set( hBottleToggletool,    'state', 'off' );
    set( hCalToggletool,       'state', 'off' );
    set( hClimToggletool,      'state', 'off' );
    set( hInterpToggletool,    'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    %     set( hMapToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
    %    set( hZoomToggletool,      'state', 'off' );

    % Open standard dialog box for retrieving files
    % ---------------------------------------------
    [fileName, pathname, filterIndex] = uigetfile( ...
      {'*.arg';'*.ast';'*.btl';'*.lbv';'*.nc';'*.ora';'*.sdf';'*.spl';...
       '*.transmit*'; '*.tsgqc';'*.xml'}, 'Pick a file');

    % flushes the event queue and updates the closed uigetfile window
    % ---------------------------------------------------------------
    drawnow;

    % if the user clicks the Cancel button or closes the dialog window,
    % FileName and PathName are set to 0.
    % -----------------------------------------------------------------
    if ~isequal(fileName, 0)

      % Pointer set to watch during reading and plotting
      % ------------------------------------------------
      set( hMainFig, 'Pointer', 'watch' );

      % construct valid and full file path
      % -----------------------------------
      fullFileName = strcat(pathname, fileName);

      % Read the data
      % -------------
      [errTsg, errSpl] = read_data( hMainFig, filterIndex, fullFileName);
 
      % Get the tsg structure
      % ---------------------
      tsg = getappdata( hMainFig, 'tsg_data');

      % Keep the pathname of the tsgqc m_file
      % -------------------------------------
      tsgqcname = mfilename;
      fulltsgqcname = mfilename('fullpath');
      tsg.DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
      setappdata( hMainFig, 'tsg_data', tsg);

      % A TSG file has been read
      % ------------------------
      if errTsg > 0

        % set WindowButtonMotionFcn on
        % ----------------------------
        set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

        % A TSG file has been open and read
        % ---------------------------------
        set( hOpenMenu, 'UserData', 'on' );

        % enable toolbar menu pushtool
        % ----------------------------
        hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdl_pushtool, 'Enable', 'on');

        set( hbgParameter, 'Visible', 'on');

        % Enable Save and Export menu
        % ---------------------------
        set(hSaveMenu,   'Enable', 'on');
        set(hExportMenu, 'Enable', 'on');
        set(hQCMenu, 'Enable', 'on');

        % update some fields in tsg structure and restore tsg
        % ---------------------------------------------------
%         updateTsgStruct(hMainFig );
%         tsg = getappdata( hMainFig, 'tsg_data');

        % update the filename display
        % ---------------------------
        set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));

        % The callback to detect the mouse motion can be set to on
        % --------------------------------------------------------
        set( hMainFig, 'UserData', 'ButtonMotionOn');

        % Update QC statistics
        % --------------------
        display_QC( hMainFig );

        % Initialise the popupmenu displaying the parameters that can be
        % plot
        % --------------------------------------------------------------
        initParameterChoice( hMainFig, pmhPara );
        tsg = getappdata( hMainFig, 'tsg_data');

        % Test if there is records with the same date and time.
        % very simple test made because of a bug in the acquisition
        % software used on IRD VOS
        % ---------------------------------------------------------
        testDoubleDate(hMainFig);
        
        % Test if there are fillable missing positions
        % ---------------------------------------------------------
        testMissPos(hMainFig);
        
      elseif errTsg > -2

        % Problem to read the file or
        % Choice of parameters for Labview file canceled by the user
        % TSG structure has been reinitialize
        % Disable toolbar menu pushtool except the open file button
        % ----------------------------------------------------------
        hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdl_pushtool, 'Enable', 'off');

        set( hOpenPushtool, 'Enable', 'on' );

      end    %if errTsg > 0

      if errTsg == 1 || errSpl == 1

        % Draw the 3 plots of the validation figure
        % The plots need to be re-initialize because of a bug with
        % the zoom function. When you open a new TSG file and you
        % have used the zoom funtion with the preceding file.
        % The zoom function keep the X and Y limits of the preceding file
        % ---------------------------------------------------------------
        delete( hPlotAxes(1) );
        delete( hPlotAxes(2) );
        delete( hPlotAxes(3) );

        hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
          'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
          'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
        hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
          'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
          'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
        hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
          'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
          'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);

        resetAxes( hMainFig, hPlotAxes )

        plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
        plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
        plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );

        set( hMapFig, 'Name', tsg.file.name);

        % Update the map if already displayed
        % -----------------------------------
        if strcmp( get(hMapFig,'visible'), 'on') == 1
          erase_Line( hPlotAxes, 4 );
          plot_map( hMainFig, hPlotAxes);
        end

      end

    end    % if ~isequal(fileName, 0)

    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );

  end

%% Inter_OnMenuCallback ................................... Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
  function Inter_OnMenuCallback( hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpDateLimit,          'Visible', 'on' );
    set( hpInterpPos,          'Visible', 'on' );
    set( hpCalCoef,            'Visible', 'off');
    set( hbgQc,                'Visible', 'off');
    set( hbgParameter,         'Visible', 'off');

    % Toggle button
    % -------------
    set( hBottleToggletool,    'state', 'off', 'enable', 'off');
    set( hCalToggletool,       'state', 'off', 'enable', 'off');
    set( hClimToggletool,      'state', 'off', 'enable', 'off');
    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hQCToggletool,        'enable', 'off');
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

    set( hHeaderPushtool,      'enable', 'off' );

    % Get application data TSG
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Get the information on time limits of the time series
    % Write them in the uipanel
    % -----------------------------------------------------
    noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
    set( hetDateMin, 'String', datestr(noNaN(1), 31));
    set( hetDateMax, 'String', datestr(noNaN(end), 31));

    % Draw the 3 plots of the interpolation figure
    % --------------------------------------------
    plot_Interpolation( hMainFig, hPlotAxes, 1 );
    plot_Interpolation( hMainFig, hPlotAxes, 2 );
    plot_Interpolation( hMainFig, hPlotAxes, 3 );

  end

%% Inter_OffMenuCallback .................................. Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
  function Inter_OffMenuCallback( hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,            'Visible', 'off' );
    set( hpDateLimit,          'Visible', 'off' );
    set( hpInterpPos,          'Visible', 'off' );
    set( hbgParameter,         'Visible', 'on'  );

    % Enable Pushbuttons
    % ------------------
    set( hBottleToggletool,    'state', 'off', 'enable', 'on' );
    set( hCalToggletool,       'state', 'off', 'enable', 'on'  );
    set( hClimToggletool,      'state', 'off', 'enable', 'on'  );
    set( hPanToggletool,       'state', 'off', 'enable', 'on'  );
    set( hQCToggletool,        'state', 'off', 'enable', 'on'  );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

    set( hHeaderPushtool,      'enable', 'on' );

    % Get tsg structure
    % -----------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % Draw the 3 plots of the validation figure
    % -----------------------------------------
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );

    % Set the pointer
    % ---------------
    set( hMainFig, 'Pointer', 'arrow');

  end

%% InterpLinearCallback ...............................Interpolation Linear
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function InterpPosLinearCallback( hObject, eventdata)

    % Get the time limits for the correction A TESTER
    % --------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

    error = interpPosLinear( hMainFig, dateMin, dateMax );

    switch error

      case 1

        % Plot in the 3 axes
        % ------------------
        plot_Interpolation( hMainFig, hPlotAxes, 2 );
        plot_Interpolation( hMainFig, hPlotAxes, 3 );

      case -1
        msgbox( 'Date limits are not correct',...
          'Correction module', 'warn', 'modal');
    end


  end

%% InterpOtherCallback ...............................Interpolation OTher
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function InterpPosOtherCallback( hObject, eventdata)

    msgbox( 'Method not yet implemented', ...
      'Function InterpOtherCallback', ...
      'warn',...
      'modal' );
  end

%% InterpPosCancelCallback ..........................Cancel Interpolation
%----------------------------------------------------------------------
  function InterpPosCancelCallback(hObject, eventdata)
    % Callback function run when

    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % Get NO_CONTROL and INTERPOLATED_VALUE codes
    % -------------------------------------------
    NO_CONTROL         = tsg.qc.hash.NO_CONTROL.code;
    INTERPOLATED_VALUE = tsg.qc.hash.INTERPOLATED_VALUE.code;

    if ~isempty( tsg.POSITION_QC )
      iINTERP = find(  tsg.POSITION_QC == INTERPOLATED_VALUE);
      tsg.LATX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
      tsg.LONX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
      tsg.POSITION_QC = [];
    end

    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

    % Refresh plots
    % -------------
    plot_Interpolation( hMainFig, hPlotAxes, 1 );
    plot_Interpolation( hMainFig, hPlotAxes, 2 );
    plot_Interpolation( hMainFig, hPlotAxes, 3 );

  end


%% Cal_OnMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function Cal_OnMenuCallback( hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,         'Visible', 'on' );
    set( hbgParameter,      'Visible', 'off');
    set( hbgQc,             'Visible', 'off');

    % Pushbutton
    % ----------
    set( hQCToggletool,     'enable', 'off' );
    set( hClimToggletool,   'enable', 'off', 'state', 'off' );
    set( hBottleToggletool, 'enable', 'off' );
    set( hInterpToggletool, 'enable', 'off' );
    set( hHeaderPushtool,   'enable', 'off' );

    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % Draw the 3 plots of the validation figure
    % -----------------------------------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );

    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);

    % Write the Cal Coef in the Editable uicontrol
    % --------------------------------------------
    set( hetCalCNDCSlope,  'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
    set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));
    set( hetCalSSJTSlope,  'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
    set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
    set( hetCalSSTPSlope,  'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
    set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));

    % Intermediate variables
    % ----------------------
    tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF_NEW(B_SSTP) = str2num(get( hetCalSSTPOffset, 'String'));

    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

  end


%% Cal_OffMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
  function Cal_OffMenuCallback( hObject, eventdata)

    % Activate or desactivate uipanels
    % --------------------------------
    set( hpCalCoef,         'Visible', 'off' );
    set( hbgParameter,      'Visible', 'on');

    % Enable Pushbuttons
    % ------------------
    set( hClimToggletool,   'enable', 'on' );
    set( hBottleToggletool, 'enable', 'on' );
    set( hInterpToggletool, 'enable', 'on' );
    set( hHeaderPushtool,   'enable', 'on' );
    set( hQCToggletool,        'state', 'off', 'enable', 'on'  );
    set( hPanToggletool,       'state', 'off', 'enable', 'on' );
    set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );

    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);

    % Save the calibration coefficient
    % --------------------------------
    tsg.CNDC_LINCOEF(A_CNDC) = tsg.CNDC_LINCOEF_NEW(A_CNDC);
    tsg.CNDC_LINCOEF(B_CNDC) = tsg.CNDC_LINCOEF_NEW(B_CNDC);
    tsg.SSJT_LINCOEF(A_SSJT) = tsg.SSJT_LINCOEF_NEW(A_SSJT);
    tsg.SSJT_LINCOEF(B_SSJT) = tsg.SSJT_LINCOEF_NEW(B_SSJT);
    tsg.SSTP_LINCOEF(A_SSTP) = tsg.SSTP_LINCOEF_NEW(A_SSTP);
    tsg.SSTP_LINCOEF(B_SSTP) = tsg.SSTP_LINCOEF_NEW(B_SSTP);

    tsg.CNDC_LINCOEF_NEW = [];
    tsg.SSJT_LINCOEF_NEW = [];
    tsg.SSTP_LINCOEF_NEW = [];

    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

    % Draw the 3 plots of the validation figure
    % -----------------------------------------
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );


  end

%% CalibrateCallback .......................................... Calibration
  function CalibrateCallback(hObject, eventdata)
    % Callback function run when

    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);

    % Get the calibration coefficients.
    % They will be used in the function calibration
    % ---------------------------------------------
    tsg.CNDC_LINCOEF_NEW(A_CNDC) = str2num(get( hetCalCNDCSlope,  'String'));
    tsg.CNDC_LINCOEF_NEW(B_CNDC) = str2num(get( hetCalCNDCOffset, 'String'));
    tsg.SSJT_LINCOEF_NEW(A_SSJT) = str2num(get( hetCalSSJTSlope,  'String'));
    tsg.SSJT_LINCOEF_NEW(B_SSJT) = str2num(get( hetCalSSJTOffset, 'String'));
    tsg.SSTP_LINCOEF_NEW(A_SSTP) = str2num(get( hetCalSSTPSlope,  'String'));
    tsg.SSTP_LINCOEF_NEW(B_SSTP) = str2num(get( hetCalSSTPOffset, 'String'));

    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

    % Calibrate the sensors
    % ---------------------
    calibration( hMainFig );

    % Update the Adjusted variables (SSPS - SSJT) with calibrated records
    % -------------------------------------------------------------------
    % updateAdjustedVariable( hMainFig );

    % Refresh plot #1
    % ---------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );

    % As soon as a modification took place the data should be saved
    % -------------------------------------------------------------
    set( hSaveMenu, 'UserData', 'on' );

  end

%% CancelCalibrationCallback .................................. Calibration
  function CancelCalibrationCallback(hObject, eventdata)
    % Callback function run when

    % Get tsg application data
    % ------------------------
    tsg = getappdata( hMainFig, 'tsg_data' );

    % Emptied the CAL variables
    % -------------------------
    tsg.CNDC_CAL = [];
    tsg.SSPS_CAL = [];
    tsg.SSJT_CAL = [];
    tsg.SSTP_CAL = [];

    % Save tsg application data
    % --------------------------
    setappdata( hMainFig, 'tsg_data', tsg );

    % Update the Adjusted variables
    % -----------------------------
    % updateAdjustedVariable( hMainFig );

    % find SLOPE (A) and OFFSET (B) indices in _LINCOEF_CONV array
    % ------------------------------------------------------------
    A_CNDC = strmatch('SLOPE', tsg.CNDC_LINCOEF_CONV);
    B_CNDC = strmatch('OFFSET',tsg.CNDC_LINCOEF_CONV);
    A_SSJT = strmatch('SLOPE', tsg.SSJT_LINCOEF_CONV);
    B_SSJT = strmatch('OFFSET',tsg.SSJT_LINCOEF_CONV);
    A_SSTP = strmatch('SLOPE', tsg.SSTP_LINCOEF_CONV);
    B_SSTP = strmatch('OFFSET',tsg.SSTP_LINCOEF_CONV);

    % Write the Cal Coef in the Editable uicontrol
    % --------------------------------------------
    set( hetCalCNDCSlope,  'String', num2str(tsg.CNDC_LINCOEF(A_CNDC)));
    set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(B_CNDC)));
    set( hetCalSSJTSlope,  'String', num2str(tsg.SSJT_LINCOEF(A_SSJT)));
    set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(B_SSJT)));
    set( hetCalSSTPSlope,  'String', num2str(tsg.SSTP_LINCOEF(A_SSTP)));
    set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(B_SSTP)));

    % Refresh plot #1
    % ---------------
    plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
    plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
    plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );

    % As soon as a modification took place the data should be saved
    % -------------------------------------------------------------
    set( hSaveMenu, 'UserData', 'on' );

  end

%% ZoomIn_OnMenuCallback
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
  function ZoomIn_OnMenuCallback(hObject, eventdata)

    % Desactivate some toggle buttons, hZoomOutToggletool changed state
    % must be call before zoom function because the callback set zoom to
    % off
    % -------------------------------------------------------------------
    set( hZoomOutToggletool,   'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );

    % Hide the map. Otherwise it slows down the zooming
    % -------------------------------------------------
    %     set( hMapToggletool,       'state', 'off' );

    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);

    % Turns off the automatic adaptation of date ticks
    % ------------------------------------------------
    zoomAdaptiveDateTicks('off');

    % turns interactive zooming to in (increase)
    % ------------------------------------------
    set(hZoom, 'direction', 'in');

    % Disallows a zoom operation on the MAP axes objects
    % --------------------------------------------------
    %      setAllowAxesZoom(hZoom, hPlotAxes(4), false);

    % turns on interactive zooming (same effect than zoom on) but prevent
    % side effect on another figure
    % -------------------------------------------------------------------
    set(hZoom, 'enable', 'on');

    % Set this callback to listen to when a zoom operation finishes
    % must be call after enable zoom (bug ?)
    % -------------------------------------------------------------
    set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);

  end

%% ZoomIn_OffMenuCallback
%----------------------------------------------------------------------
% Callback function run when the toolbar zoom in (increase) push button
% is pressed
%----------------------------------------------------------------------
  function ZoomIn_OffMenuCallback(hObject, eventdata)

    % disable zoom mode
    % -----------------
    zoom off;

  end

%% ZoomOut_OnMenuCallback
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
  function ZoomOut_OnMenuCallback(hObject, eventdata)

    % Desactivate Zoom In Toggle toggle button
    % -----------------------------------------
    set( hZoomInToggletool,    'state', 'off' );
    set( hQCToggletool,        'state', 'off' );
    set( hPanToggletool,       'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );

    % Hide the map. Otherwise it slows down the zooming
    % -------------------------------------------------
    %     set( hMapToggletool,       'state', 'off' );

    % returns a zoom mode object for the figure hMainFig handle
    % ---------------------------------------------------------
    hZoom = zoom(hMainFig);

    % turns interactive zooming out (decrease)
    % ----------------------------------------
    set(hZoom, 'direction', 'out');

    % Disallows a zoom operation on the MAP axes objects
    % --------------------------------------------------
    %     setAllowAxesZoom(hZoom, hPlotAxes(4), false);

    % turns on interactive zooming (same effect than zoom on) but prevent
    % side effect on another figure
    % -------------------------------------------------------------------
    set(hZoom, 'enable', 'on');

    % Set this callback to listen to when a zoom operation finishes
    % -------------------------------------------------------------
    set(hZoom, 'ActionPostCallback', @ZoomPan_PostCallback);

  end

%% ZoomOut_OffMenuCallback
%------------------------------------------------------------------------
% Callback function run when the toolbar zoom out (descrease) push button
% is pressed
%------------------------------------------------------------------------
  function ZoomOut_OffMenuCallback(hObject, eventdata)

    % turns interactive zooming off
    % -----------------------------
    zoom off;

    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    %set(hMainFig, 'Pointer', 'arrow');

  end

%% Pan_OnMenuCallback
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
  function Pan_OnMenuCallback(hObject, eventdata)

    % Desactivate some toggle buttons
    % -------------------------------
    set( hQCToggletool,        'state', 'off' );
    set( hTimelimitToggletool, 'state', 'off' );
    set( hZoomInToggletool,    'state', 'off' );
    set( hZoomOutToggletool,   'state', 'off' );

    % Hide the map. Otherwise it slows down the panning
    % -------------------------------------------------
    %     set( hMapToggletool,       'state', 'off' );

    % Returns a pan mode object for the figure handle
    % -----------------------------------------------
    hPan = pan(hMainFig);

    % Disallows a pan operation on the MAP axes objects
    % --------------------------------------------------
    %     setAllowAxesPan(hPan, hPlotAxes(4), false);

    % turns on interactive pan (same effect than pan on) but prevent
    % side effect on another figure
    % --------------------------------------------------------------
    set(hPan, 'enable', 'on');

    % Set this callback to listen to when a zoom operation finishes
    % must be call after enable zoom (bug ?)
    % -------------------------------------------------------------
    set(hPan, 'ActionPostCallback', @ZoomPan_PostCallback);

  end

%% Pan_OffMenuCallback
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is released
%----------------------------------------------------------------------
  function Pan_OffMenuCallback(hObject, eventdata)

    % turns interactive pan off
    % -------------------------
    pan off;

    % cursor back to normal, test if it's really necessery
    % -----------------------------------------------------
    %set(hMainFig, 'Pointer', 'arrow');

  end

%% ZoomPan_PostCallback
%------------------------------------------------------------------------
% Callback function run when zoom or pan action finishes: redraw axes
%------------------------------------------------------------------------
  function ZoomPan_PostCallback(hObject, eventdata)

    % Set the right limit and interval to the 3 axes
    % ----------------------------------------------
    for iaxe = 1:3
      set(hPlotAxes(iaxe), 'XTickMode', 'auto')
      datetick(hPlotAxes(iaxe), 'x', 'keeplimits')
    end

    % Re-draw the map once the zoom/pan is off
    % ----------------------------------------
    if strcmp( get(hMapFig,'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end

  end

%% QCMenuCallback
%----------------------------------------------------------------------
% Callback function run when the Automatic QC menu item is selected
%
% Si vous modiifer ce CallBack verifier les modifications a apporter a
% 1 - preferenceForm.m
% 2 - tsg_preference.m
%----------------------------------------------------------------------
  function QCMenuCallback(hObject, eventdata, test)
    
    switch test
      case 'Speed'
        minSpeedQC(hMainFig)
      case 'Flow'
        minFlowQC(hMainFig)
      case 'Press'
        minPressQC(hMainFig)
      case 'SSPSmin'
        minSSPSQC(hMainFig)
      case 'SSPSmax'
        maxSSPSQC(hMainFig)
      case 'SSJTmin'
        minSSJTQC(hMainFig)
      case 'SSJTmax'
        maxSSJTQC(hMainFig)
      case 'SSTPmin'
        minSSTPQC(hMainFig)
      case 'SSTPmax'
        maxSSTPQC(hMainFig)
      otherwise
        msgbox('QCMenuCallback : erreur', 'QCMenuCallback','error', 'modal');
    end

    % --------------------------
    % refresh QC statistic panel
    % --------------------------
    display_QC( hMainFig );

    % ------------------
    % Refresh the plots
    %-------------------
    
    % Get the parameter displayed on plot number 1 : figure at the top
    % -----------------------------------------------------------------
    PARA = getParaCorModule( hMainFig );

    % Draw plot 1
    % -----------
    plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );

    % Update the map if already displayed
    % -----------------------------------
    if strcmp( get(hMapFig,'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end

  end


%% QC_OnMenuCallback ............................... Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is pressed
%----------------------------------------------------------------------
  function QC_OnMenuCallback(gcbo, eventdata)

    % Make the QC code uipanel visible
    % --------------------------------
    set( hbgQc,                'Visible' ,'on');
    set( hbgParameter,         'Visible', 'off');

    % Desactivate toggletools.
    % ------------------------
    set( hZoomInToggletool,    'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,   'state', 'off', 'enable', 'on' );
    set( hPanToggletool,        'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );
    set( hCalToggletool,        'state', 'off', 'enable', 'off'  );
    set( hInterpToggletool,     'state', 'off', 'enable', 'off' );

    % Retrieve named application data
    % -------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    % refresh QC statistic panel
    % --------------------------
    display_QC( hMainFig );

    % Activate right clic context menu on first axes (salinity)
    % ---------------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', hQcCmenu);

    % Activate clic mouse menu on first axes (salinity) for next rbbox
    % ----------------------------------------------------------------
    set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);

    % change cursor to crosshair aspect
    % ---------------------------------
    set( hMainFig, 'Pointer', 'crosshair');

    % -------------------------------------------------------------
    % nested function on mouse clic when QC toggle tool is selected
    % -------------------------------------------------------------
    function QC_SelectCallback(gcbo, eventdata)

      % disable ButtonMotion on main fig during select
      % prevent drawing to map
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', []);

      % Selection of the data within the figure
      % ---------------------------------------
      point1    = get(gca,'CurrentPoint');    % button down detected
      finalRect = rbbox;                      % return figure units
      point2    = get(gca,'CurrentPoint');    % button up detected

      point1 = point1(1,1:2);                 % extract x and y
      point2 = point2(1,1:2);

      p1 = min(point1,point2);
      p2 = max(point1,point2);                % calculate locations

      % The following code is only executed if the left mouse button is clicked.
      % If the right mouse button is clicked, this code must not be
      % executed as the variable 'ind' will be emptied. And this variable
      % is used when the context menu (callback 'Qc') is called
      % -----------------------------------------------------------------
      if ~strcmp( get(gcf, 'SelectionType'), 'alt')

        % The QC is applied either on TSG data either on Sample data.
        % it depends if the Botte Toggle button has been cliked on
        % -----------------------------------------------------------
        if strcmp( get(hBottleToggletool, 'state'), 'on')

          % get index on selected zone
          % --------------------------
          if ~isempty(tsg.DAYD_EXT)

            ind = find(tsg.DAYD_EXT > p1(1) &  tsg.DAYD_EXT < p2(1) & ...
              tsg.EXT_DIF  > p1(2) &  tsg.EXT_DIF  < p2(2));

            % Keep the information on the indices of the selected zone
            % --------------------------------------------------------
            tsg.rbboxind = ind .* ones(size(ind));

            % Modifiy the QC
            % --------------
            tsg.([SAMPLE '_EXT_QC'])(ind) = tsg.qc.active.Code;

            % Save the modifications
            % ----------------------
            setappdata( hMainFig, 'tsg_data', tsg);

            % plot selected data with selected code
            % --------------------------------------
            plot_Correction( hMainFig, hPlotAxes, PARA);

          end

        else

          % get index on selected zone
          % ---------------------------
          ind = find(tsg.DAYD   > p1(1,1) & tsg.DAYD   < p2(1,1) & ...
            tsg.(PARA{1}) > p1(1,2) & tsg.(PARA{1}) < p2(1,2));

          % Keep the information on the indices of the selected zone
          % --------------------------------------------------------
          tsg.rbboxind = ind .* ones(size(ind));

          % Modifiy the QC
          % --------------
          tsg.([PARA{1} '_QC'])(ind) = tsg.qc.active.Code;

          % put last SSPS_QC in queue (Undo/Redo)
          % -------------------------------------
          %tsg.queue = push( tsg.queue, tsg.([PARA '_QC']));

          % store QC in queue object, for undo
          % ----------------------------------
          %tsg.queue = push(tsg.queue, tsg.([PARA '_QC']));

          % Save the modifications
          % ----------------------
          setappdata( hMainFig, 'tsg_data', tsg);

          % Draw plot 1 of the validation figure
          % ------------------------------------
          plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );

          % refresh QC statistic panel
          % --------------------------
          display_QC( hMainFig );

          % Update the map if already displayed
          % -----------------------------------
          if strcmp( get(hMapFig,'visible'), 'on') == 1
            erase_Line( hPlotAxes, 4 );
            plot_map( hMainFig, hPlotAxes);
          end

          % enable undo menu
          % ----------------
          set(findobj('tag','UIMENU_UNDO'),'enable','on');
        end

        % As soon as a modification took place the data should be saved
        % -------------------------------------------------------------
        set( hSaveMenu, 'UserData', 'on' );

      end

      % enable ButtonMotion on main fig after select QC area
      % ----------------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

    end
  end

%% QC_OffMenuCallback .............................. Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is released
%----------------------------------------------------------------------
  function QC_OffMenuCallback(gcbo, eventdata)

    % Desactive right clic menu on first axes (salinity)
    % ---------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', []);

    % Desactive clic mouse menu (zoom) on first axes (salinity)
    % ----------------------------------------------------------
    set(hPlotAxes(1),'ButtonDownFcn', []);

    % Uipanel visible or not
    % -----------------------
    set( hbgQc,        'Visible', 'off' );

    if strcmp( get(hBottleToggletool, 'state'), 'off' )
      set( hCalToggletool,        'state', 'off', 'enable', 'on' );
      set( hInterpToggletool,     'state', 'off', 'enable', 'on' );
    end

    % uibuttongroup uipanel used to choose a parameter is set to
    % on only if the Correction screen (bottle toggletool) is off
    % -----------------------------------------------------------
    if  strcmp( get( hBottleToggletool, 'state'), 'off')
      set( hbgParameter, 'Visible', 'on');
    end
    % cursor back to normal
    % ---------------------
    set(hMainFig,'Pointer','arrow');

  end

%% Qc context menu selected ........................ Quality Control Module
%-----------------------------------------------------------
% Callback function run when the QC context menu is selected
%
% Context menu used to attribute a QC to the TSG time series
%
%-----------------------------------------------------------
  function Qc(hObject, eventdata, key)

    % Retrieve Default Quality Code and Color
    % ---------------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Get the parameter (SSPS, SSJT or SSTP)
    % --------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    % get key and some values in hashtable
    % ------------------------------------
    code  = tsg.qc.hash.(key).code;
    color = tsg.qc.hash.(key).color;

    % set active code and color from selected context menu
    % ----------------------------------------------------
    tsg.qc.active.Code  = code;
    tsg.qc.active.Color = color;

    % Modify and plot the last selected tsg data
    % ------------------------------------------
    if isfield(tsg, 'rbboxind') && ~isempty( tsg.rbboxind )

      if strcmp( get(hBottleToggletool, 'state'), 'on')

        tsg.([SAMPLE '_EXT_QC'])(tsg.rbboxind) = tsg.qc.active.Code;

        % Save tsg.SSPS_QC and tsg.qc.active.Code
        % in the application data
        % ----------------------------------------
        setappdata( hMainFig, 'tsg_data', tsg );

        % Draw the 3 plots of the Correction figure
        % -----------------------------------------
        plot_Correction( hMainFig, hPlotAxes, PARA );

      else
        tsg.([PARA{1} '_QC'])(tsg.rbboxind) = tsg.qc.active.Code;

        % Save tsg.SSPS_QC in the application data before use 
        % inside plot_Validation
        % ---------------------------------------------------
        setappdata( hMainFig, 'tsg_data', tsg );

        % Draw plot 1 of the validation figure
        % ------------------------------------
        plot_Validation( hMainFig, hPlotAxes, 1, PARA{1} );

      end

    end

    % Update the radio button corresponding to the selected
    % QC context menu (rbg : RadioButtonGroup)
    % -----------------------------------------------------
    %     radioTag     = ['TAG_QC_RADIO_' key];        % Build the TAG of the CODE
    %     hbgChildren  = get(hbgQc,'Children');        % Get the handles of the rbg
    %     hbgTagCell   = get(hbgChildren, 'tag');      % get the TAG of the rbg
    %     ind          = strcmp(radioTag, hbgTagCell); % Compare the TAG
    %     hRadioButton = hbgChildren( ind == 1 );      % Get the handle of the button
    %     set(hbgQc, 'SelectedObject', hRadioButton);  % Make this button active

    display_QC( hMainFig);

    setappdata( hMainFig, 'tsg_data', tsg );

  end

%% Radiobutton Quality Control ..................... Quality Control Module
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
  function RadiobuttonQc(source, eventdata)

    % Retrieve Default Quality Code and Color
    % ---------------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Retrieve the key from the active RadioButton
    % --------------------------------------------
    rbTag = get(eventdata.NewValue,'Tag');
    key = strrep(rbTag, 'TAG_QC_RADIO_', '');

    % store his handle to uibuttongroup userdata
    % ------------------------------------------
    set(hbgQc,'Userdata', eventdata.NewValue);

    % set active code and color from selected context menu
    % ----------------------------------------------------
    tsg.qc.active.Code  = tsg.qc.hash.(key).code;
    tsg.qc.active.Color = tsg.qc.hash.(key).color;

    % save tsg struct
    % ----------------
    setappdata( hMainFig, 'tsg_data', tsg );

  end

%% preQcPanCallback .................................Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
  function preQcPanCallback(obj, evd)

    set(hQCToggletool, 'state', 'off' );

  end

%% postQcPanCallback ............................... Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
  function postQcPanCallback(obj, evd)

    % Set the right limit and interval to the 3 axes
    % ----------------------------------------------
    for iaxe = 1:3
      set(hPlotAxes(iaxe),'XTickMode','auto')
      datetick(hPlotAxes(iaxe),'x','keeplimits')
    end

    % Re-draw the map once the pan is off -  only valide in QC mode
    % -------------------------------------------------------------
    if strcmp( get(hMapFig, 'visible'), 'on') == 1
      erase_Line( hPlotAxes, 4 );
      plot_map( hMainFig, hPlotAxes);
    end

    % restacks the figure to the top of the screen
    % --------------------------------------------
    figure( hMainFig);

    set(hQCToggletool, 'state', 'on' );

  end

%% MouseMotion
%---------------------------------------------------------------------
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map
%---------------------------------------------------------------------
  function MouseMotion(hObject, eventdata)

    % Test if the callback can be activated
    % -------------------------------------
    if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn')

      % Retrieve named application data
      % -------------------------------
      tsg = getappdata( hMainFig, 'tsg_data');

      % Get current position of cusor and return its coordinates in
      % axes with handle h_axes
      % -----------------------------------------------------------
      a = get(hPlotAxes(1), 'CurrentPoint');
      x = a(2,1);
      y = a(2,2);

      % Get the Limits of axes 1
      % ------------------------
      limx = get(hPlotAxes(1), 'XLim');
      limy = get(hPlotAxes(1), 'YLim');

      % Code to Activate the PAN function when QC mode is active
      % A PAN zone is defined in the bottom (10%) of PlotAxes(1)
      % 2 callback are needed :
      %    1 - one to desactivate QC when Pan is set to on.
      %    2 - one to reactivate QC once the pan has been used.
      % ---------------------------------------------------------
      
      % if we are in QC mode
      % ---------------------
      if strcmp( get(hQCToggletool, 'state' ), 'on' );

        % Suppose that Y axes is increasing from the bottom to the top
        % ------------------------------------------------------------
        limy2 = limy(1) + (limy(2)-limy(1)) * 0.10;

        if  x > limx(1) && x < limx(2) &&  y <= limy2 && y >= limy(1)
          hPan = pan(hMainFig);
          set(hPan,'ActionPreCallback',  @preQcPanCallback);
          set(hPan,'ActionPostCallback', @postQcPanCallback);
          set(hPan,'Enable','on');
        else
          try
            pan(hMainFig, 'off');
          catch
          end
          
        end % end of cursor test location
        
      end % end of QC mode test

      % Dynamically display data in uicontrol for valid data
      % ----------------------------------------------------
      if x > tsg.DAYD(1) && x < tsg.DAYD(end)

        % get index of cursor location 
        % ----------------------------
        indCursor = find( tsg.DAYD > x, 1, 'first');
        
        % display informations of cursor location in text uicontrol
        % ---------------------------------------------------------
        set( hInfoDateText, 'String',...
          datestr(tsg.DAYD(indCursor),'dd/mm/yyyy   HH:MM'));
        set( hInfoLatText,  'String', dd2dm(tsg.LATX(indCursor), 0) );
        set( hInfoLongText, 'String', ...
          dd2dm(mod(tsg.LONX(indCursor) + 180, 360) - 180, 1) );
        if ~isempty(tsg.SSPS)
          set( hInfoSSPSText, 'String', tsg.SSPS(indCursor) );
        end
        if ~isempty(tsg.SSJT)
          set( hInfoSSJTText, 'String', tsg.SSJT(indCursor) );
        end
        if ~isempty(tsg.SSTP)
          set( hInfoSSTPText, 'String', tsg.SSTP(indCursor) );
        end

        % Plot the position on the map if this one is active
        % --------------------------------------------------
        if strcmp( get(hMapFig, 'Visible'), 'on')

          % Select the map axes
          % -------------------
          axes( hPlotAxes(4));

          % Look for a MARKER (Red point) on the ship track
          % -----------------------------------------------
          h = findobj( hPlotAxes(4), '-regexp','Tag', 'TAG_PLOT4_LINE_MARKER');

          if isempty( h )   % if no Marker

            if ~isnan( tsg.LONX(indCursor) )

              % Plot a Marker (Red point) on the ship track
              % -------------------------------------------
              hMarker = m_line( mod(tsg.LONX(indCursor(1)) + ...
                tsg.lonplus, tsg.lonmod) - tsg.lonplus,...
                tsg.LATX(indCursor(1)),...
                'Marker', 'o', 'MarkerSize', 5, ...
                'Color', 'r', 'MarkerFaceColor', 'r');

              % Put a tag on the Marker - This tag allows to get the handle
              % of the Marker
              % -----------------------------------------------------------
              set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
            end

          else         % a marker exists

            if ~isnan( tsg.LONX(indCursor) )

              % Delete the Marker and redraw it
              % -------------------------------
              delete( h);
              hMarker = m_line( ...
                tsg.LONX(indCursor), tsg.LATX(indCursor),...
                'Marker', 'o', 'MarkerSize', 5, ...
                'Color', 'r', 'MarkerFaceColor', 'r');

              % Put a tag on the Marker - This tag allows to get the handle
              % of the Marker
              % -----------------------------------------------------------
              set( hMarker, 'TAG', 'TAG_PLOT4_LINE_MARKER' );
            end
          end

         end % end of map visible
        
      else
        
        % if cursor is out of valid data, display blank
        % ---------------------------------------------
        set( hInfoDateText, 'String', '' );
        set( hInfoLatText,  'String', '' );
        set( hInfoLongText, 'String', '' );
        set( hInfoSSPSText, 'String', '' );
        set( hInfoSSTPText, 'String', '' );
        set( hInfoSSJTText, 'String', '' );
      end
      
    end % end of BuntonMotionOn
    
  end % end of mouseMotion function

%% Map_OnMenuCallback
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is selected
%---------------------------------------------------------------------
  function Map_OnMenuCallback(hObject, eventdata)

    % Desactivate Zoom and Pan toggle buttons
    % ---------------------------------------
    set(hZoomInToggletool,  'state', 'off' );
    set(hZoomOutToggletool,  'state', 'off' );
    set(hPanToggletool,   'state', 'off' );

    % Make the earth map visible
    % --------------------------
    set(hMapFig, 'Visible', 'on' );

    erase_Line( hPlotAxes, 4 );

    plot_map( hMainFig, hPlotAxes)
    
    % De-activate keyPressFcn callback on main fig
    % --------------------------------------------
    set(hMainFig, 'KeyPressFcn', []);

  end

%% Map_OffMenuCallback
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is unselected
%---------------------------------------------------------------------
  function Map_OffMenuCallback(hObject, eventdata)

    % Make the earth map invisible
    % ----------------------------
    set(hMapFig, 'Visible', 'off' );
    
     % Re-activate keyPressFcn callback on main fig
    % ---------------------------------------------
    set(hMainFig, 'KeyPressFcn', @keyPressFcnCallback);

  end

%% Bottle_OnMenuCallback ................................ Correction Module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
  function Bottle_OnMenuCallback(hObject, eventdata)
    % Callback function run when the Bottle tool bar item is selected

    % Get the tsg structure
    % ---------------------
    tsg = getappdata(hMainFig, 'tsg_data');

    % Get the parameter we are working on (SSPS, SSJT, SSTP)
    % ------------------------------------------------------
    SAMPLE = tsg.plot.sample;
    PARA = getParaCorModule( hMainFig );

    % Switch somme buttons
    % --------------------
    set( hQCToggletool,         'state',  'off' );
    set( hZoomInToggletool,     'state', 'off', 'enable', 'on' );
    set( hZoomOutToggletool,    'state', 'off', 'enable', 'on' );
    set( hPanToggletool,        'state',  'off' );
    %     set( hMapToggletool,        'state',  'off' );
    set( hClimToggletool,       'state',  'off', 'enable', 'off');
    set( hCalToggletool,        'enable', 'off' );
    set( hInterpToggletool,     'enable', 'off' );
    set( hTimelimitToggletool,  'enable', 'on' );

    % Activate or desactivate uipanels
    % ---------------------------------
    set( hpDateLimit,           'Visible', 'on' );
    set( hbgCorMethod,          'Visible', 'on' );
    set( hCorPanel,             'Visible', 'on' );
    set( hbgParameter,          'Visible', 'off');
    set( hbgQc,                 'Visible', 'off');

    if ~isempty( tsg.([SAMPLE '_EXT']) )
      
      % Compute the sample-TSG differences
      % ----------------------------------
      errDif = diffTsgSample( hMainFig, PARA );
      
    else
      
      msgbox('No sample data file has been read', 'modal');
      
    end
    
    % Plot in the 3 axes
    % ------------------
    plot_Correction( hMainFig, hPlotAxes, PARA );
    
    % Necessary to unzoom as the new plot keep in memory the preceding zoom
    % ---------------------------------------------------------------------
    zoom out;
    
    % Get the information on time limits of the time series
    % Write them in the uipanel
    % -----------------------------------------------------
    noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
    set( hetDateMin, 'String', datestr(noNaN(1), 31));
    set( hetDateMax, 'String', datestr(noNaN(end), 31));

end

%% Bottle_OffMenuCallback ............................... Correction module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
  function Bottle_OffMenuCallback(hObject, eventdata)

    % If necessary toggle off some buttons
    % ------------------------------------
    set( hQCToggletool,        'state',  'off' );
    set( hZoomInToggletool,    'state',  'off' );
    set( hZoomOutToggletool,   'state',  'off' );
    set( hPanToggletool,       'state',  'off' );
    %     set( hMapToggletool,       'state',  'off' );
    set( hClimToggletool,      'enable', 'on');
    set( hCalToggletool,       'enable', 'on'  );
    set( hInterpToggletool,    'enable', 'on' );
    set( hTimelimitToggletool, 'enable', 'off' );

    % Activate or Desactivate uipanel
    % --------------------------------
    set( hpDateLimit,          'Visible', 'off' );
    set( hCorPanel,            'Visible', 'off' );
    set( hbgCorMethod,         'Visible', 'off' );
    set( hbgParameter,         'Visible', 'on');

    % Desactivate Click Mouse on figure
    % ---------------------------------
    set( hMainFig, 'WindowButtonDownFcn', []);

    % Get tsg structure
    % -----------------
    tsg  = getappdata( hMainFig, 'tsg_data' );

    % Draw the 3 plots of the validation figure
    % -----------------------------------------
    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );

    % Necessary to unzoom as the new plot keep in memory the preceding zoom
    % ---------------------------------------------------------------------
    zoom out;

    % Set the pointer
    % ---------------
    set( hMainFig, 'Pointer', 'arrow');

  end

%% OldCorCancelCallback .................................... Correction Module
  function OldCorCancelCallback(hObject, eventdata)
    % Callback function run when ...

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,       'state', 'off' );
    set( hZoomOutToggletool,       'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get tsg application data
    % ------------------------
    tsg = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );

    % To cancel the correction set the ADJUSTED variable
    % to []
    % --------------------------------------------------
    tsg.([PARA{1} '_ADJUSTED']) = [];
    tsg.([PARA{1} '_ADJUSTED_QC']) = [];
    tsg.([PARA{1} '_ADJUSTED_ERROR']) = [];

    % Save tsg data
    % -------------
    setappdata(hMainFig, 'tsg_data', tsg);

    % Plot in the 3 axes
    % ------------------
    plot_Correction( hMainFig, hPlotAxes, PARA );

  end
%% cancelCorrectionCallback .................................... Correction Module
  function cancelCorrectionCallback(hObject, eventdata, Limits)
    % Callback function run when the user want to cancel the
    % corrections made from comparison with bottles or ARGO data.
    % The deletion can be made for th whole time series or
    % between 2 dates.
% $Id$

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,       'state', 'off' );
    set( hZoomOutToggletool,       'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get tsg application data
    % ------------------------
    tsg = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    
   % The correction will be cancelled either for the entire 
   % time series or within date limits
   % ------------------------------------------------------
    ind = 0;
    switch Limits
      
      % Get the indices of the whole time series
      % ----------------------------------------
      case 'total'
        
        ind = find( tsg.DAYD >= tsg.DAYD(1) &  tsg.DAYD <= tsg.DAYD(end) );

%         ind = size(tsg.([PARA{1} '_ADJUSTED']));

      % Get the indices between 2 dates
      % --------------------------------
      case 'part'

        % Get the date limits used for the correction
        % -------------------------------------------
        dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
        dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

        % Find indices within date limits
        % --------------------------------
        if dateMax > dateMin
          ind = find( tsg.DAYD >= dateMin &  tsg.DAYD <= dateMax );
        end

      otherwise
        msgbox( 'CorCancelCallback : error', 'CorCancelCallback', 'error', modal);
    end

    if ~isempty(ind) && ~isempty( tsg.([PARA{1} '_ADJUSTED']) )
      
      % Cancel the correction : set the ADJUSTED variable to NaN
      % and ADJUSTED_QC to 0 (Bytes)
      % --------------------------------------------------------
      tsg.([PARA{1} '_ADJUSTED'])(ind) = ...
        NaN*ones(size(tsg.([PARA{1} '_ADJUSTED'])(ind))) ;
      tsg.([PARA{1} '_ADJUSTED_QC'])(ind) = ...
        zeros*ones(size(tsg.([PARA{1} '_ADJUSTED_QC'])(ind))) ;
      tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind) = ...
        NaN*ones(size(tsg.([PARA{1} '_ADJUSTED_ERROR'])(ind))) ;
      
    end

    % Save tsg data
    % -------------
    setappdata(hMainFig, 'tsg_data', tsg);

    % Plot in the 3 axes
    % ------------------
    plot_Correction( hMainFig, hPlotAxes, PARA );

  end


%% gradientCorrectionCallback .................................... Correction Module
  function gradientCorrectionCallback(hObject, eventdata)
    % Callback function run when

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get the time limits for the correction
    % --------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    if ~isempty( tsg.([SAMPLE '_EXT']) )

      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );

      % Correction
      % ----------
      error = corTsgGradient(hMainFig, PARA, dateMin, dateMax);

      switch error

        case 1

          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );

        case -1

          if DateMax <= DateMin
            msgbox( 'Date limits are not correct',...
              'Correction module', 'warn', 'modal');
          end

      end

    end

  end

%% biasCorrectionCallback .................................... Correction Module
  function biasCorrectionCallback(hObject, eventdata)
    % Callback function run when

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get the time limits for the correction A TESTER
    % -----------------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    if ~isempty( tsg.([SAMPLE '_EXT']) )

      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );
      
    end
    
    % Correction
    % ----------
    error = corTsgBias(hMainFig, PARA, dateMin, dateMax);

    switch error

      case 1

        % Plot in the 3 axes
        % ------------------
        plot_Correction( hMainFig, hPlotAxes, PARA );

      case -1

        if DateMax <= DateMin
          msgbox( 'Date limits are not correct',...
            'Correction module', 'warn', 'modal');
        end
        
      otherwise
        msgbox( 'CorBiasCallback : Error different   or -1',' ', 'error');

    end
  end
    
%% linearCorrectionCallback .................................... Correction Module
  function linearCorrectionCallback(hObject, eventdata)
    % Callback function run when

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,     'state', 'off' );
    set( hZoomOutToggletool,    'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get the time limits for the correction A TESTER
    % -----------------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

    % Get tsg application data
    % ------------------------
    tsg    = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    if ~isempty( tsg.([SAMPLE '_EXT']) )

      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );

      % Correction
      % ----------
      error = corTsgLinear(hMainFig, PARA, dateMin, dateMax);

      switch error

        case 1

          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );

        case -1
          msgbox( 'Date limits are not correct',...
            'Correction module', 'warn', 'modal');
      end

    end

  end

%% medianCorrectionCallback .................................... Correction Module
  function medianCorrectionCallback(hObject, eventdata)
    % Callback function run when

    % Desactivate somme Toggle button
    % -------------------------------
    set( hZoomInToggletool,       'state', 'off' );
    set( hZoomOutToggletool,       'state', 'off' );
    set( hPanToggletool,        'state', 'off' );
    set( hQCToggletool,         'state', 'off' );
    set( hTimelimitToggletool,  'state', 'off' );

    % Get the time limits for the correction A TESTER
    % --------------------------------------
    dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
    dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');

    % Get tsg application data
    % ------------------------
    tsg = getappdata(hMainFig, 'tsg_data');

    % Get parameter we are working on (SSPS, SSJT, SSTP)
    % or SSPS_CAL, SSJT_CAL, SSTP_CAL
    % -------------------------------------------------
    PARA = getParaCorModule( hMainFig );
    SAMPLE = tsg.plot.sample;

    if ~isempty( tsg.([SAMPLE '_EXT']) )

      % Compute the sample-TSG differences
      % ----------------------------------
      diffTsgSample( hMainFig, PARA );

      % Correction
      % ----------
      error = corTsgMedian(hMainFig, PARA, dateMin, dateMax);

      switch error

        case 1

          % Plot in the 3 axes
          % ------------------
          plot_Correction( hMainFig, hPlotAxes, PARA );

        otherwise

          % Nothing is done - Error msg within the corTsgMedian function
      end

    end
  end

%% PopupMenu Select Parameter
% POP_UP filled in with the function "initParameterChoice"
% ---------------------------
  function SelectParameter(hObject, eventdata, nplot)
    % Callback function run when the ....

    % Get application data
    % --------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Get the active string of the selected box
    % -----------------------------------------
    val             = get( hObject, 'Value' );
    string_list     = get( hObject, 'String' );
    selected_string = string_list{val};

    % Get the default parameter
    % -------------------------
    tsg.plot.parameter{nplot} =  selected_string;
    if nplot == 1
      tsg.plot.sample = selected_string;
      if strcmp( tsg.plot.sample, 'SSJT' )
        tsg.plot.sample = 'SSTP';
      end
    end

    % Save application data
    % --------------------
    setappdata( hMainFig, 'tsg_data', tsg);

    % Disable the climatology
    % -----------------------
    plotClim = 0;
    if strcmp( get(hClimToggletool, 'state'), 'on' )
      set( hClimToggletool, 'state', 'off' );
      plotClim = 1;
    end

    % Disable the climatology
    % -----------------------
    set( hClimToggletool, 'state', 'off' );

    plot_Validation( hMainFig, hPlotAxes, 1, tsg.plot.parameter{1} );
    plot_Validation( hMainFig, hPlotAxes, 2, tsg.plot.parameter{2} );
    plot_Validation( hMainFig, hPlotAxes, 3, tsg.plot.parameter{3} );

    % Plot the climatology if it was already plotted
    % ----------------------------------------------
    if plotClim
      set( hClimToggletool, 'state', 'on' );
      plot_Climatology(hMainFig, hPlotAxes);
    end

  end

%% SelectTime_OnMenuCallback
%---------------------------
  function SelectTime_OnMenuCallback(hObject, eventdata)
    % Callback function run when the ....

    % Desactivate Zoom and Pan functions.
    % ----------------------------------
    set( hZoomInToggletool, 'state', 'off' );
    set( hZoomOutToggletool, 'state', 'off' );
    set( hQCToggletool,   'state', 'off' );
    set( hPanToggletool,  'state', 'off' );

    % Create a pointer to select the time limits
    % ------------------------------------------
    selTimePointer = ones(16)+1;
    selTimePointer(1,:)       = 1; selTimePointer(16,:)      = 1;
    selTimePointer(:,1)       = 1; selTimePointer(:,16)      = 1;
    selTimePointer(1:4,8:9)   = 1; selTimePointer(13:16,8:9) = 1;
    selTimePointer(8:9,1:4)   = 1; selTimePointer(8:9,13:16) = 1;
    selTimePointer(5:12,5:12) = NaN; % Create a transparent region in the center

    % Activate clic mouse menu on second axes (salinity) for next rbbox
    % ----------------------------------------------------------------
    set(hMainFig,'WindowButtonDownFcn', @Time_SelectCallback);

    % change cursor
    % ---------------
    set( hMainFig, 'Pointer', 'custom',...
      'PointerShapeCData', selTimePointer, 'PointerShapeHotSpot',[9 9]);

    % ----------------------------------------------------------------------
    % nested function on mouse clic when Select Time toggle tool is selected
    % ----------------------------------------------------------------------
    function Time_SelectCallback(gcbo, eventdata)

      % disable ButtonMotion on main fig during select
      % prevent drawing to map
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', []);

      % Retrieve named application data
      % -------------------------------
      tsg = getappdata( hMainFig, 'tsg_data');

      % Selection of the data within the figure
      % ---------------------------------------
      point1    = get(gca,'CurrentPoint');    % button down detected
      finalRect = rbbox;                      % return figure units
      point2    = get(gca,'CurrentPoint');    % button up detected

      point1 = point1(1,1:2);                 % extract x and y
      point2 = point2(1,1:2);

      p1 = min(point1,point2);
      p2 = max(point1,point2);                % calculate locations

      % get index on selected zone - Only on X axes (time)
      % --------------------------------------------------
      ind = find(tsg.DAYD >= p1(1,1) & tsg.DAYD <= p2(1,1));

      % Write the date in the Editable uicontrol
      % ----------------------------------------
      set( hetDateMin, 'String', datestr(tsg.DAYD(ind(1)),   31));
      set( hetDateMax, 'String', datestr(tsg.DAYD(ind(end)), 31));

      % enable ButtonMotion on main fig after select QC area
      % ----------------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
    end
  end

%% SelectTime_OffMenuCallback
%----------------------------
  function SelectTime_OffMenuCallback(hObject, eventdata)
    % Callback function run when the ....

    % Desactivate time limit buttons
    % ------------------------------
    set( hTimelimitToggletool, 'state', 'off');

    set( hMainFig, 'WindowButtonDownFcn', []);

    set( hMainFig, 'Pointer', 'arrow');

  end

%% Clim_OffMenuCallback
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
  function Clim_OffMenuCallback(hObject, eventdata)

    % Get lines handles from tag
    % --------------------------
    hLines = findobj('-regexp', 'Tag', 'TAG_LINE_CLIMATO_');

    % Delete climatology lines on axes
    % ---------------------------------
    delete(hLines);

  end

%% Clim_OnMenuCallback
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
  function Clim_OnMenuCallback(hObject, eventdata)

    % Test if the TSG and bucket files have been read
    % -----------------------------------------------
    if strcmp( get(hOpenMenu, 'UserData'), 'on' )

      % plot climatology
      % ----------------
      plot_Climatology(hMainFig, hPlotAxes);

    end
  end

%% ClimatoSelectMenuCallback
% -------------------------------------------------------------------
% Callback function run when climato submenu is selected
% -------------------------------------------------------------------
  function ClimatoSelectMenuCallback(hObject, eventdata, climato, time)

    % find all climato submenu and set 'checked' property to 'off'
    % ------------------------------------------------------------
    hdl = findobj( '-regexp', 'tag', 'TAG_UIMENU_CLIMATO');
    set(hdl, 'checked', 'off');

    % set current climato submenu checked
    % -----------------------------------
    set(hObject, 'checked', 'on');

    % memorize action on climatology menu for next use
    % ------------------------------------------------
    s.type = climato;
    s.time = time;
    set(hClimatoMenu, 'userdata', s);

    % check if climatology toggle button is set
    % -----------------------------------------
    if strcmp(get(hClimToggletool, 'state'), 'on')

      % clear last plotted climatology
      % ------------------------------
      Clim_OffMenuCallback;

      % plot and read (eventually) new climatology
      % ------------------------------------------
      plot_Climatology(hMainFig, hPlotAxes);
    end

  end

%% PreferencesMenuCallback
% -------------------------------------------------------------------
% Callback function run when Option/Preference is selected
% -------------------------------------------------------------------
  function PreferencesMenuCallback(hObject, eventdata)

    oldmapres=tsg.preference.map_resolution;

    % call preferences form function
    % ------------------------------
    if( preferencesForm(hMainFig) )

      % if form is validate, update plots only if plot exist
      % ----------------------------------------------------
      if ~isempty(findobj( '-regexp', 'Tag', ('TAG_PLOT\d_LINE_')))
        SelectParameter(pmhPara(1),[],1);
      end

      % Update the map (if visible) if ship speed QC has been applied
      % or map resolution has been changed
      % -------------------------------------------------------------
      if (strcmp( get(hMapFig,'visible'), 'on') == 1 & ...
              tsg.preference.map_resolution ~= oldmapres)
        erase_Line( hPlotAxes, 4 );
        plot_map( hMainFig, hPlotAxes);
      end

    end

  end

%% HelpMenuCallback
% -------------------------------------------------------------------
% Callback function run when Help/Help is selected
% -------------------------------------------------------------------
  function HelpMenuCallback(hObject, eventdata)
    msgbox( 'Function Help not yet implemented', 'warn', 'modal');
  end

%% AboutMenuCallback
% -------------------------------------------------------------------
% Callback function run when Help/About is selected
% -------------------------------------------------------------------
  function AboutMenuCallback(hObject, eventdata)
    %splash('Thermo.jpg', 3000);
    aboutDialog(hMainFig, DEFAULT_PATH_FILE);
  end

%% HeaderMenuCallback
% -------------------------------------------------------------------
% Callback function run when the headerForm tool bar item is selected
% -------------------------------------------------------------------
  function HeaderMenuCallback(hObject, eventdata)

    % call header form function
    % -------------------------
    headerForm(hMainFig);

  end

%% PrintFigMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
  function PrintFigMenuCallback(hObject, eventdata)

    % disable ButtonMotion on main fig during select
    % ----------------------------------------------
    set( hMainFig, 'WindowButtonMotionFcn', []);

    % Get the tsg structure
    % ---------------------
    tsg = getappdata( hMainFig, 'tsg_data');


    hPrintFig = figure( 'Name', 'Print','NumberTitle', 'off','Resize', 'on');
    hPlot(1) = subplot(3,1,1);
    hPlot(2) = subplot(3,1,2);
    hPlot(3) = subplot(3,1,3);
    title( hPlot(1), tsg.file.name, 'interpreter', 'none');

    if strcmp(get(hBottleToggletool,'state'), 'on')

      % Default parameter
      % -----------------------------------------------------
      PARA = getParaCorModule( hMainFig );

      plot_Correction( hMainFig, hPlot, PARA );

    elseif strcmp(get(hCalToggletool,'state'), 'on')

      plot_Calibration( hMainFig, hPlot, 1, 'SSPS' );
      plot_Calibration( hMainFig, hPlot, 2, 'SSJT' );
      plot_Calibration( hMainFig, hPlot, 3, 'SSTP' );
      %     elseif strcmp(get(hMapToggletool,'state'), 'on')
      %      plot_map( hMainFig, hPlot)

    elseif strcmp(get(hInterpToggletool,'state'), 'on')

      plot_Interpolation( hMainFig, hPlot, 1 );
      plot_Interpolation( hMainFig, hPlot, 2 );
      plot_Interpolation( hMainFig, hPlot, 3 );

    else

      plot_Validation( hMainFig, hPlot, 1, tsg.plot.parameter{1} );
      plot_Validation( hMainFig, hPlot, 2, tsg.plot.parameter{2} );
      plot_Validation( hMainFig, hPlot, 3, tsg.plot.parameter{3} );

      %       I = getframe(hPlotAxes(1));
      %       imwrite(I.cdata, 'myplot.png');
    end

    linkaxes([hPlot(1),hPlot(2),hPlot(3)], 'x');
    for i = 1 : length( hPlot )
      %      set(hPlot(i), 'box', 'on','XTickMode','auto');
      set(hPlot(i), 'box', 'on','XTickMode','auto');
      datetick(hPlot(i),'x','mm/dd','keepticks' );
    end

    % enable ButtonMotion on main fig after select QC area
    % ----------------------------------------------------
    set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

  end

%% ReportMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
  function ReportMenuCallback(hObject, eventdata)

    % call report function
    % --------------------
    saveReport(hMainFig);

  end

%% SaveMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Save menu item is selected
% -------------------------------------------------------------------
  function SaveMenuCallback(hObject, eventdata)

    % Retrieve named application data
    % -------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % fill or append header form
    % -------------------------
    error = headerForm(hMainFig);

    % if user press continue button, ask for netcdf file
    % ------------------------------------------------
    if error ~= -1
      [fileName, pathName, filterindex] = uiputfile('*.nc', ...
        'Save file name', strcat(tsg.file.name, '.nc'));

      % if user press cancel button, all var are set to zero
      % ----------------------------------------------------
      if filterindex == 0
        return;
      end

      % Pointer set to watch during reading and plotting
      % ------------------------------------------------
      set( hMainFig, 'Pointer', 'watch' );

      % flushes the event queue and updates the closed uiputfile window
      % ---------------------------------------------------------------
      drawnow;

      % write netcdf file
      % -----------------
      error = writeTSGDataNetCDF(hMainFig, strcat(pathName, fileName));

      % Pointer reset to arrow
      % ----------------------
      set( hMainFig, 'Pointer', 'arrow' );

      % Check for NetCDF writing error
      % must to be rewriting
      % ------------------------------
      if error == -1
        warning('tsgqc:SaveMenuCallback', ...
          'NetCDF writing error: %s %s', pathName, fileName);
        return;
      end

      % update the display
      % ------------------
      set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));

      % enable Quality Control mode
      % ---------------------------
      hdl_pushtool = findobj('Tag', 'QC');
      set(hdl_pushtool, 'Enable', 'on');
    end

  end

%% ExportTsgCallback
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
  function ExportTsgCallback(hObject, eventdata)

    % Retrieve named application data
    % -------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Desactivate MouseMotion 'off'
    % ----------------------------
    set( hMainFig, 'WindowButtonMotionFcn', []);

    % Open standard dialog box for saving files
    % -----------------------------------------
    [fileName, pathName, filterindex] = uiputfile('*.tsgqc', ...
      'Save file name', strcat(tsg.file.name, '.tsgqc'));

    % if user press cancel button, all var are set to zero
    % ----------------------------------------------------
    if filterindex == 0
      return;
    end

    % Pointer set to watch during reading and plotting
    % ------------------------------------------------
    set( hMainFig, 'Pointer', 'watch' );

    % Write a .TSG (ascii)  file
    % --------------------------
    error = writeAsciiTsg(hMainFig, strcat(pathName, fileName));

    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );

    % enable Quality Control mode
    % ---------------------------
    hdl_pushtool = findobj('Tag', 'QC');
    set(hdl_pushtool, 'Enable', 'on');

    % Set MouseMotion 'on'
    % --------------------
    set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

    % Check for .TSG writing error - must to be rewriting
    % Because of the 'return' - These line must be at the end
    % --------------------------------------------------------
    if error == -1
      warning('tsgqc:SaveMenuCallback', ...
        'TSG no ouput: %s %s', pathName, fileName);
      return;
    end

  end
%% ExportSampleCallback
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
  function ExportSampleCallback(hObject, eventdata)

    % Retrieve named application data
    % -------------------------------
    tsg = getappdata( hMainFig, 'tsg_data');

    % Desactivate MouseMotion 'off'
    % ----------------------------
    set( hMainFig, 'WindowButtonMotionFcn', []);

    % Open standard dialog box for saving files
    % -----------------------------------------
    [fileName, pathName, filterindex] = uiputfile('*.spl', ...
      'Save file name', strcat(tsg.file.name, '.spl'));

    % if user press cancel button, all var are set to zero
    % ----------------------------------------------------
    if filterindex == 0
      return;
    end

    % Pointer set to watch during reading and plotting
    % ------------------------------------------------
    set( hMainFig, 'Pointer', 'watch' );

    % Write a .SPL (ascii)  file
    % --------------------------
    error = writeAsciiSample(hMainFig, strcat(pathName, fileName));

    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );

    % enable Quality Control mode
    % ---------------------------
    hdl_pushtool = findobj('Tag', 'QC');
    set(hdl_pushtool, 'Enable', 'on');

    % Set MouseMotion 'on'
    % --------------------
    set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);

    % Check for .TSG writing error - must to be rewriting
    % Because of the 'return' - These line must be at the end
    % --------------------------------------------------------
    if error == -1
      warning('tsgqc:SaveMenuCallback', ...
        'TSG no ouput: %s %s', pathName, fileName);
      return;
    end

  end

%% UndoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Undo menu item is selected (Ctrl+Z)
% -----------------------------------------------------------------------
  function UndoMenuCallback(hObject, eventdata)

    % Undo module not yet implemented
    % -------------------------------
    % msgbox('Undo module not yet implemented', 'modal');

    %tsg.queue = undo(tsg.queue);
    %tsg.SSPS_QC = get(tsg.queue);

    % Make the Salinity, temperature and velocity plot
    % ------------------------------------------------
    plot_SalTempVel( hMainFig, hPlotAxes );

  end

%% RedoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Redo menu item is selected (Ctrl+R)
% -----------------------------------------------------------------------
  function RedoMenuCallback(hObject, eventdata)

    % Redo module not yet implemented
    % -------------------------------
    msgbox('Redo module not yet implemented', 'modal');

  end

%% KeyPressFcnCallback
% -----------------------------------------------------------------------
% Callback function run when key is pressed
% -----------------------------------------------------------------------
  function keyPressFcnCallback(hObject, evnt)

    % MATLAB generates repeated KeyPressFcn events, desactivate callback
    % ------------------------------------------------------------------
    set(hObject, 'KeyPressFcn', []);

    % check if key is pressed
    % -----------------------
    if ~isempty(evnt.Key)

      % test key, shift or control
      % --------------------------
      switch evnt.Key

        case 'shift'

          % get current pointer shape
          % -------------------------
          pointerShape = get(hObject, 'pointer');

          % save current cursor shape
          % -------------------------
          setappdata( hMainFig, 'tsg_pointer', pointerShape);

          % set cursor to fullcross or reset to normal arrow
          % ------------------------------------------------
          set(hObject, 'pointer', 'fullcrosshair');

        case 'control'

          % Get current position of cusor and return its coordinates in
          % axes
          % -----------------------------------------------------------
          a = get(hPlotAxes(1), 'CurrentPoint');
          x = a(2,1);

          % Test if cursor is inside data interval
          % -------------------------------------
          if x > tsg.DAYD(1) && x < tsg.DAYD(end)
 
            % loop over 3 subplot and draw vertical lines
            % -------------------------------------------
            for iplot = 1:3
              axes( hPlotAxes(iplot));
              limy = get(hPlotAxes(iplot), 'YLim');
              line([x x], limy, 'color', 'k', 'EraseMode', 'xor',...
                'tag', 'VERTICAL_TAG_LINE');
            end
            
          end

      end % end of switch

    end

  end


%% KeyReleaseFcnCallback
% -----------------------------------------------------------------------
% Callback function run when key is release
% -----------------------------------------------------------------------
  function keyReleaseFcnCallback(hObject, evnt)

    % check if key is pressed
    % -----------------------
    if ~isempty(evnt.Key)

      % test key, shift or control
      % --------------------------
      switch evnt.Key

        case 'shift'

          % get stored cursor shape
          % -----------------------
          pointerShape = getappdata( hMainFig, 'tsg_pointer');

          % if pointer equal to fullcrosshair, oups, error, reset to arrow
          % ---------------------------------------------------------------
          if strcmp(pointerShape, 'fullcrosshair')
            pointerShape = 'arrow';
            set(hObject, 'pointer', pointerShape);
          end

          % set pointer
          % -----------
          set(hObject, 'pointer', pointerShape);

        case 'control'
          
           % find vertical lines and delete them
           % -----------------------------------
            hdl_lines = findobj( 'Tag', 'VERTICAL_TAG_LINE' );
            delete(hdl_lines);

      end  % end of switch

    end  % end of if
    
    % Re-activate callback
    % --------------------
    set(hObject, 'KeyPressFcn', @keyPressFcnCallback);
    
  end

%% QuitMapCallback
% -----------------------------------------------------------------
% Callback function run when the Quit Map Figure item is selected
% -----------------------------------------------------------------
  function QuitMapCallback(hObject, eventdata)

    % Make the earth map invisible
    % ----------------------------
    set(hMapFig, 'Visible', 'off' );
    set(hMapToggletool, 'state',  'off' );

  end

%% QuitMenuCallback
% -----------------------------------------------------------------
% Callback function run when the Quit menu item is selected
% -----------------------------------------------------------------
  function QuitMenuCallback(hObject, eventdata)
    
    % Get the data from the application GUI
    % -------------------------------------
    tsg = getappdata(hMainFig, 'tsg_data');

    % in case of bad initialisation, the user could close the windows
    % ---------------------------------------------------------------
    try

      % save config mat file in prefdir
      % -------------------------------
      config_file = [prefdir, filesep, tsgqcname, '.mat'];

      % save preference mat file
      % ------------------------
      if exist('tsg', 'var') && isfield( tsg, 'preference')
        preference = tsg.preference;
        save( config_file, 'preference');
      end

      % If the data have been modified and not save, the program
      % ask to save the data
      % --------------------------------------------------------
      if  strcmp( get( hSaveMenu, 'UserData' ), 'on')
        selection = ...
          questdlg('The file has been modified.  Do you want to save it ?',...
          'Save before Quit?',...
          'Yes', 'No', 'Yes');

        if strcmp(selection, 'Yes')

          % call File/Save Menu Callback before before quit
          % -----------------------------------------------
          SaveMenuCallback;

        end

        % quit program
        % ------------
        quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);

      else
        selection = ...
          questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
          ['Quit ' get(hMainFig, 'Name') '?'],...
          'Yes', 'No', 'Yes');
        if strcmp(selection, 'No')
          return;
        else
          quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);
        end
      end

      % catch error during close windows
      % --------------------------------
    catch
      % display message to console and quit program
      % -------------------------------------------
      fprintf('abnormal program termination during close user request\n');
      quitProgram(DEFAULT_PATH_FILE, hMainFig);
    end

  end

% end of tsgqc
% ----------------
end