/*********************************************************************
 * Copyright (C) 2000 CommNav, Inc. 
 *              All Rights Reserved 
 * 
 *       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF CommNav, Inc. 
 *  Refer to the CommNav License Agreement for Terms of use. 
 * 
 * File         : $RCSfile: cnMath.js,v $
 * Author       : Ryan Bohn <rbohn@commnav.com>
 * Date         : January 16 2002
 * Revision     : $Revision: 1.3 $
 * Modified     : $Id: cnMath.js,v 1.3 2002/11/05 21:50:33 bmiller Exp $
 * Description  : javascript math functions 
 *              
 */
    cnMathJS = 1;

    /**
     * @author  rbohn@commnav.com  Ryan Bohn
     * @date    Wed Jan 16 11:15:43 EST 2002 
     * @param   inVal1 - number
     * @param   inVal2 - number
     * @return  the sum of the two numbers 
     * 
     * note: this is used in conjuction with cnMultiply because of 
     *  javascript's precision problem, It does NOT handle decimals
     */
    function cnAdd(inVal1, inVal2) {
        var strVal1 = new String(inVal1);
        var strVal2 = new String(inVal2);
        var result = "";
        var temp = "0";
    
        var i = 0;
        var index1 = strVal1.length - 1;
        var index2 = strVal2.length - 1;
        var index = 0;
    
        var carry = 0;
        
        if (index1 > index2) {
            strVal2 = cnPrepend(index1 - index2, "0", strVal2);
            index = index1;
        }
        else {
            strVal1 = cnPrepend(index2 - index1, "0", strVal1);
            index = index2;
        }
    
        for (i = index; i >= 0; i--) {
            temp = carry + new Number(strVal1.charAt(i)) + new Number(strVal2.charAt(i));
            if (temp > 9) {
                temp = new String(temp);
                carry = new Number(temp.charAt(0));
                result = temp.charAt(1) + result;
            }
            else {
                carry = 0;
                result = temp.toString() + result;
            }
             
        }
    
        if (carry > 0) {
            result = carry + result;
        }
    
        return new Number(result);
    } // end cnAdd

    /**
     * @author  rbohn@commnav.com  Ryan Bohn
     * @date    Wed Jan 16 11:18:17 EST 2002 
     * @param   inVal1 - number
     * @param   inVal2 - number
     * @return  product of the two numbers
     */
    function cnMultiply(inVal1, inVal2) {
        inVal1 = new Number(inVal1);
        inVal2 = new Number(inVal2);
        var decIndex1;
        var decIndex2;
        var dpd1 = 0;
        var dpd2 = 0;
        var dpd = 0;
        var carry = 0;
        var i = 0;
        var j = 0;
        var m;
        var temp;
        var result = "";
        var result2 = "";
        var count = 0;
        var neg1 = 1;
        var neg2 = 1;


        if (inVal1 < 0) {
            inVal1 *= -1;
            neg1 = -1;
        }

        if (inVal2 < 0) {
            inVal2 *= -1;
            neg2 = -1;
        }

        var strVal1 = new String(inVal1);
        var strVal2 = new String(inVal2);

        if (strVal1.indexOf("e") >= 0) {
            return inVal1 * inVal2;
        }

        if (strVal2.indexOf("e") >= 0) {
            return inVal1 * inVal2;
        }
    
        decIndex1 = strVal1.indexOf(".");
        decIndex2 = strVal2.indexOf(".");
    
        if (decIndex1 >= 0) {
            dpd1 = strVal1.length - decIndex1 - 1;
            strVal1 = strVal1.substring(0, decIndex1) + strVal1.substring(decIndex1 + 1, strVal1.length);
        }
    
        if (decIndex2 >= 0) {
            dpd2 = strVal2.length - decIndex2 - 1;
            strVal2 = strVal2.substring(0, decIndex2) + strVal2.substring(decIndex2 + 1, strVal2.length);
        }
    
        dpd = dpd1 + dpd2;
        
        for (i = (strVal2.length - 1); i >= 0; i--) {
            m = new Number(strVal2.charAt(i));
    
            for (j = (strVal1.length - 1); j >= 0; j--) {
                temp = new Number(strVal1.charAt(j)) * m + carry;
                if (temp > 9) {
                    temp = new String(temp);
                    carry = new Number(temp.charAt(0));
                    result2 = temp.charAt(1) + result2;
                }
                else {
                    carry = 0;
                    result2 = temp.toString() + result2;
                }
            }
    
            result2 = cnAppend(count, "0", result2);
            if (carry > 0) {
                result2 = carry + result2;
            }
            carry = 0;
            result = new String(cnAdd(result, result2));
            result2 = "";
            count++;
        }
    
        if (dpd > 0) {
            result = result.substring(0, result.length - dpd) + "."
                        + result.substring(result.length - dpd, result.length);
        }


        return (new Number(result) * neg1 * neg2);
    } // end cnMultiply

    /**
     * @author  rbohn@commnav.com  Ryan Bohn
     * @date    Wed Jan 16 11:20:37 EST 2002 
     * @param   inQty - number of characters to prepend
     * @param   inChar - character to prepend
     * @param   inString - string to use
     * @return  return string with prepend chars 
     */
    function cnPrepend(inQty, inChar, inString) {
        var i = 0;
    
        for (i = 0; i < inQty; i++) {
            inString = inChar + inString;
        }
    
        return inString;
    } // end cnPrepend

    /**
     * @author  rbohn@commnav.com  Ryan Bohn
     * @date    Wed Jan 16 11:21:35 EST 2002 
     * @param   inQty - number of characters to append
     * @param   inChar - character to append
     * @param   inString - string to use
     * @return  return string with appended chars
     */
    function cnAppend(inQty, inChar, inString) {
        var i = 0;
    
        for (i = 0; i < inQty; i++) {
            inString = inString + inChar;
        }
    
        return inString;
    } //end cnAppend

