function NLIN_WForecastFigure

% створюємо глобальну змінну TS, куди будуть записуватись дані
global TS; TS.index=0;
global TSCut; TSCut.index=0;
global TSTemp; TSTemp.index=0;

% визначаємо поточну розподільчу здатність, встановивши одиниці в PIXELS
set(0,'Units','pixels');
SCREEN_SIZE=get(0,'ScreenSize');
% SCREEN_SIZE = [left bottom width height]
SCRHeight=SCREEN_SIZE(1,4);

% створюємо фігуру розміром 100 x 600, що знаходиться у верхному лівому
% куті з відсутпом у 10 пікселів зверху та зліва
fg=figure('Position',[10,SCRHeight-630,300,600], 'Units','pixels', ...
          'HandleVisibility','on', 'MenuBar','none', 'Name','Прогнозування', ...
          'Resize','off', 'Tag','Oscillation prognosys set properties figure', ...
          'NumberTitle','off', 'DeleteFcn',@DeleteFcn_Callback);
      
% записуємо handle фігури
handles.rootFigure=fg;

% створюємо меню користувача
menuRoot=uimenu('Parent',fg, 'Label','Файл', 'Tag', 'Menu File');
menuTemp=uimenu('Parent',menuRoot, 'Label','Читати', 'Tag','Menu File Load', 'Callback',@MenuFileLoad_Callback);
      
% створюємо статичний текст 
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,575,297,25], ...
          'String','Ряди:', 'FontName','Times New Roman', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо ListBox
handles.ListBoxTS=uicontrol(fg, 'Style','listbox', 'Units','pixels', 'Position',[3,475,297,100], ...
          'String','', 'FontName','Times New Roman', ...
          'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Tag', 'ListBoxTS', 'ListboxTop', 5);

% ==================================================================================================
% створюємо статичний текст та edit для введення значення початкового масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,425,225,25], ...
          'String','Початковий масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.beginScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'beginScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,425,72,25], ...
          'String','1', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кінцевого масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,400,225,25], ...
          'String','Кінцевий масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.endScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'endScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,400,72,25], ...
          'String','250', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кількості масштабів у вікні
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,375,225,25], ...
          'String','Кількість масштабів:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.scalesEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'scalesEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,375,72,25], ...
          'String','10', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку масштабової ентропії
handles.calcScalesWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcScalesWEButton', ...
          'Units','pixels', 'Position',[65,350,170,25], 'String','Розрахувати MWE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcScalesWEButton_Callback);

% ==================================================================================================
% створюємо статичний текст та edit для введення значення початкового масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,300,225,25], ...
          'String','Початковий масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.sScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'sScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,300,72,25], ...
          'String','0', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кінцевого масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,275,225,25], ...
          'String','Кінцевий масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.eScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'eScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,275,72,25], ...
          'String','0', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку ентропії
handles.calcWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcWEButton', ...
          'Units','pixels', 'Position',[65,250,170,25], 'String','Розрахувати WE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcWEButton_Callback);

% ==================================================================================================
% кнопка вирізання ряду
handles.cutPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','cutButton', ...
          'Units','pixels', 'Position',[65,225,170,25], 'String','Вирізати ряд', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@cutButton_Callback);

% ==================================================================================================
% створюємо статичний текст 
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,175,297,25], ...
          'String','Вирізані ряди:', 'FontName','Times New Roman', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо ListBox
handles.ListBoxCuttedTS=uicontrol(fg, 'Style','listbox', 'Units','pixels', 'Position',[3,75,297,100], ...
          'String','', 'FontName','Times New Roman', ...
          'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Tag', 'ListBoxCuttedTS', 'ListboxTop', 5);

% ==================================================================================================
% кнопка прогнозування
handles.forecastPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','forecastButton', ...
          'Units','pixels', 'Position',[65,25,170,25], 'String','Прогнозування', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@forecastButton_Callback);

guidata(fg,handles);

% =============================================================================================================================
% Функція, що виконується при закритті фігури
function DeleteFcn_Callback(h,eventdata,handles)

% очищення пам"яті, що використовувалась для локальних змінних
clear global

% =============================================================================================================================
% вибір пункту меню "Прочитати файл"
function MenuFileLoad_Callback(h,eventdata,handles)

