function [MatFACT,PM_matlab,PM,koraci_podizanja,PM_reconstruct] = lifting(wavelet)

[F0,F1,H0,H1] = wave2lp(wavelet);

%==========================================================================
%%                       Matlab rjesenje za faktorizaciju
%==========================================================================

[MatFACT,PM_matlab] = ppmfact(H0,H1);

% ls = liftwave(wavelet);
% [F0,F1,H0,H1] = ls2filt(ls)
% MatFACT = {}
% for i = 1:size(ls,1)
%     if strcmp(ls(i,1),'p')
%         MatFACT{i} = laurmat({1 laurpoly(ls{i,2},ls{i,3});0 1})
%     elseif strcmp(ls(i,1),'d')
%         MatFACT{i} = laurmat({1 0;laurpoly(ls{i,2},ls{i,3}) 1})
%     end;
% end;

%==========================================================================
%%                       Nase rjesenje za faktorizaciju
%==========================================================================

% filtri polifazne matrice
H00 = even(H0);
H01 = odd(H0);
H10 = even(H1);
H11 = odd(H1);

% polifazna matrica PM
PM = laurmat({H00,H01;H10,H11});

PM_matlab = PM';

% Matlab radi sa transponiranom polifaznom matricom, ako zelimo
% usporedivati rezultate nase i Matlabove faktorizacije potrebno je
% transponirati polifaznu matricu:

% % polifazna matrica PM
% PM = PM';

%% Euklidski algoritam

%Inicijalizacija za potrebe petlje
ki = 1;
koraci_podizanja = {};
R = 1;

while R ~= 0 

    % Odredivanje tipa faktorizacije
    if (degree(H00)-degree(H10)) > 0
        k = 'primal';
    else
        k = 'dual';
    end;

    if strcmp(k,'primal')
        A = H00;
        B = H10;
    elseif strcmp(k,'dual')
        A = H10;
        B = H00;
    end;

    % Dijeljenje dva Laurentova polinoma
    DM = euclidediv(A,B);

    % Ispis svih rezultata dijeljenja Q i R (ako ih ima vise od jednog) i odabir
    if size(DM,1) > 1
        for i = 1:size(DM,1)
            disp(sprintf('\n'));
            disp(sprintf('%d.rezultat dijeljenja:',i));
            disp(sprintf(strcat('Q:',lpstr(DM{i,1}),'   R:',lpstr(DM{i,2}))));
        end;
        disp(sprintf('\n'));
        odabir = input('Potrebno je odabrati jedan od ponudjenih rezultata dijeljenja: ');
    else
        odabir = 1;
    end;
    Q = DM{odabir,1};
    R = DM{odabir,2};

    % Nova filtri polifazne matrice i korak podizanja
    if strcmp(k,'primal')
        korak_podizanja = laurmat({1 Q;0 1});
        H01 = H01 - Q*H11;
        H00 = H00 - Q*H10;
    elseif strcmp(k,'dual')
        korak_podizanja = laurmat({1 0;Q 1});
        H11 = H11 - Q*H01;
        H10 = H10 - Q*H00;
    end;

    % Nova polifazna matrica i spremanje koraka podizanja
    PMnew = laurmat({H00 H01;H10 H11});
    koraci_podizanja{ki} = korak_podizanja;
    ki = ki + 1;

    % Zavrsni korak skaliranja nakon sto je zavrsena faktorizacija (R = 0) 
    % Ako je matrica gornje trokutasta
    if PMnew(2,1) == 0
        H01 = euclidediv(H01,H11);
        H01 = H01{1,1};
        H00 = 1;
        H11 = 1;
        H10 = 0;
        korak_podizanja = laurmat({H00 H01;H10 H11});
        koraci_podizanja{ki} = korak_podizanja;
        ki = ki + 1;
        korak_skaliranja = PMnew;
        korak_skaliranja(1,2) = 0;
        koraci_podizanja{ki} = korak_skaliranja;
    end;
    % Ako je matrica donje trokutasta
    if PMnew(1,1) == 0
        H10 = euclidediv(H11,H01);
        H10 = H10{1,1};
        H00 = 1;
        H11 = 1;
        H01 = 0;
        korak_podizanja = laurmat({H00 H01;H10 H11});
        koraci_podizanja{ki} = korak_podizanja;
        ki = ki + 1;
        korak_skaliranja = PMnew;
        korak_skaliranja(2,2) = 0;
        koraci_podizanja{ki} = korak_skaliranja;
    end; 
end;

PM_reconstruct = laurmat({1,0;0,1});
for i = 1:ki
	PM_reconstruct = PM_reconstruct * koraci_podizanja{i};
end;
