// ] - shortcut utilities

// <pre><nowiki>

// Defines the Shortcuts class.
//   Input is an associative array like this:
//
/*
   s = Shortcuts({
                    'x1'   : 'str 1',
                    'x2 '  : 'str 2', // the space after x2 prevents msg() from displaying this entry
                    'x3,x4': 'str 34' // x3 and x4 are aliases; msg() only displays x3
                });
*/

function Shortcuts(input) {
    if (!(this instanceof Shortcuts)) return new Shortcuts(input);

    this.shortcuts = {};
    for (k in input) {
        var keys = k.toUpperCase().split(',');
        this.shortcuts] = input;
        for (var i=1; i < keys.length; ++i) {
            this.shortcuts] = input + ' ';
        }
    }
}

Shortcuts.prototype.msg = function() {
    var msg = 'Shortcuts available:\n';
    for (var key in this.shortcuts) {
        if (this.shortcuts.match(/ $/)) continue;
        msg += key + ': ' + this.shortcuts + '\n';
    }
    return msg;
}

Shortcuts.prototype.subst = function(word) {
    return trimspaces(this.shortcuts) || word;
}

Shortcuts.prototype.substP = function(word) {
    return Boolean(this.shortcuts);
}

// replace the first word (doesn't require uppercase)
Shortcuts.prototype.substFirstWord = function(msg) {
    if (!msg) return msg;
    if (msg.match(/^(+)(.*)$/)) {
        return this.subst(RegExp.$1) + RegExp.$2;
    }
    return msg;
}

// replace all UPPERCASE words
Shortcuts.prototype.substUppercaseWords = function(msg) {
    if (!msg) return msg;
    var ret = '';
    var m;
    while (msg && (m = msg.match(/^(.*?)\b(+)\b(.*)$/)) ) {
        ret += m + this.subst(m);
        msg = m;
    }

    ret += msg;
    return ret;
}

// replace all words (ignoring case)
Shortcuts.prototype.substWords = function(msg) {
    if (!msg) return msg;
    var ret = '';
    var m;
    while (msg && (m = msg.match(/^(.*?)\b(+)\b(.*)$/)) ) {
        ret += m + this.subst(m);
        msg = m;
    }

    ret += msg;
    return ret;
}

// </nowiki></pre>