function NLIN_MFDFAFigure

% створюємо глобальну змінну TS, куди будуть записуватись дані
global TS; TS.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','MultiFractal DFA research', ...
          'Resize','off', 'Tag','MFDFA 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);
      
% створюємо статичний текст та едіт для початкової ширини вікна
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,450,225,25], ...
          'String','Начальная ширина сегмента:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.windowWidthBeginEdit=uicontrol(fg, 'Style','edit', 'Tag','windowWidthBeginEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,450,72,25], ...
          'String','10', 'FontName','Courier New', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

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

% створюємо статичний текст та едіт для введення степенів розрахунку
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,400,297,25], ...
          'String','Степени q для расчета DFA:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.POWERSEdit=uicontrol(fg, 'Style','edit', 'Tag','POWERSEdit', 'BackgroundColor',[1.0 1.0 1.0], ...
          'Units','pixels', 'Position',[3,375,297,25], 'String','-3:0.1:3', ...
          'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

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

% створюємо статичний текст та кнопку для введення виду збільшення вікна
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,325,225,25], ...
          'String','Тип увеличения окна:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.kindOfElevatePushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','kindOfElevateButton', ...
          'Units','pixels', 'Position',[228,325,72,25], 'String','nRATIO', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@kindOfElevateButton_Callback);

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

% створюємо checkbox та edit для введення розглядуваної амплітуди значення f(alpha)
handles.percFunctionCheckBox=uicontrol(fg,'Style','checkbox','Tag','percFunctionCheckBox','Units','pixels', ...
          'Position',[3,275,225,25], 'String','Процент значения функции:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal',...
          'Value',1);
handles.percFunctionEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'percFunctionEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,275,72,25], ...
          'String','90', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку статичного MFDFA
handles.calcMFDFAPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcMFDFAButton', ...
          'Units','pixels', 'Position',[75,250,150,25], 'String','Рассчитать MFDFA', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcMFDFAButton_Callback);

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

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

% створюємо кнопку для введення виду переміщення вікна
handles.kindOfMovingWindowPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','kindOfMovingWindowPushbutton', ...
          'Units','pixels', 'Position',[75,150,150,25], 'String','Перемещение окна', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Max', 1, 'Min', 0, 'Value', 0, 'Callback',@kindOfMovingWindow_Callback);

% створюємо кнопку для розрахунку динамічного MFDFA
handles.calcDynamicMFDFAPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcDynamicMFDFAButton', ...
          'Units','pixels', 'Position',[65,115,170,25], 'String','Динамический MFDFA', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcDynamicMFDFAButton_Callback);

guidata(fg,handles);

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

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

% =============================================================================================================================
% якщо клацнули по кнопці "Тип увеличения окна"
function kindOfElevateButton_Callback(h,eventdata,handles)

handles=guidata(gcbo);
if (CmpStr(get(handles.kindOfElevatePushbutton,'String'),'STEP')==0)
    set(handles.kindOfElevatePushbutton,'String','RATIO');
    set(handles.valueOfElevateText,'String','Коэфф. увеличения окна');
    set(handles.valueOfElevateEdit,'String','1.1');
elseif (CmpStr(get(handles.kindOfElevatePushbutton,'String'),'RATIO')==0)
    set(handles.kindOfElevatePushbutton,'String','nSTEP');
    set(handles.valueOfElevateText,'String','Кол-во окон при шаге');
    set(handles.valueOfElevateEdit,'String','100');
elseif (CmpStr(get(handles.kindOfElevatePushbutton,'String'),'nSTEP')==0)
    set(handles.kindOfElevatePushbutton,'String','nRATIO');
    set(handles.valueOfElevateText,'String','Кол-во окон при коэфф.');
    set(handles.valueOfElevateEdit,'String','100');
else
    set(handles.kindOfElevatePushbutton,'String','STEP');
    set(handles.valueOfElevateText,'String','Шаг увеличения окна');
    set(handles.valueOfElevateEdit,'String','10');
end

% =============================================================================================================================
% якщо клацнули по кнопці "Перемещение окна"
function kindOfMovingWindow_Callback(h,eventdata,handles)

