var outpstr;
var fra = new fraction(-3,1);
var frb = new fraction(9,1);
var sincos = new Array();
sincos[0] = "\\sin(";
sincos[1] = "\\cos(";
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);                                                                
} 

// Euclid 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);                                                      
}

function getrandom()                                                            
{                                                                               
    r = 0;                                                                      
    while ( r==0 )                                                              
      r = Math.round(Math.random()*18-9);                                       
    return r;                                                                   
}

function print_integral(t)
{
    outpstr = outpstr+"\\int\\,e^{";
    xprintfraction(0,fra);
    outpstr = outpstr+"x}"+sincos[t];
    xprintfraction(0,frb);
    outpstr = outpstr+"x)\\,dx";
}

function partial_int(t,st)
{
    if ( st==0 )
    {
        outpstr = "\\begin{array}{l}";
	print_integral(t);
	outpstr = outpstr+"\\\\=["+sincos[t];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)]\\cdot\\left[";
	fa = new fraction(fra.denom,fra.num);
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}\\right]-\\int\\left[";
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}\\right]\\cdot\\left[";
	if ( t==1 )
	    frb.num = -frb.num;
	xprintfraction(0,frb);
	if ( t==1 )
	    frb.num = -frb.num;
	outpstr = outpstr+sincos[1-t];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)\\right]\\,dx";
	return;
    }
    if ( st==1 )
    {
        outpstr = outpstr+"\\\\=";
	fa = new fraction(fra.denom,fra.num);
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[t];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)";
	fa.num = frb.num;
	fa.denom = fra.num;
	if ( t==1 )
	    fa.num = -fa.num;
	xprintfraction(-1,fa);
	print_integral(1-t);
    }
}
  
function writeNewEqn()
{
    type = Math.round(Math.random());
    fra.num = getrandom();                                                      
    fra.denom = 1;                                                              
    frb.num = getrandom();                                                      
    if ( frb.num<0 )
        frb.num = -frb.num;
    frb.denom = 1;
    step = 0;
    outpstr = "";
    print_integral(type);
    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.eq12.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";
    document.derivative.Cont7.value="Continue";
}       

function WriteEqn1n2()                                                          
{                                                                               
    outpstr = "u="+sincos[type];
    xprintfraction(0,frb);
    outpstr = outpstr+"x)";
    document.eq1.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "dv=e^{";
    xprintfraction(0,fra);
    outpstr = outpstr+"x}";
    document.eq2.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Continue.value="Go to next step.";
}

function writeEqn3n4()
{
    outpstr = "du=";
    if ( type==1 )
        frb.num = -frb.num;
    xprintfraction(0,frb);
    if ( type==1 )
        frb.num = -frb.num;
    outpstr = outpstr+sincos[1-type];
    xprintfraction(0,frb);
    outpstr = outpstr+"x)\\,dx";
    document.eq3.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "v=\\int\\,e^{";
    xprintfraction(0,fra);
    outpstr = outpstr+"x}dx=";
    fa = new fraction(fra.denom,fra.num);
    xprintfraction(0,fa);
    outpstr = outpstr+"e^{"
    xprintfraction(0,fra);
    outpstr = outpstr+"x}";
    document.eq4.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Cont1.value="Go to next step.";
}

function writeEqn5()
{
    if ( step==0 )
    {
        partial_int(type,0);
	document.eq5.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	step = step+1;
	return;
    }
    if ( step==1 )
    {
        partial_int(type,1);
	document.eq5.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	step = step+1;
	document.derivative.Cont2.value="Go to next step.";
	outpstr = "";
	print_integral(1-type);
	document.simple.reloadFromTeXString('$$'+outpstr+'$$');
    }
}


function WriteEqn6n7()
{
    if ( step!=2 )
        return;
    outpstr = "u="+sincos[1-type];
    xprintfraction(0,frb);
    outpstr = outpstr+"x)";
    document.eq6.reloadFromTeXString('$$'+outpstr+'$$');
    outpstr = "dv=e^{";
    xprintfraction(0,fra);
    outpstr = outpstr+"x}";
    document.eq7.reloadFromTeXString('$$'+outpstr+'$$');
    document.derivative.Cont3.value="Go to next step.";
}

