function format_currency(self, val, symbol, grouping, international) {
    if (symbol == null) symbol = true
    var value = parseFloat(val)
    var neg = value < 0;
    value = value.toFixed(self.int_frac_digits)
    var exp = value.length - value.indexOf('.')
    value = value.split('');
    
    result = new Array();
    function build(chr) {
	result.push(chr)
    }
    function next() {
	var ret = value.pop()
	if (ret == '.') return next()
	return ret
    }
    var sign_posn, sep_by_space
    
    var cs_precedes = ((neg && self.n_cs_precedes) ||
		       (!neg && self.p_cs_precedes))
    
    if (neg) 
	sign_posn = self.n_sign_posn
    else
	sign_posn = self.p_sign_posn
    
    if (neg)
	sep_by_space = self.n_sep_by_space
    else
	sep_by_space = self.p_sep_by_space
    
    if (grouping)
	grouping = self.mon_grouping.split(',')
    else
	grouping = new Array()
    
    function sign_symbol() {
	if (neg)
	    build(self.negative_sign)
	else
	    build(self.positive_sign)
    }
    
    function currency_symbol() {
	if (symbol) {
	    if (cs_precedes && sep_by_space)
		build(' ')
	    if (international)
		build(self.int_curr_symbol)
	    else
		build(self.currency_symbol)
	    if (!cs_precedes && sep_by_space)
		build(' ')
	}
    }
    if (sign_posn == 0)
	build(')')
    if (sign_posn == 2)
	sign_symbol()
    if (!cs_precedes)
	currency_symbol()
    if (sign_posn == 4)
	sign_symbol()
    for (var i=0; i< self.int_frac_digits; i++) {
	if (value.length) {
	    build(next())
	} else {
	    build('0')
	}
    }
    if (self.int_frac_digits)
	build(self.mon_decimal_point)
    if (!value.length)
	build('0')
    i = 0
    while (value.length) {
	build(next())
	i += 1
	if (grouping && grouping[0] == i && value.length) {
	    i = 0
	    build(self.mon_thousands_sep)
	    if (grouping[-1] != 0)
		grouping.pop(0)
	}
    }
    if (sign_posn == 3)
	sign_symbol()
    if (cs_precedes)
	currency_symbol()
    if (sign_posn == 1)
	sign_symbol()
    if (sign_posn == 0)
	build('(')
    result.reverse()
    return result.join('')
}

function currency(val, symbol, grouping, international) {
    var data = null;
    $.ajax({async:false,
	    cache:true,
	    dataType:'json',
	    url:'/currencies/currency-info/',
	    success: function(rdata) {
		data = rdata;
	    }});
    return format_currency(data, val, symbol, grouping, international);
}
