function varargout = oct_croco_gui(varargin_id)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% CROCO_GUI Application M-file for oct_croco_gui.fig
%
%  Visualization of CROCO model outputs
%
%  Further Information:  
%  http://www.croco-ocean.org
%  
%  This file is part of CROCOTOOLS
%
%  CROCOTOOLS 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.
%
%  CROCOTOOLS 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 this program; if not, write to the Free Software
%  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
%  MA  02111-1307  USA
%
%  Copyright (c) 2002-2006 by Pierrick Penven 
%  e-mail:Pierrick.Penven@ird.fr  
%
%  Updated 02-Nov-2006 by Pierrick Penven (Yorig)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% ------------------------------------------------------------
% LAUNCH GUI
% ------------------------------------------------------------
if nargin == 0 
  warning off
  fig = openfig(mfilename,'reuse');
  warning on
  % Use system color scheme for figure:
  set(fig,'Color',get(0,'defaultUicontrolBackgroundColor'));
  % Generate a structure of handles to pass to callbacks, and store it. 
  handles = guihandles(fig);  
  hisfile_callback(fig, [], handles, varargin_id) 
  if nargout > 0
    varargout{1} = fig;
  end
elseif ischar(varargin_id{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK
  try
    [varargout{1:nargout}] = feval(varargin_id{:}); % FEVAL switchyard
  catch
    disp(lasterr);
  end
end
return
% ------------------------------------------------------------
% Callback for the Close button
% ------------------------------------------------------------
function varargout = close_Callback(h, eventdata, handles, varargin_id)
oct_delete(handles.figure1)
return
% ------------------------------------------------------------
% ------------------------------------------------------------

%% ------------------------------------------------------------
% ------------------------------------------------------------
%   Reset everything
% ------------------------------------------------------------
% ------------------------------------------------------------
function handles = reset_handles(h,handles)
handles.hisfile='';
handles.gridfile='';
handles.L=[];
handles.M=[];
handles.N=[];
handles.T=[];
handles.hmax=[];
handles.ng=[];
handles.coastfile=[];
handles.vname='zeta';
handles.vlevel=-10;
handles.pltstyle=1;
handles.lonmin=-99;
handles.tindex=1;
handles.lonmax=99;
handles.latmin=-99;
handles.latmax=99;
handles.cstep=0;
handles.cscale=1;
handles.cunit=0.1;
handles.colmin=[];
handles.colmax=[];
handles.ncol=10;
handles.coef=1;
handles.gridlevs=0;
handles.day=[];
handles.month=[];
handles.year=[];
handles.thedate='';
handles.rempts=[1 1 1 1];
handles.units='';
handles.longname='';
handles.townfile=[];
handles.isobath='0 200 1000';
handles.skipanim=1;
handles.plot=1;
handles.Yorig=NaN;
set(handles.slidercscale,'Value',handles.cscale/20);
set(handles.editcoef,'String',num2str(handles.coef))
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
guidata(h,handles)
return
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
% -------------------- OPEN FILES ----------------------------
% ------------------------------------------------------------
% Callback for Open History file
% ------------------------------------------------------------
function varargout = hisfile_callback(h, eventdata, handles, varargin_id)
% Use UIGETFILE to allow for the selection of a custom address book.

[filename, pathname] = uigetfile( ...
	{'*.nc', 'All oct_netcdf-Files (*.nc)'; ...
		'*.*','All Files (*.*)'}, ...
	'SELECT A CROCO HISTORY NETCDF FILE');
% If "Cancel" is selected then return
if isequal([filename,pathname],[0,0])
  return
% Otherwise construct the fullfilename and Check and load the file.
else
  handles=reset_handles(h,handles);
  handles.hisfile = fullfile(pathname,filename);
  ncid = oct_netcdf.open(handles.hisfile, 'NC_NOWRITE');
  if isempty(ncid)
     disp('Warning : this is not a oct_netcdf file !!!')
     handles.hisfile='';
     return
  else
    pm=ncid{'pm'};
    if isempty(pm)
      oct_netcdf.close(ncid);
      guidata(h,handles)
      gridfile_callback(h, eventdata, handles, varargin_id)
      return
    end
    oct_netcdf.close(ncid);
    hisfile=handles.hisfile;
    gridfile=handles.gridfile;
    handles = reset_handles(h,handles);
    handles.hisfile=hisfile;
    handles.gridfile=gridfile;
    guidata(h,handles)
    handles=update_listbox(h, eventdata, handles, varargin_id);
  end
end
return
% ------------------------------------------------------------
% Callback for Open Grid file
% ------------------------------------------------------------
function varargout = gridfile_callback(h, eventdata, handles, varargin_id)
% Use UIGETFILE to allow for the selection of a custom address book.
[filename, pathname] = uigetfile( ...
	{'*.nc', 'All oct_netcdf-Files (*.nc)'; ...
		'*.*','All Files (*.*)'}, ...
	'SELECT A CROCO GRID NETCDF FILE');
% If "Cancel" is selected then return
if isequal([filename,pathname],[0,0])
  return
% Otherwise construct the fullfilename and Check and load the file.
else
  handles.gridfile = fullfile(pathname,filename);
  ncid = oct_netcdf.open(handles.gridfile, 'NC_NOWRITE');
  if isempty(ncid)
     disp('Warning : this is not a oct_netcdf file !!!')
     handles.gridfile='';
     return
  else
    oct_netcdf.close(ncid);
    guidata(h,handles)
    handles=update_listbox(h, eventdata, handles, varargin_id);
  end
end
return
% ------------------------------------------------------------
% Callback for Open Coastfile
% ------------------------------------------------------------
function varargout = coastfile_callback(h, eventdata, handles, varargin_id)
% Use UIGETFILE to allow for the selection of a custom address book.
[filename, pathname] = uigetfile( ...
	{'*.mat', 'All MAT-Files (*.mat)'; ...
		'*.*','All Files (*.*)'}, ...
	'SELECT A GHRR COASTLINE FILE');
% If "Cancel" is selected then return
if isequal([filename,pathname],[0,0])
  return
% Otherwise construct the fullfilename and Check and load the file.
else
  handles.coastfile = fullfile(pathname,filename);
  if handles.plot==1
    inplot(h, eventdata, handles, varargin_id);
  else
    disp('Push ''PLOT'' button')
  end
  guidata(h,handles)
end
return
% ------------------------------------------------------------
% Callback for remove the coastline
% ------------------------------------------------------------
function varargout = remcoast_Callback(h, eventdata, handles, varargin_id)
handles.coastfile=[];
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% Callback for Open Townfile
% ------------------------------------------------------------
function varargout = townfile_callback(h, eventdata, handles, varargin_id)
% Use UIGETFILE to allow for the selection of a custom address book.
[filename, pathname] = uigetfile( ...
	{'*.dat', 'All MAT-Files (*.dat)'; ...
		'*.*','All Files (*.*)'}, ...
	'SELECT A ASCII TOWN FILE');
% If "Cancel" is selected then return
if isequal([filename,pathname],[0,0])
  return
% Otherwise construct the fullfilename and Check and load the file.
else
  handles.townfile = fullfile(pathname,filename);
  if handles.plot==1
    inplot(h, eventdata, handles, varargin_id);
  else
    disp('Push ''PLOT'' button')
  end
  guidata(h,handles)
end
return
% ------------------------------------------------------------
% Callback for remove the towns
% ------------------------------------------------------------
function varargout = remtowns_Callback(h, eventdata, handles, varargin_id)
handles.townfile=[];
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
% Callback for update button
% ------------------------------------------------------------
function varargout = update_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.pushbutton1.
handles=update_listbox(h, eventdata, handles, varargin_id);
guidata(h,handles)
return
% ------------------------------------------------------------
% Update the variable list box
% ------------------------------------------------------------
function handles = update_listbox(h, eventdata, handles, varargin_id)
% Updates the listbox to show the printable variables
vname2=[];
index_selected=[];
hisfile=handles.hisfile;
ncid = oct_netcdf.open(hisfile, 'NC_NOWRITE');
Vars = var(ncid);
Varnames = [ncnames(Vars)];
nvar=length(Vars);
ndims=0*(1:nvar);
myindex=0;
lwrd=length(handles.vname);
for i=1:nvar
  vname=char(Varnames(i));
  myvar=ncid{vname};
  ndims(i)=length(dim(myvar));
  if ndims(i)>2
    if isempty(vname2)
      vname2=vname;
    end
    myindex=myindex+1;
    if length(vname)==lwrd
      if vname==handles.vname
        index_selected=myindex;
      end
    end
  end
end
if isempty(index_selected)
  disp([handles.vname,' not found...'])
  index_selected=1;
  handles.vname=vname2;
  if isempty(handles.vname)
    error('No variable with a least 2 dimensions found')
  end
end
handles.colmin=[];
handles.colmax=[];
set(handles.editcolmin,'String',num2str(handles.colmin))
set(handles.editcolmax,'String',num2str(handles.colmax))
handles.units=oct_netcdf.getAtt(ncid, oct_netcdf.inqVarID(ncid, handles.vname), 'units');
set(handles.editunits,'String',num2str(handles.units))
handles.longname=oct_netcdf.getAtt(ncid, oct_netcdf.inqVarID(ncid, handles.vname), 'long_name');
set(handles.editlongname,'String',num2str(handles.longname))
handles.coef=1;
set(handles.editcoef,'String',num2str(handles.coef))
set(handles.listvar,'String',Varnames(ndims>2));
set(handles.listvar,'Value',index_selected)
oct_netcdf.close(ncid);
if isempty(handles.gridfile)
  handles.gridfile=handles.hisfile;
end
ncid = oct_netcdf.open(handles.hisfile, 'NC_NOWRITE');
handles.N=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 's_rho'));
handles.T=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'time'));
if handles.T==0
  disp('Warning no time dimension found.. looking for time_counter')
  handles.T=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'time_counter'));
