function PPmod(action)

%global line_handles
global select_point


switch action


case 'create'

  delete(findobj(gcbf,'Tag','P'))
	set(findobj(gcbf,'Tag','Pushbutton4'),'TooltipString','Uniform mesh')
set(findobj(gcbf,'Tag','Pushbutton5'),'TooltipString','Refine mesh')
set(findobj(gcbf,'Tag','mod_type'),'TooltipString','Redefine mesh')

  c=get(findobj(gcbf,'Tag','continuity'),'Value');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  ni=ceil(20*get(findobj(gcbf,'Tag','ni'),'Value'));
  set(findobj(gcbf,'Tag','ni'),'Userdata',ni)
  h=1/ni;
    if isempty(get(findobj(gcbf,'Tag','my_fcn'),'String'))     
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function first')
       disp('Define a function now')
    else
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Interpolate')
       disp('Interpolate')
    end
  for i=1:ni

    if d==1                   % p.w. constant
      XData=[(i-1)*h i*h];
      Y1=rand(1);
      if c==2&i>1             % continuous
        Y1=YData(length(YData));
      end
      YData=[Y1 Y1];
    end

    if d==2                   % p.w. linear
      XData=[(i-1)*h i*h];
      Y1=rand(1);
      Y2=rand(1);
      if c==2&i>1             % continuous
        Y1=YData(length(YData));
      end
      YData=[Y1 Y2];
    end

    if d==3                   % p.w. quadratic
      XData=(i-1)*h:h/10:i*h;
      Y1=rand(1);
      Y2=rand(1);
      Y3=rand(1);
      if c==2&i>1             % continuous
        Y1=YData(length(YData));
      end
      x=0:.1:1;
      YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
    end

    line_handles(2*i)=line(XData,YData,'Tag','P');
    line_handles(2*i-1)=line(XData,0*YData,'Color','g','Tag','P');
   
  end

  line_handles(2*ni+1)=line([0 0],[0 0],'Color','w');
  line_handles(2*ni+2)=line([0 0],[0 0],'Color','w');

  set(findobj(gcbf,'Tag','create'),'Userdata',line_handles)

%  xlabel('x')

case 'start'
	xmax=get(gca,'Xlim');
   select_point = get(gca, 'CurrentPoint');
   if select_point(1)<xmax(1) | select_point(1)>xmax(2)
      break
   end
   
  mod_type=get(findobj(gcbf,'Tag','mod_type'),'Value');
  if isempty(findobj(gcbf,'Tag','P'))     
            disp('Create a mesh first')
       break
        end

  if mod_type==1
    set(gcbf, 'WindowButtonMotionFcn',...
              'PPmod(''change_PP_values'')');
  elseif mod_type==2
    set(gcbf, 'WindowButtonMotionFcn',...
              'PPmod(''move_nodes'')');
  elseif mod_type==3
    set(gcbf, 'WindowButtonMotionFcn',...
              'PPmod(''add_nodes'')');
  end
  set(gcbf, 'WindowButtonUpFcn',     'PPmod(''stop'')');


case 'change_PP_values'
       line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  c=get(findobj(gcbf,'Tag','continuity'),'Value');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  
  cp = get(gca, 'CurrentPoint');
  %if cp(1)<0
   %  break
  %end
  [interval, node]=find_node(select_point);
  y1=cp(1,2);

  if (c==1&d==1)|(c==2&d==2)
    for j=1:ni
       YData=get(line_handles(2*j),'YData');
       
       
      Y(j)=YData(1);
      if j==ni
         Y(j+1)=YData(2);
         end
      if interval==j&node==1
         int=interval+1;
         end
      if interval==j&node==-1
         Y(j)=y1;
         int=interval;
      end
    end
    if node==0&d==2
       return
    elseif node==0&d==1
       int=interval;
    end
    
    if int<=4 
    text=['v(x) = '...
      num2str(Y(1),'%1.2f') ' \phi_1(x) + '...
      num2str(Y(2),'%1.2f') ' \phi_2(x) + '...
      num2str(Y(3),'%1.2f') ' \phi_3(x) + '...
      num2str(Y(4),'%1.2f') ' \phi_4(x) + ...'];
