// $Id: util.js 86 2008-12-12 03:15:20Z x2iiinf $
// Copyright (c) 2004 Kurt M. Brown, x2ii.info.
// This file is subject to the terms and conditions of the GNU General Public
// License. See the file COPYING for more details.

xi.byAnonId = function(binding, id)
{
    return document.getAnonymousElementByAttribute(binding, 'anonid', id);
}
xi.dprint = function()
{
    var out = '';
    for (var i = 0; i < arguments.length - 1; ++i)
        out += arguments[i] + ',';
    out += arguments[i] + '\n';
    dump(out);
    return out;
}
xi.pprint = function(obj)
{
    var res = '';
    if (res.hasOwnProperty('toString'))
        res = obj.toString();
    else {
        for (var i in obj) {
            try {
                if (typeof(obj[i]) != 'function')
                    res += i + ' => ' + obj[i] + '\n';
            }
            catch(e) {
                res += i + ' => <<not implemented>>\n';
            }
        }
    }
    dump(res);
    return res;
}
xi.isEmpty = function(str)
{
   if (str == null || str == undefined || str.length == 0)
        return true;
   for (var i = 0 ; i < str.length; i++) {
      if (str.charAt(i) != ' ')
            return false;
   }
   return true;
}
xi.error = function(origin, msg)
{
    var out = 'error@' + origin + ': ' + msg;
    if (arguments.length > 2) {
        for (var i = 2; i < arguments.length; ++i)
            out += ', ' + arguments[i];
    }
    out += '\n';
    dump(out);
    return out;
}
xi.dumpCallStack = function()
{
    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
    var stack = Components.stack;
    dump(stack + "\n");
    while ((stack = stack.caller) != null)
        dump(stack + "\n");
}
xi.decimalMoney = function(value) {
    var val = parseInt(value, 10);
    if (isNaN(val)) {
        val = 0;
        xi.error('xi.decimalMoney()', 'bad-input');
    }
    return (0.01*val).toFixed(2);
}
xi.money = function(value)
{
    var val = parseInt(value, 10);
    if (isNaN(val)) {
        val = 0;
        xi.error('xi.money()', 'bad-input');
    }
    return xi.addThousandsDelimiters(val < 0, (0.01*val).toFixed(2), ',');
}
xi.addThousandsDelimiters = function(isNeg, value, thousandsDelimiter)
{
    var val = value;
    const offset = isNeg ? 1 : 0;
    const dot = value.indexOf('.');
    const section = value.substring(offset, (dot > -1 ? dot : value.length));
    if (section.length > 3) { // e.g., 1234
        val = isNeg ? value.charAt(0) : '';
        const end = section.length - 3;
        const p1 = end % 3;
        const p2 = p1 == 0 ? 3 : p1;
        val += section.substr(0, p2);
        var i;
        for (i = p2; i <= end; i += 3)
            val += thousandsDelimiter + section.substr(i, 3);
        val += section.substr(i);

        if (dot > -1)
            val += value.substr(dot);
    }
    return val;
}
xi.fireMouseEvent = function(name, target)
{
    var ev = document.createEvent('MouseEvents');
    ev.initEvent(name, true, true);
    return target.dispatchEvent(ev);
}
xi.formatTime = function(when)
{
    return (new Date(1000*when)).toLocaleFormat('%Y-%m-%d %T');
}
xi.nvl = function(obj, prop, value)
{
    return obj.hasOwnProperty(prop) ? obj[prop] : value;
}
xi.round = function(number)
{
    return Math.round(number + 0.00001);
}
xi.roundFixed = function(number, fixed)
{
    var m = Math.pow(10, fixed);
    var n = xi.round(number * m);
    return n/m;
}
xi.secondsToDuration = function(elapsed)
{
    var sign = (elapsed < 0) ? '-' : '';
    elapsed = Math.abs(elapsed);
    var seconds = elapsed % 60;
    if (seconds < 10)
        seconds = '0' + seconds;
    elapsed = Math.floor(elapsed / 60);
    var minutes = elapsed % 60;
    if (minutes < 10)
        minutes = '0' + minutes;
    elapsed = Math.floor(elapsed / 60);

    return sign + elapsed + ':' + minutes + ':' + seconds;
}