end
if handles.T==0
  disp('Warning no time dimension found.. looking for tclm_time')
  handles.T=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'tclm_time'));
end
if handles.T==0
  disp('Warning no time dimension found.. looking for ocean_time')
  handles.T=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'ocean_time'));
end
if handles.T==0
  error('Warning no time dimension found')
end
oct_netcdf.close(ncid);
ncid = oct_netcdf.open(handles.gridfile, 'NC_NOWRITE');
handles.L=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'xi_rho'));
handles.M=oct_netcdf.inqDimLen(ncid, oct_netcdf.inqDimID(ncid, 'eta_rho'));
handles.hmax=max(max((oct_netcdf.getVar(ncid, oct_netcdf.inqVarID(ncid, 'h')))));
lat=rempoints(readlat(ncid),handles.rempts);
lon=rempoints(readlon(ncid),handles.rempts);
handles.lonmin=min(min(lon));
handles.lonmax=max(max(lon));
handles.latmin=min(min(lat));   
handles.latmax=max(max(lat));
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
oct_netcdf.close(ncid);
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% Callback for variable listbox
% ------------------------------------------------------------
function varargout = listvar_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.listvar.
list_entries = get(handles.listvar,'String');
index_selected = get(handles.listvar,'Value');
if length(index_selected) ~= 1
	errordlg('You must select 1 variables','Incorrect Selection','modal')
