function RtoQ(dblDecimal){
/*	Returns the fractional representation of dblDecimal 
	or dblDecimal if conversion is not possible (i.e. 3.5 -> 3 1/2).
*/
    var LIMIT = 32;
    var dblFraction;
    var dblNumerator;
    var intDenominator;
    var intPos;
    var intBase;
    var strBase='';
    
    dblNumerator = 0;
    intDenominator = 2;

    intBase = Math.floor(dblDecimal) 

    if (intBase == 0)
        intPos = 0;
    else if ((intBase >= 1) && (intBase < 10))
        intPos = 1; 
    else if ((intBase >= 10) & (intBase < 100))
        intPos = 2;
    else
        return dblDecimal;

    if (intBase > 0)
    	strBase = intBase + " ";

    dblFraction = dblDecimal.substr(intPos);
   
    while (intDenominator <= LIMIT)
    {        
        if (dblFraction % (1 / intDenominator) == 0)
	{
            dblNumerator = dblFraction * intDenominator;
            break;
        }
            intDenominator = intDenominator * 2;
    }
    
    if (dblNumerator != 0)
        return strBase + dblNumerator + "/" + intDenominator;
    else
        return dblDecimal;

}
function QtoR(q){
/*      Returns the decimal representation of q 
        or null if q is not a number (i.e. 3 1/2 -> 3.5, abdc -> null) 
*/      
        var re = /[^\s]+/g;
        var reInvalidChar = /[^\d^\/^\.^\s]/g;
        var reDigits = /^\d+$/; 
        var reFraction = /^\d+\/\d+$/; 
        var tokens = q.match(re);       
        var num1=null;  
        var invalidTokens = q.match(reInvalidChar);     
        if (invalidTokens) 
                return null;
        
        if (tokens){
                if (tokens.length ==1){         
                        if (!isNaN(eval(tokens[0])))
                                num1 = eval(tokens[0]);                 
                } else if (tokens.length ==2) {
                        if (!(reDigits.test(tokens[0])) || !(reFraction.test(tokens[1]))) 
                                return null; /* token 1 must be an integer, token 2 must be of format int/int */
                        if (!isNaN(eval(tokens[0])) && !isNaN(eval(tokens[1])))
                                num1 = eval(tokens[0]) +  eval(tokens[1]);              
                }       
        }
        return num1;
}       

