diff --git a/load/defs.js b/load/defs.js index 975556b..5febe84 100644 --- a/load/defs.js +++ b/load/defs.js @@ -42,7 +42,7 @@ var ERR_ROUTE ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08'; var ERR_METHOD_NOT_EXIST ='\1n\1h\1WMISTAKE? \1GTRY AGAIN OR TELL US ON *08'; var ACCESS_DENIED ='\1n\1h\1RACCESS DENIED. \1RMISTAKE? TRY AGAIN OR TELL US *08'; -var NO_HISTORY_FRAMES =['98b']; +var NO_HISTORY_FRAMES =['980a','98b','981a']; var SYSTEM_FRAMES =['AWgBUkEBR04BQlMBWUkBbgE3AWt0ZXgBbg==']; @@ -84,7 +84,7 @@ function Frame() { log(LOG_DEBUG,'- FRAME User: ['+JSON.stringify(user)+']'); // Dont show the page number on system login page - if (user.number || this.type != FRAME_TYPE_LOGIN) { + if (user.number || (this.type != FRAME_TYPE_LOGIN && NO_HISTORY_FRAMES.indexOf(this.page) == -1)) { header = '\1n'+owner+' '.repeat(FRAME_HEADER-console.strlen(owner))+'\1n '+ '\1W\1H'+this.page+' '.repeat(FRAME_PAGENUM-this.page.length)+' '+ '\1G\1H'+' '.repeat(FRAME_COST-this.cost.toString().length)+this.cost+FRAME_COSTUNIT+ @@ -353,6 +353,7 @@ Frame.prototype.parse = function(text) { ftype: fieldtype, flength: fieldlen, fchar: fieldchar, + fname: field, r: r, c: c, attribute: {i:i,f:f,b:b}, diff --git a/main.js b/main.js index 060f951..9812051 100644 --- a/main.js +++ b/main.js @@ -23,7 +23,7 @@ while(bbs.online) { var mode = false; // Initial mode // If the user is already on, our start page is 98b - var next_page = { frame: 98,index: user.number ? 'b' : 'a' }; // Start Frame + var next_page = user.number ? { frame: 98,index: 'b' } : { frame: 980,index: 'a' }; // Start Frame var action = ACTION_GOTO; // Initial action var inkey_timeout = 10000; // Timeout waiting for input @todo required? check if idle timeout occurs @@ -31,6 +31,9 @@ while(bbs.online) { var fn = null; // Current Field Number for an Input Frame var history = []; // Page history + var cf = null; // Current Input Field + var cc = null; // Current Control Method + var control = []; // Methods that need to process input ansi.send('ext_mode','clear','cursor'); @@ -48,6 +51,14 @@ while(bbs.online) { system.node_list[bbs.node_num-1].action=0xff; // to ensure our node status is updated correctly + if (mode != MODE_BL && control.length) { + cc = control[control.length-1]; + log(LOG_DEBUG,'CONTROL START: ['+read+'] ('+cc+')'); + read = cc.handle(read); + + log(LOG_DEBUG,'CONTROL END: ['+read+']'); + } + log(LOG_DEBUG,'MODE START: ['+read+']'); switch (mode) { case false: @@ -69,8 +80,15 @@ while(bbs.online) { case '7': case '8': case '9': - if (fo.key[read]) { - next_page = { frame: fo.key[read] }; + log(LOG_DEBUG,'- false: Key ['+read+'] Route ['+fo.key[read]+']'); + if (fo.key[read] !== null) { + // If are requesting a home page + if (fo.key[read] === 0) { + next_page = { frame: user.number ? 1 : 98,index: 'a' }; + + } else { + next_page = { frame: fo.key[read] }; + } action = ACTION_GOTO; log(LOG_DEBUG,'- false: Key ['+read+'] ['+pageStr(next_page)+']'); @@ -162,7 +180,19 @@ while(bbs.online) { cmd = ''; cursorOff(); - // @todo If we are editing a field... + if (cf) { + // If there is a control for this field, + if (cc) + cc.prefield(); + + mode = MODE_FIELD; + console.gotoxy(cf.c,cf.r); + console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m'); + console.write(cf.fchar.repeat(cf.fvalue.length)); + console.gotoxy(cf.c,cf.r); + ansi.send('ext_mode','set','cursor'); + cf.fvalue = ''; + } } if (read == '#' || read == '\r') { @@ -175,7 +205,7 @@ while(bbs.online) { action = ACTION_BACKUP; } else if (cmd == '0') { - next_page = { frame: 1 }; // @todo specify home page in config + next_page = { frame: user.number ? 1 : 98,index: 'a' }; // @todo specify home page in config action = ACTION_GOTO; // Edit frame @@ -208,14 +238,13 @@ while(bbs.online) { case '\r': log(LOG_DEBUG,'- MODE_FIELD:FRAME_TYPE_LOGIN: ['+read+'] A'); // If we are the main login screen, see if it is a new user - //if ($this->fo->isCUG(0)) { - if (fo.frame_fields[fn].ftype == 't' && fo.frame_fields[fn].fvalue == 'NEW') { - action = ACTION_GOTO; - next_page = { frame: 981,index: 'a' }; // @todo This should be in the INI. + // @todo Need to make sure this is only actioned on user login + if (cf.ftype == 't' && cf.fvalue.toUpperCase() == 'NEW') { + action = ACTION_GOTO; + next_page = { frame: 981,index: 'a' }; // @todo This should be in the INI. - break; - } - //} + break; + } break; } @@ -238,6 +267,10 @@ while(bbs.online) { log(LOG_DEBUG,'fn:'+fn+', cf'+JSON.stringify(cf)); if (cf) { + // If there is a control for this field, + if (cc) + cc.prefield(); + mode = MODE_FIELD; console.gotoxy(cf.c,cf.r); console.write(KEY_ESC+'['+cf.attribute.i+';'+cf.attribute.f+';'+cf.attribute.b+'m'); @@ -654,6 +687,14 @@ while(bbs.online) { mode = false; } + // If this is the register page + // @todo this needs to be configurable + if (fo.page == '981a') { + log(LOG_DEBUG,'Adding REGISTER to control stack'); + require('ansitex/load/register.js','CONTROL_REGISTER'); + control.push(new register()); + } + break; // Standard Frame