var outpstr;
var fra = new fraction(2,1);
var frb = new fraction(3,1);
var frc = new fraction(4,1);
var frd = new fraction(5,1);
var fa = fra;
var fb = frb;
var fc = frc;
var fd = frd;
var qp1 =  new qpoly(fra,frb,frc);
var type = 0;
var step = 0;

// Constructor of a simple type - fraction
function fraction(n,d)
{ 
    this.num = n;
    this.denom = d;
}

function fracmult(fr1,fr2)
{
    fr1.num = fr1.num*fr2.num;
    fr1.denom = fr1.denom*fr2.denom;
    reduce(fr1);
}

// Constractor of objects representing polynomials of deg<=2 with fractional
// coefficients 
function qpoly(aa,bb,cc)
{
    this.a = aa;  this.b = bb; this.c = cc;
}
 
// Euler algorithm to compute GCD
function gcd(a,b)
{
    ra = Math.abs(a);
    rb = Math.abs(b);
    if ( ra<rb )
    {
        rr = ra;  ra = rb;  rb = rr;
    }
    while ( rb!=0 )
    {
        rr = ra % rb; ra = rb; rb = rr;
    }
    return ra; 
}

// This function reduces a given fraction
function reduce(fr)
{
    if ( fr.num==0 )
       fr.denom = 1;
    else
    { 
      if ( fr.denom<0 )
      {
          fr.denom = -fr.denom;
	  fr.num = -fr.num;
      }
      g = gcd(fr.num,fr.denom);
      fr.num = fr.num/g;
      fr.denom = fr.denom/g;
    }
}

// This function outputs a fraction in LaTeX format
function printfraction(pm,fr)
{
    reduce(fr);
    if ( pm<0 )
      fr.num = -fr.num;
    if ( pm!=0 && fr.num>0 )
      outpstr = outpstr+"+";
    if ( fr.num!=0 )
    {
      if ( fr.denom==1 )
         outpstr = outpstr+fr.num;
      else
      {
         if ( fr.num<0 )
            outpstr = outpstr+"-";
         outpstr = outpstr+"\\frac{"+Math.abs(fr.num)+"}{"+fr.denom+"}";
      }
    }
    if ( pm<0 )
      fr.num = -fr.num;
}    

// This is modified version of printfraction - used to print -x instead of -1x
function xprintfraction(pm,fr)
{
    if ( fr.num==fr.denom )
    {
        if ( pm>0 )
	    outpstr = outpstr+"+";
	 else if ( pm<0 )
	    outpstr = outpstr+"-";
	 return;
     } 
     if ( fr.num==-fr.denom )
     {
         if ( pm>=0 )
	     outpstr = outpstr+"-";
	 else if ( pm<0 )
	     outpstr = outpstr+"+";
	 return;
     }
     printfraction(pm,fr);
}
          
// This function outputs the whole polynomial ( in LaTeX format of course )
function printqpoly(pm,qp,base)
{
    if ( qp.a.num!=0 )
    {
       xprintfraction(pm,qp.a);
       outpstr = outpstr+"x^"+(base+2);
       if ( pm==0 )
          pm = 1;
    }
    if ( qp.b.num!=0 )
    {
       xprintfraction(pm,qp.b);
       outpstr = outpstr+"x";
       if ( base>0 )
         outpstr = outpstr+"^"+(base+1);
       if ( pm==0 )
          pm = 1;
    }
    if ( qp.c.num!=0 )
    {
       if ( base>0 )
           xprintfraction(pm,qp.c);
       else
           printfraction(pm,qp.c);  
       if ( base>0 )
       {
           outpstr = outpstr+"x";
           if ( base>1 )
             outpstr = outpstr+"^"+(base);
       }
    }  
}

