- code cleanup and refactoring
- implement max post size on pc services
- add box account transfer system
- create directory indexer for pc services
- fix catchall for pc services
- pc services not respects `disabled: true` if sharing the same port
- new wtv-tricks:/info from WebTV Redialed
- Added missing Pagebuilder themes
- Fixed various PageBuilder bugs, pages should work correctly (republish your page if needed)
- various security and bug fixes
This commit is contained in:
zefie
2025-02-12 14:18:32 -05:00
parent c74e2fb71b
commit 81729b66da
55 changed files with 5446 additions and 84056 deletions

View File

@@ -46,9 +46,17 @@ function shutdown(signal = 'SIGTERM') {
};
}
function getServiceEnabled(service) {
if (minisrv_config.services[service]) {
if (minisrv_config.services[service].disabled) return false;
else return true;
}
return false;
}
function getServiceByPort(port) {
var service_name = null;
Object.keys(minisrv_config.services).forEach(function(k) {
Object.keys(minisrv_config.services).forEach(function (k) {
if (service_name) return;
if (minisrv_config.services[k].port) {
if (port == parseInt(minisrv_config.services[k].port))
@@ -58,6 +66,18 @@ function getServiceByPort(port) {
return service_name;
}
function getServiceByVHost(vhost) {
var service_name = null;
Object.keys(minisrv_config.services).forEach(function (k) {
if (service_name) return;
if (minisrv_config.services[k].vhost) {
if (vhost.toLowerCase() == minisrv_config.services[k].vhost.toLowerCase())
service_name = k;
}
})
return service_name;
}
function getPortByService(service) {
if (minisrv_config.services[service]) return minisrv_config.services[service].port;
else return null;
@@ -211,6 +231,7 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
// node core variables and functions
"console": console, // needed for per-script debugging
"__dirname": __dirname, // needed by services such as wtv-flashrom and wtv-disk
"__filename": (filename) ? filename : null, // path to the script file
// Our modules
"wtvmime": wtvmime,
@@ -241,7 +262,7 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
"service_deps": service_deps,
"ssid_sessions": ssid_sessions,
"moveArrayKey": moveArrayKey,
"cwd": __dirname, // current working directory
"cwd": (filename) ? path.dirname(filename) : __dirname, // current working directory
// Our prototype overrides
"Buffer": Buffer,
@@ -483,6 +504,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
if (pc_services) {
var pc_service_name = getServiceByVaultDir(service_name)
contextObj.pc_service_name = pc_service_name;
if (minisrv_config.services[pc_service_name].service_vaults) {
vaults_to_scan = vaults_to_scan.concat(minisrv_config.services[pc_service_name].service_vaults);
}
@@ -744,7 +766,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
}
} else {
// look for a catchall in the current path and all parent paths up until the service root
var service_config = minisrv_config.services[service_name] || {};
var service_config = ((pc_services) ? minisrv_config.services[pc_service_name] : minisrv_config.services[service_name]) || {};
if (minisrv_config.config.catchall_file_name || service_config['catchall_file_name']) {
var minisrv_catchall_file_name = service_config['catchall_file_name'] || minisrv_config.config.catchall_file_name || null;
if (minisrv_catchall_file_name) {
@@ -1057,7 +1079,9 @@ minisrv-no-mail-count: true`;
if ((shortURL.indexOf(":/ROMCache/") != -1 || shortURL.indexOf("://ROMCache/") != -1) && minisrv_config.config.enable_shared_romcache) {
shared_romcache = wtvshared.fixPathSlashes(minisrv_config.config.SharedROMCache + path.sep + shortURL.split(':/')[1]);
}
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming headers on socket ID", socket.id, (await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers)))));
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming", (pc_services) ? "HTTP" : "WTVP", "headers on", (pc_services) ? "HTTP" : "WTVP", "socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
else debug(" * Incoming", (pc_services) ? "HTTP" : "WTVP", "headers on", (pc_services) ? "HTTP" : "WTVP", "socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
socket_sessions[socket.id].request_headers = request_headers;
processPath(socket, urlToPath, request_headers, service_name, shared_romcache, pc_services);
} else if (shortURL.indexOf('http://') >= 0 || shortURL.indexOf('https://') >= 0 || (use_external_proxy == true && shortURL.indexOf(service_name + "://") >= 0) && !pc_services) {
@@ -1078,16 +1102,20 @@ minisrv-no-mail-count: true`;
} else {
if (request_headers.request.indexOf("HTTP/1.0") > 0) {
// webtv in HTTP/1.0 mode, try to kick it back to WTVP
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming headers (HTTP/1.0) on socket ID", socket.id, (await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers)))));
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming HTTP/1.0 headers on WTVP socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
else debug(" * Incoming HTTP/1.0 headers on WTVP socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
var errpage = wtvshared.doErrorPage(500, null, null, false, true);
headers = errpage[0];
data = ''
socket_sessions[socket.id].close_me = true;
sendToClient(socket, headers, data);
} else {
// error reading headers (no request_url provided)
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming headers (INVALID) on socket ID", socket.id, (await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers)))));
var errpage = wtvshared.doErrorPage(400, null, null, false, true);
// error reading headers (no request_url provided, or PC on WTVP port)
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming Invalid headers on WTVP socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
else debug(" * Incoming Invalid headers on WTVP socket ID", socket.id, await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers))));
var errpage = wtvshared.doErrorPage(500, null, null, true, false);
headers = errpage[0];
data = ''
socket_sessions[socket.id].close_me = true;
@@ -1179,6 +1207,8 @@ async function doHTTPProxy(socket, request_headers) {
var request_type = request_headers.request_url.substring(0, idx);
if (minisrv_config.config.debug_flags.show_headers) console.debug(request_type.toUpperCase() + " Proxy: Client Request Headers on socket ID", socket.id, (await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers)))));
else debug(request_type.toUpperCase() + " Proxy: Client Request Headers on socket ID", socket.id, (await wtvshared.decodePostData(await wtvshared.filterRequestLog(await wtvshared.filterSSID(request_headers)))));
switch (request_type) {
case "https":
var proxy_agent = https;
@@ -1336,9 +1366,10 @@ function headerStringToObj(headers, response = false) {
if (/^SECURE ON/.test(d) && !response) {
headers_obj.secure = true;
} else if (/^([0-9]{3}) $/.test(d.substring(0, 4)) && response && !headers_obj.Status) {
headers_obj.Status = d.replace("\r", "");
d.s
headers_obj.Status = d.trim("\r");
} else if (/^(GET |PUT |POST)$/.test(d.substring(0, 4)) && !response) {
headers_obj.request = d.replace("\r", "");
headers_obj.request = d.trim("\r");
var request_url = d.split(' ');
if (request_url.length > 2) {
request_url.shift();
@@ -1350,7 +1381,7 @@ function headerStringToObj(headers, response = false) {
} else {
request_url = request_url[1];
}
headers_obj.request_url = decodeURI(request_url).replace("\r", "");
headers_obj.request_url = decodeURI(request_url).trim("\r");
} else if (d.indexOf(":") > 0) {
var d_split = d.split(':');
var header_name = d_split[0];
@@ -1360,7 +1391,7 @@ function headerStringToObj(headers, response = false) {
}
d_split.shift();
d = d_split.join(':');
headers_obj[header_name] = (d).replace("\r", "");
headers_obj[header_name] = (d).trim("\r");
if (headers_obj[header_name].substring(0, 1) == " ") {
headers_obj[header_name] = headers_obj[header_name].substring(1);
}
@@ -1581,7 +1612,7 @@ async function sendToClient(socket, headers_obj, data = null) {
} else {
// delete if webtv
if (socket.ssid) delete headers_obj[xpower];
else {
if (socket.service_name) {
if (minisrv_config.services[socket.service_name].hide_minisrv_version) {
// Don't report version
if (!socket.ssid) headers_obj[xpower] = headers_obj[xpower] + "; NodeJS; minisrv";
@@ -1597,6 +1628,8 @@ async function sendToClient(socket, headers_obj, data = null) {
if (!socket.res) {
// header object to string
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Outgoing headers on socket ID", socket.id, headers_obj);
else debug(" * Outgoing headers on socket ID", socket.id, headers_obj);
Object.keys(headers_obj).forEach(function (k) {
if (k == "Status") {
headers += headers_obj[k] + eol;
@@ -1624,12 +1657,16 @@ async function sendToClient(socket, headers_obj, data = null) {
}
});
console.log(headers_obj);
// send to client
if (socket.res) {
var resCode = parseInt(headers_obj.Status.substr(0, 3));
socket.res.writeHead(resCode, headers_obj);
socket.res.end(data);
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Outgoing PC headers on " + socket.service_name + " socket ID", socket.id, headers_obj);
else debug(" * Outgoing PC headers on " + socket.service_name + " socket ID", socket.id, headers_obj);
if (minisrv_config.config.debug_flags.quiet) console.debug(" * Sent response " + headers_obj.Status + " to PC client (Content-Type:", headers_obj['Content-type'], "~", headers_obj['Content-length'], "bytes)");
} else {
var toClient = null;
@@ -2454,23 +2491,36 @@ pc_bind_ports.every(function (v) {
server.get('*', (req, res) => {
var ssl = (req.socket.ssl) ? true : false;
var service_name = getServiceByPort(v);
var request_headers = {};
request_headers['request'] = "GET " + req.originalUrl + " HTTP/1.1";
request_headers.request_url = req.originalUrl;
request_headers.raw_headers = "Request: " + request_headers['request'] + "\r\n";
Object.keys(req.headers).forEach(function (k) {
request_headers[k] = req.headers[k];
request_headers.raw_headers += k + ": " + req.headers[k] + "\r\n";
});
request_headers.query = req.query;
var host_name = (request_headers['host']) ? request_headers['host'] : null;
if (host_name) {
if (host_name.indexOf(":") != -1) host_name = host_name.substring(0, host_name.indexOf(":"));
debug(host_name)
service_name = (getServiceByVHost(host_name)) ? getServiceByVHost(host_name) : service_name
}
req.socket.minisrv_pc_mode = true;
req.socket.res = res;
req.socket.service_name = service_name;
req.socket.id = parseInt(crc16('CCITT-FALSE', Buffer.from(String(req.socket.remoteAddress) + String(req.socket.remotePort), "utf8")).toString(16), 16);
socket_sessions[req.socket.id] = [];
var request_headers = {};
request_headers['request'] = "GET " + req.originalUrl + " HTTP/1.1";
request_headers.request_url = req.originalUrl;
request_headers.raw_headers = "Request: "+request_headers['request']+"\r\n";
Object.keys(req.headers).forEach(function (k) {
request_headers[k] = req.headers[k];
request_headers.raw_headers += k+": "+req.headers[k] + "\r\n";
});
request_headers.query = req.query;
if (minisrv_config.config.debug_flags.show_headers) console.log(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC GET Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
if (getServiceEnabled(service_name)) {
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC GET Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
else debug(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC GET Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
if (!ssl && minisrv_config.services[service_name].force_https && minisrv_config.services[service_name].https_cert) {
var headers = `302 Moved
Location: https://${(minisrv_config.services[service_name].https_cert.domain) ? minisrv_config.services[service_name].https_cert.domain : minisrv_config.services[service_name].host}:${minisrv_config.services[service_name].port}${req.originalUrl}
@@ -2479,8 +2529,13 @@ Content-type: text/html`;
} else {
processURL(req.socket, request_headers, true)
}
} else {
var errpage = wtvshared.doErrorPage(404, "Service Not Found");
sendToClient(req.socket, errpage[0], errpage[1]);
}
})
server.post('*', (req, res) => {
var errpage = null;
var ssl = (req.socket.ssl) ? true : false;
var service_name = getServiceByPort(v);
req.socket.minisrv_pc_mode = true;
@@ -2498,31 +2553,52 @@ Content-type: text/html`;
request_headers.raw_headers += k+": "+req.headers[k] + "\r\n";
});
request_headers.query = req.query;
var host_name = (request_headers['host']) ? request_headers['host'] : null;
if (host_name) {
if (host_name.indexOf(":") != -1) host_name = host_name.substring(0, host_name.indexOf(":"));
debug(host_name)
service_name = (getServiceByVHost(host_name)) ? getServiceByVHost(host_name) : service_name
}
if (getServiceEnabled(service_name)) {
if (req.body) {
if (typeof(req.body) == "string") {
if (typeof (req.body) == "string") {
request_headers.post_data = req.body;
} else if (req.body.length) {
if (req.body.length > (minisrv_config.config.max_post_length * 1024 * 1024)) {
errpage = wtvshared.doErrorPage("400", "POST size too large");
} else {
var data = "";
for (var i=0; i<req.body.length; i++) {
for (var i = 0; i < req.body.length; i++) {
data += String.fromCharCode(req.body[i]);
}
request_headers.post_data = data;
} else {
request_headers.post_data = "";
}
} else {
request_headers.post_data = "";
}
}
if (minisrv_config.config.debug_flags.show_headers) console.debug(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC POST Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
else debug(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC POST Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
if (minisrv_config.config.debug_flags.show_headers) console.log(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC POST Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
if (!ssl && minisrv_config.services[service_name].force_https && minisrv_config.services[service_name].https_cert) {
var headers = `302 Moved
Location: https://${(minisrv_config.services[service_name].https_cert.domain) ? minisrv_config.services[service_name].https_cert.domain : minisrv_config.services[service_name].host}:${minisrv_config.services[service_name].port}${req.originalUrl}
Content-type: text/html`;
sendToClient(req.socket, headers);
} else if (errpage) {
sendToClient(req.socket, errpage[0], errpage[1]);
} else {
processURL(req.socket, request_headers, true)
}
} else {
var errpage = wtvshared.doErrorPage(404, "Service Not Found");
sendToClient(req.socket, errpage[0], errpage[1]);
}
})
return true;
} catch (e) {

View File

@@ -2,45 +2,53 @@ class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
var styledata = {};
this.styledata.text = "#000000"
this.styledata.link = "#180d4b"
this.styledata.vlink = "#660000"
this.styledata.headcol = this.styledata.text
this.styledata.listcol1 = "#ff7c76"
this.styledata.listcol2 = "#81c2d0"
this.styledata.stylemedia = ["/clipart/styleMedia/us_flag.gif", "/clipart/Flags/fl00050_.gif"];
this.styledata.text = "#000000";
this.styledata.link = "#180d4b";
this.styledata.vlink = "#660000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#ff7c76";
this.styledata.listcol2 = "#81c2d0";
this.styledata.stylemedia = [
"/clipart/styleMedia/us_flag.gif",
"/clipart/Flags/fl00050_.gif",
];
this.styledata.headerimgL = "clipart/Flags/fl00050_.gif";
this.styledata.headerimgLheight = "68";
this.styledata.headerimgLwidth = "66";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body vlink="#660000" link="#180d4b" bgcolor="#eeeeee" background="clipart/styleMedia/us_flag.gif">`
<body vlink="#660000" link="#180d4b" bgcolor="#eeeeee" background="clipart/styleMedia/us_flag.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<center>
<font size="6" color=` + this.styledata.text + `><b>${title}</b></font>
</center>`
this.styledata.titheader +=
`<center>
<font size="6" color=` +
this.styledata.text +
`><b>${title}</b></font>
</center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += ` <p>&nbsp;</p>`
this.styledata.titheader += ` <p>&nbsp;</p>`;
this.styledata.afterblock1 = null;
@@ -56,7 +64,7 @@ to return to editing it.
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
@@ -64,8 +72,7 @@ to return to editing it.
</tbody></table>
<div style="position: static !important;"></div></body></html>`
return styledata;
<div style="position: static !important;"></div></body></html>`;
}
get() {

View File

@@ -0,0 +1,81 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#cccc99";
this.styledata.link = "66ff66";
this.styledata.vlink = "#ccffcc";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/baseballfield.gif",
"/clipart/styleMedia/baseball.gif",
];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/baseballfield.gif" text="#cccc99" link="#66ff66" vlink="#ccffcc">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<center>
<img src="clipart/styleMedia/baseball.gif" width="400" height="100" align="bottom">
&nbsp;
</center><p>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<CENTER><H1><font size="6" color=` +
this.styledata.text +
`>${title}</font></H1></CENTER>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = ``;
this.styledata.footerstart = `<p>&nbsp;
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -12,42 +12,48 @@ class PBTemplate {
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body text="#7ac2d5" bgcolor="#11144c" link="#a5a033" vlink="#25a51f">`
<body text="#7ac2d5" bgcolor="#11144c" link="#a5a033" vlink="#25a51f">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.header += `
<center>
<font size="+3" color="#66ff66"><b>
<table width="100%" cellspacing="4" cellpadding="4" border="0">
<tbody><tr>
<td>`
this.styledata.titheader = ``
<td>`;
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<font size="+4" color=` + this.styledata.text + `>${title}</font></td>
<td>`
this.styledata.titheader +=
`<font size="+4" color=` +
this.styledata.text +
`>${title}</font></td>
<td>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = `</tr>
</table>
</b></font></center>`
</b></font></center>`;
this.styledata.tabstart = ``;
@@ -60,13 +66,13 @@ to return to editing it.
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`
</HTML>`;
}
get() {

View File

@@ -2,23 +2,26 @@ class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#faf3ed"
this.styledata.link = "#fa9d46"
this.styledata.vlink = "#fa7474"
this.styledata.headcol = this.styledata.text
this.styledata.text = "#faf3ed";
this.styledata.link = "#fa9d46";
this.styledata.vlink = "#fa7474";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile5.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body vlink="#fa7474" text="#faf3ed" link="#fa9d46" background="clipart/styleMedia/tile5.gif">`
<body vlink="#fa7474" text="#faf3ed" link="#fa9d46" background="clipart/styleMedia/tile5.gif">`;
// Do some templating here for some fucking reason
if (state == "previewing") {
this.styledata.header += `
@@ -27,20 +30,21 @@ class PBTemplate {
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<center><h1><font color=` + this.styledata.text + `>`
this.styledata.titheader +=
`<center><h1><font color=` + this.styledata.text + `>`;
this.styledata.titheader += `
${title}
</font></h1></center>`
</font></h1></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
@@ -57,7 +61,7 @@ ${title}
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
@@ -65,7 +69,8 @@ ${title}
</tbody></table>
<div style="position: static !important;"></div></body></html>` }
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;

View File

@@ -5,40 +5,43 @@ class PBTemplate {
this.styledata.link = "#0000EE";
this.styledata.vlink = "#551A8B";
this.styledata.text = "#000000";
this.styledata.headcol = "#eeeeee"
this.styledata.listcol1 = "#eeeeee"
this.styledata.headcol = "#eeeeee";
this.styledata.listcol1 = "#eeeeee";
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/CAT.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body bgcolor="#eeeeee">`
<body bgcolor="#eeeeee">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.header += `
<table width="100%" cellspacing="4" cellpadding="4" border="0">
<tbody>`
<tbody>`;
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<center>
<font size="7" color="#000000"><b>${title}</b></font></center>`
<font size="7" color="#000000"><b>${title}</b></font></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
@@ -59,14 +62,14 @@ to return to editing it.
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`
<div style="position: static !important;"></div></body></html>`;
}
get() {

View File

@@ -0,0 +1,98 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#14122f";
this.styledata.link = "#ae1b27";
this.styledata.vlink = "#4e4397";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/so00511w_.gif",
"/clipart/Special_Occasions/Holidays/so00470_.gif",
];
this.styledata.headerimgL =
"clipart/Special_Occasions/Holidays/so00470_.gif";
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="#464de3" text="#14122f" link="#ae1b27" vlink="#4e4397">
<center>
<table border="0" cellpadding="8" cellspacing="0" frame>`;
this.styledata.previewheader = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="black" text="#e68a34" link="#e64045">
<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>
<center>
<table border="0" cellpadding="8" cellspacing="0" frame>
`;
this.styledata.titheader = `<tr bgcolor="#464de3">
<td bgcolor="#464de3">
<img height="63" width="54" src="clipart/styleMedia/so00511w_.gif">
</td>
<td bgcolor="#464de3" >
<center>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<b><font size="7" color="#e6e1e1">${title}</font></b></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</td>
<td bgcolor="#464de3">
<img height="63" width="54" src="clipart/styleMedia/so00511w_.gif">
</td>
</tr>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<tr>
<td bgcolor="#464de3">&nbsp; <p>&nbsp;</td>
<td bgcolor="#e1dee3">`;
this.styledata.footerstart = `<p>&nbsp;
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,95 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#ffffff";
this.styledata.link = "#D26E81";
this.styledata.vlink = "#CC3333";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/so00483_.gif",
"/clipart/styleMedia/so00482_.gif",
"/clipart/styleMedia/so00130_.gif",
];
this.styledata.headerimgL = "clipart/styleMedia/so00130_.gif";
this.styledata.headerimgLheight = "68";
this.styledata.headerimgLwidth = "74";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body background="#255126" text="#ffffff" link="#D26E81" vlink="#CC3333" bgcolor="#255126">`;
this.styledata.previewheader = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="black" text="#e68a34" link="#e64045">
<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>
`;
this.styledata.titheader = `<center>
<table border="0" cellpadding="0" cellspacing="2" frame width="90%">
<tr>
<td><img src="clipart/styleMedia/so00483_.gif"></td>
<td >
<center>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</td>
<td><img src="clipart/styleMedia/so00483_.gif"></td>
</tr>
</table>
</center>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = ``;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,82 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#180d4b";
this.styledata.vlink = "#660000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#e5f4ff";
this.styledata.listcol2 = "#81c2d0";
this.styledata.stylemedia = [
"/clipart/styleMedia/stars.gif",
"/clipart/Animals/Wildlife/an00348_.gif",
"/clipart/Animals/Wildlife/an00974_.gif",
];
this.styledata.headerimgL = "clipart/Animals/Wildlife/an00974_.gif";
this.styledata.headerimgLheight = "75";
this.styledata.headerimgLwidth = "88";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="white" link="#180d4b" vlink="#660000" background="clipart/styleMedia/stars.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<center><font size="6" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `<p><img src="clipart/Animals/Wildlife/an00348_.gif" width="277" height="273" align="bottom"> </p>
<p>&nbsp;</p>
</center>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<blockquote>`;
this.styledata.footerstart = `</blockquote>
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,104 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#000000";
this.styledata.vlink = "#000000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/Animations/AG00397_.gif",
"/clipart/styleMedia/easter.gif",
"/clipart/Animations/AG00398_.gif",
];
this.styledata.headerimgL = "clipart/Animations/AG00397_.gif";
this.styledata.headerimgLheight = "163";
this.styledata.headerimgLwidth = "102";
this.styledata.headerimgR = "clipart/Animations/AG00398_.gif";
this.styledata.headerimgRheight = "163";
this.styledata.headerimgRwidth = "102";
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="#66cccc">
<center>`;
this.styledata.previewheader = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="#66cccc">
<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>
<center>
`;
this.styledata.titheader = `<table border="0">
<tr>
<td width="102">
<center>
<img src="clipart/Animations/AG00397_.gif" width="102" height="163" align="bottom"></center>
</td>
<td>
<center>
<font size="7"><img src="clipart/styleMedia/easter.gif" width="239" height="75" align="bottom"></font></center>
</td>
<td width="102">
<center>
<img src="clipart/Animations/AG00398_.gif" width="102" height="163" align="bottom"></center>
</td>
</tr>
<tr>
<td colspan=3 >
<center>
`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<font size="6" color="#000000"><b>${title}</b></font></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</tr>
</table>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<P>`;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "black";
this.styledata.link = "#09021e";
this.styledata.vlink = "#2f0001";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile9.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/tile9.gif" text="black" link="#09021e" vlink="#2f0001">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,96 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#7eecf7";
this.styledata.link = "#c5c1ca";
this.styledata.vlink = "#b4c1fa";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/Animations/AG00219_.gif",
"/clipart/Animations/AG00220_.gif",
];
this.styledata.headerimgL = "clipart/Animations/AG00220_.gif";
this.styledata.headerimgLheight = "100";
this.styledata.headerimgLwidth = "100";
this.styledata.headerimgR = "clipart/Animations/AG00219_.gif";
this.styledata.headerimgRheight = "100";
this.styledata.headerimgRwidth = "100";
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="#ccffcc" bgcolor="#003300" link="#ffcc00" vlink="#ccb699">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<table border="0">
<tr>
<td width="100">
<center>
<img src="clipart/Animations/AG00219_.gif" width="100" height="100" align="bottom"></center>
</td>
<td >
<center>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="6" color=` +
this.styledata.text +
`><b>${title}</b></font></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</td>
<td width="100">
<center>
<img src="clipart/Animations/AG00220_.gif" width="100" height="100" align="bottom"></center>
</td>
</tr>
</table>
<p>&nbsp;</p>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<P>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,80 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#180d4b";
this.styledata.vlink = "#660000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#ffcc00";
this.styledata.listcol2 = "#ffcc00";
this.styledata.stylemedia = ["/clipart/Nature/Flowers/na00140_.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<BODY bgcolor=#ffffcc link=#006600 vlink=#660000>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<TABLE cellpadding=8 width=100%>
<TR>
<TD><IMG src=clipart/Nature/Flowers/na00140_.gif width=253 height=273 align=left> </TD>
<TD>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<FONT size=+3 color=#003300>${title}</FONT>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `<P></TD>
</TR>
</TABLE>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `
<CENTER>
<P>`;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,78 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#ffffcc";
this.styledata.link = "yellow";
this.styledata.vlink = "#ffcc99";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/footballfield.gif",
"/clipart/styleMedia/football.gif",
];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/footballfield.gif" text="#ffffcc" bgcolor="white" link="yellow" alink="#ccffcc" vlink="#ffcc99">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<img src="clipart/styleMedia/football.gif" width="283" height="55" align="bottom"><p>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<H1><font size="6" color=` +
this.styledata.text +
`>${title}</font></H1>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `</center>
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -12,43 +12,49 @@ class PBTemplate {
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body text="#97e373" bgcolor="#003300" link="#ccc63f" vlink="#22cc17">`
<body text="#97e373" bgcolor="#003300" link="#ccc63f" vlink="#22cc17">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.header += `
<center>
<font size="+3" color="#66ff66"><b>
<table border=0 cellspacing="4" cellpadding="4" width=100%>
<tbody><tr>
<td>`
<td>`;
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<font size="+4" color=` + this.styledata.text + `>${title}</font></td>
<td>`
this.styledata.titheader +=
`<font size="+4" color=` +
this.styledata.text +
`>${title}</font></td>
<td>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = `</tr>
</table>
</b></font></center>`
</b></font></center>`;
this.styledata.tabstart = ``;
@@ -61,13 +67,13 @@ to return to editing it.
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`
</HTML>`;
}
get() {

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#261373";
this.styledata.link = "blue";
this.styledata.vlink = "#2a6e73";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile6.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="#261373" link="blue" vlink="#2a6e73" background="clipart/styleMedia/tile6.gif">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = ``;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "black";
this.styledata.link = "blue";
this.styledata.vlink = "#ff00ff";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body bgcolor="silver" text="black" link="blue" alink="red" vlink="#ff00ff">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `</center>
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -3,23 +3,31 @@ class PBTemplate {
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#e68a34";
this.styledata.link = "#e64045";
this.styledata.vlink = "#e64045";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/Animations/j0205352.gif", "/clipart/Animations/j0205350.gif", "/clipart/Special_Occasions/Holidays/so00430_.gif"];
this.styledata.headerimgL = "clipart/Special_Occasions/Holidays/so00430_.gif";
this.styledata.headerimgLheight = "94";
this.styledata.headerimgLwidth = "119";
this.styledata.header = `<html>
this.styledata.link = "#e64045";
this.styledata.vlink = "#e64045";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/Animations/j0205352.gif",
"/clipart/Animations/j0205350.gif",
"/clipart/Special_Occasions/Holidays/so00430_.gif",
];
this.styledata.headerimgL =
"clipart/Special_Occasions/Holidays/so00430_.gif";
this.styledata.headerimgLheight = "94";
this.styledata.headerimgLwidth = "119";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="black" text="#e68a34" link="#e64045">`
this.styledata.previewheader = `<html>
<body bgcolor="black" text="#e68a34" link="#e64045">`;
this.styledata.previewheader = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
@@ -32,34 +40,37 @@ You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>
`
this.styledata.titheader = `<center>
`;
this.styledata.titheader = `<center>
<table border="0" cellpadding="0" cellspacing="2" frame width="90%">
<tr>
<td><img height="150" width="150" src="clipart/Animations/j0205352.gif"></td>
<td >
<center>`
if (state == "editing") {
<center>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
}
this.styledata.titheader += `<font size="+3" color=` + this.styledata.text + `><b>${title}</b></font></center>`
`;
}
this.styledata.titheader +=
`<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
}
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</td>
this.styledata.titheader += `</td>
<td><img height="150" width="150" src="clipart/Animations/j0205350.gif"></td>
</tr>
</table>
</center>`
</center>`;
this.styledata.afterblock1 = null;
this.styledata.afterblock1 = null;
this.styledata.tabstart = ``;
this.styledata.tabstart = ``;
this.styledata.footerstart = `
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
@@ -68,13 +79,13 @@ this.styledata.footerstart = `
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`
</HTML>`;
}
get() {

View File

@@ -0,0 +1,79 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#33309a";
this.styledata.vlink = "#33309a";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#d6d6d6";
this.styledata.listcol2 = "#d6d6d6";
this.styledata.stylemedia = ["/clipart/styleMedia/AG00318_.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<BODY bgcolor="#c4dbff" link="#33309a">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<TABLE border=0 cellpadding=8>
<TR>
<TD><IMG src=clipart/styleMedia/AG00318_.gif align=left> </TD>
<TD>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<FONT size=+3 color=#003300>${title}</FONT>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `<P></TD>
</TR>
</TABLE>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `
<CENTER>`;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,79 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#4c58b6";
this.styledata.vlink = "#519eb6";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#d6d6d6";
this.styledata.listcol2 = "#d6d6d6";
this.styledata.stylemedia = ["/clipart/styleMedia/AG00318_.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<BODY bgcolor="#deb1b1" link="#4c58b6" vlink="#519eb6">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<TABLE border=0 cellpadding=8>
<TR>
<TD><IMG src=clipart/styleMedia/AG00318_.gif align=left> </TD>
<TD>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<FONT size=+3 color=#003300>${title}</FONT>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `<P></TD>
</TR>
</TABLE>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `
<CENTER>`;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#7eecf7";
this.styledata.link = "#c5c1ca";
this.styledata.vlink = "#b4c1fa";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile4.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="#7eecf7" link="#c5c1ca" vlink="#b4c1fa" background="clipart/styleMedia/tile4.gif">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b><i>${title}</i></b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<P>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,80 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#ffffa0";
this.styledata.link = "#fff81f";
this.styledata.vlink = "#ffa034";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile1.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/tile1.gif" text="#ffffa0" link="#fff81f" vlink="#ffa034">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<CENTER><H1>
<font color=` +
this.styledata.text +
`>${title}</font>
</H1></CENTER>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `&nbsp;`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,102 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.link = "#00ffff";
this.styledata.vlink = "#ccffff";
this.styledata.text = "#ffffff";
this.styledata.headcol = "#ffffff";
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/oceantile.gif",
"/clipart/Animals/Fish_n_Sealife/an01053_.gif",
"/clipart/Animals/Fish_n_Sealife/an00312_.gif",
"/clipart/Animals/Fish_n_Sealife/na00299_.gif",
];
this.styledata.headerimgL = "/clipart/Animals/Fish_n_Sealife/an01053_.gif";
this.styledata.headerimgLheight = "68";
this.styledata.headerimgLwidth = "32";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body vlink="#CCFFFF" text="#FFFFFF" link="#00FFFF" bgcolor="#7189ae" background="clipart/styleMedia/oceantile.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `
<center>
<table border="0" cellpadding="0" cellspacing="2" frame width="90%">
<tr>
<td><img height="69" width="69" src="clipart/Animals/Fish_n_Sealife/na00299_.gif"></td>
<td >
<center>
`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font></center>
`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `
</td>
<td><img height="69" width="78" src="clipart/Animals/Fish_n_Sealife/an00312_.gif"></td>
</tr>
</table>
</center>
`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `</td>
</tr>
</tbody></table>
</center>
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</tbody></table>
</center>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "c8e7f1";
this.styledata.link = "#fffe67";
this.styledata.vlink = "#ff7171";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/show-tile3.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/show-tile3.gif" text="#c8e7f1" link="#fffe67" vlink="#ff7171">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -12,43 +12,49 @@ class PBTemplate {
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body text="#cabdc7" bgcolor="#660517" link="#cac534" vlink="#c8cac5">`
<body text="#cabdc7" bgcolor="#660517" link="#cac534" vlink="#c8cac5">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.header += `
<center>
<font size="+3" color="#66ff66"><b>
<table border="0" cellspacing="4" cellpadding="4" width=100%>
<tbody><tr>
<td>`
<td>`;
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<font size="+4" color=` + this.styledata.text + `>${title}</font></td>
<td>`
this.styledata.titheader +=
`<font size="+4" color=` +
this.styledata.text +
`>${title}</font></td>
<td>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = `</tr>
</table>
</b></font></center>`
</b></font></center>`;
this.styledata.tabstart = ``;
@@ -61,13 +67,13 @@ to return to editing it.
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`
</HTML>`;
}
get() {

View File

@@ -2,45 +2,55 @@ class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000"
this.styledata.link = "#180d4b"
this.styledata.vlink = "#660000"
this.styledata.headcol = this.styledata.text
this.styledata.listcol1 = "#e5f4ff"
this.styledata.listcol2 = "#81c2d0"
this.styledata.stylemedia = ["/clipart/styleMedia/stars.gif", "/clipart/Animals/Wildlife/an00660_.gif", "/clipart/Animals/Wildlife/an00975_.gif"];
this.styledata.text = "#000000";
this.styledata.link = "#180d4b";
this.styledata.vlink = "#660000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = "#e5f4ff";
this.styledata.listcol2 = "#81c2d0";
this.styledata.stylemedia = [
"/clipart/styleMedia/stars.gif",
"/clipart/Animals/Wildlife/an00660_.gif",
"/clipart/Animals/Wildlife/an00975_.gif",
];
this.styledata.headerimgL = "clipart/Animals/Wildlife/an00975_.gif";
this.styledata.headerimgLheight = "70";
this.styledata.headerimgLwidth = "51";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="white" link="#180d4b" vlink="#660000" background="clipart/styleMedia/stars.gif">`
<body bgcolor="white" link="#180d4b" vlink="#660000" background="clipart/styleMedia/stars.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<center><font size="6" color=` + this.styledata.text + `><b>${title}</b></font>`
this.styledata.titheader +=
`<center><font size="6" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `<p><img src="clipart/Animals/Wildlife/an00660_.gif" width="317" height="273" align="bottom"> </p>
<p>&nbsp;</p>
</center>`
</center>`;
this.styledata.afterblock1 = null;
@@ -55,13 +65,13 @@ to return to editing it.
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`
</HTML>`;
}
get() {

View File

@@ -0,0 +1,89 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#000000";
this.styledata.link = "#180d4b";
this.styledata.vlink = "#660000";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/ringbinder.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="black" link="#552768" bgcolor="white" vlink="#333333" background="clipart/styleMedia/ringbinder.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>
`;
}
this.styledata.header += `<TABLE border=0 cellspacing=0 cellpadding=0>`;
this.styledata.titheader = `<TR>
<TD width=80 rowspan=2></TD>
<TD >
<CENTER>
<FONT size=7>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<font color=` + this.styledata.text + `><b>${title}</B>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</FONT></CENTER>
</TD>
</TR>
<TR>
<TD valign=top>
<FONT size=6 color=#666666><B>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = "";
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</table>
</B></FONT></P>
<P>&nbsp;</TD>
</TR>
</TABLE>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "e4ece6";
this.styledata.link = "eceb9f";
this.styledata.vlink = "#e1903c";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile12.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="#e4ece6" link="#eceb9f" vlink="#e1903c" background="clipart/styleMedia/tile12.gif">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "black";
this.styledata.link = "#2a238c";
this.styledata.vlink = "#f17075";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile11.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/tile11.gif" link="#2a238c" vlink="#f17075">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -1,4 +1,3 @@
class PBTemplate {
styledata = {};
@@ -6,34 +5,40 @@ class PBTemplate {
this.styledata.link = "#ffcc00";
this.styledata.vlink = "#ffff99";
this.styledata.text = "#cccccc";
this.styledata.headcol = "#cccccc"
this.styledata.headcol = "#cccccc";
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/spacefield.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html><head>
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body vlink="#ffff99" text="#cccccc" link="#ffcc00" bgcolor="#333333" background="clipart/styleMedia/spacefield.gif">`
<body vlink="#ffff99" text="#cccccc" link="#ffcc00" bgcolor="#333333" background="clipart/styleMedia/spacefield.gif">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`
</TABLE>`;
}
this.styledata.titheader = ``
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`
`;
}
this.styledata.titheader += `<center>
<font size="7" color=` + this.styledata.text + `><b>
this.styledata.titheader +=
`<center>
<font size="7" color=` +
this.styledata.text +
`><b>
${title}
</b></font>
<p>
@@ -43,12 +48,11 @@ ${title}
</td>
</tr>
</tbody></table>
</center>`
</center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>
@@ -67,7 +71,7 @@ ${title}
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
@@ -75,7 +79,7 @@ ${title}
</center>
<div style="position: static !important;"></div></body></html>`
<div style="position: static !important;"></div></body></html>`;
}
get() {

View File

@@ -0,0 +1,78 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#ffffcc";
this.styledata.link = "#00ccff";
this.styledata.vlink = "#ccffff";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/stonesfield.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body text="#ffffcc" bgcolor="white" link="#00ccff" vlink="#ccffff" background="clipart/styleMedia/stonesfield.gif">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<center>
<font size="+3" color=` +
this.styledata.text +
`><b><i>${title}</i></b></font>
</center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `</center>
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,80 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#cccccc";
this.styledata.link = "#50caca";
this.styledata.vlink = "#47ca92";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/tile3.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/tile3.gif" text="#cccccc" link="#50caca" vlink="#47ca92">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`<CENTER><H1>
<font color=` +
this.styledata.text +
`>${title}</font>
</H1></CENTER>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `&nbsp;`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<p>`;
this.styledata.footerstart = `</center>
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,77 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "white";
this.styledata.link = "aqua";
this.styledata.vlink = "#ccffff";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = ["/clipart/styleMedia/watertile.gif"];
this.styledata.headerimgL = null;
this.styledata.headerimgLheight = null;
this.styledata.headerimgLwidth = null;
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<meta name="generator" content="WebTV Page Builder (Rebuilt By JarHead)">
<meta name="description" content="${desc}">
<title>${title}</title>
</head>
<body background="clipart/styleMedia/watertile.gif" text="white" link="aqua" alink="red" vlink="#ccffff">
<center>`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = ``;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader +=
`
<font size="+3" color=` +
this.styledata.text +
`><b>${title}</b></font>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.afterblock1 = null;
this.styledata.tabstart = `<P>`;
this.styledata.footerstart = `
<table width="100%" cellspacing="2" cellpadding="0" border="0">
<tbody><tr height="0">
<td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td><td height="0">
<spacer type="block" width="30%" height="0">
</spacer></td></tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `
</td>
</tr>
</tbody></table>
<div style="position: static !important;"></div></body></html>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,87 @@
class PBTemplate {
styledata = {};
constructor(wtvauthor, title, desc, state, docName) {
this.styledata.text = "#3f3a89";
this.styledata.link = "#6a298c";
this.styledata.vlink = "#6a298c";
this.styledata.headcol = this.styledata.text;
this.styledata.listcol1 = null;
this.styledata.listcol2 = null;
this.styledata.stylemedia = [
"/clipart/styleMedia/j0172489.gif",
"/clipart/Special_Occasions/Wedding/so00527_.gif",
];
this.styledata.headerimgL =
"clipart/Special_Occasions/Wedding/so00527_.gif";
this.styledata.headerimgLheight = "76";
this.styledata.headerimgLwidth = "92";
this.styledata.headerimgR = null;
this.styledata.headerimgRheight = null;
this.styledata.headerimgRwidth = null;
this.styledata.header = `<html>
<head>
<META NAME="generator" CONTENT="WebTV Page Builder (Rebuilt By JarHead)">
<META NAME="description" CONTENT="${desc}">
<title>${title}</title>
</head>
<body bgcolor="#97bfbb" text="#3f3a89" link="#6a298c" vlink="#6a298c">`;
if (state == "previewing") {
this.styledata.header += `<TABLE cellspacing=0 cellpadding=0 bgcolor=#1e4261 border=1 width=100%>
<TR><TD valign=middle align=center><FONT color=#D1D1D1>
You are previewing your page. Press <B>Back</B>
to return to editing it.
</FONT>
</TABLE>`;
}
this.styledata.titheader = `<center>
<table border="0" cellpadding="0" cellspacing="2" frame width="90%">
<tr>
<td><img src="clipart/styleMedia/j0172489.gif" height="122" width="123"></td>
<td >
<center>`;
if (state == "editing") {
this.styledata.titheader += `<a href="wtv-author:/edit-title?docName=${docName}&titleOnly=true">
`;
}
this.styledata.titheader += `<FONT size=+3 color=#${this.styledata.text}><b>${title}</b></FONT></center>`;
if (state == "editing") {
this.styledata.titheader += `</a>`;
}
this.styledata.titheader += `</td>
</tr>
</table>
</center>`;
this.styledata.afterblock1 = null;
this.styledata.tabstart = `
<CENTER>
<P>`;
this.styledata.footerstart = `
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<tr height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
<td height=0>
<spacer type=block width=30% height=0>
</tr>`;
this.styledata.webtvfooter = wtvauthor.getCommonFooter();
this.styledata.footerend = `</td>
</tr>
</table>
</BODY>
</HTML>`;
}
get() {
return this.styledata;
}
}
module.exports = PBTemplate;

View File

@@ -0,0 +1,162 @@
var minisrv_service_file = true;
try {
var relativePath = request_headers.request_url;
if (relativePath.indexOf('?') > -1) relativePath = relativePath.split('?')[0];
while (relativePath.endsWith('/')) relativePath = relativePath.substring(0, relativePath.length - 1);
var dir = service_name + relativePath;
var num_per_page = 25;
var dirs = ['<tr><td>Directory</td><td><a href="' + relativePath + '/..">Parent Directory</a></td><td>-</td><td>-</td></tr > '];
var files = [];
vault_found = false;
// Iterate through each service vault to find the first occurrence
for (let i = 0; i < service_vaults.length; i++) {
const vaultPath = path.join(service_vaults[i], dir || '');
if (!fs.existsSync(vaultPath)) continue;
try {
vault_found = true;
const entries = fs.readdirSync(vaultPath);
entries.forEach(entry => {
if (entry === path.basename(__filename)) return;
// Check if entry exists in all service vaults
let found = false;
var checkPath = "";
for (let j = 0; j < service_vaults.length; j++) {
checkPath = path.join(service_vaults[j], dir || '', entry);
if (fs.existsSync(checkPath)) {
found = true;
break;
}
}
// Skip if not found in all
if (!found) return;
const fullPath = checkPath;
const stats = fs.statSync(fullPath);
const isDir = stats.isDirectory();
const mimeType = (isDir) ? "Directory" : wtvmime.getContentType(fullPath)[1];
var readableSize = '-';
// Get file size with unit
if (!isDir) {
const fileSize = stats.size;
const units = ['Bytes', 'KB', 'MB', 'GB'];
const unitSize = Math.floor(Math.log(fileSize) / Math.log(1024));
readableSize = (fileSize / Math.pow(1024, unitSize)).toFixed(2) + units[unitSize];
}
// Get last modified time
const mtime = stats.mtime.toLocaleString('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
// Check if modified recently
const currentTime = Date.now();
const tenSecondsAgo = currentTime - 10000;
const isModifiedRecently = stats.mtime.getTime() > tenSecondsAgo;
// Create clickable link
const link = isDir ?
`<a href="${relativePath}/${entry}">${entry}</a>` :
`<a href="${relativePath}/${path.basename(fullPath)}">${entry}</a>`;
// Generate icon and timestamp display
const icon = mimeType;
const timestampDisplay = isModifiedRecently ?
`<span style="color: #666;">${mtime}</span>` :
`${mtime}`;
if (isDir) dirs.push(`<tr><td>${icon}</td><td>${(isModifiedRecently) ? entry : link}</td><td>${readableSize}</td><td>${timestampDisplay}</td></tr>`);
else files.push(`<tr><td>${icon}</td><td>${(isModifiedRecently) ? entry : link}</td><td>${readableSize}</td><td>${timestampDisplay}</td></tr>`);
});
} catch (err) {
console.error('Error:', err);
continue;
}
}
if (!vault_found) {
var errpage = wtvshared.doErrorPage(404);
headers = errpage[0];
data = errpage[1];
} else {
// Pagination logic
const totalFiles = files.length;
const max_pages = Math.ceil(totalFiles / num_per_page);
let current_page = 1; // Default to first page
if (totalFiles > 0) {
current_page = parseInt(request_headers.query.page || 1);
if (current_page < 1) current_page = 1;
if (current_page > max_pages) current_page = max_pages;
}
const start_index = (current_page - 1) * num_per_page;
const end_index = current_page * num_per_page;
const merged_files = dirs.concat(files);
const paginatedFiles = merged_files.slice(start_index, end_index);
let paginationHtml = `
<div style="text-align: center; margin-top: 20px;">
<form action="" method="get" style="display: inline;">
<input type=button onclick="window.location.href='?page=1'" ${(current_page === 1) ? 'disabled' : ''} value="First"></input>
<input type=button onclick="window.location.href='?page=${Math.max(current_page - 1, 1)}'" ${(current_page === 1) ? 'disabled' : ''} value="Previous"></input>
<span style="margin: 0 10px;">Page ${current_page} of ${max_pages}</span>
<input type=button onclick="window.location.href='?page=${Math.min(current_page + 1, max_pages)}'" ${(current_page === max_pages) ? 'disabled' : ''} value="Next"></input>
<input type=button onclick="window.location.href='?page=${max_pages}'" ${(current_page === max_pages) ? 'disabled' : ''} value="Last"></input>
</form>
</div>`;
data = `
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Directory Index</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #121212;
color: #ffffff;
}
a, a:hover, a:active {
color: #1e90ff;
text-decoration: none;
}
a:visited { color: #8a2be2; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 8px; text-align: left; border-bottom: 1px solid #333; }
tr:hover { background-color: #2a2a2a; }
</style>
</head>
<body bgcolor="#121212" text="#ffffff" link="#1e90ff" vlink="#8a2be2">
<h2>Directory Index of ${relativePath}</h2>
<hr>
<table>
<tr><th>Type</th><th>Name</th><th>Size</th><th>Last Modified</th></tr>
${paginatedFiles.join('')}
</table>
${paginationHtml}
<script>
function toggleTheme() { ... }
</script>
</body>
</html>`;
headers = `200 OK\nContent-Type: text/html`;
}
} catch (err) {
console.error('Error:', err);
var err = wtvshared.doErrorPage(404);
headers = err[0];
data = err[1];
}

File diff suppressed because it is too large Load Diff

View File

@@ -8,9 +8,10 @@ var oldBlockNum = request_headers.query.blockNum
var blockType = pagedata.blocks[oldBlockNum].type
var photo;
var thumbnail;
if (pagedata.blocks[oldBlockNum].photo) {
console.log(pagedata.blocks[oldBlockNum].photo);
photo = wtvshared.atob(pagedata.blocks[oldBlockNum].photo)
photo = wtvshared.btoa(pagedata.blocks[oldBlockNum].photo)
thumbnail = photo.replace('clipart/', 'clipart/icons/');
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,281 +1,7 @@
var minisrv_service_file = true;
var create = true;
var pagenums = session_data.pagestore.listPages().length;
if (minisrv_config.services["wtv-author"].max_pages) {
if (pagenums + 1 > minisrv_config.services["wtv-author"].max_pages) {
create = false;
}
}
if (create) {
headers = `200 OK
headers = `302 Moved
Connection: Keep-Alive
Content-Type: text/html`
Location: wtv-author:/styles?tmplClass=11&docName=&styleName=&pageNum=0`;
data = `<HTML>
<HEAD>
<DISPLAY fontsize=medium>
<TITLE>Select a page style</TITLE>
</HEAD>
<sidebar width=122 height=420 align=left>
<table cellspacing=0 cellpadding=0 height=385>
<TR>
<td width=3>
<td abswidth=2 bgColor=#8A99B0 rowspan=99>
<td absHEIGHT=4>&nbsp;
<td abswidth=2 bgColor=#8A99B0 rowspan=99>
<td width=4 rowspan=99>
<td backGround="wtv-author:/ROMCache/grad_tile.gif" width=16 rowspan=99>
</TR>
<tr>
<td>
<td align=right height=69 width=93 href="wtv-home:/home">
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
<tr>
<td absheight=5>&nbsp;
<TR>
<td colspan=5 absheight=2 valign=middle align=center bgcolor=#8A99B0>&nbsp;
<tr>
<td>
<td abswidth=93 absheight=26>
<table href="wtv-author:/documents" cellspacing=0 cellpadding=0>
<tr>
<td abswidth=5>
<td abswidth=90 valign=middle align=left>
<table cellspacing=0 cellpadding=0>
<tr>
<td maxlines=1>
<font sizerange=medium color="C2CCD7">Index</font>
</table>
</table>
<TR>
<td colspan=5 absheight=2 valign=middle align=center bgcolor=#8A99B0>&nbsp;
<tr>
<td>
<td abswidth=93 absheight=26>
<table href="wtv-guide:/help?topic=Glossary&subtopic=P&page=pagebuilder" cellspacing=0 cellpadding=0>
<tr>
<td abswidth=5>
<td abswidth=90 valign=middle align=left>
<table cellspacing=0 cellpadding=0>
<tr>
<td maxlines=1>
<font sizerange=medium color="C2CCD7">Help</font>
</table>
</table>
<TR>
<td colspan=5 absheight=2 valign=middle align=center bgcolor=#8A99B0>&nbsp;
<tr>
<td>
<td valign=bottom align=right>
<img src="wtv-author:/ROMCache/pagebuilder.gif" height=124 width=78>&nbsp;
</table>
</sidebar>
<body bgcolor=#1e4261 background=wtv-author:/ROMCache/blue_tile_128.gif text=AEBFD1 link=B8BDC7 vlink=B8BDC7 hspace=0 vspace=0>
<table cellspacing=0 cellpadding=0 width=100%>
<tr>
<td abswidth=10 rowspan=100>
<tr>
<td height=44 width=206 valign=middle colspan=2>
<font size=+1 color=D1D1D1>
<blackface> Choose a page style </blackface>
</font>
<td align=right valign=middle>
<table valign=middle>
<tr>
<td>
<table cellspacing=0 cellpadding=0>
<tr>
<td>
<img src="wtv-author:/ROMCache/minus_button_dim.gif">
</table>
</td>
<td align=center>
<font color=D1D1D1>
<B>1 of 1</B>
</font>
</td>
<td>
<table cellspacing=0 cellpadding=0 ref="wtv-author:/styles?tmplClass=11&docName=&styleName=&pageNum=1#plus" id=plus>
<tr>
<td>
<img src="wtv-author:/ROMCache/plus_button_dim.gif">
</table>
</td>
</tr>
</table>
<tr>
<td absheight=5>
<tr>
<td colspan=5>
<font color=AEBFD1> You can change the style at any time without losing your text or images. </font>
<tr>
<td absheight=10>
<tr>
<td absheight=5>
<tr>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Blue_Sands.tmpl&contentTMPL=&styleName=Blue Sands&blocksPerPage=0" name="Blue Sands">
<spacer type=block width=4></spacer>
<font color=0F283F> Blue Sands <BR>
</font>
<center>
<img src=/images/styles/blue_sands.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Space.tmpl&contentTMPL=&styleName=Space&blocksPerPage=0" name="Space">
<spacer type=block width=4></spacer>
<font color=0F283F> Space <BR>
</font>
<center>
<img src=/images/styles/space.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Cats.tmpl&contentTMPL=&styleName=Cats&blocksPerPage=0" name="Cats">
<spacer type=block width=4></spacer>
<font color=0F283F> Cats <BR>
</font>
<center>
<img src=/images/styles/catz.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
<tr>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Blue.tmpl&contentTMPL=&styleName=Blue&blocksPerPage=0" name="Blue">
<spacer type=block width=4></spacer>
<font color=0F283F> Blue <BR>
</font>
<center>
<img src=/images/styles/blue.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Red.tmpl&contentTMPL=&styleName=Red&blocksPerPage=0" name="Red">
<spacer type=block width=4></spacer>
<font color=0F283F> Red <BR>
</font>
<center>
<img src=/images/styles/red.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
<td>
<TABLE border=0 cellpadding=0 cellspacing=0 width=137>
<TR height=120>
<TD width=128 height=120 bgcolor=#8A99B0 href="new?tmplClass=&layoutTMPL=Republican.tmpl&contentTMPL=&styleName=Republican&blocksPerPage=0" name="Republican">
<spacer type=block width=4></spacer>
<font color=0F283F> Republican <BR>
</font>
<center>
<img src=/images/styles/republican.gif width="120" height="90" vspace=3>
</center>
</TD>
<TD height=120>
<IMG height=120 width=12 src=/ROMCache/right_shadow.gif>
</TD>
</TR>
<TR>
<TD width=128>
<IMG height=12 width=128 src=/ROMCache/bottom_shadow.gif>
</TD>
<TD>
<IMG height=12 width=12 src=/ROMCache/corner_shadow.gif>
</TD>
</TR>
</TABLE>
</td>
</table>
</BODY>
</HTML>
`;
} else {
var err = wtvshared.doErrorPage(500, "You are not allowed to create more than <b>"+minisrv_config.services["wtv-author"].max_pages+"</b> pages.");
headers = err[0];
data = err[1];
}
data = ''

View File

@@ -4,11 +4,48 @@ var challenge_response, challenge_header = '';
var gourl;
var wtvsec_login = null;
if (request_headers.query.hangup) {
hasPendingTransfer = session_data.hasPendingTransfer()
if (hasPendingTransfer) {
if (hasPendingTransfer.type == "target") {
var xferSession = new WTVClientSessionData(minisrv_config, hasPendingTransfer.ssid);
xferSession.user_id = 0
var primary_username = xferSession.listPrimaryAccountUsers()['subscriber']['subscriber_username'];
var transferPendingDest = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "There is a pending transfer of the account <b>" + primary_username + "</b>, would you like to complete the transfer, or cancel it?",
'buttonlabel1': "Complete Transfer",
'buttonaction1': "wtv-head-waiter:/complete-account-transfer",
'buttonlabel2': "Cancel Transfer",
'buttonaction2': "wtv-head-waiter:/cancel-account-transfer",
'noback': true,
}).getURL();
var errpage = wtvshared.doRedirect(transferPendingDest);
var headers = errpage[0];
var data = errpage[1];
} else if (hasPendingTransfer.type == "source") {
var transferPendingSrc = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "There is a pending transfer of this account to <b>" + hasPendingTransfer.ssid + "</b>. In order to use this box, you need to complete or cancel the transfer.",
'buttonlabel1': "Power Off",
'buttonaction1': "client:poweroff",
'buttonlabel2': "Cancel Transfer",
'buttonaction2': "wtv-head-waiter:/cancel-account-transfer",
'noback': true,
}).getURL();
var errpage = wtvshared.doRedirect(transferPendingSrc);
var headers = errpage[0];
var data = errpage[1];
} else {
console.log(hasPendingTransfer);
}
} else {
if (request_headers.query.hangup) {
headers = `300 OK
Location: client:gototvhome
wtv-visit: client:hangupphone`
} else {
} else {
var user_id = (request_headers.query.user_id) ? request_headers.query.user_id : session_data.user_id;
if (socket.ssid !== null && user_id !== null) session_data.switchUserID(user_id);
@@ -72,7 +109,7 @@ minisrv-no-mail-count: true
if (session_data.baddisk === true && !ssid_sessions[socket.ssid].get("bad_disk_shown")) {
gourl = "wtv-head-waiter:/bad-disk?"
}
else if (session_data.getNumberOfUserAccounts() > 1 && user_id === 0 && (!session_data.isUserLoggedIn() || request_headers.query.initial_login || request_headers.query.relogin) ) {
else if (session_data.getNumberOfUserAccounts() > 1 && user_id === 0 && (!session_data.isUserLoggedIn() || request_headers.query.initial_login || request_headers.query.relogin)) {
gourl = "wtv-head-waiter:/choose-user?"
} else {
if (!session_data.getUserPasswordEnabled() && request_headers.query.user_login) session_data.setUserLoggedIn(true);
@@ -94,4 +131,5 @@ wtv-encrypted: ${(request_headers['wtv-encrypted']) ? wtvshared.parseBool(reques
wtv-visit: ${gourl}`;
}
}
}

View File

@@ -0,0 +1,13 @@
var minisrv_service_file = true;
var ssid = session_data.cancelPendingTransfer();
var transferCanceled = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "The transfer of this account to <b>" + ssid + "</b> has been cancelled.",
'buttonlabel1': "Okay",
'buttonaction1': "wtv-head-waiter:/login",
'noback': true,
}).getURL();
var errpage = wtvshared.doRedirect(transferCanceled);
var headers = errpage[0];
var data = errpage[1];

View File

@@ -0,0 +1,24 @@
var minisrv_service_file = true;
var result = session_data.finalizePendingTransfer();
if (result) {
var transferCanceled = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "The transfer is complete.",
'buttonlabel1': "Login",
'buttonaction1': "wtv-head-waiter:/login",
'noback': true,
}).getURL();
} else {
var transferCanceled = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "The transfer failed.",
'buttonlabel1': "Try to Login",
'buttonaction1': "wtv-head-waiter:/login",
'noback': true,
}).getURL();
}
var errpage = wtvshared.doRedirect(transferCanceled);
var headers = errpage[0];
var data = errpage[1];

View File

@@ -3,7 +3,6 @@ session_data.setUserLoggedIn(false);
var challenge_response, challenge_header = "";
if (socket.ssid !== null) session_data.switchUserID(0);
var gourl = "wtv-head-waiter:/ValidateLogin?";
if (request_headers.query.relogin) gourl += "relogin=true";
else if (request_headers.query.reconnect) gourl += "reconnect=true";

View File

@@ -0,0 +1,146 @@
var minisrv_service_file = true;
// security
if (session_data.user_id != 0 && session_data.user_id != request_headers.query.user_id) {
var errpage = wtvshared.doErrorPage(400, "You are not authorized to transfer this account. Please log in as the primary user.");
headers = errpage[0];
data = errpage[1];
}
if (!session_data.getUserPasswordEnabled()) {
var passwordRequired = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "For security, you must first set a password on your account before you can transfer it.",
'buttonlabel1': "Set Password",
'buttonaction1': "wtv-setup:/edit-password",
'buttonlabel2': "Cancel",
'buttonaction2': "client:donothing",
'noback': true,
}).getURL();
var errpage = wtvshared.doRedirect(passwordRequired);
headers = errpage[0];
data = errpage[1];
} else if (session_data.getUserPasswordEnabled() && session_data.user_id === 0) {
headers = `200 OK
Connection: Keep-Alive
Content-Type: text/html
wtv-expire-all: wtv-setup:/transfer-account
wtv-noback-all: wtv-setup:/transfer-account`;
data = `<HTML>
<HEAD>
<TITLE>
Transfer your account
</TITLE>
<DISPLAY nosave skipback noscroll>
</HEAD>
<sidebar width=110> <table cellspacing=0 cellpadding=0 BGCOLOR="30364D">
<tr>
<td colspan=3 abswidth=104 absheight=4>
<td rowspan=99 width=6 absheight=420 valign=top align=left>
<img src="wtv-home:/ROMCache/Shadow.gif" width=6 height=420>
<tr>
<td abswidth=6>
<td abswidth=92 absheight=76>
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
<tr>
<td align=right>
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
</table>
<td abswidth=6>
<tr><td absheight=5 colspan=3>
<table cellspacing=0 cellpadding=0>
<tr><td abswidth=104 absheight=2 valign=middle align=center bgcolor="1C1E28">
<img src="wtv-home:/ROMCache/Spacer.gif" width=1 height=1>
<tr><td abswidth=104 absheight=1 valign=top align=left>
<tr><td abswidth=104 absheight=2 valign=top align=left bgcolor="4D5573">
<img src="wtv-home:/ROMCache/Spacer.gif" width=1 height=1>
</table>
<tr><td absheight=37>
<tr><td absheight=263 align=right colspan=3>
<img src="ROMCache/AccountBanner.gif" width=53 height=263>
<tr><td absheight=41>
</table>
</sidebar>
<BODY BGCOLOR="#191919" TEXT="#44cc55" LINK="189CD6" VLINK="189CD6" HSPACE=0 VSPACE=0 FONTSIZE="large"
>
<table cellspacing=0 cellpadding=0>
<tr>
<td abswidth=14>
<td abswidth=416 absheight=80 valign=center>
<font size="+2" color="E7CE4A"><blackface><shadow>
Transfer your account
<td abswidth=20>
<tr>
<td>
<td absheight=244 valign=top align=left>
<form
action="wtv-setup:/validate-transfer-account"
>
<P>
<table cellspacing=0 cellpadding=0 border=0>
<tr>
<td align=left valign=top abswidth=400 colspan=2>
<table cellspacing=0 cellpadding=0>
<tr>
<td align=left>
Enter the SSID of the target box, and the current primary user's password.
</table>
<tr>
<tr>
</td>
<td align=left valign=top width=6>
</td>
<table cellspacing=0 cellpadding=0>
<tr><td absheight=15></td></tr>
<tr>
<td colspan=3 align=left>
SSID<br>
<INPUT noSubmit name="ssid" id="ssid" Value=""
bgcolor=#444444 text=#ffdd33 cursor=#cc9933
TYPE="text" ASCIIONLY
SIZE="20"
MAXLENGTH="16">
<tr>
<td height=6>
<tr>
<td colspan=3 align=left>
<br>Primary User Password<br>
<INPUT noSubmit name="password" id="password" Value=""
bgcolor=#444444 text=#ffdd33 cursor=#cc9933
TYPE="password" ASCIIONLY
SIZE="20"
MAXLENGTH="${minisrv_config.config.passwords.max_length}">
</a>
</table>
</table>
<td>
<tr>
<td absheight=7>
<tr>
<td>
<td colspan=2 absheight=2 bgcolor="2B2B2B">
<img src="wtv-home:/ROMCache/Spacer.gif" width=426 height=1>
<tr>
<td absheight=1>
<tr>
<td>
<td colspan=2 absheight=2 bgcolor="0D0D0D">
<img src="wtv-home:/ROMCache/Spacer.gif" width=426 height=1>
<tr>
<td absheight=4>
</table>
<table cellspacing=0 cellpadding=0>
<tr>
<td abswidth=430 valign=top align=right>
<font color="#E7CE4A" size=-1><shadow>
<input
selected
type=submit borderimage="file://ROM/Borders/ButtonBorder2.bif"
value=Continue name="Continue" usestyle width=103>
</shadow></font></form>
<td abswidth=20>
</table>
</body>
</html>`
}

View File

@@ -0,0 +1,69 @@
var minisrv_service_file = true;
var wtvr = new WTVRegister(minisrv_config);
// security
if (session_data.user_id != 0 && session_data.user_id != request_headers.query.user_id) {
var errpage = wtvshared.doErrorPage(400, "You are not authorized to transfer this account. Please log in as the primary user.");
headers = errpage[0];
data = errpage[1];
}
if (!request_headers.query.ssid || !request_headers.query.password) {
var errpage = wtvshared.doErrorPage(400, "Invalid Parameter");
headers = errpage[0];
data = errpage[1];
}
if (!session_data.getUserPasswordEnabled()) {
var passwordRequired = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "For security, you must first set a password on your account before you can transfer it.",
'buttonlabel1': "Set Password",
'buttonaction1': "wtv-setup:/edit-password",
'buttonlabel2': "Cancel",
'buttonaction2': "client:donothing",
'noback': true,
}).getURL();
var errpage = wtvshared.doRedirect(passwordRequired);
headers = errpage[0];
data = errpage[1];
} else if (session_data.getUserPasswordEnabled() && session_data.user_id === 0 && request_headers.query.ssid && request_headers.query.password) {
validPassword = session_data.validateUserPassword(request_headers.query.password);
if (!validPassword) {
var errpage = wtvshared.doErrorPage(400, "Incorrect Password");
headers = errpage[0];
data = errpage[1];
}
else if (!wtvshared.checkSSID(request_headers.query.ssid)) {
var errpage = wtvshared.doErrorPage(400, "The provided SSID is not valid. Only valid CRC validated SSIDs are available as a destination. Please check your input and try again.");
headers = errpage[0];
data = errpage[1];
}
else if (!wtvr.checkSSIDAvailable(request_headers.query.ssid)) {
var errpage = wtvshared.doErrorPage(400, "The destination already has an account registered, or a transfer is already in progress. Please delete the account associated with the target SSID, or cancel the pending transfer, then try again.");
headers = errpage[0];
data = errpage[1];
} else {
var transferInitiated = new clientShowAlert({
'image': minisrv_config.config.service_logo,
'message': "Your account transfer is pending. Please connect to this server with the destination box. A prompt should appear instead of registration. To cancel the transfer, select <b>Cancel Transfer</b>, or simply reconnect with this box.",
'buttonlabel1': "Cancel Transfer",
'buttonaction1': "wtv-head-waiter:/cancel-account-transfer",
'buttonlabel2': "Power Off",
'buttonaction2': "client:poweroff",
'noback': true,
}).getURL();
session_data.setPendingTransfer(request_headers.query.ssid);
session_data.setUserLoggedIn(false);
var errpage = wtvshared.doRedirect(transferInitiated);
headers = errpage[0];
data = errpage[1];
}
} else {
var errpage = wtvshared.doErrorPage(400, "Invalid Parameter");
headers = errpage[0];
data = errpage[1];
}

View File

@@ -16,12 +16,17 @@ function getLegend() {
headers = `200 OK
Content-Type: text/html`;
data = `<html><head><display allowoffline switchtowebmode>
<script src=/ROMCache/h.js></script><script src=/ROMCache/n.js></script>
<script src=htv-cSetup.js></script>
</head ><form name=t><input type=hidden name=h value=&pname;></form>
<script>head('WebTV Character Map');</script>
<br><br>
data = `<html>
<body>
<display nosave nosend>
<title>Character Map</title>
<sidebar width=20%>
<img src="wtv-tricks:/images/Favorites_bg.jpg">
</sidebar>
<body bgcolor="#191919" text="#44cc55" link="36d5ff" vlink="36d5ff" vspace=0>
<br>
<br>
<h1>WebTV Character Map</h1>
<table border=1>`;

View File

@@ -1,79 +1,246 @@
var minisrv_service_file = true;
var client_caps = null;
let client_caps = null;
if (socket.ssid != null) {
if (session_data.capabilities) {
client_caps = session_data.capabilities;
}
}
if (client_caps) {
headers = `200 OK
Content-Type: text/html`
var service_ip = minisrv_config.config.service_ip
var client_label = "TODO";
var boot_client_label = "TODO";
var wtv_system_sysconfig_str = "TODO";
headers = `200 OK
Content-Type: text/html`;
const versionMap = [
{ build: 0, vers: `1.0` },
{ build: 200, vers: `1.1` },
{ build: 300, vers: `1.2` },
{ build: 1000, vers: `1.3` },
{ build: 1090, vers: `1.3Retail` },
{ build: 1127, vers: `1.4Retail` },
{ build: 1150, vers: `1.4` },
{ build: 2000, vers: `2.0` },
{ build: 2100, vers: `2.0J` },
{ build: 2150, vers: `2.0.1J` },
{ build: 2200, vers: `2.0.1` },
{ build: 2300, vers: `2.0.3` },
{ build: 2500, vers: `2.0.5` },
{ build: 3000, vers: `2.1` },
{ build: 3065, vers: `2.1.1` },
{ build: 3070, vers: `2.1.5` },
{ build: 3250, vers: `2.1.7` },
{ build: 3450, vers: `Springboard2.2` },
{ build: 3600, vers: `2.0.2J` },
{ build: 3700, vers: `2.2.1J` },
{ build: 3800, vers: `2.2.5` },
{ build: 5000, vers: `2.3` },
{ build: 5200, vers: `Fiji` },
{ build: 5500, vers: `2.3.5` },
{ build: 5700, vers: `2.3.7` },
{ build: 5750, vers: `2.3.8` },
{ build: 5759, vers: `2.3.8-NAND` },
{ build: 6000, vers: `3.0` }, // WNI actually did this, i'm pretty sure they gave up
{ build: 32767, vers: `Private` },
];
function getVersion(givenBuild) {
return (versionMap.at(versionMap.findIndex(({ build }) => build > givenBuild) - 1).vers);
}
const serviceIP = minisrv_config.config.service_ip;
const zTitle = `WebTV Services, (${minisrv_version_string})`;
const systemVersion = session_data.get("wtv-system-version");
const bootromVersion = session_data.get("wtv-client-bootrom-version");
const SSID = wtvshared.filterSSID(
session_data.get("wtv-client-serial-number")
);
const romType = session_data.get("wtv-client-rom-type");
const chipVersionStr =
"0x0" + parseInt(session_data.get("wtv-system-chipversion")).toString(16);
const sysConfigHex =
"0x" + parseInt(session_data.get("wtv-system-sysconfig")).toString(16);
const capabilitiesTable = new WTVClientCapabilities().capabilities_table;
var wtv_system_version = session_data.get("wtv-system-version");
var wtv_client_bootrom_version = session_data.get("wtv-client-bootrom-version");
var wtv_client_serial_number = wtvshared.filterSSID(session_data.get("wtv-client-serial-number"));
var wtv_client_rom_type = session_data.get("wtv-client-rom-type");
var wtv_system_chipversion_str = session_data.get("wtv-system-chipversion");
var wtv_system_sysconfig_hex = parseInt(session_data.get("wtv-system-sysconfig")).toString(16);
// halen's sysconfig/chipversion stuff
const soloVersion = (chipVersionStr & 0xf00000) >> 0x14;
const soloFab = (chipVersionStr & 0xf0000) >> 0x10;
const boardType = (sysConfigHex & 0x7000) >> 0xc;
const boardRev = (sysConfigHex & 0xf00) >> 8;
const boardRevB = (sysConfigHex & 0xf0) >> 4;
var capabilities_table = new WTVClientCapabilities().capabilities_table;
// determine box ASIC type
switch (chipVersionStr >> 0x18) {
case 1:
chip = "FIDO1";
break;
case 3:
chip = `SOLO-${soloVersion}, fab ${soloFab}`;
break;
case 4:
chip = `SOLO2-${soloVersion}, fab ${soloFab}`; // don't know much about this one
break;
default:
chip = "?";
}
// ========================= LC2 SYSCONFIG DECODE START =========================
// determine box video type
if ((sysConfigHex & 8) == 0) video = "NTSC";
else video = "PAL";
data = `<html>
// determine box storage type
if ((sysConfigHex & 4) == 0) storage = "disk";
else storage = "flash";
// determine box CPU endianness
if ((sysConfigHex & 0x80000) == 0) endianness = "little";
else endianness = "big";
// determine box CPU type
if ((sysConfigHex & 0x100000) == 0) cpu = 5230;
else cpu = 4640;
// determine box CPU clock multiplier
if ((sysConfigHex & 0x20000) == 0) cpuMult = 3;
else cpuMult = 2;
// determine smartcard 0 support
if ((sysConfigHex & 0x400000) == 0) sc0 = "supported";
else sc0 = "not supported";
//determine smartcard 1 support
if ((sysConfigHex & 0x200000) == 0) sc1 = "supported";
else sc1 = "not supported";
// ========================= FCS SYSCONFIG DECODE START =========================
/* "I don't even know how it works."
-Bruce Leak, Thursday, October 12, 1995 1:53:28 AM */
// determine box CPU output bufs
if ((sysConfigHex & 0x2000) == 0) outputBufs = 100;
else outputBufs = 50;
// determine box SGRAM speed
function getSGSpeed() {
let SGRAMand = sysConfigHex & 0xc00000;
if (SGRAMand == 0x400000) return 66;
else if (0x400000 < SGRAMand)
if (SGRAMand == 0x800000) return 77;
else if (SGRAMand == 0xc00000) return 83; // potentially incorrect but looks like it should return 83MHz on known existing hardware
else if (SGRAMand == 0) return 100;
}
// determine box audio chip type
if ((sysConfigHex & 0xc0000) == 0xc0000) audio = "AKM4310/4309";
else audio = "Unknown";
// determine box audio clock source
if ((sysConfigHex & 0x20000) == 0) audioClk = "SPOT";
else audioClk = "External";
// determine box video chip
function getVideoChip() {
let videoChipAnd = sysConfigHex & 0x600;
if (videoChipAnd == 0x200) return "Bt851";
else if (videoChipAnd < 0x201 && videoChipAnd !== 0) return "Unknown";
else if (videoChipAnd == 0x400) return "Bt852";
else return "Philips7187/Bt866";
}
// determine box video type
if ((sysConfigHex & 0x800) == 0) videoB = "PAL";
else videoB = "NTSC";
// determine box video clock source
if ((sysConfigHex & 0x10000) == 0) videoClk = "External";
else videoClk = "SPOT";
// determine box board type
switch (sysConfigHex & 0xc) {
case 8:
boardTypeB = "Trial";
break;
case 0xc:
boardTypeB = "FCS";
break;
default:
boardTypeB = "Unknown Type";
}
// determine bank 0 type
if (sysConfigHex < 0) bank0Type = "Mask";
else bank0Type = "Flash";
// determine bank 0 mode
if ((sysConfigHex & 0x40000000) == 0) bank0Mode = "Normal";
else bank0Mode = "PageMode";
// determine bank 1 type
if ((sysConfigHex & 0x8000000) == 0) bank1Type = "Flash";
else bank1Type = "Mask";
// determine bank 1 mode
if ((sysConfigHex & 0x40000000) == 0) bank1Mode = "Normal";
else bank1Mode = "PageMode";
data = `<html>
<!--- *=* Copyright 1996, 1997 WebTV Networks, Inc. All rights reserved. --->
<display nosave nosend skipback>
<title>${minisrv_config.config.service_name} Info</title>
<sidebar width=20%>
<img src="wtv-tricks:/images/About_bg.jpg">
</sidebar>
<body bgcolor="#191919" text="#44cc55" link="36d5ff" vlink="36d5ff" vspace=0>
<br>
<br>
<br>
<h1>${minisrv_config.config.service_name} Info</h1>
<table cellspacing=0 cellpadding=0><tr><td abswidth=10>&nbsp;<td colspan=3>
<table>
<tr>
<td height=20>
<tr>
<td valign=top align=right><shadow>Connected to:</shadow>
<td width=10>
<td valign=top>Mini Service
<td valign=top>${minisrv_config.config.service_name} Service
<tr>
<td valign=top align=right><shadow>Host/Port:</shadow>
<td width=10>
<td valign=top>${service_ip}/${minisrv_config.services[service_name].port}
<td valign=top>${serviceIP}/${minisrv_config.services[service_name].port}
<tr>
<td valign=top align=right width=150><shadow>Service:</shadow>
<td width=10>
<td valign=top>${minisrv_version_string}
<td valign=top>${zTitle}
<tr>
<td valign=top align=right><shadow>Client:</shadow>
<td width=10>
<td valign=top>&vers; (Build ${wtv_system_version} [${client_label}])
<td valign=top>&vers; (Build ${systemVersion} [${getVersion(systemVersion)}])
<tr>
<td valign=top align=right><shadow>Boot:</shadow>
<td width=10>
<td valign=top>&wtv-bootvers; (Build ${wtv_client_bootrom_version} [${boot_client_label}])
<td valign=top>&wtv-bootvers; (Build ${bootromVersion} [${getVersion(bootromVersion)}])
<tr>
<td height=20)
<tr>
<td valign=top align=right><shadow>Silicon serial ID:</shadow>
<td width=10>
<td valign=top>${wtv_client_serial_number}
<td valign=top>${SSID}
<tr>
<td valign=top align=right><shadow>Connected at:</shadow>
<td width=10>
<td valign=top>&rate;
<tr>
<td valign=top align=right><shadow>POP Number:</shadow>
<td width=10>
<td valign=top>&phone;
<tr>
<td valign=top align=right><shadow>Client IP number:</shadow>
<td width=10>
@@ -87,16 +254,7 @@ Content-Type: text/html`
<tr>
<td valign=top align=right><shadow>Subscriber Username:</shadow>
<td width=10>
<td valign=top>${session_data.getSessionData("subscriber_username")}
<tr>
<td valign=top align=right><shadow>Subscriber Contact:</shadow>
<td width=10>
<td valign=top>${session_data.getSessionData("subscriber_contact")} (${session_data.getSessionData("subscriber_contact_method")})`;
} else {
data += `<tr>
<td valign=top align=right><shadow>Unregistered Guest:</shadow>
<td width=10>
<td valign=top>Yes`;
<td valign=top>${session_data.getSessionData("subscriber_username")}`;
}
data += `<tr>
@@ -104,28 +262,22 @@ Content-Type: text/html`
<tr>
<td valign=top align=right><shadow>ROM type:</shadow>
<td width=10>
<td valign=top>${wtv_client_rom_type}
<td valign=top>${romType}
<tr>
<td valign=top align=right><shadow>Modem f/w (when available):</shadow>
<td width=10>
<td valign=top>&modem;
`;
if (session_data.get("wtv-need-upgrade")) {
data += `<tr>
<td valign=top align=right><shadow>Mini-browser:</shadow>
<td width=10>
<td valign=top>Yes
`;
}
data += `
<tr>
<td valign=top align=right><shadow>Chip version:</shadow>
<td width=10>
<td valign=top>${wtv_system_chipversion_str} (TODO)
<td valign=top>${chipVersionStr} (${chip})`;
if (sysConfigHex !== "0xNaN")
data += `
<tr>
<td valign=top align=right><shadow>SysConfig:</shadow>
<td width=10>
<td valign=top>0x${wtv_system_sysconfig_hex}
<td valign=top>${sysConfigHex}`;
data += `
</table>
<table>
@@ -139,33 +291,39 @@ Content-Type: text/html`
<table>
`;
// start loop
Object.keys(capabilities_table).forEach(function (k) {
Object.keys(capabilitiesTable).forEach(function (k) {
data += `<tr>
<td valign=top align=right>${capabilities_table[k][1]}
<td valign=top align=right>${capabilitiesTable[k][1]}
<td width=10>
`;
if (client_caps[capabilities_table[k][0]]) data += "<td valign=top>True\n";
if (client_caps[capabilitiesTable[k][0]]) data += "<td valign=top>True\n";
else data += "<td valign=top>False\n";
});
// end loop
// end loop
data += `
data += `
</table>
<pre>
${wtv_system_sysconfig_str}
<pre>`
// TODO: finish FCS decode
if (romType == "bf0app" && sysConfigHex !== "0xNaN") {
data += `CPU Clk Mult = 2x Bus Clk, CPU output bufs @ ${outputBufs}%
ROM Bank 0: ${bank0Type}, ${bank0Mode}, 120ns/60ns
ROM Bank 1: ${bank1Type}, ${bank1Mode}, 150ns/75ns
SGRAM: ${getSGSpeed()}MHz
Audio: ${audio}, ${audioClk} Clk
Video: ${getVideoChip()}, ${videoB}, ${videoClk} Clk
Board: ${boardTypeB}, Rev = ${0xf - (boardRevB)} (${boardRevB})`;
} else if (sysConfigHex !== "0xNaN") {
data += `Video = ${video}, storage = ${storage}
CPU type = ${cpu}, ${endianness}-endian
CPU clock mult = ${cpuMult}x
SmartCard 0 ${sc0}, SmartCard 1 ${sc1}
Board type = ${boardType}, board rev = ${boardRev}`;
}
data += `
</pre>
<br>
</body> </html>`;
} else {
var errpage = wtvshared.doErrorPage(400);
headers = errpage[0];
data = errpage[1];
}
</body></html>`;

View File

@@ -274,7 +274,7 @@ ${thisblock.title}
block += "<td>"
block += `<CENTER>
<IMG SRC="wtv-author:/${btoa(thisblock.photo)}">
<IMG SRC="wtv-author:/${atob(thisblock.photo)}">
</CENTER>
</TD>
</TR>
@@ -470,8 +470,8 @@ this.fs.writeFile(destDir + this.wtvclient.session_store.subscriber_username + '
break;
case "clipart":
this.fs.mkdirSync(destDir + this.wtvclient.session_store.subscriber_username + '/' + pagedata.publishname + "/" + btoa(thisblock.photo).substr(0, btoa(thisblock.photo).lastIndexOf("/")), { recursive: true })
this.fs.copyFile('includes/ServiceVault/wtv-author/' + btoa(thisblock.photo), destDir + this.wtvclient.session_store.subscriber_username + '/' + pagedata.publishname + "/" + btoa(thisblock.photo), (err) => {
this.fs.mkdirSync(destDir + this.wtvclient.session_store.subscriber_username + '/' + pagedata.publishname + "/" + atob(thisblock.photo).substr(0, atob(thisblock.photo).lastIndexOf("/")), { recursive: true })
this.fs.copyFile('includes/ServiceVault/wtv-author/' + atob(thisblock.photo), destDir + this.wtvclient.session_store.subscriber_username + '/' + pagedata.publishname + "/" + atob(thisblock.photo), (err) => {
if (err) throw err;
});
block = `<p><TABLE nocolor width=100%>`
@@ -486,7 +486,7 @@ ${thisblock.title}
</TD>
</TR>`
block += `<TR><td><CENTER>
<IMG SRC="${btoa(thisblock.photo)}">
<IMG SRC="${atob(thisblock.photo)}">
</CENTER>
</TD>
</TR>

View File

@@ -52,6 +52,7 @@ class WTVClientSessionData {
this.loginWhitelist = Object.assign([], this.lockdownWhitelist); // clone lockdown whitelist into login whitelist
this.loginWhitelist.push("wtv-head-waiter:/choose-user");
this.loginWhitelist.push("wtv-head-waiter:/password");
this.loginWhitelist.push("wtv-head-waiter:/confirm-transfer");
}
assignMailStore() {
@@ -171,7 +172,6 @@ class WTVClientSessionData {
var master_directory = this.getUserStoreDirectory(true);
var account_data = [];
var self = this;
this.debug(this.ssid)
this.fs.readdirSync(master_directory).forEach(f => {
if (self.fs.lstatSync(master_directory + self.path.sep + f).isDirectory()) {
if (f.substr(0, 4) == "user") {
@@ -234,6 +234,67 @@ class WTVClientSessionData {
return false;
}
setPendingTransfer(ssid) {
var pending_file = this.getUserStoreDirectory(true) + this.path.sep + "pending_transfer.json";
var ssidobj = { "ssid": ssid, "type": "source" };
this.fs.writeFileSync(pending_file, JSON.stringify(ssidobj));
var new_userstore = this.getAccountStoreDirectory() + this.path.sep + ssidobj.ssid;
if (!this.fs.existsSync(new_userstore)) this.fs.mkdirSync(new_userstore);
var dest_pending_file = new_userstore + this.path.sep + "pending_transfer.json";
var ssidobj = { "ssid": this.ssid, "type": "target" };
this.fs.writeFileSync(dest_pending_file, JSON.stringify(ssidobj));
}
cancelPendingTransfer() {
var pending_file = this.getUserStoreDirectory(true) + this.path.sep + "pending_transfer.json";
if (this.fs.existsSync(pending_file)) {
var file = this.fs.readFileSync(pending_file)
var ssidobj = JSON.parse(file);
var new_userstore = this.getAccountStoreDirectory() + this.path.sep + ssidobj.ssid;
var dest_pending_file = new_userstore + this.path.sep + "pending_transfer.json";
if (this.fs.existsSync(dest_pending_file)) this.fs.unlinkSync(dest_pending_file);
this.fs.unlinkSync(pending_file);
if (this.fs.existsSync(new_userstore)) this.fs.rmdirSync(new_userstore);
return ssidobj.ssid
}
return null;
}
finalizePendingTransfer() {
var pending_file = this.getUserStoreDirectory(true) + this.path.sep + "pending_transfer.json";
var file = this.fs.readFileSync(pending_file)
var ssidobj = JSON.parse(file);
if (ssidobj.type != "target") return false; // Only allow completion from target
var source_ssid = ssidobj.ssid
var old_account = this.getAccountStoreDirectory() + this.path.sep + source_ssid
var new_account = this.getUserStoreDirectory(true);
this.fs.cpSync(old_account, new_account, {
filter: (source, _destination) => {
return source != "pending_transfer.json";
},
recursive: true
});
this.fs.rmSync(old_account, { recursive: true })
this.fs.rmSync(pending_file);
return true;
}
hasPendingTransfer(dtype = null) {
var pending_file = this.getUserStoreDirectory(true) + this.path.sep + "pending_transfer.json";
if (this.fs.existsSync(pending_file)) {
var ssidobj = JSON.parse(this.fs.readFileSync(pending_file));
console.log(ssidobj)
if (dtype) {
(ssidobj.type == dtype) ? ssidobj.ssid : false;
}
else {
return ssidobj;
}
} else {
return false
}
}
/**
* Store a file in the user's file store
* @param {string} path Relative path to User's file store
@@ -631,14 +692,14 @@ class WTVClientSessionData {
}
setSessionData(key, value) {
if (key === null) throw ("ClientSessionData.set(): invalid key provided");
if (key === null) throw ("ClientSessionData.setSessionData(): invalid key provided");
if (typeof (this.session_store) === 'undefined') this.session_store = new Array();
this.session_store[key] = value;
this.SaveIfRegistered();
}
deleteSessionData(key) {
if (key === null) throw ("ClientSessionData.delete(): invalid key provided");
if (key === null) throw ("ClientSessionData.deleteSessionData(): invalid key provided");
delete this.session_store[key];
this.SaveIfRegistered(true);
}

View File

@@ -27,6 +27,19 @@ class WTVRegister {
return regex.test(username);
}
checkSSIDAvailable(ssid) {
var directory = (directory) ? directory : this.session_store_dir + this.path.sep + "accounts";
var available = true;
if (this.fs.existsSync(directory)) {
this.fs.readdirSync(directory).forEach(file => {
if (file.toLowerCase() == ssid.toLowerCase()) {
available = false;
return false;
}
});
};
return available;
}
checkUsernameAvailable(username, directory = null) {
var self = this;

View File

@@ -33,8 +33,7 @@ class WTVShared {
String.prototype.reverse = function () {
var splitString = this.split("");
var reverseArray = splitString.reverse();
var joinArray = reverseArray.join("");
return joinArray;
return reverseArray.join("");
}
}
if (!String.prototype.hexEncode) {
@@ -80,12 +79,11 @@ class WTVShared {
parseConfigVars(s) {
if (s.indexOf("%ServiceDeps%") >= 0) {
if (s.indexOf("%ServiceDeps%") >= 0)
return this.getServiceDep(s.replace("%ServiceDeps%", ""), true);
} else {
else
return s;
}
}
/**
* CryptoJS implmentation of Base64 Encoder
@@ -119,12 +117,14 @@ class WTVShared {
return new RegExp(src);
} else if (src instanceof Date) {
return new Date(src.getTime());
} else if (Array.isArray(src)) {
return src.map(item => this.cloneObj(item));
} else if (typeof src === 'object' && src !== null) {
const clone = {};
Object.keys(src).forEach(k => {
clone[k] = this.cloneObj(src[k]);
var clone = null;
if (Array.isArray(src)) clone = [];
else clone = {};
var self = this;
Object.keys(src).forEach((k) => {
clone[k] = self.cloneObj(src[k]);
});
return clone;
}
@@ -349,7 +349,7 @@ class WTVShared {
utf8Decode(utf8String) {
if (typeof utf8String !== 'string') {
throw new TypeError('parameter <EFBFBD>utf8String<EFBFBD> is not a string');
throw new TypeError("parameter 'utf8String' is not a string");
}
const textDecoder = new TextDecoder('utf-8');
const bytes = new Uint8Array(utf8String.split('').map(c => c.charCodeAt(0)));
@@ -617,7 +617,7 @@ class WTVShared {
* @returns {string} Random string
*/
generatePassword(len, simple = false) {
return this.generateString(len, (simple) ? null : '!@#$%&()[]-_+=?.');
return this.generateString(len, (simple) ? '' : '!@#$%&()[]-_+=?.');
}
/**
@@ -749,7 +749,7 @@ class WTVShared {
*/
filterSSID(obj) {
var new_obj = false;
if (this.minisrv_config && this.minisrv_config.config.hide_ssid_in_logs) {
if (this.minisrv_config.config.hide_ssid_in_logs) {
if (typeof obj === "string") {
return this.censorSSID(obj);
} else if (typeof obj === "object" && obj !== null) {
@@ -765,9 +765,8 @@ class WTVShared {
filterRequestLog(obj) {
if (this.minisrv_config.config.filter_passwords_in_logs && obj.query) {
const passwordRegex = /(^pass$|passw(or)?d)/i;
let newobj = this.cloneObj(obj); // Clone the object once at the beginning
var newobj = this.cloneObj(obj); // Clone the object once at the beginning
if (newobj.query) {
Object.keys(newobj.query).forEach((k) => {
@@ -777,13 +776,9 @@ class WTVShared {
});
}
delete newobj.raw_headers;
return newobj;
}
return obj;
}
decodePostData(obj) {
@@ -974,6 +969,11 @@ class WTVShared {
}
}
/**
* Creates a 302 redirect and returns the headers/data
* @param {any} url
* @returns [headers, data]
*/
doRedirect(url) {
var headers = []
headers['Status'] = "302 Moved";
@@ -984,7 +984,7 @@ class WTVShared {
}
/**
* Creates an error message and sends it to the client
* Creates an error message and returns the headers/data
* @param {number} code HTTP Error Code
* @param {string} data Optinal Custom Error Message
* @param {string} details Optional extra error information
@@ -1000,7 +1000,7 @@ class WTVShared {
data += "<br>Details:<br>" + details;
}
let headers = `${code} ${message}\n`;
let headers = `Status: ${(pc_mode) ? 'HTTP/1.1' : ''} ${code} ${message}\n`;
headers += "Content-Type: text/html\n";
if (wtv_reset && !pc_mode) {
@@ -1075,12 +1075,16 @@ class WTVShared {
return path;
}
unpackCompressedB64(data) {
var data_buf = (typeof data === 'object') ? Buffer.from(data.toString('ascii'), 'base64') : Buffer.from(data, 'base64');
return this.zlib.inflateSync(data_buf, { finishFlush: this.zlib.Z_SYNC_FLUSH }).toString('ascii');
}
/**
* Compresses data and converts it to a base64 string
* @param {any} data
* @returns {string} base64 string
*/
packCompressedB64(data) {
return this.zlib.deflateSync(data, { 'level': 9 }).toString('base64');
}
@@ -1176,6 +1180,12 @@ class WTVShared {
return result;
}
/**
* Find a key in an object regardless of its case
* @param {string} key Key to find
* @param {obj} obj Object to search
* @returns {string|null} The found key or null if not found
*/
getCaseInsensitiveKey(key, obj) {
const foundKey = Object.keys(obj).find(k => k.toLowerCase() === key.toLowerCase());
return foundKey || null;
@@ -1191,6 +1201,17 @@ class clientShowAlert {
noback = null;
image = null;
/**
* User-friendly client:showalert generation
* @param {string} image Image URL
* @param {string} message Alert Message (HTML Allowed)
* @param {string} buttonlabel1 Button 1 Label
* @param {string} buttonaction1 Button 1 Action
* @param {string} buttonlabel2 Button 2 Label
* @param {string} buttonaction2 Button 2 Action
* @param {string} noback If true, disables the back button
* @param {string} sound Sound to play
*/
constructor(image = null, message = null, buttonlabel1 = null, buttonaction1 = null, buttonlabel2 = null, buttonaction2 = null, noback = null, sound = null) {
this.message = message;
this.buttonlabel1 = buttonlabel1;
@@ -1212,6 +1233,10 @@ class clientShowAlert {
}
}
/**
* Get the client:showalert URL from the helper class
* @returns {string} client:showalert URL
*/
getURL() {
var url = "client:ShowAlert?";
if (this.message) url += "message=" + escape(this.message) + "&";

View File

@@ -95,6 +95,8 @@
"wtv-head-waiter:/login",
"wtv-head-waiter:/ValidateLogin",
"wtv-head-waiter:/login-stage-two",
"wtv-head-waiter:/complete-account-transfer",
"wtv-head-waiter:/cancel-account-transfer",
"wtv-head-waiter:/relogin",
"wtv-head-waiter:/ROMCache/Spacer.gif",
"wtv-head-waiter:/ROMCache/NameStrip.gif",
@@ -167,7 +169,6 @@
"news": {
// for news:group.name urls
"port": 1605,
"nobind": true,
"flags": "0x00000004"
},
"wtv-register": {
@@ -233,14 +234,12 @@
"wtvchat": {
// wtvchat://server:port/channel passthrough (wni official)
"port": 1630,
"nobind": true,
"flags": "0x00000004",
"allow_double_slash": true // allows service:// .. don't enable on http or https
},
"irc": {
// irc://server:port/channel passthrough (something wni should have had...)
"port": 1630,
"nobind": true,
"flags": "0x00000004",
"servicevault_dir": "wtvchat", // share service_vault with wtvchat
"allow_double_slash": true // allows service:// .. don't enable on http or https
@@ -354,6 +353,7 @@
"privileged": true,
"use_https": false,
"force_https": false,
"catchall_file_name": "indexer.js",
"https_cert": {
/* self-signed, can be replaced with another cert */
// "domain": "mycooldomain.com",

View File

@@ -1,15 +1,16 @@
{
"name": "zefie_wtvp_minisrv",
"version": "0.9.58",
"version": "0.9.59",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "zefie_wtvp_minisrv",
"version": "0.9.58-pre",
"version": "0.9.59-pre",
"license": "GPL3",
"dependencies": {
"adm-zip": "^0.5.12",
"cross-env": "^7.0.3",
"crypto-js": "^4.2.0",
"easy-crc": "0.0.2",
"endianness": "^8.0.2",
@@ -520,11 +521,28 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"license": "MIT"
},
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
"integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.1"
},
"bin": {
"cross-env": "src/bin/cross-env.js",
"cross-env-shell": "src/bin/cross-env-shell.js"
},
"engines": {
"node": ">=10.14",
"npm": ">=6",
"yarn": ">=1"
}
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -1601,7 +1619,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/js-yaml": {
@@ -2011,7 +2028,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -2409,7 +2425,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -2422,7 +2437,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -2685,7 +2699,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"

View File

@@ -1,13 +1,14 @@
{
"name": "zefie_wtvp_minisrv",
"version": "0.9.58",
"version": "0.9.59",
"description": "WebTV Service (WTVP) Emulation Server",
"main": "app.js",
"homepage": "https://github.com/zefie/zefie_wtvp_minisrv",
"license": "GPL3",
"scripts": {
"start": "node app.js",
"test": "node test.js"
"test": "node test.js",
"debug": "cross-env DEBUG=* node app.js"
},
"author": {
"name": "zefie",
@@ -27,6 +28,7 @@
},
"dependencies": {
"adm-zip": "^0.5.12",
"cross-env": "^7.0.3",
"crypto-js": "^4.2.0",
"easy-crc": "0.0.2",
"endianness": "^8.0.2",

View File

@@ -8,4 +8,7 @@
</CleanCommand>
<StartupCommand>npm start</StartupCommand>
</PropertyGroup>
<ItemGroup>
<Folder Include="UserServiceVault\http_pc\content\midi\" />
</ItemGroup>
</Project>