else
  varname = list_entries{index_selected(1)};
  handles.vname=varname;
  handles.colmin=[];
  set(handles.editcolmin,'String',num2str(handles.colmin));
  handles.colmax=[];
  set(handles.editcolmax,'String',num2str(handles.colmax));
  ncid = oct_netcdf.open(handles.hisfile, 'NC_NOWRITE');
  handles.units=oct_netcdf.getAtt(ncid, oct_netcdf.inqVarID(ncid, handles.vname), 'units');
  set(handles.editunits,'String',num2str(handles.units))
  handles.longname=oct_netcdf.getAtt(ncid, oct_netcdf.inqVarID(ncid, handles.vname), 'long_name');
  set(handles.editlongname,'String',num2str(handles.longname))
  oct_netcdf.close(ncid);
  handles.coef=1;
  set(handles.editcoef,'String',num2str(handles.coef))
  if handles.plot==1
    inplot(h, eventdata, handles, varargin_id);
  else
    disp('Push ''PLOT'' button')
  end
  guidata(h,handles)
end 
return
% ------------------------------------------------------------
% Callback for derived variable listbox
% ------------------------------------------------------------
function varargout = listdvar_Callback(h, eventdata, handles, varargin_id)
list_entries = get(handles.listdvar,'String');
index_selected = get(handles.listdvar,'Value');
if length(index_selected) ~= 1
	errordlg('You must select 1 variables','Incorrect Selection','modal')