function adjustqpxfr(fd,qp)
{
    fracmult(qp.a,fd);
    fracmult(qp.b,fd);
    fracmult(qp.c,fd);
    r = (qp.a.denom*qp.b.denom)/gcd(qp.a.denom,qp.b.denom);
    r = (r*qp.c.denom)/gcd(r,qp.c.denom);
    r1 = gcd(qp.a.num,qp.b.num);
    r1 = gcd(r1,qp.c.num);
    if ( qp.a.num<0 || qp.a.num==0 && qp.b.num<0 )
        r = -r;
    fd.num = r;
    fd.denom = r1;    
    fracmult(qp.a,fd);
    fracmult(qp.b,fd);
    fracmult(qp.c,fd);
    fd.denom = r;
    fd.num = r1;
    reduce(fd);
}
 
function prqpxfr(pm,fd,qp,base)
{
    adjustqpxfr(fd,qp);
    xprintfraction(pm,fd);
    outpstr = outpstr+"\\left[";
    printqpoly(0,qp,base);
    outpstr = outpstr+"\\right]";
}
          
type = 0;

function getrandom()
{
    r = 0;
    while ( r==0 )
      r = Math.round(Math.random()*18-9);
    return r;
}
    
function writeNewEqn()
{
    type = Math.round(Math.random()*3);
    fra.num = getrandom();
    fra.denom = 1;
    frb.num = getrandom();
    frb.denom = 1;
    frc.num = getrandom();
    frc.denom = 1;
    frd.num = getrandom();
    if ( type==2 && frd.num<0 )
        frd.num = -frd.num;
    frd.denom = 1;

    step = 0;
    qp1.a = fra; qp1.b = frb; qp1.c = frc;
    outpstr = "\\int\\,(";
    printqpoly(0,qp1,0);
    outpstr = outpstr+")\\,";
    if ( type == 0 )
      outpstr = outpstr + "\\sin(";
    else if ( type == 1 )
      outpstr = outpstr + "\\cos(";
    else if ( type == 2 )
      outpstr = outpstr + "\\ln(";
    else
      outpstr = outpstr +"\\exp(";
    xprintfraction(0,frd);
    outpstr = outpstr+"x)\\,dx";
    document.polynomial.reloadFromTeXString('$$'+outpstr+'$$');
    document.eq1.reloadFromTeXString('$$'+''+'$$');
    document.eq2.reloadFromTeXString('$$'+''+'$$');
    document.eq3.reloadFromTeXString('$$'+''+'$$');
    document.eq4.reloadFromTeXString('$$'+''+'$$'); 
    document.eq5.reloadFromTeXString('$$'+''+'$$');
    document.simple.reloadFromTeXString('$$'+''+'$$');
    document.eq6.reloadFromTeXString('$$'+''+'$$');
    document.eq7.reloadFromTeXString('$$'+''+'$$');
    document.eq8.reloadFromTeXString('$$'+''+'$$');
    document.eq9.reloadFromTeXString('$$'+''+'$$');
    document.eq10.reloadFromTeXString('$$'+''+'$$'); 
    document.eq11.reloadFromTeXString('$$'+''+'$$'); 
    document.derivative.Continue.value="Continue";
    document.derivative.Cont1.value="Continue";
    document.derivative.Cont2.value="Continue";
    document.derivative.Cont3.value="Continue";                     
    document.derivative.Cont4.value="Continue";
    document.derivative.Cont5.value="Continue";
    document.derivative.Cont6.value="Continue";
}

function WriteEqn1n2()
{
    outpstr = "u=";
    if ( type!=2 )
       printqpoly(0,qp1,0);
    else
    {
       outpstr = outpstr+"\\ln(";
       xprintfraction(0,frd);
       outpstr = outpstr+"x)";
    }
    document.eq1.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "dv=";
    if ( type!=2 )
    {
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else if ( type==2 )
            outpstr = outpstr+"\\ln(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)";
    }
    else
        printqpoly(0,qp1,0); 
    document.eq2.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Continue.value="Go to next step.";
}
 



