var oldPosition = null;
var calculatorObj = {
    sRegex: eval("/\\./g"),
    bsmv: 0,
    calcType: 1,
    _month: null,
    _interest: null,
    _perMonth: null,
    _total: null,
    _ratios: null,

    setElements: function(monthElement, interestElement, perMonthElement, totalElement, ratios, calcType) {
        if (monthElement) this._month = monthElement;
        if (interestElement) this._interest = interestElement;
        if (perMonthElement) this._perMonth = perMonthElement;
        if (totalElement) this._total = totalElement;

        this._ratios = ratios;
        if (calcType)
            this.calcType = calcType;
        else
            this.calcType = 1;
    },

    setCreditPlan: function(manualRatio) {
        manualRatio = typeof (manualRatio) != 'undefined' ? manualRatio : false;
        var k = this._month.value;
        for (var i = 0; i < this._ratios.length; i++) {
            if (k <= this._ratios[i]['month']) {
                this._interest.value = this._ratios[i].ratio;
                break;
            }
        }
        this.recalcRatio(manualRatio);
        this.display();
    },

    recalcRatio: function(rat) {
        var k = this._month.value;
        for (var i = 0; i < this._ratios.length; i++) {
            if (k <= this._ratios[i]['month'] * 1) {
                if (this._ratios[i].ratio.toString().length < 4) {
                    this._interest.value = (rat) ? rat : this._ratios[i].ratio + "0";
                }
                else {
                    this._interest.value = (rat) ? rat : this._ratios[i].ratio;
                }
                break;
            }
        }
    },

    display: function() {
        var month = this._month.value;
        var interest = this._interest.value;
        var interest2 = ((interest / 100) * (1 + this.bsmv));
        if (this.calcType == 1) {
            var total = this.regReplace(this._total.value);
            var perMonth = (this.regReplace(total) * Math.pow((1 + interest2), (month)) * interest2) / (Math.pow((1 + interest2), (month)) - 1)
            this._perMonth.value = this.numberFormat(Math.round(perMonth).toString(), 0, false, false, true);
        } else {
            var perMonth = this.regReplace(this._perMonth.value);
            var total = perMonth * (Math.pow((1 + interest2), (month)) - 1) / (Math.pow((1 + interest2), (month)) * interest2);
            this._total.value = this.numberFormat(Math.round(total).toString(), 0, false, false, true);
        }
    },

    regReplace: function(org) {
        return org.replace(this.sRegex, '');
    },

    getSelectionStart: function(o) {
        if (o.createTextRange) {
            var r = document.selection.createRange().duplicate()
            r.moveEnd('character', o.value.length)
            if (r.text == '') return o.value.length
            return o.value.lastIndexOf(r.text)
        } else return o.selectionStart
    },

    setCaretTo: function(obj, pos) {
        if (obj.createTextRange) {
            var range = obj.createTextRange();
            //range.move("character", (pos % 3) == 1 ? pos + 1 : pos);
            range.move("character", obj.value.length > 3 ? pos + 1 : pos);
            range.select();
        } else if (obj.selectionStart) {
            obj.focus();
            obj.setSelectionRange(pos, pos);
        }
    },

    numberFormat: function(item, decimalNumber, zero, parent, boolean) {
        var ku = typeof (item) == 'string' ? item : item.value;
        number = this.regReplace(ku);
        if (typeof (item) != 'string') {
            oldPosition = this.getSelectionStart(item);
        }
        var templateNumber = parseInt(number);
        var iSign = number < 0 ? -1 : 1;
        templateNumber *= Math.pow(10, decimalNumber);
        templateNumber = Math.round(Math.abs(templateNumber))
        templateNumber /= Math.pow(10, decimalNumber);
        templateNumber *= iSign;
        var returnNumber = new String(templateNumber);
        if (!zero && number < 1 && number > -1 && number != 0)
            if (number > 0)
            returnNumber = returnNumber.substring(1, returnNumber.length);
        else
            returnNumber = "-" + returnNumber.substring(2, returnNumber.length);

        if (boolean && (number >= 1000 || number <= -1000)) {
            var iStart = returnNumber.indexOf(".");
            if (iStart < 0)
                iStart = returnNumber.length;
            iStart -= 3;
            while (iStart >= 1) {
                returnNumber = returnNumber.substring(0, iStart) + "." + returnNumber.substring(iStart, returnNumber.length)
                iStart -= 3;
            }
        }
        if (parent && number < 0)
            returnNumber = "(" + returnNumber.substring(1, returnNumber.length) + ")";

        if (returnNumber == 'NaN')
            returnNumber = '';
        return returnNumber;
    }
};