else
  varname = list_entries{index_selected(1)};
  if ~isempty(varname)
    handles.vname=varname;
    handles.colmin=[];
    set(handles.editcolmin,'String',num2str(handles.colmin));
    handles.colmax=[];
    set(handles.editcolmax,'String',num2str(handles.colmax));
    handles.units='';
    set(handles.editunits,'String',num2str(handles.units))
    handles.longname='';
    set(handles.editlongname,'String',num2str(handles.vname))
    handles.coef=1;
    set(handles.editcoef,'String',num2str(handles.coef))
    if handles.plot==1
      inplot(h, eventdata, handles, varargin_id);
    else
      disp('Push ''PLOT'' button')
    end
    guidata(h,handles)
  end 
end 
return
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
% vertical levels
% ------------------------------------------------------------
function varargout = upvlevel_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up vertical level'
if handles.vlevel < 0.
   handles.vlevel=handles.vlevel+100;
   if handles.vlevel >= 0.
     handles.vlevel=handles.N;
   end
else
   handles.vlevel=handles.vlevel + 1;
   if handles.vlevel >= handles.N
     handles.vlevel=handles.N;
   end
end
set(handles.editvlev,'String',num2str(handles.vlevel))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downvlevel_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down vertical level'
if handles.vlevel < 1
   handles.vlevel=handles.vlevel-100;
   if handles.vlevel <= -handles.hmax
     handles.vlevel=round(100-handles.hmax);
   end
else
   handles.vlevel=handles.vlevel - 1;
   if handles.vlevel < 1 
     handles.vlevel=handles.vlevel-100;
     if handles.vlevel <= 100-handles.hmax
       handles.vlevel=round(100-handles.hmax);
     end
   end
end
set(handles.editvlev,'String',num2str(handles.vlevel))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editvlev_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the vlevel text box
handles.vlevel = str2num(get(handles.editvlev,'String'));
if handles.vlevel >= handles.N
  handles.vlevel=handles.N;
  set(handles.editvlev,'String',num2str(handles.vlevel))
end
if handles.vlevel <= 100-handles.hmax
  handles.vlevel=round(100-handles.hmax);
  set(handles.editvlev,'String',num2str(handles.vlevel))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% end vertical levels
% ------------------------------------------------------------

% ------------------------------------------------------------
% plot style (pcolor, contourf, etc..)
% ------------------------------------------------------------
function varargout = pcolor_Callback(h, eventdata, handles, varargin_id)
handles.pltstyle=1;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = contourf_Callback(h, eventdata, handles, varargin_id)
handles.pltstyle=2;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = contour_Callback(h, eventdata, handles, varargin_id)
handles.pltstyle=3;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = graycontour_Callback(h, eventdata, handles, varargin_id)
handles.pltstyle=4;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = seawifs_Callback(h, eventdata, handles, varargin_id)
handles.pltstyle=5;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% end plotbutton style
% ------------------------------------------------------------

% ------------------------------------------------------------
% lon min
% ------------------------------------------------------------
function varargout = uplonmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up longitude minimum'
handles.lonmin=handles.lonmin + 1;
if handles.lonmin >= handles.lonmax
  handles.lonmin=handles.lonmax-0.01;
end
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downlonmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down longitude minimum'
handles.lonmin=handles.lonmin - 1;
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editlonmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the lonmin text box
handles.lonmin = str2num(get(handles.editlonmin,'String'));
if handles.lonmin >= handles.lonmax
  handles.lonmin=handles.lonmax-0.01;
  set(handles.editlonmin,'String',num2str(handles.lonmin))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end lon min
% ------------------------------------------------------------

