/** * This handles session specific aspects of each frame type, eg: sending to the baseline, clearing, accepting * input, moving around the frame (and windows within one if any) * * @constructor */ function Session() { 'use strict'; // Our page object this.page = undefined; /* Frame type settings */ this.settings = {}; /* Frame Version */ this.version = 1; /* Frame Number [0-9] */ this.frame = null; /* Frame Index [a-z] */ this.index = null; /* The Service Provider owning the frame. */ this.owner = 0; /* The cost to view the frame @todo to implement */ this.cost = 0; /* The frame content, base64 encoded */ this.content = ''; // Frame's owned by the system where: // isPublic is FALSE - the user must be logged in to view it // isPublic is TRUE - can be viewed by non-logged in users // Frame's owned by Service Providers where: // isPublic is FALSE - can only be viewed if a user is // a member of the Service Providers CUG // isPublic is TRUE - can be viewed by users (if logged in) this.isPublic = false; // Is this frame accessible to non CUG users // If FALSE user must be a member of the CUG to view the frame // All users, including unauthenticated, are members of 'system' (owner = 0) this.isAccessible = false; // Is this frame available to be accessed // If FALSE, only the SP can view/edit the frame this.type = FRAME_TYPE_INFO; // The frame type - see FRAME_TYPES above this.key = [null,null,null,null,null,null,null,null,null,null]; // Key actions [0-9] /** * Return the frames fields */ Object.defineProperty(this,'fields', { get: function() { return this.frame_fields; } }); /** * Check if the user is already a member of the CUG */ Object.defineProperty(this,'isMember',{ get: function() { log(LOG_DEBUG,'- Checking if user is a member of frame: '+this.page); if (user.number) { return ( (this.pageowner === SYSTEM_OWNER) ); } else { return false; } } }) Object.defineProperty(this,'pageownerlogo', { get: function() { return base64_decode(this.settings.ext === 'tex' ? pageOwner(this.frame).logoans : pageOwner(this.frame).logovtx); } }) /** * Enable pulling out submitted value by its name * * @param key * @returns {null|string|*} */ this.fieldValue = function(key) { for each (var k in this.frame_fields) { log(LOG_DEBUG,' - k:'+JSON.stringify(k)); if (k.fname === key) { return k.fvalue; } } return null; } this.get = function(page) { if (!(page instanceof PageObject)) throw new Error('page must be a PageObject'); this.baselineSend('LOADING'); this.page = new Page(); this.page.get(page); this.baselineClear(); } /** * Load a message frame * * @param page */ this.loadMessage = function(page,ext) { this.frame = ''+page; this.index = 'a'; this.owner = 1; this.isPublic = true; this.isAccessible = true; // @todo Keys should map to next/previous/send, etc as indicated in the template frame. this.key = [this.frame.substr(0,7)+'1',null,null,null,null,null,null,null,null,null]; // @todo validate that FRAME_TYPE_MESSAGE is a message template this.type = FRAME_TYPE_MESSAGE; // Load our message var ma = new MsgAreas() var area = ma.getArea(this.frame); var msg = ma.getMessage(this.frame); var msg_header; if (! msg) return undefined; // @todo Search 1zzzzEE..., 1zzzz... var to = viewdata ? new FrameViewdata() : new FrameAnsi(); to.load(MAIL_TEMPLATE_FRAME,ext); // @todo Check that this is a frame of type "m" and report error if not // @todo Take the cost from the template this.cost = 5; if (! to) { log(LOG_ERROR,'Echomail template missing :['+MAIL_TEMPLATE_FRAME+'] ?'); msg_header = 'TO: '+msg.to.substr(0,72)+"\n\r"; msg_header += 'FROM: '+msg.from.substr(0,72)+"\n\r"; msg_header += 'DATE: '+msg.date.substr(0,72)+"\n\r"; msg_header += 'SUBJECT: '+msg.subject.substr(0,72)+"\n\r"; } else { // @todo change this to use atcode() msg_header = base64_decode(to.content).replace(/@(.*)@/g, function (str, code, offset, s) { var length = code.split(':')[1]; switch(code.split(':')[0]) { case 'DATE': return msg.date.substr(0,length); case 'TO': return msg.to.substr(0,length); case 'FROM': return msg.from.substr(0,length); case 'SUBJECT': return msg.subject.substr(0,length); } } ); } //log(LOG_DEBUG,'Loaded message: '+msg_header+msg.content); this.content = base64_encode(msg_header+msg.content); // Update the user's pointers var stats = ma.getUserStats(this.frame); // if this message is to the user, and the msg number > scan_ptr and it is the next message on the user's new mail list var newmsgs = area.newMsgsToMe(); var next; log(LOG_DEBUG,'User has: '+newmsgs.length-1+' msgs to read to ME'); if (newmsgs.length) { next = newmsgs[1]; //log(LOG_DEBUG,'- NEXT is: '+next.tags+', this is: '+msg.tags); if (next && (next.tags === msg.tags)) { log(LOG_DEBUG,'- Updating scan_ptr to: '+next.number); stats.scan_ptr = next.number; } // Last message next = newmsgs[0]; if (next !== undefined) { log(LOG_DEBUG,'- LAST TO ME is: '+next.tags); this.key[1] = area.page(next.tags); } // Next new message next = newmsgs[2]; if (next !== undefined) { log(LOG_DEBUG,'- NEXT TO ME is: '+next.tags); this.key[2] = area.page(next.tags); } } // if this message is the next message, update last_read newmsgs = area.newMsgs(); log(LOG_DEBUG,'User has: '+newmsgs.length+' msgs to read'); if (newmsgs.length) { next = newmsgs[0]; log(LOG_DEBUG,'- NEXT is: '+next.tags+', this is: '+msg.tags); if (next.tags === msg.tags) { log(LOG_DEBUG,'- Updating last_read to: '+next.number); stats.last_read = next.number; } } // Previous Message x = area.MessagePrev(this.frame); if (x) this.key[4] = area.page(x.tags); // Next Message x = area.MessageNext(this.frame); if (x) this.key[6] = area.page(x.tags); log(LOG_DEBUG,'Built frame: ['+this.frame+']['+this.index+'] ('+this.page+')'); } // Render the page this.render = function() { this.gotoxy(0,0); write(so.page.display().join('')); } } /** * Return the message for a index * * @param index * @returns {string|*} */ Session.prototype.getMessage = function(index) { eval('var msg = this.settings.'+index); return msg; }