function Fraction( fraction)
{
  this.add              = fraction_add;
  this.multiply         = fraction_multiply;
  this.resolve          = fraction_resolve;
  this.isValid          = fraction_isValid;
  this.getNumerator     = fraction_getNumerator;
  this.putNumerator     = fraction_putNumerator;
  this.getDenominator   = fraction_getDenominator;
  this.putDenominator   = fraction_putDenominator;
  this.getString        = fraction_getString;
  this.putString        = fraction_putString;
  
  this.getValue         = fraction_getValue;
  
  this.isGreaterThan           = fraction_isGreaterThan;
  this.isGreaterThanOrEqualTo  = fraction_isGreaterThanOrEqualTo;
  this.isLessThan              = fraction_isLessThan;
  this.isLessThanOrEqualTo     = fraction_isLessThanOrEqualTo;
  this.isEqualTo               = fraction_isEqualTo;
  
  this.constructString  = fraction_constructString;
        
  this.fraction         = fraction;
    
  this.numerator        = 0;
  this.denominator      = 1;
  
  if (fraction != "" && fraction != null && typeof(fraction) != "undefined") {
  
      if (typeof(fraction) == "string") {
          this.numerator        = fraction_extractNumerator( fraction);
          this.denominator      = fraction_extractDenominator( fraction);
      }
      
      if ((typeof(fraction) == "object") && (fraction instanceof Fraction)) {
          this.numerator        = fraction.getNumerator();
          this.denominator      = fraction.getDenominator();
      }
  }
  
  this.constructString();
}

function fraction_getNumerator()
{
   return this.numerator;
}

function fraction_putNumerator(obj)
{
   this.numerator = parseInt(obj);
}

function fraction_getDenominator()
{
   return this.denominator;
}

function fraction_putDenominator(obj)
{
   this.denominator = parseInt(obj);
}

function fraction_getString()
{
    return this.fraction;
}

function fraction_putString( obj)
{
    if (obj != "" && obj != null && typeof(obj) != "undefined") {
    
      this.fraction = obj.toString();
  
      if (typeof(obj) == "string") {
          this.numerator        = fraction_extractNumerator( obj);
          this.denominator      = fraction_extractDenominator( obj);
      }
      
      if ((typeof(obj) == "object") && (obj instanceof Fraction)) {
          this.numerator        = obj.getNumerator();
          this.denominator      = obj.getDenominator();
      }
  }
}

function fraction_extractNumerator( obj)
{   
   if (obj == null) return null;
   if (typeof(obj) == "undefined") return null;
         
   var FractionStr  = obj.toString();
   if (FractionStr == "") return null;
      
   var split = FractionStr.split("/");
   if (split == null)      
       return null;
               
   return parseInt(split[0]);
}

function fraction_extractDenominator( obj)
{   
   if (obj == null) return null;
   if (typeof(obj) == "undefined") return null;
         
   var FractionStr  = obj.toString();
   if (FractionStr == "") return null;
   
   // if not fraction present denominator as 1
      
   if (FractionStr.indexOf("/") == -1) return 1;
   
   var split = FractionStr.split("/");
   if (split == null)      
       return null;
               
   return parseInt(split[1]);
}

function fraction_isValid()
{  
  return ((this.denominator > 0) && (this.numerator <= this.denominator)) ? true : false;
}

function fraction_add( oFraction)
{   
  if ((typeof(oFraction) != "object") || !(oFraction instanceof Fraction)) return null;
  
  if (oFraction.isEqualTo(0) == true) return this;
  if (this.isEqualTo(0)      == true) return oFraction;
      
  var fractionTotal = new Fraction();
  
  fractionTotal.numerator   = oFraction.numerator*this.denominator + this.numerator*oFraction.denominator;
  fractionTotal.denominator = oFraction.denominator*this.denominator;  
  
  fractionTotal.constructString();
     
  return fractionTotal;
}

function fraction_multiply( oFraction)
{   
  if ((typeof(oFraction) != "object") || !(oFraction instanceof Fraction)) return null;
      
  var fractionProduct = new Fraction();
  
  fractionProduct.numerator   = oFraction.numerator*this.numerator;
  fractionProduct.denominator = oFraction.denominator*this.denominator;  
  
  fractionProduct.constructString();
     
  return fractionalProduct;
}

// use this to convert fractions eg., 6/9 to 2/3 or 2/4 to 1/2.
function fraction_resolve()
{
  var difference;
  var current1;
  var current2;
  var finished;
  
  if (this.isEqualTo(0) == true) return this;
  
  var resolvedFraction = new Fraction();

  if (this.denominator == this.numerator) {
  
     resolvedFraction.denominator = 1;
     resolvedFraction.numerator   = 1;
     resolvedFraction.constructString();
     return resolvedFraction;
  }

  current1 = this.denominator;
  current2 = this.numerator;
  finished = false;
  
  difference = Math.abs(current1 - current2);

  while (((difference < current1) || (difference < current2)) && !finished) {

          if (((current1 % difference) == 0) && ((current2 % difference) == 0)) {
                current1 = current1 / difference;
                current2 = current2 / difference;
                finished = true;
          }      
          else {
  
                if (current1 > current2) 
                    current1 = difference;
                else
                    current2 = difference;
                difference = Math.abs(current1 - current2)
          }
  }
   
  resolvedFraction.denominator = this.denominator / difference;
  resolvedFraction.numerator   = this.numerator / difference;
  
  resolvedFraction.constructString();
  
  return resolvedFraction;
}

function fraction_isGreaterThan( obj)
{
  var num = eval(obj.toString());
  
  if (isNaN(num) == true) num = 0;
   
  var fraction = eval(this.fraction);
  
  if (isNaN(fraction) == true) fraction = 0;
  
  return (fraction > num) ? true : false;
}

function fraction_isGreaterThanOrEqualTo( obj)
{
  var num = eval(obj.toString());
  
  if (isNaN(num) == true) num = 0;
   
  var fraction = eval(this.fraction);
  
  if (isNaN(fraction) == true) fraction = 0;
  
  return (fraction >= num) ? true : false;
}

function fraction_isLessThan( obj)
{
  var num = eval(obj.toString());
  
  if (isNaN(num) == true) num = 0;
   
  var fraction = eval(this.fraction);
  
  if (isNaN(fraction) == true) fraction = 0;
  
  return (fraction < num) ? true : false;
}

function fraction_isLessThanOrEqualTo( obj)
{
  var num = eval(obj.toString());
  
  if (isNaN(num) == true) num = 0;
   
  var fraction = eval(this.fraction);
  
  if (isNaN(fraction) == true) fraction = 0;
  
  return (fraction <= num) ? true : false;
}

function fraction_isEqualTo( obj)
{
  var num = eval(obj.toString());
  
  if (isNaN(num) == true) num = 0;
   
  var fraction = eval(this.fraction);
  
  if (isNaN(fraction) == true) fraction = 0;
  
  return (fraction == num) ? true : false;
}

function fraction_constructString()
{  
  this.fraction = this.numerator + "/" + this.denominator;
}

function fraction_getValue()
{
  if (this.fraction == "" || typeof(this.fraction) == "undefined") this.fraction = "0";
  return eval(this.fraction); 
}