function writeEqn3n4()
{
    if ( type!=2 )
    {
        outpstr = "du=("; 
        fa = new fraction(0,1);
        fb = new fraction(2*fra.num,1);
        qp2 = new qpoly(fa,fb,frb);
        printqpoly(0,qp2,0);
        outpstr = outpstr+")\\,dx";
    }
    else
        outpstr = "du=\\frac{1}{x}\\,dx";
    document.eq3.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "v=\\int\\,";
    if ( type==0 )
       outpstr = outpstr+"\\sin(";
    else if ( type==1 )
       outpstr = outpstr+"\\cos(";
    else if ( type==2 )
       outpstr = outpstr+"(";
    else
       outpstr = outpstr+"\\exp(";
    if ( type!=2 )
    {
       xprintfraction(0,frd);
       outpstr = outpstr+"x";
    }
    else
       printqpoly(0,qp1,0);
    outpstr = outpstr + ")\\,dx=";
    if ( type!=2 )
    {
       fd = new fraction(1,frd.num);
       if ( type==0 )
           fd.num = -fd.num;
       printfraction(0,fd);
       outpstr = outpstr+"\\cdot";
       if ( type==0 )
           outpstr = outpstr+"\\cos(";
       else if ( type==1 )
           outpstr = outpstr+"\\sin(";
       else
           outpstr = outpstr+"\\exp(";
       xprintfraction(0,frd);
       outpstr = outpstr+"x)";
    }
    else
    {
       fa = new fraction(fra.num,3);
       fb = new fraction(frb.num,2);
       qp2 = new qpoly(fa,fb,frc);
       printqpoly(0,qp2,1);
    }
    document.eq4.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Cont1.value="Go to next step.";
}


