function Money()
{
    this.decimalSeparator = '';
    this.threeDigitSeparator = '';
    this.precision = 0;

    this.addThreeDigitSeparator = function (number)
    {
        var numberLength = number.length;
		
        // jika tidak perlu diberi titik karena digitnya kurang dari 4
        if ( numberLength < 4 )
        {
            return number;
        }
        // jika perlu diberi titik
        else
        {
            // cari banyaknya jumlah titik yang diperlukan
            var numOfDot = Math.floor(numberLength/3);
			
            if ( numberLength % 3 == 0 )
            {
                numOfDot--;
            }

            // tambahkan titik pertama (titik paling kanan)
            var numberMoney = this.threeDigitSeparator + number.substr(numberLength-3, 3);
			
            // tambahkan titik2 selanjutnya
            for (var count = 1; count < numOfDot; count++)
            {
                numberMoney = this.threeDigitSeparator + number.substr(numberLength-(3*(count+1)), 3) + numberMoney;
            }
		
            var head = numberLength%3;

            // jika angka di sebelah kiri dari titik paling kiri ada 3 digit
            if (head == 0)
            {
                numberMoney = number.substr(0, 3) + numberMoney;
            }
            // jika angka di sebelah kiri dari titik paling kiri ada 1 atau 2 digit
            else
            {
                numberMoney = number.substr(0, head) + numberMoney;
            }

            return numberMoney;
        }
    }
	
    /**
	 * Fungsi untuk merepresentasikan nilai bilangan dalam format uang
	 *
	 * @param int $string bilangan riil
	 * @return string $money representasi bilangan dalam format uang
	 */
    this.display = function (string, showMinus, noAddDecimal)
    {
        string = String(string);
        
        if (!showMinus)
        {
            showMinus = false;
        }

        var money;

        // jika variabel $string empty
        if (string == null || string.length == 0 || string == "0")
        {
            money = '0' + this.decimalSeparator;
			
            for (var counter=0; counter < this.precision; counter++)
            {
                money += '0';
            }

            return money;
        }
        // jika variabel $string tidak empty
        else
        {

            // jika bilangan memiliki digit desimal
            var hasDecimalPattern = /\./;
            if ( hasDecimalPattern.test(string) )
            {
                this.precision = 2;
                this.decimalSeparator = '.';
                this.threeDigitSeparator = ',';

                var decimalDigitsPattern = /\.(\d+)$/;
                var decimal = decimalDigitsPattern.exec(string);
                //                                alert(decimal)
                var numOfDecimalDigit = decimal[1].length;
                // jika nilai desimal pada bilangan panjangnya kurang dari PRESISI maka ditambahkan 0 sejumlah kekurangannya
                if ( numOfDecimalDigit < this.precision )
                {
                    for (var counter=numOfDecimalDigit; counter < this.precision; counter++)
                    {
                        decimal[1] += '0';
                    }
                }
                else if( numOfDecimalDigit > this.precision )
                {
                    decimal[1] = decimal[1].substr(0, this.precision);
                }else if(numOfDecimalDigit == this.precision){
                    decimal[1] = decimal[1];
                }

                // jika bilangan memiliki tanda negatif
                var hasNegativeSignPattern = /^-/;
                if ( hasNegativeSignPattern.test(string) )
                {
                    var integerDigitsPattern = /^-(\d+)\./;
                    var integer = integerDigitsPattern.exec(string);
					
                    if ( showMinus )
                    {
                        return '-' + this.addThreeDigitSeparator(integer[1]) +  this.decimalSeparator + decimal[1];
                    }
                    else
                    {
                        return '(' + this.addThreeDigitSeparator(integer[1]) +  this.decimalSeparator + decimal[1] + ')';
                    }
                }
                // jika bilangan tidak memiliki tanda negatif
                else
                {
                    var integerDigitsPattern = /^(\d+)\./;
                    var integer = integerDigitsPattern.exec(string);
                    //                                        alert((this.addThreeDigitSeparator(integer[1]) +  this.decimalSeparator + decimal[1]));
                    return this.addThreeDigitSeparator(integer[1]) +  this.decimalSeparator + decimal[1];
                }
            }
            // jika bilangan tidak memiliki digit desimal
            else
            {
                this.precision = 0;
                this.decimalSeparator = '';
                this.threeDigitSeparator = '.';

                money = '';
                // jika bilangan tersebut memiliki tanda negatif
                var hasNegativeSignPattern = /^-/;
                if ( hasNegativeSignPattern.test(string) )
                {
                    if ( showMinus )
                    {
                        money = '-' + this.addThreeDigitSeparator( string.substr(1, string.length-1) ) + this.decimalSeparator;
                    }
                    else
                    {
                        money = '(' + this.addThreeDigitSeparator( string.substr(1, string.length-1) ) + this.decimalSeparator;

                        for (var counter=0; counter < this.precision; counter++)
                        {
                            money += '0';
                        }

                        return money + ')';
                    }
                }
                // jika bilangan tersebut tidak memiliki tanda negatif
                else
                {
                    money = this.addThreeDigitSeparator( string ) + this.decimalSeparator;
                }

                for (var counter=0; counter < this.precision; counter++)
                {
                    money += '0';
                }

                return money;
            }
        }
    }

    /**
	* TO DO: masih perlu dikembangkan karena belum lengkap
	*/
    this.parseMoney = function(moneyString)
    {
        var hasThreeDigitSeparatorPattern = /\./;
		
        if ( hasThreeDigitSeparatorPattern.test(moneyString) )
        {
            return parseInt( moneyString.gsub(hasThreeDigitSeparatorPattern, '') );
        }
        else
        {
            return parseInt(moneyString);
        }
    }
}

var money = new Money();

function AjaxJSONEvaluator()
{
    this.eval = function(transport)
    {
        // baca response
        var response = transport.responseText;
        re = /(<!--.*-->)$/;
        // filter konten response non JavaScript
        response = response.gsub(re, '');
        // evaluasi script
        var jsonObj = eval("(" + response + ")");

        return jsonObj;
    }
}

var ajaxJSONEvaluator = new AjaxJSONEvaluator();

function AjaxIndicator( ajaxIndicatorId )
{
    this.ajaxIndicatorId = ajaxIndicatorId;
    this.ajaxIndicator = $(ajaxIndicatorId);
    this.showIndicator = function()
    {
        this.ajaxIndicator.show();
    };
    this.hideIndicator = function()
    {
        this.ajaxIndicator.hide();
    };
}