handles=guidata(gcbo);
if (CmpStr(get(handles.kindOfMovingWindowPushbutton,'String'),'Перемещение окна')==0)
    set(handles.kindOfMovingWindowPushbutton,'String','Увеличение окна');
    set(handles.windowMovingText,'String','Шаг увеличения окна');
else
    set(handles.kindOfMovingWindowPushbutton,'String','Перемещение окна');
    set(handles.windowMovingText,'String','Шаг перемещения окна');
end

% =============================================================================================================================
% при натисненні на кнопку "Рассчитать MFDFA"
function calcMFDFAButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;
windowWidthBegin=str2num(get(handles.windowWidthBeginEdit,'String'));
windowWidthEnd=str2num(get(handles.windowWidthEndEdit,'String'));
POWERS=String2Array(get(handles.POWERSEdit,'String'));
% визначаємо, чи є нулі в ряді степенів
% якщо є - викидаємо їх
[m,n]=size(POWERS);
index=1;
while (index<=n)
    if (POWERS(1,index)==0)
        if (index==1) POWERS=POWERS(1,2:n); n=n-1;
        elseif (index==n) POWERS=POWERS(1,1:n-1); n=n-1;
        else POWERS=[POWERS(1,1:index-1) POWERS(1,index+1:n)]; n=n-1;
        end
    else index=index+1;
    end
end
    
ORDER=str2num(get(handles.ORDEREdit,'String'));
kindOfElevate=get(handles.kindOfElevatePushbutton,'String');
valueOfElevate=get(handles.valueOfElevateEdit,'String');
percFunction=get(handles.percFunctionCheckBox,'Value');
if (percFunction==1)
    percFunction=get(handles.percFunctionEdit,'String');
else
    percFunction='0';
end

calculateMFDFA(X,windowWidthBegin,windowWidthEnd,POWERS,ORDER,kindOfElevate,valueOfElevate,percFunction);

% очищуємо локальні змінні
clear index X windowWidthBegin windowWidthEnd POWERS m n index ORDER kindOfElevate valueOfElevate;

% =============================================================================================================================
% при натисненні на кнопку "Динамический MFDFA"
function calcDynamicMFDFAButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;
windowWidthBegin=str2num(get(handles.windowWidthBeginEdit,'String'));
windowWidthEnd=str2num(get(handles.windowWidthEndEdit,'String'));
POWERS=String2Array(get(handles.POWERSEdit,'String'));
% визначаємо, чи є нулі в ряді степенів
% якщо є - викидаємо їх
[m,n]=size(POWERS);
index=1;
while (index<=n)
    if (POWERS(1,index)==0)
        if (index==1) POWERS=POWERS(1,2:n); n=n-1;
        elseif (index==n) POWERS=POWERS(1,1:n-1); n=n-1;
        else POWERS=[POWERS(1,1:index-1) POWERS(1,index+1:n)]; n=n-1;
        end
    else index=index+1;
    end
end
    
ORDER=str2num(get(handles.ORDEREdit,'String'));
kindOfElevate=get(handles.kindOfElevatePushbutton,'String');
valueOfElevate=get(handles.valueOfElevateEdit,'String');

if (CmpStr(get(handles.kindOfMovingWindowPushbutton,'String'),'Перемещение окна')==0)
    kindOfMovingWindow=0;
else
    kindOfMovingWindow=1;
end
beginWidthMovingWindow=str2num(get(handles.beginWidthMovingWindowEdit,'String'));
windowMovingStep=str2num(get(handles.windowMovingEdit,'String'));

percFunction=get(handles.percFunctionCheckBox,'Value');
if (percFunction==1)
    percFunction=get(handles.percFunctionEdit,'String');
else
    percFunction='0';
end

calculateDynamicMFDFA(X,windowWidthBegin,windowWidthEnd,POWERS,ORDER,kindOfElevate,valueOfElevate, ...
                      kindOfMovingWindow,beginWidthMovingWindow,windowMovingStep,percFunction);

% очищуємо локальні змінні
clear index X windowWidthBegin windowWidthEnd POWERS m n index ORDER kindOfElevate valueOfElevate percFunction;

% =============================================================================================================================
% вибір пункту меню "Прочитати файл"
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