function writeEqn5()
{
    if ( step==0 )
    {
        outpstr = "\\begin{array}{l}\\int\\,(";
        printqpoly(0,qp1,0);
        outpstr = outpstr+")\\,";
        if ( type == 0 )
          outpstr = outpstr + "\\sin(";
        else if ( type == 1 )
          outpstr = outpstr + "\\cos(";
        else if ( type == 2 )
          outpstr = outpstr + "\\ln(";
        else
          outpstr = outpstr +"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)\\,dx\\\\=\\left[";
        if ( type!=2 )
        {
            printqpoly(0,qp1,0);
            outpstr = outpstr+"\\right]\\cdot\\left[";
            fd = new fraction(1,frd.num);
            if ( type==0 )
               fd.num = -fd.num;
            xprintfraction(0,fd);
            if ( type==0 )
                outpstr = outpstr+"\\cos(";
            else if ( type==1 )
                outpstr = outpstr+"\\sin(";
            else
                outpstr = outpstr+"\\exp(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)\\right]-\\int\\,\\left[";
            xprintfraction(0,fd);
            if ( type==0 )
                outpstr = outpstr+"\\cos(";
            else if ( type==1 )
                outpstr = outpstr+"\\sin(";
            else
                outpstr = outpstr+"\\exp(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)\\right]\\cdot\\left[";
            fa = new fraction(0,1);
            fb = new fraction(2*fra.num,1);
            qp2 = new qpoly(fa,fb,frb);
            printqpoly(0,qp2,0);
            outpstr = outpstr+"\\right]\\,dx";
        }
        else
        {
            outpstr = outpstr+"\\ln(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)\\right]\\cdot\\left[";
            fa = new fraction(fra.num,3);
            fb = new fraction(frb.num,2);
            qp2 = new qpoly(fa,fb,frc);
            printqpoly(0,qp2,1);
            outpstr = outpstr+"\\right]-\\int\\,\\left[";
            printqpoly(0,qp2,1);
            outpstr = outpstr+"\\right]\\cdot\\frac{1}{x}\\,dx";
        }   
        document.eq5.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
        step = step+1;
        return;
    }
    if ( step==1 )
    {
       outpstr = outpstr+"\\\\=";
       if ( type!=2 )
       {
           fd = new fraction(1,frd.num);
           if ( type==0 )
              fd.num = -fd.num;
           fd1 = new fraction(fd.num,fd.denom);
	   fa = new fraction(fra.num,fra.denom);
	   fb = new fraction(frb.num,frb.denom);
	   fc = new fraction(frc.num,frc.denom);
           qp2 = new qpoly(fa,fb,fc);
           prqpxfr(0,fd1,qp2,0);  
           outpstr = outpstr+"\\cdot";
           if ( type==0 )
               outpstr = outpstr+"\\cos(";
           else if ( type==1 )
               outpstr = outpstr+"\\sin(";
           else
               outpstr = outpstr+"\\exp(";
           xprintfraction(0,frd);
           outpstr = outpstr+"x)";
           fa = new fraction(0,1);
           fb = new fraction(2*fra.num,1);
	   fc = new fraction(frb.num,frb.denom);
           qp2 = new qpoly(fa,fb,fc);
	   adjustqpxfr(fd,qp2);
           xprintfraction(-1,fd);
           outpstr = outpstr+"\\int\\,[";
           printqpoly(0,qp2,0);
           outpstr = outpstr+"]\\cdot";
           if ( type==0 )
               outpstr = outpstr+"\\cos(";
           else if ( type==1 )
               outpstr = outpstr+"\\sin(";
           else
               outpstr = outpstr+"\\exp(";
           xprintfraction(0,frd);
           outpstr = outpstr+"x)\\,dx";
       }
       else
       {
           fd1 = new fraction(1,1);
	   fa = new fraction(fra.num,3);
           fb = new fraction(frb.num,2);
	   fc = new fraction(frc.num,frc.denom);
           qp2 = new qpoly(fa,fb,fc);
	   prqpxfr(0,fd1,qp2,1);
           outpstr = outpstr+"\\ln(";
	   xprintfraction(0,frd);
	   outpstr = outpstr+"x)";
	   xprintfraction(-1,fd1);
	   outpstr = outpstr+"\\int\\,\\left(";
	   printqpoly(0,qp2,0);
	   outpstr = outpstr+"\\right)\\,dx";
       }
	   
       document.eq5.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
       step = step+1;  
       if ( type!=2 )
       {
           document.derivative.Cont2.value="Go to next step.";
	   outpstr = "\\int\\,(";
	   qp2 = new qpoly(fa,fb,fc);
	   printqpoly(0,qp2,0);
	   outpstr = outpstr+")";
	   if ( type==0 )
	       outpstr = outpstr+"\\cos(";
	   else if ( type==1 )
	       outpstr = outpstr+"\\sin(";
	   else
	       outpstr = outpstr+"\\exp(";
	   xprintfraction(0,frd);
	   outpstr = outpstr+"x)\\,dx";
	   document.simple.reloadFromTeXString('$$'+outpstr+'$$');	  
       }
       return;    
    }
    if ( step==2 && type==2 )
    {
        outpstr = outpstr+"\\\\=";
	fd1 = new fraction(1,1);
	fa = new fraction(fra.num,3);
        fb = new fraction(frb.num,2);
	fc = new fraction(frc.num,frc.denom);
        qp2 = new qpoly(fa,fb,fc);
	prqpxfr(0,fd1,qp2,1);
        outpstr = outpstr+"\\ln(";
	xprintfraction(0,frd);
	outpstr = outpstr+"x)";
	fa.denom = fa.denom*3;
	fb.denom = fb.denom*2;
	qp2.a = fa;
	qp2.b = fb;
	prqpxfr(-1,fd1,qp2,1);
	document.eq5.reloadFromTeXString('$$'+outpstr+"\\ \\ {+C}\\end{array}"+'$$');
	document.derivative.Continue.value="Done!";
	document.derivative.Cont1.value="Done!";
	document.derivative.Cont2.value="Done!";
	document.derivative.Cont3.value="Done!";
	document.derivative.Cont4.value="Done!";
	document.derivative.Cont5.value="Done!";
	document.derivative.Cont6.value="Done!";
        document.simple.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq6.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq7.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq8.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq9.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq10.reloadFromTeXString("\\begin{center}{DONE!}");
        document.eq11.reloadFromTeXString("\\begin{center}{DONE!}");
	step = step+1;
    }  
}