% ------------------------------------------------------------
% lon max
% ------------------------------------------------------------
function varargout = uplonmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up longitude maximum'
handles.lonmax=handles.lonmax + 1;
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downlonmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down longitude maximum'
handles.lonmax=handles.lonmax - 1;
if handles.lonmax <= handles.lonmin
  handles.lonmax=handles.lonmin+0.01;
end
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editlonmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the lonmax text box
handles.lonmax = str2num(get(handles.editlonmax,'String'));
if handles.lonmax <= handles.lonmin
  handles.lonmax=handles.lonmax+0.01;
  set(handles.editlonmax,'String',num2str(handles.lonmax))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end lon max
% ------------------------------------------------------------

% ------------------------------------------------------------
% lat min
% ------------------------------------------------------------
function varargout = uplatmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up latitude minimum'
handles.latmin=handles.latmin + 1;
if handles.latmin >= handles.latmax
  handles.latmin=handles.latmax-0.01;
end
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downlatmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down latitude minimum'
handles.latmin=handles.latmin - 1;
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editlatmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the latmin text box
handles.latmin = str2num(get(handles.editlatmin,'String'));
if handles.latmin >= handles.latmax
  handles.latmin=handles.latmax-0.01;
  set(handles.editlatmin,'String',num2str(handles.latmin))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end lat min
% ------------------------------------------------------------

% ------------------------------------------------------------
% lat max
% ------------------------------------------------------------
function varargout = uplatmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up latitude maximum'
handles.latmax=handles.latmax + 1;
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downlatmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down latitude maximum'
handles.latmax=handles.latmax - 1;
if handles.latmax <= handles.latmin
  handles.latmax=handles.latmin+0.01;
end
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editlatmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the latmax text box
handles.latmax = str2num(get(handles.editlatmax,'String'));
if handles.latmax <= handles.latmin
  handles.latmax=handles.latmax+0.01;
  set(handles.editlatmax,'String',num2str(handles.latmax))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end lat max
% ------------------------------------------------------------
% ------------------------------------------------------------
%  zoom in
% ------------------------------------------------------------
function varargout = zoom_in_Callback(h, eventdata, handles, varargin_id)
handles.latmin=handles.latmin + 1;
handles.latmax=handles.latmax - 1;
handles.lonmin=handles.lonmin + 1;
handles.lonmax=handles.lonmax - 1;
if handles.lonmax <= handles.lonmin
  handles.lonmax=handles.lonmax+1;
  handles.lonmin=handles.lonmin-1;
end
if handles.latmax <= handles.latmin
  handles.latmax=handles.latmax+1;
  handles.latmin=handles.latmin-1;
end
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end zoom in
% ------------------------------------------------------------
% ------------------------------------------------------------
%  zoom out
% ------------------------------------------------------------
function varargout = zoom_out_Callback(h, eventdata, handles, varargin_id)
handles.latmin=handles.latmin - 1;
handles.latmax=handles.latmax + 1;
handles.lonmin=handles.lonmin - 1;
handles.lonmax=handles.lonmax + 1;
set(handles.editlatmin,'String',num2str(round(handles.latmin*10)/10))
set(handles.editlatmax,'String',num2str(round(handles.latmax*10)/10))
set(handles.editlonmin,'String',num2str(round(handles.lonmin*10)/10))
set(handles.editlonmax,'String',num2str(round(handles.lonmax*10)/10))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end zoom out
% ------------------------------------------------------------

% ------------------------------------------------------------
% tindex
% ------------------------------------------------------------
function varargout = uptindex_Callback(h, eventdata, handles, varargin_id)
handles.tindex=handles.tindex + 1;
if handles.tindex >= handles.T
  handles.tindex=handles.T;
end
set(handles.edittindex,'String',num2str(handles.tindex))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downtindex_Callback(h, eventdata, handles, varargin_id)
handles.tindex=handles.tindex - 1;
if handles.tindex <= 1
  handles.tindex=1;
