\n';
+
+ for (c = 0; c < this.conf.cols; c++) rstr += ' ';
+
+ for (r = 0; r < this.conf.rows; r++) {
+ var termid = (this.globals.hasSubDivs) ? '' : ' id="' + divPrefix + r + '"';
+
+ s += '' + rstr + '<\/td><\/tr>\n';
+ }
+
+ s += '<\/table><\/td><\/tr>\n';
+ s += '<\/table><\/td><\/tr>\n';
+ s += '<\/table>\n';
+
+ var termOffset = 2 + this.conf.frameWidth;
+
+ if (this.globals.hasSubDivs) {
+ for (var r = 0; r < this.conf.rows; r++) {
+ s += '<\/div>\n';
+ }
+
+ this.globals.termStringStart = ' ';
+ this.globals.termStringEnd = '<\/td><\/tr><\/table>';
+ }
+
+ this.globals.writeElement(this.termDiv, s);
+ }
+
+ if (!rebuild) {
+ this.globals.setElementXY(this.termDiv, this.conf.x, this.conf.y);
+ this.globals.setVisible(this.termDiv, 1);
+ }
+ },
+ rebuild: function (){
+ // check for bounds and array lengths
+ var c;
+ var r;
+ var rl = this.conf.rows;
+ var cl = this.conf.cols;
+
+ for (r = 0; r < rl; r++) {
+ var cbr = this.charBuf[r];
+
+ if (!cbr) {
+ this.charBuf[r] = this.getRowArray(cl, 0);
+ this.styleBuf[r] = this.getRowArray(cl, 0);
+ } else if (cbr.length < cl) {
+ for (c = cbr.length; c < cl; c++) {
+ this.charBuf[r][c] = 0;
+ this.styleBuf[r][c] = 0;
+ }
+ }
+ }
+
+ var resetcrsr = false;
+
+ if (this.r >= rl) {
+ r = rl - 1;
+ resetcrsr = true;
+ }
+
+ if (this.c >= cl) {
+ c = cl - 1;
+ resetcrsr = true;
+ }
+
+ if (resetcrsr && this.cursoractive) this.cursorOn();
+
+ // and actually rebuild
+ this._makeTerm(true);
+
+ for (r = 0; r < rl; r++) {
+ this.redraw(r);
+ }
+
+ // clear backup buffer to prevent errors
+ this.backupBuffer = null;
+ },
+ moveTo: function (x, y){
+ this.globals.setElementXY(this.termDiv, x, y);
+ },
+ resizeTo: function (x, y){
+ if (this.termDivReady()) {
+ x = parseInt(x, 10);
+ y = parseInt(y, 10);
+
+ if (isNaN(x) || isNaN(y) || x < 4 || y < 2) return false;
+
+ this.maxCols = this.conf.cols = x;
+ this.maxLines = this.conf.rows = y;
+
+ this._makeTerm();
+ this.clear();
+
+ return true;
+ } else {
+ return false;
+ }
+ },
+ redraw: function (r){
+ var k;
+ var st;
+ var s = this.globals.termStringStart;
+ var curStyle = 0;
+ var tstls = this.globals.termStyles;
+ var tscls = this.globals.termStyleClose;
+ var tsopn = this.globals.termStyleOpen;
+ var tspcl = this.globals.termSpecials;
+ var tclrs = this.globals.colorCodes;
+ var tnclrs = this.globals.nsColorCodes;
+ var twclrs = this.globals.webColorCodes;
+ var t_cb = this.charBuf;
+ var t_sb = this.styleBuf;
+ var blur = this.textBlur;
+ var clr = '';
+ var textColor = this.textColor || '';
+
+ for (var i = 0; i < this.conf.cols; i++) {
+ var c = t_cb[r][i];
+ var cs = t_sb[r][i];
+
+ if (cs != curStyle || (i == 0 && textColor)) {
+ if (curStyle) {
+ if (curStyle & 0xffff00) s += '';
+
+ for (k = tstls.length - 1; k >= 0; k--) {
+ st = tstls[k];
+
+ if (curStyle & st) s += tscls[st];
+ }
+ }
+
+ curStyle = cs;
+
+ for (k = 0; k < tstls.length; k++) {
+ st = tstls[k];
+
+ if (curStyle & st) s += tsopn[st];
+ }
+
+ clr = textColor;
+
+ if (curStyle & 0xff00) {
+ var cc = (curStyle & 0xff00) >>> 8;
+
+ clr = (cc < 16) ? tclrs[cc] : '#' + tnclrs[cc - 16];
+ } else if (curStyle & 0xff0000) {
+ clr = '#' + twclrs[(curStyle & 0xff0000) >>> 16];
+ }
+
+ if (clr) {
+ if (curStyle & 1) {
+ s += '';
+ } else if (typeof blur === 'object') {
+ s += '';
+ } else if (blur) {
+ s += '';
+ } else {
+ s += '';
+ }
+ }
+ }
+
+ s += (tspcl[c]) ? tspcl[c] : String.fromCharCode(c);
+ }
+
+ if (curStyle > 0) {
+ if (curStyle & 0xffff00) s += '';
+
+ for (k = tstls.length - 1; k >= 0; k--) {
+ st = tstls[k];
+
+ if (curStyle & st) s += tscls[st];
+ }
+ }
+
+ s += this.globals.termStringEnd;
+
+ this.globals.writeElement(this.termDiv + '_r' + r, s);
+ },
+ guiReady: function (){
+ var ready = true;
+
+ if (this.globals.guiElementsReady(this.termDiv)) {
+ for (var r = 0; r < this.conf.rows; r++) {
+ if (this.globals.guiElementsReady(this.termDiv + '_r' + r) == false) {
+ ready = false;
+ break;
+ }
+ }
+ } else {
+ ready = false;
+ }
+
+ return ready;
+ },
+ termDivReady: function (){
+ if (document.getElementById) {
+ return (document.getElementById(this.termDiv)) ? true : false;
+ } else if (document.all) {
+ return (document.all[this.termDiv]) ? true : false;
+ } else {
+ return false;
+ }
+ },
+ getDimensions: function (){
+ var object;
+ var w = 0;
+ var h = 0;
+ var d = this.termDiv;
+
+ if (document.getElementById) {
+ object = document.getElementById(d);
+
+ if (object && object.firstChild) {
+ w = parseInt(object.firstChild.offsetWidth, 10);
+ h = parseInt(object.firstChild.offsetHeight, 10);
+ } else if (object && object.children && object.children[0]) {
+ w = parseInt(object.children[0].offsetWidth, 10);
+ h = parseInt(object.children[0].offsetHeight, 10);
+ }
+ } else if (document.all) {
+ object = document.all[d];
+
+ if (object && object.children && object.children[0]) {
+ w = parseInt(object.children[0].offsetWidth, 10);
+ h = parseInt(object.children[0].offsetHeight, 10);
+ }
+ }
+
+ return { width: w, height: h };
+ },
+ // global store for static data and methods (former "TermGlobals")
+ globals: {
+ termToInitialze: null,
+ activeTerm: null,
+ kbdEnabled: false,
+ keylock: false,
+ keyRepeatDelay1: 450, // initial delay
+ keyRepeatDelay2: 100, // consecutive delays
+ keyRepeatTimer: null,
+ lcMorePrompt1: ' -- MORE -- ',
+ lcMorePromtp1Style: 1,
+ lcMorePrompt2: ' (Type: space to continue, \'q\' to quit)',
+ lcMorePrompt2Style: 0,
+ lcMoreKeyAbort: 113,
+ lcMoreKeyContinue: 32,
+ // initialize global data structs
+ _initGlobals: function (){
+ var tg = Terminal.prototype.globals;
+
+ tg._extendMissingStringMethods();
+ tg._initWebColors();
+ tg._initDomKeyRef();
+
+ Terminal.prototype.termKey = tg.termKey;
+ },
+ // hex support (don't rely on generic support like Number.toString(16))
+ getHexChar: function (c){
+ var tg = Terminal.prototype.globals;
+
+ if (tg.isHexChar(c)) return tg.hexToNum[c];
+
+ return -1;
+ },
+ isHexChar: function (c){
+ return !!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
+ },
+ isHexOnlyChar: function (c){
+ return !!((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
+ },
+ hexToNum: {
+ '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,
+ '8': 8, '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15,
+ 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15
+ },
+ // data for color support
+ webColors: [],
+ webColorCodes: [''],
+ colors: {
+ // ANSI bright (bold) color set
+ black: 1,
+ red: 2,
+ green: 3,
+ yellow: 4,
+ blue: 5,
+ magenta: 6,
+ cyan: 7,
+ white: 8,
+ // dark color set
+ grey: 9,
+ red2: 10,
+ green2: 11,
+ yellow2: 12,
+ blue2: 13,
+ magenta2: 14,
+ cyan2: 15,
+ // synonyms
+ red1: 2,
+ green1: 3,
+ yellow1: 4,
+ blue1: 5,
+ magenta1: 6,
+ cyan1: 7,
+ gray: 9,
+ darkred: 10,
+ darkgreen: 11,
+ darkyellow: 12,
+ darkblue: 13,
+ darkmagenta: 14,
+ darkcyan: 15,
+ // default color
+ 'default': 0,
+ clear: 0
+ },
+ colorCodes: [
+ '', '#000000', '#ff0000', '#00ff00', '#ffff00', '#0066ff', '#ff00ff', '#00ffff', '#ffffff',
+ '#808080', '#990000', '#009900', '#999900', '#003399', '#990099', '#009999'
+ ],
+ nsColors: {
+ 'aliceblue': 1, 'antiquewhite': 2, 'aqua': 3, 'aquamarine': 4,
+ 'azure': 5, 'beige': 6, 'black': 7, 'blue': 8,
+ 'blueviolet': 9, 'brown': 10, 'burlywood': 11, 'cadetblue': 12,
+ 'chartreuse': 13, 'chocolate': 14, 'coral': 15, 'cornflowerblue': 16,
+ 'cornsilk': 17, 'crimson': 18, 'darkblue': 19, 'darkcyan': 20,
+ 'darkgoldenrod': 21, 'darkgray': 22, 'darkgreen': 23, 'darkkhaki': 24,
+ 'darkmagenta': 25, 'darkolivegreen': 26, 'darkorange': 27, 'darkorchid': 28,
+ 'darkred': 29, 'darksalmon': 30, 'darkseagreen': 31, 'darkslateblue': 32,
+ 'darkslategray': 33, 'darkturquoise': 34, 'darkviolet': 35, 'deeppink': 36,
+ 'deepskyblue': 37, 'dimgray': 38, 'dodgerblue': 39, 'firebrick': 40,
+ 'floralwhite': 41, 'forestgreen': 42, 'fuchsia': 43, 'gainsboro': 44,
+ 'ghostwhite': 45, 'gold': 46, 'goldenrod': 47, 'gray': 48,
+ 'green': 49, 'greenyellow': 50, 'honeydew': 51, 'hotpink': 52,
+ 'indianred': 53, 'indigo': 54, 'ivory': 55, 'khaki': 56,
+ 'lavender': 57, 'lavenderblush': 58, 'lawngreen': 59, 'lemonchiffon': 60,
+ 'lightblue': 61, 'lightcoral': 62, 'lightcyan': 63, 'lightgoldenrodyellow': 64,
+ 'lightgreen': 65, 'lightgrey': 66, 'lightpink': 67, 'lightsalmon': 68,
+ 'lightseagreen': 69, 'lightskyblue': 70, 'lightslategray': 71, 'lightsteelblue': 72,
+ 'lightyellow': 73, 'lime': 74, 'limegreen': 75, 'linen': 76,
+ 'maroon': 77, 'mediumaquamarine': 78, 'mediumblue': 79, 'mediumorchid': 80,
+ 'mediumpurple': 81, 'mediumseagreen': 82, 'mediumslateblue': 83, 'mediumspringgreen': 84,
+ 'mediumturquoise': 85, 'mediumvioletred': 86, 'midnightblue': 87, 'mintcream': 88,
+ 'mistyrose': 89, 'moccasin': 90, 'navajowhite': 91, 'navy': 92,
+ 'oldlace': 93, 'olive': 94, 'olivedrab': 95, 'orange': 96,
+ 'orangered': 97, 'orchid': 98, 'palegoldenrod': 99, 'palegreen': 100,
+ 'paleturquoise': 101, 'palevioletred': 102, 'papayawhip': 103, 'peachpuff': 104,
+ 'peru': 105, 'pink': 106, 'plum': 107, 'powderblue': 108,
+ 'purple': 109, 'red': 110, 'rosybrown': 111, 'royalblue': 112,
+ 'saddlebrown': 113, 'salmon': 114, 'sandybrown': 115, 'seagreen': 116,
+ 'seashell': 117, 'sienna': 118, 'silver': 119, 'skyblue': 120,
+ 'slateblue': 121, 'slategray': 122, 'snow': 123, 'springgreen': 124,
+ 'steelblue': 125, 'tan': 126, 'teal': 127, 'thistle': 128,
+ 'tomato': 129, 'turquoise': 130, 'violet': 131, 'wheat': 132,
+ 'white': 133, 'whitesmoke': 134, 'yellow': 135, 'yellowgreen': 136
+ },
+ nsColorCodes: [
+ '',
+ 'f0f8ff', 'faebd7', '00ffff', '7fffd4',
+ 'f0ffff', 'f5f5dc', '000000', '0000ff',
+ '8a2be2', 'a52a2a', 'deb887', '5f9ea0',
+ '7fff00', 'd2691e', 'ff7f50', '6495ed',
+ 'fff8dc', 'dc143c', '00008b', '008b8b',
+ 'b8860b', 'a9a9a9', '006400', 'bdb76b',
+ '8b008b', '556b2f', 'ff8c00', '9932cc',
+ '8b0000', 'e9967a', '8fbc8f', '483d8b',
+ '2f4f4f', '00ced1', '9400d3', 'ff1493',
+ '00bfff', '696969', '1e90ff', 'b22222',
+ 'fffaf0', '228b22', 'ff00ff', 'dcdcdc',
+ 'f8f8ff', 'ffd700', 'daa520', '808080',
+ '008000', 'adff2f', 'f0fff0', 'ff69b4',
+ 'cd5c5c', '4b0082', 'fffff0', 'f0e68c',
+ 'e6e6fa', 'fff0f5', '7cfc00', 'fffacd',
+ 'add8e6', 'f08080', 'e0ffff', 'fafad2',
+ '90ee90', 'd3d3d3', 'ffb6c1', 'ffa07a',
+ '20b2aa', '87cefa', '778899', 'b0c4de',
+ 'ffffe0', '00ff00', '32cd32', 'faf0e6',
+ '800000', '66cdaa', '0000cd', 'ba55d3',
+ '9370db', '3cb371', '7b68ee', '00fa9a',
+ '48d1cc', 'c71585', '191970', 'f5fffa',
+ 'ffe4e1', 'ffe4b5', 'ffdead', '000080',
+ 'fdf5e6', '808000', '6b8e23', 'ffa500',
+ 'ff4500', 'da70d6', 'eee8aa', '98fb98',
+ 'afeeee', 'db7093', 'ffefd5', 'ffdab9',
+ 'cd853f', 'ffc0cb', 'dda0dd', 'b0e0e6',
+ '800080', 'ff0000', 'bc8f8f', '4169e1',
+ '8b4513', 'fa8072', 'f4a460', '2e8b57',
+ 'fff5ee', 'a0522d', 'c0c0c0', '87ceeb',
+ '6a5acd', '708090', 'fffafa', '00ff7f',
+ '4682b4', 'd2b48c', '008080', 'd8bfd8',
+ 'ff6347', '40e0d0', 'ee82ee', 'f5deb3',
+ 'ffffff', 'f5f5f5', 'ffff00', '9acd32'
+ ],
+ _webSwatchChars: ['0', '3', '6', '9', 'c', 'f'],
+ _initWebColors: function (){
+ // generate long and short web color ref
+ var tg = Terminal.prototype.globals;
+ var wn = tg.webColors;
+ var cc = tg.webColorCodes;
+ var n = 1;
+ var a, b, c, al, bl, bs, cl;
+
+ for (var i = 0; i < 6; i++) {
+ a = tg._webSwatchChars[i];
+ al = a + a;
+
+ for (var j = 0; j < 6; j++) {
+ b = tg._webSwatchChars[j];
+ bl = al + b + b;
+ bs = a + b;
+
+ for (var k = 0; k < 6; k++) {
+ c = tg._webSwatchChars[k];
+ cl = bl + c + c;
+ wn[bs + c] = wn[cl] = n;
+ cc[n] = cl;
+ n++;
+ }
+ }
+ }
+ },
+ webifyColor: function (s){
+ var i;
+ var a;
+ var c = '';
+ // return nearest web color in 3 digit format
+ // (do without RegExp for compatibility)
+ var tg = Terminal.prototype.globals;
+
+ if (s.length == 6) {
+ for (i = 0; i < 6; i += 2) {
+ a = s.charAt(i);
+
+ var b = s.charAt(i + 1);
+
+ if (tg.isHexChar(a) && tg.isHexChar(b)) {
+ c += tg._webSwatchChars[Math.round(parseInt(a + b, 16) / 255 * 5)];
+ } else {
+ return '';
+ }
+ }
+
+ return c;
+ } else if (s.length == 3) {
+ for (i = 0; i < 3; i++) {
+ a = s.charAt(i);
+
+ if (tg.isHexChar(a)) {
+ c += tg._webSwatchChars[Math.round(parseInt(a, 16) / 15 * 5)];
+ } else {
+ return '';
+ }
+ }
+
+ return c;
+ } else {
+ return '';
+ }
+ },
+ // public methods for color support
+ setColor: function (label, value){
+ var n;
+ var tg = Terminal.prototype.globals;
+
+ if (typeof label == 'number' && label >= 1 && label <= 15) {
+ tg.colorCodes[label] = value;
+ } else if (typeof label == 'string') {
+ label = label.toLowerCase();
+
+ if (label.length == 1 && tg.isHexChar(label)) {
+ n = tg.hexToNum[label];
+
+ if (n) tg.colorCodes[n] = value;
+ }
+ else if (typeof tg.colors[label] != 'undefined') {
+ n = tg.colors[label];
+
+ if (n) tg.colorCodes[n] = value;
+ }
+ }
+ },
+ getColorString: function (label){
+ var tg = Terminal.prototype.globals;
+
+ if (typeof label == 'number' && label >= 0 && label <= 15) {
+ return tg.colorCodes[label];
+ } else if (typeof label == 'string') {
+ label = label.toLowerCase();
+
+ if (label.length == 1 && tg.isHexChar(label)) {
+ return tg.colorCodes[tg.hexToNum[label]];
+ } else if (typeof tg.colors[label] != 'undefined') {
+ return tg.colorCodes[tg.colors[label]];
+ }
+ }
+
+ return '';
+ },
+ getColorCode: function (label){
+ var tg = Terminal.prototype.globals;
+
+ if (typeof label == 'number' && label >= 0 && label <= 15) {
+ return label;
+ } else if (typeof label == 'string') {
+ label = label.toLowerCase();
+
+ if (label.length == 1 && tg.isHexChar(label)) {
+ return parseInt(label, 16);
+ } else if (typeof tg.colors[label] != 'undefined') {
+ return tg.colors[label];
+ }
+ }
+
+ return 0;
+ },
+ // import/paste methods (methods return success)
+ insertText: function (text){
+ // auto-types a given string to the active terminal
+ // returns success (false indicates a lock or no active terminal)
+ var tg = Terminal.prototype.globals;
+ var termRef = tg.activeTerm;
+
+ if (!termRef || termRef.closed || tg.keylock
+ || termRef.lock || termRef.charMode || termRef.fieldMode) return false;
+
+ // terminal open and unlocked, so type the text
+ for (var i = 0; i < text.length; i++) {
+ tg.keyHandler({ which: text.charCodeAt(i), _remapped: true });
+ }
+
+ return true;
+ },
+ importEachLine: function (text){
+ // import multiple lines of text per line each and execs
+ // returns success (false indicates a lock or no active terminal)
+ var tg = Terminal.prototype.globals;
+ var termRef = tg.activeTerm;
+
+ if (!termRef || termRef.closed || tg.keylock
+ || termRef.lock || termRef.charMode || termRef.fieldMode) return false;
+
+ // clear the current command line
+ termRef.cursorOff();
+ termRef._clearLine();
+
+ // normalize line breaks
+ text = text.replace(/\r\n?/g, '\n');
+ // split lines and auto-type the text
+ var t = text.split('\n');
+
+ for (var i = 0; i < t.length; i++) {
+ for (var k = 0; k < t[i].length; k++) {
+ tg.keyHandler({ which: t[i].charCodeAt(k), _remapped: true });
+ }
+
+ tg.keyHandler({ which: term.termKey.CR, _remapped: true });
+ }
+
+ return true;
+ },
+ importMultiLine: function (text){
+ // importing multi-line text as single input with "\n" in lineBuffer
+ var tg = Terminal.prototype.globals;
+ var termRef = tg.activeTerm;
+
+ if (!termRef || termRef.closed || tg.keylock
+ || termRef.lock || termRef.charMode || termRef.fieldMode) return false;
+
+ // lock and clear the line
+ termRef.lock = true;
+
+ termRef.cursorOff();
+ termRef._clearLine();
+ // normalize linebreaks and echo the text linewise
+ text = text.replace(/\r\n?/g, '\n');
+
+ var lines = text.split('\n');
+
+ for (var i = 0; i < lines.length; i++) {
+ termRef.type(lines[i]);
+
+ if (i < lines.length - 1) termRef.newLine();
+ }
+
+ // fake ;
+ // (no history entry for this)
+ termRef.lineBuffer = text;
+ termRef.lastLine = '';
+ termRef.inputChar = 0;
+ termRef.handler();
+
+ return true;
+ },
+ // text related service functions
+ normalize: function (n, m){
+ var s = '' + n;
+
+ while (s.length < m) s = '0' + s;
+
+ return s;
+ },
+ fillLeft: function (t, n){
+ if (typeof t != 'string') t = '' + t;
+
+ while (t.length < n) t = ' ' + t;
+
+ return t;
+ },
+ center: function (t, l){
+ var s = '';
+
+ for (var i = t.length; i < l; i += 2) s += ' ';
+
+ return s + t;
+ },
+ // simple substitute for String.replace()
+ stringReplace: function (s1, s2, t){
+ var l1 = s1.length;
+ var l2 = s2.length;
+ var ofs = t.indexOf(s1);
+
+ while (ofs >= 0) {
+ t = t.substring(0, ofs) + s2 + t.substring(ofs + l1);
+ ofs = t.indexOf(s1, ofs + l2);
+ }
+
+ return t;
+ },
+ // config data for text wrap
+ wrapChars: {
+ // keys: charCode
+ // values: 1 = white space, 2 = wrap after, 3 = wrap before, 4 = conditional word break
+ 9: 1, // tab
+ 10: 1, // new line - don't change this (used internally)!!!
+ 12: 4, // form feed (use this for conditional word breaks)
+ 13: 1, // cr
+ 32: 1, // blank
+ 40: 3, // (
+ 45: 2, // dash/hyphen
+ 61: 2, // =
+ 91: 3, // [
+ 94: 3, // caret (non-printing chars)
+ 123: 3 // {
+ },
+ // keyboard methods & controls
+ setFocus: function (termref){
+ Terminal.prototype.globals.activeTerm = termref;
+ Terminal.prototype.globals.clearRepeatTimer();
+ },
+ termKey: {
+ // codes of special keys
+ 'NUL': 0x00,
+ 'SOH': 0x01,
+ 'STX': 0x02,
+ 'ETX': 0x03,
+ 'EOT': 0x04,
+ 'ENQ': 0x05,
+ 'ACK': 0x06,
+ 'BEL': 0x07,
+ 'BS': 0x08,
+ 'BACKSPACE': 0x08,
+ 'HT': 0x09,
+ 'TAB': 0x09,
+ 'LF': 0x0A,
+ 'VT': 0x0B,
+ 'FF': 0x0C,
+ 'CR': 0x0D,
+ 'SO': 0x0E,
+ 'SI': 0x0F,
+ 'DLE': 0x10,
+ 'DC1': 0x11,
+ 'DC2': 0x12,
+ 'DC3': 0x13,
+ 'DC4': 0x14,
+ 'NAK': 0x15,
+ 'SYN': 0x16,
+ 'ETB': 0x17,
+ 'CAN': 0x18,
+ 'EM': 0x19,
+ 'SUB': 0x1A,
+ 'ESC': 0x1B,
+ 'IS4': 0x1C,
+ 'IS3': 0x1D,
+ 'IS2': 0x1E,
+ 'IS1': 0x1F,
+ 'DEL': 0x7F,
+ // other specials
+ 'EURO': 0x20AC,
+ // cursor mapping
+ 'LEFT': 0x1C,
+ 'RIGHT': 0x1D,
+ 'UP': 0x1E,
+ 'DOWN': 0x1F
+ },
+ // map some DOM_VK_* properties to values defined in termKey
+ termDomKeyRef: {},
+ _domKeyMappingData: {
+ 'LEFT': 'LEFT',
+ 'RIGHT': 'RIGHT',
+ 'UP': 'UP',
+ 'DOWN': 'DOWN',
+ 'BACK_SPACE': 'BS',
+ 'RETURN': 'CR',
+ 'ENTER': 'CR',
+ 'ESCAPE': 'ESC',
+ 'DELETE': 'DEL',
+ 'TAB': 'TAB'
+ },
+ _initDomKeyRef: function (){
+ var tg = Terminal.prototype.globals;
+ var m = tg._domKeyMappingData;
+ var r = tg.termDomKeyRef;
+ var k = tg.termKey;
+
+ for (var i in m) {
+ if (m.hasOwnProperty(i)) {
+ r['DOM_VK_' + i] = k[m[i]];
+ }
+ }
+ },
+ registerEvent: function (element, eventType, handler, capture){
+ if (element.addEventListener) {
+ element.addEventListener(eventType.toLowerCase(), handler, capture);
+ } else {
+ var et = eventType.toUpperCase();
+
+ if (window.Event && window.Event[et] && element.captureEvents) element.captureEvents(Event[et]);
+
+ element['on' + eventType.toLowerCase()] = handler;
+ }
+ },
+ releaseEvent: function (element, eventType, handler, capture){
+ if (element.removeEventListener) {
+ element.removeEventListener(eventType.toLowerCase(), handler, capture);
+ } else {
+ var et = eventType.toUpperCase();
+
+ if (window.Event && window.Event[et] && element.releaseEvents) element.releaseEvents(Event[et]);
+
+ et = 'on' + eventType.toLowerCase();
+
+ if (element[et] && element[et] == handler) element.et = null;
+ }
+ },
+
+ enableKeyboard: function (term){
+ var tg = Terminal.prototype.globals;
+
+ if (!tg.kbdEnabled) {
+ tg.registerEvent(document, 'keypress', tg.keyHandler, true);
+ tg.registerEvent(document, 'keydown', tg.keyFix, true);
+ tg.registerEvent(document, 'keyup', tg.clearRepeatTimer, true);
+
+ tg.kbdEnabled = true;
+ }
+
+ tg.activeTerm = term;
+ },
+ disableKeyboard: function (term){
+ var tg = Terminal.prototype.globals;
+
+ if (tg.kbdEnabled) {
+ tg.releaseEvent(document, 'keypress', tg.keyHandler, true);
+ tg.releaseEvent(document, 'keydown', tg.keyFix, true);
+ tg.releaseEvent(document, 'keyup', tg.clearRepeatTimer, true);
+
+ tg.kbdEnabled = false;
+ }
+
+ tg.activeTerm = null;
+ },
+ // remap some special key mappings on keydown
+ keyFix: function (e){
+ var tg = Terminal.prototype.globals;
+ var term = tg.activeTerm;
+ var ch;
+
+ if (tg.keylock || term.lock) return true;
+
+ if (window.event) {
+ if (!e) e = window.event;
+
+ ch = e.keyCode;
+
+ if (e.DOM_VK_UP) {
+ for (var i in tg.termDomKeyRef) {
+ if (tg.termDomKeyRef.hasOwnProperty(i)) {
+ if (e[i] && ch == e[i]) {
+ tg.keyHandler({ which: tg.termDomKeyRef[i], _remapped: true, _repeat: ch == 0x1B });
+
+ if (e.preventDefault) e.preventDefault();
+
+ if (e.stopPropagation) e.stopPropagation();
+
+ e.cancelBubble = true;
+
+ return false;
+ }
+ }
+ }
+
+ e.cancelBubble = false;
+
+ return true;
+ } else {
+ // no DOM support
+ var termKey = term.termKey;
+ var keyHandler = tg.keyHandler;
+
+ if (ch == 8 && !term.isOpera) {
+ keyHandler({ which: termKey.BS, _remapped: true, _repeat: true });
+ } else if (ch == 9) {
+ keyHandler({
+ which: termKey.TAB,
+ _remapped: true,
+ _repeat: (term.printTab) ? false : true
+ });
+ } else if (ch == 27) {
+ keyHandler({
+ which: termKey.ESC,
+ _remapped: true,
+ _repeat: (term.printTab) ? false : true
+ });
+ } else if (ch == 37) {
+ keyHandler({ which: termKey.LEFT, _remapped: true, _repeat: true });
+ } else if (ch == 39) {
+ keyHandler({ which: termKey.RIGHT, _remapped: true, _repeat: true });
+ } else if (ch == 38) {
+ keyHandler({ which: termKey.UP, _remapped: true, _repeat: true });
+ } else if (ch == 40) {
+ keyHandler({ which: termKey.DOWN, _remapped: true, _repeat: true });
+ } else if (ch == 127 || ch == 46) {
+ keyHandler({ which: termKey.DEL, _remapped: true, _repeat: true });
+ } else if (ch >= 57373 && ch <= 57376) {
+ if (ch == 57373) {
+ keyHandler({ which: termKey.UP, _remapped: true, _repeat: true });
+ } else if (ch == 57374) {
+ keyHandler({ which: termKey.DOWN, _remapped: true, _repeat: true });
+ } else if (ch == 57375) {
+ keyHandler({ which: termKey.LEFT, _remapped: true, _repeat: true });
+ } else if (ch == 57376) {
+ keyHandler({ which: termKey.RIGHT, _remapped: true, _repeat: true });
+ }
+ } else {
+ e.cancelBubble = false;
+
+ return true;
+ }
+
+ if (e.preventDefault) e.preventDefault();
+
+ if (e.stopPropagation) e.stopPropagation();
+
+ e.cancelBubble = true;
+
+ return false;
+ }
+ }
+ },
+ clearRepeatTimer: function (e){
+ var tg = Terminal.prototype.globals;
+
+ if (tg.keyRepeatTimer) {
+ clearTimeout(tg.keyRepeatTimer);
+
+ tg.keyRepeatTimer = null;
+ }
+ },
+ doKeyRepeat: function (ch){
+ Terminal.prototype.globals.keyHandler({ which: ch, _remapped: true, _repeated: true })
+ },
+ keyHandler: function (e){
+ var tg = Terminal.prototype.globals;
+ var term = tg.activeTerm;
+
+ if (tg.keylock || term.lock || term.isMac && e && e.metaKey) return true;
+
+ if (window.event) {
+ if (window.event.preventDefault) window.event.preventDefault();
+
+ if (window.event.stopPropagation) window.event.stopPropagation();
+ } else if (e) {
+ if (e.preventDefault) e.preventDefault();
+
+ if (e.stopPropagation) e.stopPropagation();
+ }
+
+ var ch;
+ var ctrl = false;
+ var shft = false;
+ var remapped = false;
+ var termKey = term.termKey;
+ var keyRepeat = 0;
+
+ if (e) {
+ ch = e.which;
+ ctrl = ((e.ctrlKey && !e.altKey) || e.modifiers == 2);
+ shft = (e.shiftKey || e.modifiers == 4);
+
+ if (e._remapped) {
+ remapped = true;
+
+ if (window.event) {
+ //ctrl=(ctrl || window.event.ctrlKey);
+ ctrl = (ctrl || (window.event.ctrlKey && !window.event.altKey));
+ shft = (shft || window.event.shiftKey);
+ }
+ }
+
+ if (e._repeated) {
+ keyRepeat = 2;
+ } else if (e._repeat) {
+ keyRepeat = 1;
+ }
+ } else if (window.event) {
+ ch = window.event.keyCode;
+ //ctrl=(window.event.ctrlKey);
+ ctrl = (window.event.ctrlKey && !window.event.altKey); // allow alt gr == ctrl alt
+ shft = (window.event.shiftKey);
+
+ if (window.event._repeated) {
+ keyRepeat = 2;
+ } else if (window.event._repeat) {
+ keyRepeat = 1;
+ }
+ } else {
+ return true;
+ }
+
+ if (ch == '' && remapped == false) {
+ // map specials
+ if (e == null) e = window.event;
+
+ if (e.charCode == 0 && e.keyCode) {
+ if (e.DOM_VK_UP) {
+ var dkr = tg.termDomKeyRef;
+
+ for (var i in dkr) {
+ if (dkr.hasOwnProperty(i)) {
+ if (e[i] && e.keyCode == e[i]) {
+ ch = dkr[i];
+ break;
+ }
+ }
+ }
+ } else {
+ // NS4
+ if (e.keyCode == 28) { ch = termKey.LEFT; }
+ else if (e.keyCode == 29) { ch = termKey.RIGHT; }
+ else if (e.keyCode == 30) { ch = termKey.UP; }
+ else if (e.keyCode == 31) { ch = termKey.DOWN; }
+ // Mozilla alike but no DOM support
+ else if (e.keyCode == 37) { ch = termKey.LEFT; }
+ else if (e.keyCode == 39) { ch = termKey.RIGHT; }
+ else if (e.keyCode == 38) { ch = termKey.UP; }
+ else if (e.keyCode == 40) { ch = termKey.DOWN; }
+ // just to have the TAB mapping here too
+ else if (e.keyCode == 9) { ch = termKey.TAB; }
+ }
+ }
+ }
+
+ // leave on unicode private use area (might be function key etc)
+ if ((ch >= 0xE000) && (ch <= 0xF8FF)) return;
+
+ if (keyRepeat) {
+ tg.clearRepeatTimer();
+
+ tg.keyRepeatTimer = window.setTimeout(
+ 'Terminal.prototype.globals.doKeyRepeat(' + ch + ')',
+ (keyRepeat == 1) ? tg.keyRepeatDelay1 : tg.keyRepeatDelay2
+ );
+ }
+
+ // key actions
+ if (term.charMode) {
+ term.insert = false;
+ term.inputChar = ch;
+ term.lineBuffer = '';
+ term.handler();
+
+ if (ch <= 32 && window.event) window.event.cancelBubble = true;
+
+ return false;
+ }
+
+ if (!ctrl) {
+ // special keys
+ if (ch == termKey.CR) {
+ term.lock = true;
+
+ term.cursorOff();
+
+ term.insert = false;
+
+ if (term.rawMode) {
+ term.lineBuffer = term.lastLine;
+ } else if (term.fieldMode) {
+ term.lineBuffer = term.lastLine;
+ term.exitFieldMode();
+ } else {
+ term.lineBuffer = term._getLine(true);
+
+ if (
+ term.lineBuffer != '' &&
+ (!term.historyUnique || term.history.length == 0 ||
+ term.lineBuffer != term.history[term.history.length - 1])
+ ) {
+ term.history[term.history.length] = term.lineBuffer;
+ }
+
+ term.histPtr = term.history.length;
+ }
+
+ term.lastLine = '';
+ term.inputChar = 0;
+ term.handler();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (term.fieldMode) {
+ if (ch == termKey.ESC) {
+ term.lineBuffer = term.lastLine = '';
+ term.exitFieldMode();
+ term.lastLine = '';
+ term.inputChar = 0;
+ term.handler();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.LEFT) {
+ if (term.fieldC > 0) term.fieldC--;
+ } else if (ch == termKey.RIGHT) {
+ if (term.fieldC < term.lastLine.length) term.fieldC++;
+ } else if (ch == termKey.BS) {
+ if (term.fieldC > 0) {
+ term.lastLine = term.lastLine.substring(0, term.fieldC - 1) + term.lastLine.substring(term.fieldC);
+ term.fieldC--;
+ }
+ } else if (ch == termKey.DEL) {
+ if (term.fieldC < term.lastLine.length) {
+ term.lastLine = term.lastLine.substring(0, term.fieldC) + term.lastLine.substring(term.fieldC + 1);
+ }
+ } else if (ch >= 32) {
+ term.lastLine = term.lastLine.substring(0, term.fieldC) + String.fromCharCode(ch)
+ + term.lastLine.substring(term.fieldC);
+ term.fieldC++;
+ }
+
+ term.drawField();
+
+ return false;
+ } else if (ch == termKey.ESC && term.conf.closeOnESC) {
+ term.close();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ }
+
+ if (ch < 32 && term.rawMode) {
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else {
+ if (ch == termKey.LEFT) {
+ term.cursorLeft();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.RIGHT) {
+ term.cursorRight();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.UP) {
+ term.cursorOff();
+
+ if (term.histPtr == term.history.length) term.lastLine = term._getLine();
+
+ term._clearLine();
+
+ if (term.history.length && term.histPtr >= 0) {
+ if (term.histPtr > 0) term.histPtr--;
+
+ term.type(term.history[term.histPtr]);
+ } else if (term.lastLine) {
+ term.type(term.lastLine);
+ }
+
+ term.cursorOn();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.DOWN) {
+ term.cursorOff();
+
+ if (term.histPtr == term.history.length) term.lastLine = term._getLine();
+ term._clearLine();
+
+ if (term.history.length && term.histPtr <= term.history.length) {
+ if (term.histPtr < term.history.length) term.histPtr++;
+
+ if (term.histPtr < term.history.length) {
+ term.type(term.history[term.histPtr]);
+ } else if (term.lastLine) {
+ term.type(term.lastLine);
+ }
+ } else if (term.lastLine) {
+ term.type(term.lastLine);
+ }
+
+ term.cursorOn();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.BS) {
+ term.backspace();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ch == termKey.DEL) {
+ if (term.DELisBS) {
+ term.backspace();
+ } else {
+ term.fwdDelete();
+ }
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ }
+ }
+ }
+
+ if (term.rawMode) {
+ if (term.isPrintable(ch)) {
+ term.lastLine += String.fromCharCode(ch);
+ }
+
+ if (ch == 32 && window.event) {
+ window.event.cancelBubble = true;
+ } else if (window.opera && window.event) {
+ window.event.cancelBubble = true;
+ }
+
+ return false;
+ } else {
+ if (term.conf.catchCtrlH && (ch == termKey.BS || (ctrl && ch == 72))) {
+ // catch ^H
+ term.backspace();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (term.ctrlHandler && (ch < 32 || (ctrl && term.isPrintable(ch, true)))) {
+ if ((ch >= 65 && ch <= 96) || ch == 63) {
+ // remap canonical
+ if (ch == 63) {
+ ch = 31;
+ } else {
+ ch -= 64;
+ }
+ }
+
+ term.inputChar = ch;
+ term.ctrlHandler();
+
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (ctrl || !term.isPrintable(ch, true)) {
+ if (window.event) window.event.cancelBubble = true;
+
+ return false;
+ } else if (term.isPrintable(ch, true)) {
+ if (term.blinkTimer) clearTimeout(term.blinkTimer);
+
+ if (term.insert) {
+ term.cursorOff();
+ term._scrollRight(term.r, term.c);
+ }
+
+ term._charOut(ch);
+ term.cursorOn();
+
+ if (ch == 32 && window.event) {
+ window.event.cancelBubble = true;
+ } else if (window.opera && window.event) {
+ window.event.cancelBubble = true;
+ }
+
+ return false;
+ }
+ }
+
+ return true;
+ },
+ // gui mappings
+ hasSubDivs: false,
+ termStringStart: '',
+ termStringEnd: '',
+ termSpecials: {
+ // special HTML escapes
+ 0: ' ',
+ 1: ' ',
+ 9: ' ',
+ 32: ' ',
+ 34: '"',
+ 38: '&',
+ 60: '<',
+ 62: '>',
+ 127: '◊',
+ 0x20AC: '€'
+ },
+ // extensive list of max 8 styles (2^n, n<16)
+ termStyles: [1, 2, 4, 8, 16],
+ // style markup: one letter keys, reserved keys: "p" (plain), "c" (color)
+ termStyleMarkup: {
+ 'r': 1,
+ 'u': 2,
+ 'i': 4,
+ 's': 8,
+ 'b': 16 // map "b" to 16 (italics) for ANSI mapping
+ },
+ // mappings for styles (heading HTML)
+ termStyleOpen: {
+ 1: '',
+ 2: '',
+ 4: '',
+ 8: '',
+ 16: ''
+ },
+ // mapping for styles (trailing HTML)
+ termStyleClose: {
+ 1: '<\/span>',
+ 2: '<\/u>',
+ 4: '<\/i>',
+ 8: '<\/strike>',
+ 16: ''
+ },
+ // method to install custom styles
+ assignStyle: function (styleCode, markup, htmlOpen, htmlClose){
+ var i;
+ var tg = Terminal.prototype.globals;
+
+ // check params
+ if (!styleCode || isNaN(styleCode)) {
+ if (styleCode >= 256) {
+ alert('termlib.js:\nCould not assign style.\n' + s + ' is not a valid power of 2 between 0 and 256.');
+
+ return;
+ }
+ }
+
+ var s = styleCode & 0xff;
+ var matched = false;
+
+ for (i = 0; i < 8; i++) {
+ if ((s >>> i) & 1) {
+ if (matched) {
+ alert('termlib.js:\nCould not assign style code.\n' + s + ' is not a power of 2!');
+ return;
+ }
+ matched = true;
+ }
+ }
+
+ if (!matched) {
+ alert('termlib.js:\nCould not assign style code.\n' + s + ' is not a valid power of 2 between 0 and 256.');
+
+ return;
+ }
+
+ markup = String(markup).toLowerCase();
+
+ if (markup == 'c' || markup == 'p') {
+ alert('termlib.js:\nCould not assign mark up.\n"' + markup + '" is a reserved code.');
+
+ return;
+ }
+
+ if (markup.length > 1) {
+ alert('termlib.js:\nCould not assign mark up.\n"' + markup + '" is not a single letter code.');
+
+ return;
+ }
+
+ var exists = false;
+
+ for (i = 0; i < tg.termStyles.length; i++) {
+ if (tg.termStyles[i] == s) {
+ exists = true;
+ break;
+ }
+ }
+
+ if (exists) {
+ var m = tg.termStyleMarkup[markup];
+
+ if (m && m != s) {
+ alert('termlib.js:\nCould not assign mark up.\n"' + markup + '" is already in use.');
+
+ return;
+ }
+ } else {
+ if (tg.termStyleMarkup[markup]) {
+ alert('termlib.js:\nCould not assign mark up.\n"' + markup + '" is already in use.');
+
+ return;
+ }
+
+ tg.termStyles[tg.termStyles.length] = s;
+ }
+
+ // install properties
+ tg.termStyleMarkup[markup] = s;
+ tg.termStyleOpen[s] = htmlOpen;
+ tg.termStyleClose[s] = htmlClose;
+ },
+ // ANSI output mapping (styles & fg colors only)
+ ANSI_regexp: /(\x1b\[|x9b)([0-9;]+?)([a-zA-Z])/g, // CSI ( = 0x1b+"[" or 0x9b ) + params + letter
+ ANIS_SGR_codes: {
+ '0': '%+p',
+ '1': '%+b',
+ '3': '%+i',
+ '4': '%+u',
+ '7': '%+r',
+ '9': '%+s',
+ '21': '%+u',
+ '22': '%-b',
+ '23': '%-i',
+ '24': '%-u',
+ '27': '%-r',
+ '29': '%-s',
+ '30': '%c(0)', // using default fg color for black (black: "%c(1)")
+ '31': '%c(a)',
+ '32': '%c(b)',
+ '33': '%c(c)',
+ '34': '%c(d)',
+ '35': '%c(e)',
+ '36': '%c(f)',
+ '37': '%c(#999)',
+ '39': '%c(0)',
+ '90': '%c(9)',
+ '91': '%c(2)',
+ '92': '%c(3)',
+ '93': '%c(4)',
+ '94': '%c(5)',
+ '95': '%c(6)',
+ '96': '%c(7)',
+ '97': '%c(8)',
+ '99': '%c(0)',
+ 'trueBlack': '%c(1)'
+ },
+ ANSI_map: function (t, trueBlack){
+ // transform simple ANSI SGR codes to internal markup
+ var tg = Terminal.prototype.globals;
+
+ tg.ANSI_regexp.lastIndex = 0;
+
+ return t.replace(
+ tg.ANSI_regexp,
+ function (str, p1, p2, p3, offset, s){
+ return tg.ANSI_replace(p2, p3, trueBlack);
+ }
+ );
+ },
+ /**
+ * @return {string}
+ */
+ ANSI_replace: function (p, cmd, trueBlack){
+ var tg = Terminal.prototype.globals;
+
+ if (cmd == 'm') {
+ if (p == '') {
+ return tg.ANIS_SGR_codes[0];
+ } else if (trueBlack && p == '30') {
+ return tg.ANIS_SGR_codes.trueBlack;
+ } else if (tg.ANIS_SGR_codes[p]) {
+ return tg.ANIS_SGR_codes[p];
+ }
+ }
+
+ return '';
+ },
+ // basic DHTML dynamics and browser abstraction
+ writeElement: function (e, t){
+ if (document.getElementById) {
+ var element = document.getElementById(e);
+
+ element.innerHTML = t;
+ } else if (document.all) {
+ document.all[e].innerHTML = t;
+ }
+ },
+ setElementXY: function (d, x, y){
+ if (document.getElementById) {
+ var element = document.getElementById(d);
+
+ element.style.left = x + 'px';
+ element.style.top = y + 'px';
+ } else if (document.all) {
+ document.all[d].style.left = x + 'px';
+ document.all[d].style.top = y + 'px';
+ }
+ },
+ setVisible: function (d, v){
+ if (document.getElementById) {
+ var element = document.getElementById(d);
+
+ element.style.visibility = (v) ? 'visible' : 'hidden';
+ } else if (document.all) {
+ document.all[d].style.visibility = (v) ? 'visible' : 'hidden';
+ }
+ },
+ setDisplay: function (d, v){
+ if (document.getElementById) {
+ var element = document.getElementById(d);
+
+ element.style.display = v;
+ }
+ else if (document.all) {
+ document.all[d].style.display = v;
+ }
+ },
+ guiElementsReady: function (e){
+ if (document.getElementById) {
+ return (document.getElementById(e)) ? true : false;
+ } else if (document.all) {
+ return (document.all[e]) ? true : false;
+ } else {
+ return false;
+ }
+ },
+ // constructor mods (MSIE fixes)
+ _termString_makeKeyref: function (){
+ var tg = Terminal.prototype.globals;
+ var termString_keyref = tg.termString_keyref = [];
+ var termString_keycoderef = tg.termString_keycoderef = [];
+ var hex = ['A', 'B', 'C', 'D', 'E', 'F'];
+
+ for (var i = 0; i <= 15; i++) {
+ var high = (i < 10) ? i : hex[i - 10];
+
+ for (var k = 0; k <= 15; k++) {
+ var low = (k < 10) ? k : hex[k - 10];
+ var cc = i * 16 + k;
+
+ if (cc >= 32) {
+ var cs = unescape("%" + high + low);
+
+ termString_keyref[cc] = cs;
+ termString_keycoderef[cs] = cc;
+ }
+ }
+ }
+ },
+ _extendMissingStringMethods: function (){
+ if (!String.fromCharCode || !String.prototype.charCodeAt) {
+ Terminal.prototype.globals._termString_makeKeyref();
+ }
+
+ if (!String.fromCharCode) {
+ String.fromCharCode = function (cc){
+ return (cc != null) ? Terminal.prototype.globals.termString_keyref[cc] : '';
+ };
+ }
+
+ if (!String.prototype.charCodeAt) {
+ String.prototype.charCodeAt = function (n){
+ var cs = this.charAt(n);
+
+ return (Terminal.prototype.globals.termString_keycoderef[cs]) ?
+ Terminal.prototype.globals.termString_keycoderef[cs] : 0;
+ };
+ }
+ }
+ // end of Terminal.prototype.globals
+ }
+ // end of Terminal.prototype
+};
+
+// initialize global data
+Terminal.prototype.globals._initGlobals();
+// global entities for backward compatibility with termlib 1.x applications
+var TerminalDefaults = Terminal.prototype.Defaults;
+var termDefaultHandler = Terminal.prototype.defaultHandler;
+var TermGlobals = Terminal.prototype.globals;
+var termKey = Terminal.prototype.globals.termKey;
+var termDomKeyRef = Terminal.prototype.globals.termDomKeyRef;
+// eof
\ No newline at end of file
|
| |
|