function error = headerForm(hTsgGUI)
%
% Input
% -----
% hTsgGUI ............ Handel to the main user interface
%
% Output
% ------
% error .............. 1: OK ; -1 : an error occured

% $Id$

error = -1;

% Get the data from the application GUI
% -------------------------------------
tsg = getappdata( hTsgGUI, 'tsg_data');

% Define uicontrol start position
% -------------------------------
left   = .01;
bottom = .95;
inc_x  =  0.5;
inc_y  =  0.03;

% set default uicontrol size
% --------------------------
default_height = 0.018;
default_length = .1;

% get actual date
% ---------------
date = datestr(now,30);

% Get global attributes list from class tsg_nc with file 'tsg_ncattr.csv'
% -----------------------------------------------------------------------
nca      = tsg_nc('tsg_ncattr.csv');
nca_keys = keys(nca);


% header Uicontrols in a new figure
% ---------------------------------
hHeaderFig = figure(...
   'BackingStore','off',...
  'Name', 'TSG GLOBAL ATTRIBUTES', ...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Menubar','none', ...
  'Toolbar', 'none', ...
  'Tag', 'GLOBAL_ATTRIBUTES', ...
  'Visible','on',...
  'Units', 'normalized',...
  'Position',get(hTsgGUI,'Position'), ...
  'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

% bg = [0.92549 0.913725 0.847059] = get( 0, 'DefaultUIControlBackgroundColor' );

% Display fields from class
% -------------------------
for i=1:numel(nca_keys)
  
  % get key, use {} for cell
  % ------------------------
  key = nca_keys{i};
  
  % get all structure for the key
  % -----------------------------
  s = get(nca, key);
  
  % set tsg.DATE_UPDATE
  % -------------------
  if strcmp(key, 'DATE_UPDATE')
    tsg.(key) = [date(1:8) date(10:15)];
  end
  
  % check for empty field and replace them by default value
  % -------------------------------------------------------
  if isempty(s.length), s.length = default_length; end;
  if isempty(s.height), s.height = default_height; end;
      
  % display dynamically uicontrol text
  % use of char function to prevent error when field is empty [] => ''
  % ------------------------------------------------------------------
  uicontrol(...
    'Parent', hHeaderFig, ...
    'Units', 'normalized', ...
    'Style', 'Text', ...
    'Fontsize', 10, ...
    'HorizontalAlignment', 'left', ...
    'Position',[left, bottom, .12, .0135], ...
    'TooltipString', char(s.comment), ...
    'String', char(s.name) );
  
  % display dynamically uicontrol 
  % -----------------------------
  ui = uicontrol(...
    'Parent', hHeaderFig, ...
    'Units', 'normalized', ...
    'BackgroundColor', 'w', ...
    'Style', char(s.uicontrolType), ...
    'Fontsize', 8, ...
    'HorizontalAlignment', char(s.horizontalAlignment), ...
    'Position',[left+.11, bottom, s.length, s.height], ...
    'String', char(s.string), ...
    'Value', s.value, ...
    'Tag', key);
  
  % display conventions field if exist 
  % ----------------------------------
  uicontrol(...
    'Parent', hHeaderFig, ...
    'Units', 'normalized', ...
    'Style', 'text', ...
    'Fontsize', 10, ...
    'HorizontalAlignment', 'left', ...
    'Position',[left+.22, bottom, .1, s.height], ...
    'String', char(s.conventions) );
  
  % set dynamically uicontrol from tsg struct
  % -----------------------------------------
  switch s.uicontrolType
    case 'popupmenu'
      str = cellstr(get(ui,'String'));
      ind = strfind(str,tsg.(key));
      for k=1:numel(ind)
        if ~isempty(ind{k})
          set(ui, 'value', k);
        end
      end
    case 'edit'
      set(ui, 'string', tsg.(key));
    case 'checkbox'
      % not yet implemented !!!
  end
  
  % Check vertical position of last uicontrol and creation new colomn
  % -----------------------------------------------------------------
  bottom = bottom - inc_y;
  if bottom < .15
    bottom = 0.95;
    left = left + inc_x;
  end  
end


% CONTINUE PUSH BUTTON
% --------------------
% The Continue (valid)  button
uicontrol( ...
  'Parent', hHeaderFig, ...
  'Style','pushbutton',...
  'Units', 'normalized', ...
  'Position',[.05, .1, .05, .02],...
  'String','Continue',...
  'Interruptible','off',...
  'BusyAction','cancel',...
  'Tag','PUSH_BUTTON',...
  'Callback', @continueCallback);

% CANCEL PUSH BUTTON
% ------------------
% The cancel  button
uicontrol( ...
  'Parent', hHeaderFig, ...
  'Style','pushbutton',...
  'Units', 'normalized', ...
  'Position',[.15, .1, .05, .02],...
  'String','Cancel',...
  'Interruptible','off',...
  'BusyAction','cancel',...
  'Tag','PUSH_BUTTON',...
  'Callback', @cancelCallback);

% Build structure container for graphic handles with tag property defined.
% ------------------------------------------------------------------------
data = guihandles(hHeaderFig);

% record data struct in application data object 
% ---------------------------------------------
%guidata(hHeaderFig, data);

% stop execution until push-button Continue was press
% ---------------------------------------------------
uiwait(hHeaderFig);

%% Nested callback
  % -----------------------------------------------------------------------
  function continueCallback(obj, event)
    
    % get uicontrol fields and populate tsg structure
    % ------------------------------------------------
    % for text only
    % -------------
    tsg.PLATFORM_NAME     = get(data.PLATFORM_NAME, 'string');
    tsg.SHIP_CALL_SIGN    = get(data.SHIP_CALL_SIGN, 'string');
    tsg.SHIP_MMSI         = get(data.SHIP_MMSI, 'string');
    tsg.TSG_TYPE          = get(data.TSG_TYPE, 'string');
    tsg.TSG_NUMBER        = get(data.TSG_NUMBER, 'string');
    tsg.TINT_TYPE         = get(data.TINT_TYPE, 'string');
    tsg.TINT_NUMBER       = get(data.TINT_NUMBER, 'string');
    tsg.DATA_TYPE         = get(data.DATA_TYPE, 'string');
    tsg.DATA_MODE         = get(data.DATA_MODE, 'string');
    tsg.SAMPLING_PERIOD   = get(data.SAMPLING_PERIOD, 'string');
    tsg.PROCESSING_STATUS = get(data.PROCESSING_STATUS, 'string');
    tsg.DATE_START        = get(data.DATE_START, 'string');
    tsg.DATE_END          = get(data.DATE_END, 'string');
    tsg.SOUTH_LATX        = get(data.SOUTH_LATX, 'string');
    tsg.NORTH_LATX        = get(data.NORTH_LATX, 'string');
    tsg.WEST_LONX         = get(data.WEST_LONX, 'string');
    tsg.EAST_LONX         = get(data.EAST_LONX, 'string');
    tsg.FORMAT_VERSION    = get(data.FORMAT_VERSION, 'string');
    tsg.DATE_CREATION     = get(data.DATE_CREATION, 'string');
    tsg.DATE_UPDATE       = get(data.DATE_UPDATE, 'string');
    tsg.DATA_RESTRICTIONS = get(data.DATA_RESTRICTIONS, 'string');
    tsg.COMMENT           = get(data.COMMENT, 'string');
    tsg.PROJECT_NAME      = get(data.PROJECT_NAME, 'string');
    tsg.PI_NAME           = get(data.PI_NAME, 'string');
    tsg.DATA_CENTRE       = get(data.DATA_CENTRE, 'string');
    tsg.DATA_ACQUISITION  = get(data.DATA_ACQUISITION, 'string');
    tsg.PROCESSING_CENTRE = get(data.PROCESSING_CENTRE, 'string');
    tsg.PROCESSING_STATES = get(data.PROCESSING_STATES, 'string');
    
    % for popupmenu only, deblank remove all trailling whitespace char
    % ----------------------------------------------------------------
    tsg.TSG_TYPE          = deblank(tsg.TSG_TYPE(get(data.TSG_TYPE, 'value'),:));
    tsg.TINT_TYPE         = deblank(tsg.TINT_TYPE(get(data.TINT_TYPE, 'value'),:));
    tsg.DATA_MODE         = deblank(tsg.DATA_MODE(get(data.DATA_MODE, 'value'),:));
    tsg.PI_NAME           = deblank(tsg.PI_NAME(get(data.PI_NAME, 'value'),:));
    tsg.DATA_ACQUISITION  = deblank(tsg.DATA_ACQUISITION(get(data.DATA_ACQUISITION, 'value'),:));
    tsg.PROCESSING_CENTRE = deblank(tsg.PROCESSING_CENTRE(get(data.PROCESSING_CENTRE, 'value'),:));
    tsg.PROCESSING_STATES = deblank(tsg.PROCESSING_STATES(get(data.PROCESSING_STATES, 'value'),:));
    
    % Save tsg structure 
    % ------------------
    setappdata( hTsgGUI, 'tsg_data', tsg);
 
    % close windows (replace call to uiresume(hHeaderFig))
    % ----------------------------------------------------
    close(hHeaderFig);
    
    % flushes the event queue and updates the figure window
    % -----------------------------------------------------
    drawnow;
    
    % return no error code (true)
    % ---------------------------
    error = 1;
  end

  % -----------------------------------------------------------------------
  function cancelCallback(obj, event)
    
    % close windows
    % -------------
    close(hHeaderFig);
    
    % flushes the event queue and updates the figure window
    % -----------------------------------------------------
    drawnow;
    
    % return error code (no change)
    % -----------------------------
    error = -1;
  end

end