end
set(handles.edittindex,'String',num2str(handles.tindex))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = edittindex_Callback(h, eventdata, handles, varargin_id)
handles.tindex = floor(str2num(get(handles.edittindex,'String')));
if handles.tindex <= 1
  handles.tindex=1;
  set(handles.edittindex,'String',num2str(handles.tindex))
end
if handles.tindex >= handles.T
  handles.tindex=handles.T;
  set(handles.edittindex,'String',num2str(handles.tindex))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end tindex
% ------------------------------------------------------------

% ------------------------------------------------------------
% cstep
% ------------------------------------------------------------
function varargout = upcstep_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up cstep'
handles.cstep=handles.cstep + 1;
set(handles.editcstep,'String',num2str(handles.cstep))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downcstep_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down cstep'
handles.cstep=handles.cstep - 1;
if handles.cstep < 0
  handles.cstep=-1;
end
set(handles.editcstep,'String',num2str(handles.cstep))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editcstep_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the cstep text box
handles.cstep = floor(str2num(get(handles.editcstep,'String')));
if handles.cstep < 0
  handles.cstep=-1;
  set(handles.editcstep,'String',num2str(handles.cstep))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end cstep
% ------------------------------------------------------------

% ------------------------------------------------------------
% cscale
% ------------------------------------------------------------
function varargout = slidercscale_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the cscale slider
handles.cscale = 100*get(handles.slidercscale,'Value');
set(handles.editcscale,'String',num2str(handles.cscale,3))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editcscale_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the cscale text box
handles.cscale = str2num(get(handles.editcscale,'String'));
if handles.cscale <= 1.e-6
  handles.cscale=1.e-6;
  set(handles.editcscale,'String',num2str(handles.cscale))
end
if handles.cscale >= 100
  handles.cscale=100;
  set(handles.editcscale,'String',num2str(handles.cscale))
end
set(handles.slidercscale,'Value',handles.cscale/100)
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% end cscale
% ------------------------------------------------------------

% ------------------------------------------------------------
% cunit
% ------------------------------------------------------------
function varargout = upcunit_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up cunit'
handles.cunit=handles.cunit + 0.01;
set(handles.editcunit,'String',num2str(handles.cunit))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downcunit_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down cunit'
handles.cunit=handles.cunit - 0.01;
if handles.cunit <= 0.01
  handles.cunit=0.01;
end
set(handles.editcunit,'String',num2str(handles.cunit))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editcunit_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the cunit text box
handles.cunit = str2num(get(handles.editcunit,'String'));

if handles.cunit < 0.01
  handles.cunit=0.01;
  set(handles.editcunit,'String',num2str(handles.cunit))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end cunit
% ------------------------------------------------------------

% ------------------------------------------------------------
% ncol
% ------------------------------------------------------------
function varargout = upncol_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'up ncol'
handles.ncol=handles.ncol + 1;
set(handles.editncol,'String',num2str(handles.ncol))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = downncol_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the pushbutton 'down ncol'
handles.ncol=handles.ncol - 1;
if handles.ncol <= 2
  handles.ncol=2;
end
set(handles.editncol,'String',num2str(handles.ncol))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editncol_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the ncol text box
handles.ncol = floor(str2num(get(handles.editncol,'String')));
if handles.ncol <= 2
  handles.ncol=2;
  set(handles.editncol,'String',num2str(handles.ncol))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end ncol
% ------------------------------------------------------------

% ------------------------------------------------------------
%  colmin
% ------------------------------------------------------------
function varargout = editcolmin_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the ncol text box
handles.colmin = str2num(get(handles.editcolmin,'String'));
if handles.colmin >= handles.colmax
  handles.colmin=handles.colmax-0.01;
  set(handles.editcolmin,'String',num2str(handles.colmin))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end colmin
% ------------------------------------------------------------

% ------------------------------------------------------------
%  colmax
% ------------------------------------------------------------
function varargout = editcolmax_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the ncol text box
handles.colmax = str2num(get(handles.editcolmax,'String'));
if handles.colmax <= handles.colmin
  handles.colmax=handles.colmin+0.01;
  set(handles.editcolmax,'String',num2str(handles.colmax))
end
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end colmax
% ------------------------------------------------------------

