/*
 * Calculator Support Library
 * Requires JQuery
 *
 * Copyright 2009 Squawkfox.
 * All rights reserved.
 */


var Validation = function() {

    return {
        validatePercent: function(value) {
/*                             
            if (!Validation.validateNumeric(value)) {
                return false;
            }

            return value >= 0 && value <= 1;
*/
            return Validation.validateNumeric(value);
        },

        validatePositive: function(value) {
            if (!Validation.validateNumeric(value)) {
                return false;
            }

            return value > 0;
        },

        validateNumeric: function(value) {
            return !isNaN(value);
        },

        /*
         * Set class on object as needed.
         */
        validate: function(id, invalidClassName, validator) {
            var valid = validator(NumberFormatting.parseNumericFromObject(id));
            if (valid) {
                jQuery(id).removeClass(invalidClassName);
            }
            else {
                jQuery(id).addClass(invalidClassName);
            }
        }

    };
}();



var NumberFormatting = function() {

    return {

        /*
         * Parse a percentage.
         * Values greater than 1 are treated as fractional, and returned divided by 100.
         */
        parsePercent: function(value) {
            var p = NumberFormatting.parseNumeric(value);
            if (isNaN(p)) {
                return p;
            }

            if (p > 1 || p < -1) {
                return p / 100;
            }

            return p;
        },

        parsePercentFromObject: function(id) {
            return NumberFormatting.parsePercent(jQuery(id).val());
        },

        /*
         * Parse a number, stripping formatting (commas, dollars, etc.)
         * Returns NaN if invalid.
         * If the string contains a percent sign, value is divided by 100.
         */
        parseNumeric: function(value) {

            if (value == null) {
                return Number.NaN;
            }

            var stringValue = value.toString();

            if (stringValue.length == 0) {
                return Number.NaN;
            }

            var isPercent = (stringValue.indexOf("%") != -1);

            var num = stringValue.replace(/\$|\,|%/g,'') * 1.0;
            if (isPercent) {
                num = num / 100;
            }
            
            return num;
        },

        parseNumericFromObject: function(id) {
            return NumberFormatting.parseNumeric(jQuery(id).val());
        },

        /*
         * Format a percentage as a string.
         * ex. 0.246 --> "24.6%"
         */
        formatPercent: function(value) {
            if (isNaN(num)) {
                return "?";
            }

            return (num * 100).toString() + "%";
        },

        /*
         * Format a number as a currency string.
         */
        formatCurrency: function(value) {
            
            var num = value.toString().replace(/\$|\,/g,'');

            if(isNaN(num)) {
                num = "0";
            }

            sign = (num == (num = Math.abs(num)));
            num = Math.floor(num*100+0.50000000001);
            cents = num%100;
            num = Math.floor(num/100).toString();
            if (cents < 10) {
                cents = "0" + cents;
            }
            for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
                num = num.substring(0,num.length-(4*i+3))+','+
                    num.substring(num.length-(4*i+3));
            }
            return (((sign)?'':'-') + '$' + num + '.' + cents);
        },


        formatMonths: function(value) {
            if (isNaN(value)) {
                return "0";
            }

            var years = Math.floor(value / 12);
            var months = value - (12 * years);

            var result = "";

            if (years > 0) {
                result += years.toString() + " year";
            }
            if (years > 1) {
                result += "s ";
            }
            else {
                result += " ";
            }

            result += months.toString() + " month";
            if (months != 1) {
                result += "s";
            }

            return result;
        },

        /*
         * Round number to given decimals.
         */
        round: function(value, decimals) {
            var exponent = Math.pow(10, decimals);
            return (Math.round(value * exponent) / exponent);
        }
    };
}();