title(text,'FontSize',11)
elseif int>4
  text=['v(x) = '...
         ' ... + '...
      num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '...
      num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '...
      num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '...
      num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...'];
title(text,'FontSize',11)
end
  elseif c==2&d==3
          counter=1;
     for i=1:ni
        if interval==i&node==-1
           int=i*2-1;
        elseif interval==i&node==0
           int=i*2;
        elseif interval==i&node==1
           int=i*2+1;
        end
        
     YData=get(line_handles(2*i),'YData');
    
     Y(counter)=YData(1);
     Y(counter+1)=YData(6);
      counter=counter+2;
    end
    Y(counter)=YData(11);
             if int<=4 
    text=['v(x) = '...
      num2str(Y(1),'%1.2f') ' \phi_1(x) + '...
      num2str(Y(2),'%1.2f') ' \phi_2(x) + '...
      num2str(Y(3),'%1.2f') ' \phi_3(x) + '...
      num2str(Y(4),'%1.2f') ' \phi_4(x) + ...'];
title(text,'FontSize',11)
elseif int>4
   text=['v(x) = '...
         ' ... + '...
      num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '...
      num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '...
      num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '...
      num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...'];
title(text,'FontSize',11)
end

   elseif c==1&d==2
    counter=1;
    for j=1:ni
       YData=get(line_handles(2*j),'YData');
       
       
      if interval==j&node==1
         int=interval*2;
         end
      if interval==j&node==-1
         int=interval*2-1;
      end
      Y(counter)=YData(1);
      Y(counter+1)=YData(2);
      counter=counter+2;
   end
    if node==0
       return
    end
    
    if int<=4 
    text=['v(x) = '...
      num2str(Y(1),'%1.2f') ' \phi_1(x) + '...
      num2str(Y(2),'%1.2f') ' \phi_2(x) + '...
      num2str(Y(3),'%1.2f') ' \phi_3(x) + '...
      num2str(Y(4),'%1.2f') ' \phi_4(x) + ...'];
title(text,'FontSize',11)
elseif int>4
  text=['v(x) = '...
         ' ... + '...
      num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '...
      num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '...
      num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '...
      num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...'];
title(text,'FontSize',11)
end

    
    
 elseif c==1&d==3
      counter=1;
     for i=1:ni
        if interval==i&node==-1
           int=i*3-2;
        elseif interval==i&node==0
           int=i*3-1;
        elseif interval==i&node==1
           int=i*3;
        end
        
     YData=get(line_handles(2*i),'YData');
    
     Y(counter)=YData(1);
     Y(counter+1)=YData(6);
     Y(counter+2)=YData(11);
     counter=counter+3;
    end
          if int<=4 
    text=['v(x) = '...
      num2str(Y(1),'%1.2f') ' \phi_1(x) + '...
      num2str(Y(2),'%1.2f') ' \phi_2(x) + '...
      num2str(Y(3),'%1.2f') ' \phi_3(x) + '...
      num2str(Y(4),'%1.2f') ' \phi_4(x) + ...'];
title(text,'FontSize',11)
elseif int>4
   text=['v(x) = '...
         ' ... + '...
      num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '...
      num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '...
      num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '...
      num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...'];
title(text,'FontSize',11)
end
  end

  if d==1&node==0
    YData=[y1 y1];
    set(line_handles(2*interval),'YData',YData)
    if c==1
      XData=get(line_handles(2*interval),'XData');
      set(line_handles(2*interval-1),'YData',[y1 y1])
      set(line_handles(2*ni+1),...
        'XData',[XData(1) XData(1)],...
        'YData',[0 y1],'LineStyle',':',...
        'Color','g','Tag','P');
      set(line_handles(2*ni+2),...
        'XData',[XData(2) XData(2)],...
        'YData',[0 y1],'LineStyle',':',...
        'Color','g','Tag','P');
    end
  end
  if d==2
    YData=get(line_handles(2*interval),'YData');
    if node==-1
      YData(1)=y1;
      Y2Data=[y1 0];
      set(line_handles(2*interval),'YData',YData)
      set(line_handles(2*interval-1),'YData',Y2Data)
    elseif node==1
      YData(2)=y1;
      Y2Data=[0 y1];
      set(line_handles(2*interval),'YData',YData)
      set(line_handles(2*interval-1),'YData',Y2Data)
    end
  end
  if d==3
    YData=get(line_handles(2*interval),'YData');
    Y1=YData(1);
    Y2=YData(6);
    Y3=YData(11);
    Y21=0;
    Y22=0;
    Y23=0;
    if node==-1
      Y1=y1;
      Y21=y1;
    elseif node==1
      Y3=y1;
      Y23=y1;
    else
      Y2=y1;
      Y22=y1;
    end
    x=0:.1:1;
    YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
    set(line_handles(2*interval),'YData',YData)
    Y2Data=Y21*(1-x).*(1-2*x)+Y22*4*x.*(1-x)+Y23*x.*(2*x-1);
    set(line_handles(2*interval-1),'YData',Y2Data)
  end

  if c==2
    i=interval;
    if d==1
      for j=1:ni
        set(line_handles(2*j),'YData',[y1 y1])
      end
    end
    if d==2
      if interval>1&node==-1
        YData=get(line_handles(2*i-2),'YData');
        YData(2)=y1;
        Y2Data=[0 y1];
        set(line_handles(2*i-2),'YData',YData)
        set(line_handles(2*i-3),'YData',Y2Data)
      end
      if interval<ni&node==1
        YData=get(line_handles(2*i+2),'YData');
        YData(1)=y1;
        Y2Data=[y1 0];
        set(line_handles(2*i+2),'YData',YData)
        set(line_handles(2*i+2-1),'YData',Y2Data)
      end
    end
    if d==3
      if interval>1&node==-1
        YData=get(line_handles(2*i-2),'YData');
        Y1=YData(1);
        Y21=0;
        Y2=YData(6);
        Y22=0;
        Y3=y1;
        Y23=y1;
        x=0:.1:1;
        YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
        set(line_handles(2*i-2),'YData',YData) 
        Y2Data=Y21*(1-x).*(1-2*x)+Y22*4*x.*(1-x)+Y23*x.*(2*x-1);
        set(line_handles(2*i-2-1),'YData',Y2Data)  
      end
      if interval<ni&node==1
        YData=get(line_handles(2*i+2),'YData');
        Y1=y1;
        Y21=y1;
        Y2=YData(6);
        Y22=0;
        Y3=YData(11);
        Y23=0;
        x=0:.1:1;
        YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
        set(line_handles(2*i+2),'YData',YData)
        Y2Data=Y21*(1-x).*(1-2*x)+Y22*4*x.*(1-x)+Y23*x.*(2*x-1);
        set(line_handles(2*i+2-1),'YData',Y2Data)
      end
    end   % if d==3
  end   % if c==2
  %PPmod('compute_error')
  
case 'move_nodes'
         line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  cp = get(gca, 'CurrentPoint');
 
  
  [interval, node]=find_node(cp);
  [interval_sel, node_sel]=find_node(select_point);
  x1=cp(1,1);
  x1 = round(1000*x1)/1000;
  title(['Current x-coordinate: ' num2str(x1)], 'FontSize', 11)

  if abs(interval-interval_sel)<=1
   
  if node==-1&interval>1

    XData=get(line_handles(2*interval),'XData');
    x2=XData(length(XData));
    x1=min(x1,x2);
    h=x2-x1;
    XData=[x1 x2];
    if d==3
      XData=x1:h/10:x2;
    end
    set(line_handles(2*interval),'XData',XData)
    set(line_handles(2*interval-1),'XData',XData)
    YDataR=get(line_handles(2*interval),'YData');
    mi=min(0,YDataR(1));
    ma=max(0,YDataR(1));
%    Y2Data=0*YData;
%    Y2Data(1)=YData(1);
%    set(line_handles(2*interval-1),'YData',Y2Data)

    XData=get(line_handles(2*interval-2),'XData');
    x0=XData(1);
    x1=max(x1,x0);
    h=x1-x0;
    XData=[x0 x1];
    if d==3
      XData=x0:h/10:x1;
    end
    set(line_handles(2*interval-2),'XData',XData)
    set(line_handles(2*interval-2-1),'XData',XData)
    YDataL=get(line_handles(2*interval-2),'YData');
    mi=min(mi,YDataL(length(YDataL)));
    ma=max(ma,YDataL(length(YDataL)));
%    Y2Data=0*YData;
%    Y2Data(length(Y2Data))=YData(length(YData));
%    set(line_handles(2*interval-2-1),'YData',Y2Data)
     set(line_handles(2*ni+1),'XData',[x1 x1],...
       'YData',[mi ma],...
       'LineStyle',':','Color','b') 
  end

  if node==1&interval<ni

    XData=get(line_handles(2*interval+2),'XData');
    x2=XData(length(XData));
    x1=min(x1,x2);
    h=x2-x1;
    XData=[x1 x2];
    if d==3
      XData=x1:h/10:x2;
    end
    set(line_handles(2*interval+2),'XData',XData)
    set(line_handles(2*interval+2-1),'XData',XData)
    YDataR=get(line_handles(2*interval+2),'YData');
    mi=min(0,YDataR(1));
    ma=max(0,YDataR(1));
%    Y2Data=0*YData;
%    Y2Data(1)=YData(1);
%    set(line_handles(2*interval+2-1),'YData',Y2Data)

    XData=get(line_handles(2*interval),'XData');
    x0=XData(1);
    x1=max(x1,x0);
    h=x1-x0;
    XData=[x0 x1];
    if d==3
      XData=x0:h/10:x1;
    end
    set(line_handles(2*interval),'XData',XData)
    set(line_handles(2*interval-1),'XData',XData)
    YDataL=get(line_handles(2*interval),'YData');
    mi=min(mi,YDataL(length(YDataL)));
    ma=max(ma,YDataL(length(YDataL)));
%    Y2Data=0*YData;
%    Y2Data(length(Y2Data))=YData(length(Y2Data));
%    set(line_handles(2*interval-1),'YData',Y2Data)
    set(line_handles(2*ni+1),'XData',[x1 x1],...
       'YData',[mi ma],...
       'LineStyle',':','Color','b') 
  end
  end
  %PPmod('compute_error')
  
case 'add_nodes'
       line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
%  cp=get(gca, 'CurrentPoint');
  x1=select_point(1,1);
  [interval, node]=find_node(x1);
  XData=get(line_handles(2*interval),'XData');
  YData=get(line_handles(2*interval),'YData');
  x0=XData(1);
%  x1=select_point(1,1);
  x2=XData(length(XData));
  if d==1
    XDataL=[x0 x1];
    XDataR=[x1 x2];
    Y1=YData(1);
    YDataL=[Y1 Y1];
    YDataR=[Y1 Y1];
  end
  if d==2
    XDataL=[x0 x1];
    XDataR=[x1 x2];
    Y1=YData(1);
    Y2=Y1+(YData(length(YData))-Y1)*(x1-x0)/(x2-x0);
    YDataL=[Y1 Y2];
    Y1=Y2;
    Y2=YData(length(YData));
    YDataR=[Y1 Y2];
  end
  if d==3
    h=x1-x0;
    XDataL=x0:h/10:x1;
    h=x2-x1;
    XDataR=x1:h/10:x2;
    Y1=YData(1);
    Y3=YData(6);
    Y2=(YData(3)+YData(4))/2;
    x=0:.1:1;
    YDataL=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
    Y1=Y3;
    Y3=YData(length(YData));
    Y2=(YData(8)+YData(9))/2;
    YDataR=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
  end
  set(line_handles(2*interval),'XData',XDataL)
  set(line_handles(2*interval-1),'XData',XDataL)
  set(line_handles(2*interval),'YData',YDataL)
  set(line_handles(2*interval-1),'YData',0*YDataL)

%  for j=2*interval+2-1:2*ni+2
%    line_handles(j+2)=line_handles(j);
%  end
   i=interval;
   line_handles(2*i+4-1:2*ni+2+2)=line_handles(2*i+2-1:2*ni+2);

  line_handles(2*interval+2)=line(XDataR,YDataR,'Tag','P');
  line_handles(2*interval+2-1)=...
                   line(XDataR,0*YDataR,'Color','g','Tag','P');
  ni=ni+1;
  set(findobj(gcbf,'Tag','ni'),'Userdata',ni)
  set(findobj(gcbf,'Tag','create'),'Userdata',line_handles)
  %PPmod('compute_error')
  PPmod('stop')


case 'stop'

  line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  set(gcbf, 'WindowButtonMotionFcn', '');
  set(gcbf, 'WindowButtonUpFcn', '');

  for i=1:ni
    YData=get(line_handles(2*i-1),'YData');
    set(line_handles(2*i-1),'YData',0*YData)
  end
    
    set(line_handles(2*ni+1),'YData',[0 0])
    set(line_handles(2*ni+2),'YData',[0 0])

  PPmod('compute_error')


case 'uniform'
     if isempty(findobj(gcbf,'Tag','P'))     
       set(findobj(gcbf,'Tag','Pushbutton4'),'TooltipString','Create a mesh first')
       disp('Create a mesh first')
       break
        end
  line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  h=1/ni;
  for i=1:ni
    XData=[(i-1)*h i*h];
    if d==3
      XData=(i-1)*h:h/10:i*h;
    end
    set(line_handles(2*i),'XData',XData);
    set(line_handles(2*i-1),'XData',XData);
  end


case 'refine'
     if isempty(findobj(gcbf,'Tag','P'))     
       set(findobj(gcbf,'Tag','Pushbutton5'),'TooltipString','Create a mesh first')
       disp('Create a mesh first')
       break
    end
    disp('refining')
  line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  ni_to_refine=ni;
  d=get(findobj(gcbf,'Tag','degree'),'Value');

  for i=ni_to_refine:-1:1
    XData=get(line_handles(2*i),'XData');
    YData=get(line_handles(2*i),'YData');
    x0=XData(1);
    x2=XData(length(XData));
    x1=(x0+x2)/2;

    if d==1
      XDataL=[x0 x1];
      XDataR=[x1 x2];
      Y1=YData(1);
      YDataL=[Y1 Y1];
      YDataR=[Y1 Y1];
    end

    if d==2
      XDataL=[x0 x1];
      XDataR=[x1 x2];
      Y1=YData(1);
      Y2=Y1+(YData(length(YData))-Y1)*(x1-x0)/(x2-x0);
      YDataL=[Y1 Y2];
      Y1=Y2;
      Y2=YData(length(YData));
      YDataR=[Y1 Y2];
    end

    if d==3
      h=x1-x0;
      XDataL=x0:h/10:x1;
      h=x2-x1;
      XDataR=x1:h/10:x2;
      Y1=YData(1);
      Y3=YData(6);
      Y2=(YData(3)+YData(4))/2;
      x=0:.1:1;
      YDataL=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
      Y1=Y3;
      Y3=YData(length(YData));
      Y2=(YData(8)+YData(9))/2;
      YDataR=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
    end

    set(line_handles(2*i),'XData',XDataL)
    set(line_handles(2*i-1),'XData',XDataL)
    set(line_handles(2*i),'YData',YDataL)
    set(line_handles(2*i-1),'YData',0*YDataL)

%    for j=2*i+2-1:2*ni   %+2*(ni-i)
%      line_handles(j+2)=line_handles(j)
%      pause(1)
%    end
    line_handles(2*i+4-1:2*ni+2+2)=line_handles(2*i+2-1:2*ni+2);

    line_handles(2*i+2)=line(XDataR,YDataR,'Tag','P');
    line_handles(2*i+2-1)=...
                   line(XDataR,0*YDataR,'Color','g','Tag','P');
    ni=ni+1;
  end

%  ni=2*ni;
  set(findobj(gcbf,'Tag','ni'),'Userdata',ni)
  set(findobj(gcbf,'Tag','create'),'Userdata',line_handles)


case 'choose_fcn'

  hndl=findobj(gcbf,'Tag','function');
  value=get(hndl,'Value');
  string=get(hndl,'String');
  delete(findobj(gcbf,'Tag','f_graph'))
  title('')
   
  %myfunc=get(findobj(gcbf,'Tag','my_fcn'),'String');
  if value==1
     set(findobj(gcbf,'Tag','my_fcn'),'String','')
     
  else
     f=string{value};
     set(findobj(gcbf,'Tag','my_fcn'),'String',f)
     x=0:.002:1;
    line(x,eval(f),'Color','r','Tag','f_graph')
    %title(['u(x) = ' f],'FontSize',11)
    set(findobj(gcbf,'Tag','norm'),'TooltipString','Choose norm')
    if isempty(findobj(gcbf,'Tag','P'))     
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Create a mesh first')
       disp('Create a mesh now')
    else
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Interpolate')
       disp('Interpolate')
    end
    


  %else
   % x=0:.002:1;
    %line(x,eval(myfunc),'Color','r','Tag','f_graph')
    %title(['u(x) = ' myfunc],'FontSize',11)
  end

case 'choose_my_fcn'
   delete(findobj(gcbf,'Tag','f_graph'))
   title('')
   
	myfunc=get(findobj(gcbf,'Tag','my_fcn'),'String');
   if ~isempty(myfunc)    
   x=0:.002:1;
    line(x,eval(myfunc),'Color','r','Tag','f_graph')
    %title(['u(x) = ' myfunc],'FontSize',11)
	    if isempty(findobj(gcbf,'Tag','P'))     
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Create a mesh first')
       disp('Create a mesh now')
    else
       set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Interpolate')
       disp('Interpolate')
    end
 else
    set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function first')
       disp('Define a function now')
 end
 
case 'interpolate'

  %disp('interpolating')
  line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  c=get(findobj(gcbf,'Tag','continuity'),'Value');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  hndl=findobj(gcbf,'Tag','function');
  value=get(hndl,'Value');
  string=get(hndl,'String');
  f=string{value};
  f_my_fcn=get(findobj(gcbf,'Tag','my_fcn'),'String');
  if strcmp(f,f_my_fcn)==0
     f=f_my_fcn;
     if isempty(f)
        set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function first')
        disp('Define a function now')
        break
     end  
  end
  if isempty(findobj(gcbf,'Tag','P'))
     set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Create a mesh first')
        disp('Create a mesh now')
        break
     end
   disp('interpolating')
  for i=1:ni
    
    if d==1
      XData=get(line_handles(2*i),'XData');
      x=(XData(1)+XData(length(XData)))/2;
      if c==2
        x=0.5;
      end
      Y1=eval(f);
      YData=[Y1 Y1];
      set(line_handles(2*i),'YData',YData)
    end
    
    if d==2
      XData=get(line_handles(2*i),'XData');
      x=XData(1);
      Y1=eval(f);
      x=XData(length(XData));
      Y2=eval(f);
      YData=[Y1 Y2];
      set(line_handles(2*i),'YData',YData)
    end
  
    if d==3
      XData=get(line_handles(2*i),'XData');
      x=XData(1);
      Y1=eval(f);
      x=XData((length(XData)+1)/2);
      Y2=eval(f);
      x=XData(length(XData));
      Y3=eval(f);
      x=0:0.1:1;
      YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1);
      set(line_handles(2*i),'YData',YData)
    end
    
  end
    
  title('')
  PPmod('compute_error')


case 'compute_error'

  line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
  ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
  d=get(findobj(gcbf,'Tag','degree'),'Value');
  n=get(findobj(gcbf,'Tag','norm'),'Value');
  hndl=findobj(gcbf,'Tag','function');
  value=get(hndl,'Value');
  string=get(hndl,'String');
 	f=get(findobj(gcbf,'Tag','my_fcn'),'String');
  if isempty(f)
     set(findobj(gcbf,'Tag','norm'),'TooltipString','Define a function first')
     %disp('Define a function now')
     break
  end
%  if value>=1
    e=0;
    dy_norm=0;
    d2y_norm=0;
    for i=1:ni
      XData=get(line_handles(2*i),'XData');
      h=XData(length(XData))-XData(1);
      YData=get(line_handles(2*i),'YData');
      for j=1:10
        if d==3
          x=(XData(j)+XData(j+1))/2;
          y=eval(f);
          x=XData(j);
          dy=eval(f);
          x=XData(j+1);
          dy=(eval(f)-dy)/h/10;
          Y=(YData(j)+YData(j+1))/2;
        else
          x=XData(1)+(j-0.5)*h/10;
          y=eval(f);
          
          dY=YData(length(YData))-YData(1);
          Y=YData(1)+(j-0.5)*dY/10;
        end

        x=XData(1)+(j-1)*h/10;
        y0=eval(f);
        x=XData(1)+(j-0.5)*h/10;
        y1=eval(f);
        x=XData(1)+j*h/10;
        y2=eval(f);
        dy=(y2-y0)/(h/10);
        d2y=((y2-y1)-(y1-y0))/(h/20)^2;

        if n==2
          e=max(e,abs(y-Y));
          dy_norm=max(dy_norm,abs(h*dy));
          d2y_norm=max(d2y_norm,abs(h^2*d2y));
        elseif n==3
          e=e+(y-Y)^2*h/10;
          dy_norm=dy_norm+(h*dy)^2*h/10;
          d2y_norm=d2y_norm+(h^2*d2y)^2*h/10;
        end

      end
    end

    if n==3
      e=sqrt(e);
      dy_norm=sqrt(dy_norm);
      d2y_norm=sqrt(d2y_norm);
    end
    if e==0 & dy_norm==0 & d2y_norm==0
       set(findobj(gcbf,'Tag','error'),'String','||u-v||')
       set(findobj(gcbf,'Tag','dy'),'String','||hDu||')
       set(findobj(gcbf,'Tag','d2y'),'String','||h^2D^2u||')
    else
       
    set(findobj(gcbf,'Tag','error'),...
                'String',['||u-v||=' num2str(e)])
    set(findobj(gcbf,'Tag','dy'),...
                'String',['||hDu||=' num2str(dy_norm)])
    set(findobj(gcbf,'Tag','d2y'),...   
       'String',['||h^2D^2u||=' num2str(d2y_norm)])
    end
%    c_i1=e/dy_norm
%    c_i2=e/d2y_norm
%  end


case 'reset'

set(findobj(gcbf,'Tag','function'),'Value',1)
set(findobj(gcbf,'Tag','norm'),'Value',1)
set(findobj(gcbf,'Tag','continuity'),'Value',2)
    set(findobj(gcbf,'Tag','degree'),'Value',2)
set(findobj(gcbf,'Tag','ni'),'Value',0.3,'Userdata',[])
set(findobj(gcbf,'Tag','mod_type'),'Value',1)
title('')
set(findobj(gcbf,'Tag','error'),'String','')
set(findobj(gcbf,'Tag','dy'),'String','')
set(findobj(gcbf,'Tag','d2y'),'String','')
set(findobj(gcbf,'Tag','my_fcn'),'String','')
set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function or a mesh first')
set(findobj(gcbf,'Tag','Pushbutton4'),'TooltipString','Create a mesh first')
set(findobj(gcbf,'Tag','Pushbutton5'),'TooltipString','Create a mesh first')
set(findobj(gcbf,'Tag','mod_type'),'TooltipString','Create a mesh first')


end




function [interval, node]=find_node(select_point)
%global line_handles
line_handles=get(findobj(gcbf,'Tag','create'),'Userdata');
ni=get(findobj(gcbf,'Tag','ni'),'Userdata');
for i=1:ni
  XData=get(line_handles(2*i),'XData');
  x1=XData(1);
  x2=XData(length(XData));
  x=select_point(1,1);
  if x1<=x&x<=x2
    interval=i;
    if x-x1<0.2*(x2-x1)
      node=-1;
    elseif x2-x<0.2*(x2-x1)
      node=1;
    else
      node=0;
    end
  end
end