% ------------------------------------------------------------
%  resetcolors
% ------------------------------------------------------------
function varargout = resetcolors_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.pushbutton25.
handles.colmax = [];
handles.colmin = [];
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end resetcolors
% ------------------------------------------------------------

% ------------------------------------------------------------
%  boundary points
% ------------------------------------------------------------
function varargout = editnptsW_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.editnptsW.
handles.rempts(1)=floor(min([((handles.L-4)/2)  ...
                         abs(str2num(get(handles.editnptsW,'String')))]));
set(handles.editnptsW,'String',num2str(handles.rempts(1)))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editnptsE_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.editnptsE.
handles.rempts(2)=floor(min([((handles.L-4)/2)  ...
                         abs(str2num(get(handles.editnptsE,'String')))]));
set(handles.editnptsE,'String',num2str(handles.rempts(2)))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editnptsS_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.editnptsS.
handles.rempts(3)=floor(min([((handles.M-4)/2)  ...
                         abs(str2num(get(handles.editnptsS,'String')))]));
set(handles.editnptsS,'String',num2str(handles.rempts(3)))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
function varargout = editnptsN_Callback(h, eventdata, handles, varargin_id)
% Stub for Callback of the uicontrol handles.editnptsN.
handles.rempts(4)=floor(min([((handles.M-4)/2)  ...
                         abs(str2num(get(handles.editnptsN,'String')))]));
set(handles.editnptsN,'String',num2str(handles.rempts(4)))
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end boundary points
% ------------------------------------------------------------

% ------------------------------------------------------------
%  isobath
% ------------------------------------------------------------
function varargout = editisobath_Callback(h, eventdata, handles, varargin_id)
handles.isobath=get(handles.editisobath,'String');
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end isobath
% ------------------------------------------------------------

% ------------------------------------------------------------
%  coeff
% ------------------------------------------------------------
function varargout = editcoef_Callback(h, eventdata, handles, varargin_id)
handles.coef=str2num(get(handles.editcoef,'String'));
guidata(h,handles)
resetcolors_Callback(h, eventdata, handles, varargin_id);
return
% ------------------------------------------------------------
%  end coeff
% ------------------------------------------------------------

% ------------------------------------------------------------
%  Number of embedded levels
% ------------------------------------------------------------
function varargout = editnlev_Callback(h, eventdata, handles, varargin_id)
handles.gridlevs=str2num(get(handles.editnlev,'String'));
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
%  end number of embedded levels
% ------------------------------------------------------------

% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
%  Hold plot in the gui
% ------------------------------------------------------------
function holdplot_Callback(h, eventdata, handles, varargin_id)
handles.plot=0;
guidata(h,handles)
return
% ------------------------------------------------------------
%  Restore plot in the gui
% ------------------------------------------------------------
function plotbutton_Callback(h, eventdata, handles, varargin_id)
handles.plot=1;
guidata(h,handles)
inplot(h, eventdata, handles, varargin_id);
return
% ------------------------------------------------------------
%  Do a plotbutton in the GUI
% ------------------------------------------------------------
function varargout = inplot(h, eventdata, handles, varargin_id)
horizslice(handles.hisfile,handles.vname,handles.tindex,...
           handles.vlevel,handles.rempts,handles.coef,handles.gridlevs,...
	   handles.colmin,handles.colmax,handles.lonmin,handles.lonmax,...
           handles.latmin,handles.latmax,handles.ncol,...
           handles.pltstyle,handles.isobath,handles.cstep,...
           handles.cscale,handles.cunit,handles.coastfile,...
           handles.townfile,handles.gridfile,h,handles,...
	   handles.Yorig)
return
% ------------------------------------------------------------
%  Do a plotbutton outside of the GUI
% ------------------------------------------------------------
function varargout = outplot_Callback(h, eventdata, handles, varargin_id)
figure(1)
horizslice(handles.hisfile,handles.vname,handles.tindex,...
           handles.vlevel,handles.rempts,handles.coef,handles.gridlevs,...
	   handles.colmin,handles.colmax,handles.lonmin,handles.lonmax,...
           handles.latmin,handles.latmax,handles.ncol,...
           handles.pltstyle,handles.isobath,handles.cstep,...
           handles.cscale,handles.cunit,handles.coastfile,...
           handles.townfile,handles.gridfile,[],[],...
	   handles.Yorig)