function WriteEqn6n7()
{
    if ( step!=2 || type==2 )
        return;
    outpstr = "u=";
    qp2 = new qpoly(fa,fb,fc);
    printqpoly(0,qp2,0);
    document.eq6.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "dv=";
    if ( type==0 )
         outpstr = outpstr+"\\cos(";
    else if ( type==1 )
         outpstr = outpstr+"\\sin(";
    else
         outpstr = outpstr+"\\exp(";
    xprintfraction(0,frd);
    outpstr = outpstr+"x)";
    document.eq7.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Cont3.value="Go to next step.";
}

function writeEqn8n9()
{
    if ( step!=2 || type==2 )
        return;
    outpstr = "du=";
    printfraction(0,fb);
    outpstr = outpstr+"\\,dx";
    document.eq8.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "v=\\int\\,";
    if ( type==0 )
        outpstr = outpstr+"\\cos(";
    else if ( type==1 )
        outpstr = outpstr+"\\sin(";
    else
        outpstr = outpstr+"\\exp(";
    xprintfraction(0,frd);
    outpstr = outpstr+"x)\\,dx=";
    fd1 = new fraction(frd.denom,frd.num);
    if ( type==1 )
        fd1.num = -fd1.num;
    xprintfraction(0,fd1);
    if ( type==0 )
        outpstr = outpstr+"\\sin(";
    else if ( type==1 )
        outpstr = outpstr+"\\cos(";
    else
        outpstr = outpstr+"\\exp(";
    xprintfraction(0,frd);
    outpstr = outpstr+"x)";
    document.eq9.reloadFromTeXString('$$'+outpstr+'$$');        
    document.derivative.Cont4.value="Go to next step.";
}

function writeEqn10()
{
    if ( step<2 || type==2 )
        return;
    if ( step==2 )
    {
        outpstr = "\\begin{array}{l}\\int\\,\\left(";
        qp2 = new qpoly(fa,fb,fc);
        printqpoly(0,qp2,0);
        outpstr = outpstr+"\\right)\\,";
        if ( type==0 )
            outpstr = outpstr+"\\cos(";
        else if ( type==1 )
            outpstr = outpstr+"\\sin(";
        else 
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)\\,dx\\\\=[";
        printqpoly(0,qp2,0);
        outpstr = outpstr+"]\\cdot\\left[";
        fd1 = new fraction(frd.denom,frd.num);
        if ( type==1 )
            fd1.num = -fd1.num;
        xprintfraction(0,fd1);
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)\\right]-\\int\\,\\left[";
        xprintfraction(0,fd1);
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)\\right]\\cdot";
        printfraction(0,fb);
        outpstr = outpstr+"\\,dx";
        document.eq10.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
        step = step+1;
        return;
    }  
    if ( step==3 )
    {
        outpstr = outpstr+"\\\\=";
        fd1 = new fraction(frd.denom,frd.num);
        if ( type==1 )
            fd1.num = -fd1.num;
        qp2 = new qpoly(fa,fb,fc);
	prqpxfr(0,fd1,qp2,0);
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)";
        fd1.num = fb.num;
        fd1.denom = frd.num*frd.num;
        if ( type!=3 )
            xprintfraction(1,fd1);
        else
            xprintfraction(-1,fd1);
        if ( type==0 )
            outpstr = outpstr+"\\cos(";
        else if ( type==1 )
            outpstr = outpstr+"\\sin(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)";
        document.eq10.reloadFromTeXString('$$'+outpstr+"+C\\end{array}"+'$$');
        step = step+1;
        document.derivative.Cont5.value="Go to next step.";
    }   
}