function writeEqn8n9()
{
    if ( step!=2 )
        return;
    outpstr = "du=";
    if ( type==0 )
        frb.num = -frb.num;
    xprintfraction(0,frb);
    if ( type==0 )
        frb.num = -frb.num;
     outpstr = outpstr+sincos[type];
     xprintfraction(0,frb);
     outpstr = outpstr+"x)\\,dx";
     document.eq8.reloadFromTeXString('$$'+outpstr+'$$');
     outpstr = "v=";
     fa = new fraction(fra.denom,fra.num);
     xprintfraction(0,fa);
     outpstr = outpstr+"e^{";
     xprintfraction(0,fra);
     outpstr = outpstr+"x}";
     document.eq9.reloadFromTeXString('$$'+outpstr+'$$');
     document.derivative.Cont4.value="Go to next step.";
}

function writeEqn10()
{
    if ( step<2 )
        return;
    if ( step==2 )
    {
        partial_int(1-type,0);
	document.eq10.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	step = step+1;
	return;
    }
    if ( step==3 )
    {
        partial_int(1-type,1);
	document.eq10.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	document.derivative.Cont5.value="Go to next step.";
	step = step+1;
    }
}


function writeEqn11()
{
    if ( step<4 )
        return;
    if ( step==4 )
    {
        outpstr = "\\begin{array}{l}";
	print_integral(type);
	outpstr = outpstr+"\\\\=";
	fa = new fraction(fra.denom,fra.num);
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[type];
        xprintfraction(0,frb);
        outpstr = outpstr+"x)";
	fb = new fraction(frb.num,fra.num);
	xprintfraction(2*type-1,fb);
	outpstr = outpstr+"\\left[";
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[1-type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)";
	xprintfraction(1-2*type,fb);
	print_integral(type);
	outpstr = outpstr+"\\right]";
	document.eq11.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	step = step+1;
	return;
    }
    if ( step==5 )
    {
        outpstr = outpstr+"\\\\=";
	fa = new fraction(fra.denom,fra.num);
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[type];
        xprintfraction(0,frb);
        outpstr = outpstr+"x)";
	fb = new fraction(frb.num,fra.num*fra.num);
	xprintfraction(2*type-1,fb);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[1-type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)";
	fb.num *= frb.num;
	xprintfraction(-1,fb);
	outpstr = outpstr+"\\color{red}{"
	print_integral(type);
	document.eq11.reloadFromTeXString('$$'+outpstr+"}\\end{array}"+'$$');
	document.derivative.Cont6.value="Go to next step.";
	step = step+1;
    }
}

function writeEqn12()
{
    if ( step==6 )
    {
        outpstr = "\\begin{array}{l}";
        fa = new fraction(fra.num*fra.num+frb.num*frb.num,fra.num*fra.num);
	xprintfraction(0,fa);
	print_integral(type); 
	outpstr = outpstr+"=";
	fa.num = fra.denom;  fa.denom = fra.num;
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)";
	fa.num = frb.num;  fa.denom = fra.num*fra.num;
	xprintfraction(2*type-1,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[1-type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)+C";
	document.eq12.reloadFromTeXString('$$'+outpstr+"\\end{array}"+'$$');
	step = step+1;
	return;
    }
    if ( step==7 )
    {
        outpstr = outpstr+"\\\\";
	print_integral(type);
	outpstr = outpstr+"=";
	fa = new fraction(fra.num,fra.num*fra.num+frb.num*frb.num);
	xprintfraction(0,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)";
	fa.num = frb.num;
        fa.denom = fra.num*fra.num+frb.num*frb.num;
	xprintfraction(2*type-1,fa);
	outpstr = outpstr+"e^{";
	xprintfraction(0,fra);
	outpstr = outpstr+"x}"+sincos[1-type];
	xprintfraction(0,frb);
	outpstr = outpstr+"x)+\\hat{C}";    
	document.eq12.reloadFromTeXString('$$'+outpstr+"\\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.derivative.Cont7.value="Done!";
	step = step+1;
    }
}