return
% ------------------------------------------------------------
%  Print
% ------------------------------------------------------------
function varargout = print_Callback(h, eventdata, handles, varargin_id)
outplot_Callback(h, eventdata, handles, varargin_id)
[day,month,year,imonth,thedate]=...
get_date(handles.hisfile,handles.tindex,handles.Yorig);
if handles.vname(1)=='*'
  fname=[handles.vname(2:3),...
         num2str(day),month,num2str(year),...
         '_z',num2str(handles.vlevel),'.eps'];
else
  fname=[handles.vname,num2str(day),month,num2str(year),...
         '_z',num2str(handles.vlevel),'.eps'];
end
disp(['EPS file : ',fname])
eval(['print -painter -depsc2 ',fname])
return
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
% ------------------------------------------------------------
%    Animation
% ------------------------------------------------------------
% ------------------------------------------------------------
function varargout = animation_Callback(h, eventdata, handles, varargin_id)
oct_animation(handles)

return
function varargout = editskipanim_Callback(h, eventdata, handles, varargin_id)
handles.skipanim=floor(abs(str2num(get(handles.editskipanim,'String'))));
set(handles.editskipanim,'String',num2str(handles.skipanim))
guidata(h,handles)
return
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
% --------------------- SPECIAL PLOTS ------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
%    Vertical section
% ------------------------------------------------------------
function varargout = vsection_Callback(h, eventdata, handles, varargin_id)
[lon1,lat1,lon2,lat2]=get_mouse(handles);
figure(1)
vertslice(handles.hisfile,handles.gridfile,[lon1 lon2],[lat1 lat2],...
          handles.vname,handles.tindex,handles.coef,[],[],...
	  handles.ncol,[],[],[],[],handles.pltstyle,[],[],...
	  handles.Yorig)
return
% ------------------------------------------------------------
%    Hovmuller diagram
% ------------------------------------------------------------
function varargout = hovmull_Callback(h, eventdata, handles, varargin_id)
[lon1,lat1,lon2,lat2]=get_mouse(handles);
figure(1)
hovmuller(handles.hisfile,handles.gridfile,[lon1 lon2],[lat1 lat2],...
          handles.vname,[1:handles.T],handles.vlevel,handles.coef,...
          [],[],handles.ncol,[],[],[],[],handles.pltstyle)
return
% ------------------------------------------------------------
%    Time series
% ------------------------------------------------------------
function varargout = tseries_Callback(h, eventdata, handles, varargin_id)
[lon0,lat0]=get_mouse_1(handles);
figure(1)
time_series(handles.hisfile,handles.gridfile,lon0,lat0,...
            handles.vname,handles.vlevel,handles.coef)
return
% ------------------------------------------------------------
%    Vertical profile
% ------------------------------------------------------------
function varargout = vprofile_Callback(h, eventdata, handles, varargin_id)
[lon0,lat0]=get_mouse_1(handles);
figure(1)
vert_profile(handles.hisfile,handles.gridfile,lon0,lat0,...
             handles.vname,handles.tindex,handles.coef,...
	     handles.Yorig)
return
% ------------------------------------------------------------
%    View bathymetry
% ------------------------------------------------------------
function varargout = viewtopo_Callback(h, eventdata, handles, varargin_id)
handles.vname='h';
handles.vlevel=0;
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
return
% ------------------------------------------------------------
% ------------------------------------------------------------

% ------------------------------------------------------------
%  Year origin
% ------------------------------------------------------------
function edit_Yorig_Callback(h, eventdata, handles, varargin_id)
handles.Yorig=str2num(get(handles.edit_Yorig,'String'));
if handles.plot==1
  inplot(h, eventdata, handles, varargin_id);
else
  disp('Push ''PLOT'' button')
end
guidata(h,handles)
% ------------------------------------------------------------
% ------------------------------------------------------------



% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
% ---------------------------   fin   ------------------------
% ------------------------------------------------------------
% ------------------------------------------------------------
