﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("WebControls");

// This 'element' here should be the inputEl
WebControls.NumericInput = function(element) {
    WebControls.NumericInput.initializeBase(this, [element]);
    
}

WebControls.NumericInput.prototype = {
    initialize: function() {
        WebControls.NumericInput.callBaseMethod(this, 'initialize');

        // alert("init textInput");
        var that = this;

    },
    dispose: function() {
        //Add custom dispose actions here
        WebControls.NumericInput.callBaseMethod(this, 'dispose');
    },
    
    get_value: function() {
        var valueStr = this._element.value;
        if (valueStr == '') {
            return null;
        } else {
            // Remove commas
            while (valueStr.indexOf(",") > -1) {
                valueStr = valueStr.replace(",", "");
            }

            // Remove %s
            while (valueStr.indexOf("%") > -1) {
                valueStr = valueStr.replace("%", "");
            }

            if (this._isPercentage) {
                return parseFloat(valueStr) / 100;
            } else {
                return parseFloat(valueStr);
            }
        }
    },

    set_value: function(value) {
        if (value == null || isNaN(value)) {
            this._element.value = "";
        } else {
            if (this._isPercentage) {
                this._element.value = this.formatForView("" + value * 100);
            } else {
                this._element.value = this.formatForView("" + value);
            }
        }
    },

    isValid: function() {


        var valid = true;

        // Invalidate if no text entered 
        var number = this.get_value();
        if ((number == null || isNaN(number)) && !this._allowBlankEntry) {
            return valid = false;
        }
         if ((number == null || isNaN(number)) && this._allowBlankEntry) {
            return valid = true;
        }
        
        if (number.toString().match("e") ) {
            valid = false;
        }
        var numDigitsAllowedBeforeDP = this._maxDigits - this._dps;
        var numString = number.toString().replace("-", "");
        var numDigitsBeforeDP =
            (numString.indexOf(".") == -1) ? numString.length : numString.indexOf(".");

        if (numDigitsBeforeDP > numDigitsAllowedBeforeDP) {
            valid = false;
        }
     


        return valid;

    },

    isCharAllowed: function(keyChar) {
        if (
            (
                (keyChar >= '0' && keyChar <= '9')
              || keyChar == '.'
              || keyChar == ','
              || keyChar == '-'
              || (this._isPercentage && keyChar == '%')
            )
        ) {
            return true;
        } else {
            return false;
        }

    },

    onBlur: function() {
        var value = this.formatForView(this._element.value);

        if (value == null) {
            this._element.value = "";
        } else {
            this._element.value = value;
        }
    },

    anyRealNumberWithSetNumberDecimals: function(value, min, max) {
        //Accepts number with decimal but it must have at least the min and at most the max places after the decimal
        var re = new RegExp("^-?\\d+\\.\\d{" + min + "," + max + "}?$");
        return re.test(value);
    },
    Decimals: function(x, dec_sep) {
        var tmp = new String();
        tmp = x;
        if (tmp.indexOf(dec_sep) > -1)
            return tmp.length - tmp.indexOf(dec_sep) - 1;
        else
            return 0;
    },

    formatForView: function(value) {
        var number = value;

        if (number == null || number == '') {
            return "";
        }

        // Remove commas
        while (number.indexOf(",") > -1) {
            number = number.replace(",", "");
        }

        if (this._isPercentage) {
            return formatPercentage(number, this._dps);
        } else {
            if (isNaN(number)) {
                return "";
            }

            return formatNumber(number, this._dps, this._noCommas);

        }


    }
}

WebControls.NumericInput.createProperty("dps");
WebControls.NumericInput.createProperty("isPercentage");
WebControls.NumericInput.createProperty("noCommas");
WebControls.NumericInput.createProperty("minimumValue");
WebControls.NumericInput.createProperty("maximumValue");
WebControls.NumericInput.createProperty("maxDigits");
WebControls.NumericInput.createProperty("allowBlankEntry");

WebControls.NumericInput.registerClass('WebControls.NumericInput', WebControls.BaseInput);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

function formatNumber(number, dps, noCommas) {
    if (number == null) {
        return "";
    }
   
    
    if(noCommas)
    {
        return parseFloat(number).toFixed(dps);
    }else
    {
        return RComma(parseFloat(number).toFixed(dps));
    }
}

//function formatNumberForView(number, dps) {
//    var formattedNumber = formatNumber(number, dps);
//    if (number < 0) {
//        formattedNumber = formattedNumber.replace("-", "");
//        formattedNumber = '<span style="color: #FF0000">(' + formattedNumber + ')</span>';
//    }
//    return formattedNumber;
//}

function formatPercentage(number, dps) {
    
    return RComma((parseFloat(number)).toFixed(dps)) + "%";
}

// Taken from a website (http://www.merlyn.demon.co.uk/js-maths.htm#ITSep)
function RComma(S) {
  S = String(S)
  var RgX = /^(.*\s)?([-+\u00A3\u20AC]?\d+)(\d{3}\b)/
  return S == (S=S.replace(RgX, "$1$2,$3")) ? S : RComma(S)
}


if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();