function writeEqn11()
{
    if ( step<4 || type==2 )
        return;
    if ( step==4 )
    {
        outpstr = "\\begin{array}{l}\\int\\,(";
        qp1 = new qpoly(fra,frb,frc);
        printqpoly(0,qp1,0);
        outpstr = outpstr+")\\,";
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)\\,dx\\\\=";    
        fd = new fraction(1,frd.num);
        if ( type==0 )
           fd.num = -fd.num;
        fa = new fraction(fra.num,fra.denom);
	fb = new fraction(frb.num,frb.denom);
	fc = new fraction(frc.num,frc.denom);
        qp2 = new qpoly(fa,fb,fc);
        prqpxfr(0,fd,qp2,0);  
        if ( type==0 )
            outpstr = outpstr+"\\cos(";
        else if ( type==1 )
            outpstr = outpstr+"\\sin(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)";
        fd.num = frd.denom;
        fd.denom = frd.num;
        fracmult(fd,fd);
        if ( type==3 )
            fd.num = -fd.num;
        fa = new fraction(0,1);
        fb = new fraction(fra.num*2,fra.denom);
        fc = new fraction(frb.num,frb.denom);
        qp2.a = fa; qp2.b = fb; qp2.c = fc;
        prqpxfr(1,fd,qp2,0);
        if ( type==0 )
            outpstr = outpstr+"\\sin(";
        else if ( type==1 )
            outpstr = outpstr+"\\cos(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)";
        fd.num = 2*fra.num;
        fd.denom = frd.num*frd.num*frd.num;
        if ( type==1 )
            fd.num = -fd.num;
        xprintfraction(1,fd);
        if ( type==0 )
            outpstr = outpstr+"\\cos(";
        else if ( type==1 )
            outpstr = outpstr+"\\sin(";
        else
            outpstr = outpstr+"\\exp(";
        xprintfraction(0,frd);
        outpstr = outpstr+"x)+C";
        document.eq11.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
        step = step+1;
        return;
    }     
    if ( step==5 )
    {
        outpstr = outpstr+"\\\\=";
        if ( type!=3 )
        {
            fd.num = frd.denom;  fd.denom = frd.num;
            if ( type==0 )
                fd.num = -fd.num;
            fa.num = fra.num; fa.denom = fra.denom; 
            fb.num = frb.num; fb.denom = frb.denom;
            fc.num = frc.num*frd.num*frd.num-2*fra.num;
            fc.denom = frd.num*frd.num;
            qp1.a = fa;  qp1.b = fb; qp1.c = fc;
            //xprintfraction(0,fd);
            //outpstr = outpstr+"[";
            //printqpoly(0,qp1,0);
            //outpstr = outpstr+"]";
            prqpxfr(0,fd,qp1,0);
            if ( type==0 )
                outpstr = outpstr+"\\cos(";
            else
                outpstr = outpstr+"\\sin(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)";
            fd.num = 1;  fd.denom = frd.num*frd.num;
            fa.num = 0; fa.denom = 1;
            fb.num = 2*fra.num; fb.denom = 1;
            fc.num = frb.num; fc.denom = 1;
            qp1.a = fa; qp1.b = fb; qp1.c = fc;   
            prqpxfr(1,fd,qp1,0);
            if ( type==0 )
                outpstr = outpstr+"\\sin(";
            else
                outpstr = outpstr+"\\cos(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)";
        }
        else
        {
            fd.num = 1;  fd.denom = frd.num;
            fa.num = fra.num;  fa.denom = 1;
            fb.num = frb.num*frd.num-2*fra.num;
            fb.denom = frd.num;
            fc.num = frc.num*frd.num*frd.num-frb.num*frd.num+2*fra.num;
            fc.denom = frd.num*frd.num;
            qp1.a = fa; qp1.b = fb; qp1.c = fc; 
            //xprintfraction(0,fd);
            //outpstr = outpstr+"[";
            //printqpoly(0,qp1,0);
            //outpstr = outpstr+"]"; 
            prqpxfr(0,fd,qp1,0);
            outpstr = outpstr+"\\exp(";
            xprintfraction(0,frd);
            outpstr = outpstr+"x)";
         }    
         document.eq11.reloadFromTeXString('$$'+outpstr+"{\\ +C}\\end{array}"+'$$');
         step = step+1;
	 document.derivative.Continue.value="Done!";
	 document.derivative.Cont1.value="Done!";
	 document.derivative.Cont2.value="Done!";
	 document.derivative.Cont3.value="Done!";
	 document.derivative.Cont4.value="Done!";
	 document.derivative.Cont5.value="Done!";
	 document.derivative.Cont6.value="Done!";
    }
}

