/*************************
 * Rational number class *
 * --------------------- *
 *************************

new Rational(n,d)
[String].toRational("n/d")
[Rational].toString()
[Rational].valueOf()

[Rational].minus()
[Rational].inverse()

Rational.add(a,b)
Rational.multiply(a,b)
Rational.divide(a,b)

*/
 
String.prototype.toRational = function() {
    var a = this.split("/");
    numerator = parseInt(a[0]);
    if ( !numerator ) {
	numerator = 0;
    }
    denominator = parseInt(a[1]);
    if ( denominator ) {
        return new Rational(numerator,denominator);
    } else {
	return new Rational(numerator,1);
    }
};

function Rational(numerator,denominator) {
    var g;
    
    if ( denominator < 0 ) {
        numerator = -numerator;
	denominator = -denominator;
    }
    
    g = Rational.gcd(Math.abs(numerator),denominator);
    
    this.n = numerator/g;
    this.d = denominator/g;
}

Rational.gcd = function(x,y) {
    var temp;
    
    while ( x ) {
	temp = y%x;
	y = x;
	x = temp;
    }
    return y;
      
/*    
    if ( x == 0 ) {
        return y;
    } else {
	return Rational.gcd(y%x,x);
    }
*/

};

Rational.prototype.toString = function() {
    if ( this.d == 1 ) {
        return this.n.toString();
    } else {
	return this.n.toString() + "/" + this.d.toString();
    }
};

Rational.prototype.valueOf = function() {
    return this.n / this.d;
}

Rational.multiply = function(q1,q2) {
    return new Rational ( q1.n * q2.n, q1.d * q2.d );
};

Rational.add = function(q1,q2) {
    return new Rational ( q1.n * q2.d + q1.d * q2.n, q1.d  * q2.d );
};

Rational.prototype.minus = function() {
    return new Rational ( -this.n,this.d );
}

Rational.prototype.inverse = function() {
    return new Rational ( this.d,this.n );
}

Rational.divide = function(q1,q2) {
    return new Rational ( q1.n * q2.d, q1.d * q2.n );
}