% читаємо ім"я файла
[FILENAME,PATHNAME,FILTERINDEX]=uigetfile( ...
    {'*.txt;*.dat;*.ts', 'Файлы с данными (*.txt, *.dat, *.ts)'; ...
     '*.ts',             'Файлы с временными рядами (*.ts)'; ...
     '*.txt',            'Текстовые файлы (*.txt)'; ...
     '*.dat',            'Текстовый файлы с данными (*.dat)'}, ...
     'Выберите файл с временным рядом');

if ((FILENAME(1,1)~=0) & (PATHNAME(1,1)~=0))
    % читаємо дані з вибраного файла
    [NAMES,DATAS,DATES]=loadTS(PATHNAME,FILENAME);

    global TSTemp;
    
    % повідомляємо про прочитаний файл
    TSTemp.index=TSTemp.index+1;
    TSTemp.data{TSTemp.index}.datas=DATAS;
    TSTemp.data{TSTemp.index}.names=NAMES;
    TSTemp.data{TSTemp.index}.dates=DATES;
    
    % отримуємо handle ListBox
    handles=guidata(gcbo);
    ListBoxTS=handles.ListBoxTS;
    STRINGS=get(ListBoxTS,'String');
    STRINGS=appendString(STRINGS,FILENAME);
    set(ListBoxTS,'String',STRINGS);
end

% =============================================================================================================================
% при натисненні на кнопку "Розрахувати MWE"
function calcScalesWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=3; % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=1; % 1 - Scales, 2 - Points

scaleBegin=str2num(get(handles.beginScaleEdit,'String'));
scaleEnd=str2num(get(handles.endScaleEdit,'String'));
scalesCount=str2num(get(handles.scalesEdit,'String'));

[SWT,POWER,Pj]=waventropy_scales(X,ttType,teType,scaleBegin,scaleEnd,scalesCount,1);

% очищуємо локальні змінні
clear index X ttType teType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Розрахувати WE"
function calcWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=3;    % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=1;    % 1 - Scales, 2 - Points

tsScale=str2num(get(handles.sScaleEdit,'String'));
teScale=str2num(get(handles.eScaleEdit,'String'));

[SWT,POWER,Pj]=waventropy(X,ttType,teType,0,tsScale,teScale);

[m,n]=size(POWER);
if ((tsScale<1) || (tsScale>m))
    sScale=1;
else
    sScale=tsScale;
end
if ((teScale<1) || (teScale>m))
    eScale=m;
else
    eScale=teScale;
end
SCALE=sScale:eScale;

Y=X; %X=[1:n];
title_add1='Relative wavelet energy method';
title_add2='DWT_c_s';
%figure; mesh(X,SCALE,POWER); title(['Power of C (' title_add2 ')']);
handles.cutFigure=figure;
handles.cutFigureSubPlot=subplot(2,1,1); plot(Pj); title([title_add1 ' (' title_add2 ')']);
                         subplot(2,1,2); plot(Y); title('Source TS');
%figure; plot(Pj); title([title_add1 ' (' title_add2 ')']);

guidata(handles.rootFigure,handles);

% очищуємо локальні змінні
clear index X ttType teType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Вирізати ряд"
function cutButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

figure(handles.cutFigure);
[mouseX,mouseY]=ginput(2);

CH=get(handles.cutFigureSubPlot,'Children');
X=get(CH,'XData');
Y=get(CH,'YData');

[m,n]=size(X);
iBegin=1;
while (X(iBegin)<=mouseX(1))
    iBegin=iBegin+1;
end
iEnd=iBegin;
while (X(iEnd)<mouseX(2))
    iEnd=iEnd+1;
end

X=X(iBegin:iEnd);
Y=Y(iBegin:iEnd);

global TSCut;
    
% повідомляємо про отриманий ряд
TSCut.index=TSCut.index+1;
TSCut.data{TSCut.index}.X=X;
TSCut.data{TSCut.index}.Y=Y;
    
% отримуємо handle ListBox
ListBoxCuttedTS=handles.ListBoxCuttedTS;
STRINGS=get(ListBoxCuttedTS,'String');
TEXT=[num2str(get(handles.ListBoxTS,'Value')) ':' num2str(iBegin) '-' num2str(iEnd)];
STRINGS=appendString(STRINGS,TEXT);
set(ListBoxCuttedTS,'String',STRINGS);

% очищуємо локальні змінні
clear handles mouseX mouseY CH X Y m n iBegin iEnd STRINGS TEXT;

% =============================================================================================================================
% при натисненні на кнопку "Прогнозування"
function forecastButton_Callback(h,eventdata,handles)

handles=guidata(gcbo);

global TSCut;
TSCut.currentIndex=get(handles.ListBoxCuttedTS,'Value');

NLIN_OscillationsFigure;
