This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/site/static/beta5/js/pg_message.js

943 lines
20 KiB
JavaScript

var colTypes = new Array('st', 'sub', 'date', 'from', 'to');
var msgSortGetData = [
'(x.status == "N") ? 2 : ((x.status == "r") ? 1 : 0)',
'x.subject.toLowerCase()', 'x.moment',
'x.from.toLowerCase()', 'x.to.toLowerCase()'
];
var folders = new Array();
var fpBuilding = false;
var flUpdate;
var page;
var vFolder;
var pCompose;
var udFolder;
var udFList;
var msgtt;
function emptyCB(data) { }
function Folder(t, i, n, nc, mc)
{
this.type = t;
this.id = i;
this.name = n;
this.nCount = nc;
this.mCount = mc;
this.messages = new Array();
this.settings = new Array();
this.threadOrder = new Array();
this.selAll = false;
this.selected = false;
this.deleteMessage = Folder_deleteMessage;
this.prepareThreading = Folder_prepareThreading;
}
function Folder_deleteMessage(idm)
{with(this) {
var i;
for (i=0;i<messages.length&&messages[i].id!=idm;i++) ;
if (i==messages.length)
return;
if (messages[i].status == 'N')
nCount --;
messages.splice(i, 1);
}}
function Folder_prepareThreading()
{with(this){
var i, j, ir = new Array();
for (i=0;i<messages.length;i++)
{
messages[i].replies = new Array();
for (j=0;j<messages.length;j++)
if (j!=i && messages[j].replyTo == messages[i].id)
{
messages[i].replies.push(j);
ir[j] = i;
}
}
threadOrder = new Array();
for (i=0;i<messages.length;i++)
{
if (typeof ir[i] != "undefined")
continue;
threadedMessage(this, i, 0);
}
}}
function threadedMessage(fld, m, d)
{with(fld){
var i;
threadOrder.push(m);
messages[m].depth = d;
for (i=0;i<messages[m].replies.length;i++)
threadedMessage(fld, messages[m].replies[i], d+1);
}}
function Message(id, moment, status, sl, rl, repl, from, to, sub, rtid)
{
this.id = id;
this.moment = parseInt(moment, 10);
this.status = status;
this.slink = sl;
this.rlink = rl;
this.replink = repl;
this.from = from;
this.to = to;
this.subject = sub;
this.replyTo = rtid;
this.replies = new Array();
this.depth = 0;
this.message = "";
this.isopen = false;
this.selected = false;
}
function ComposeParameters(tt, tid, rid)
{
this.tType = tt; // Player/Planet/Alliance
this.tId = tid; // Target identifier
this.tText = ""; // Target text
this.sText = ""; // Subject
this.cText = ""; // Contents
this.rId = rid; // Reply to
this.rText = ""; // Reply text
this.errors = new Array(0, 0, 0);
this.sent = false;
this.ready = false;
this.check = checkComposeMessage;
}
function checkComposeMessage()
{with(this){
sent = false;
if (tText == "")
errors[0] = 1;
else
errors[0] = 0;
if (sText == "")
errors[1] = 1;
else if (sText.length > 64)
errors[1] = 2;
else
errors[1] = 0;
if (cText == "")
errors[2] = 1;
else
errors[2] = 0;
return (errors[0] == 0 && errors[1] == 0 && errors[2] == 0);
}}
function makeSortFunction(type,dir)
{
var str = 'function(a,b){var x,s1,s2,i,rv=0,l=msgSortGetData.length;'
+ 'for(i=0;i<l&&rv==0;i++){x=a;eval(\'' + (dir ? 's1' : 's2')
+ '=(\'+msgSortGetData[(i+'+type+')%l]+\')\');x=b;eval(\''
+ (dir ? 's2' : 's1')+'=(\'+msgSortGetData[(i+'+type+')%l]+\')\');'
+ 'rv=((s1<s2)?-1:((s1>s2)?1:0));}return rv;}';
return str;
}
function initMessages()
{
// Initialise sort functions
var i,j;
for (i=0;i<colTypes.length;i++)
{
eval('ms_' + colTypes[i] + '_asc = ' + makeSortFunction(i,true));
eval('ms_' + colTypes[i] + '_desc = ' + makeSortFunction(i,false));
}
var data = document.getElementById('jsmsgflist').innerHTML;
if (data.split('\n').length == 1)
{
// IE really sucks.
x_updateFolders(initializeFoldersIE);
return;
}
parseFolderList(data);
initializeLayout();
data = document.getElementById('jsmsginit').innerHTML.split('#');
page = data.shift();
eval('setParameters' + page + '(data)');
drawMainMenu();
}
function initializeFoldersIE(d1)
{
parseFolderList(d1);
initializeLayout();
var data = document.getElementById('jsmsginit').innerHTML.split('#');
page = data.shift();
eval('setParameters' + page + '(data)');
drawMainMenu();
}
function parseFolderList(data)
{
var lst = data.split('\n');
var l = lst.length, i, j;
var nFolders = new Array();
var init = (folders.length == 0);
var cft, cfi;
var afc = new Array();
if (!init && page == 'Browse')
{
cft = folders[vFolder].type;
cfi = folders[vFolder].id;
}
for (i=j=0;i<l;i+=2,j++)
{
var of, a;
a = lst[i].split('#');
nFolders[j] = new Folder(a[0], a[1], lst[i+1], a[2], a[3]);
of = findFolder(a[0], a[1]);
if (of == -1)
continue;
afc[j] = folders[of].nCount;
nFolders[j].settings = folders[of].settings;
nFolders[j].messages = folders[of].messages;
nFolders[j].selAll = folders[of].selAll;
nFolders[j].selected = folders[of].selected;
nFolders[j].threadOrder = folders[of].threadOrder;
}
folders = nFolders;
if (!init)
{
if (page == 'Browse')
{
idx = findFolder(cft, cfi);
if (idx == -1)
{
page = 'NotFound';
drawPageNotFound();
}
else
{
i = vFolder;
vFolder = idx;
if (afc[i] < folders[idx].nCount)
browseFolder(idx);
}
}
else if (page == "Folders")
buildFoldersList();
drawMainMenu();
}
flUpdate = (new Date()).getTime();
udFList = setTimeout('x_updateFolders(parseFolderList)', 15000);
}
function findFolder(t, id)
{
var i;
for (i=0;i<folders.length;i++)
if (folders[i].type == t && (t != 'CUS' || (t == 'CUS' && folders[i].id == id)))
return i;
return -1;
}
function initializeLayout() {
document.getElementById('jsmsg').innerHTML = '<table cellspacing="0" cellpadding="0"><tr><td class="mmenu" id="mmenu">&nbsp;</td><td id="mbody">&nbsp;</td>'
+ '<td style="width:5%"><a href="manual?p=messages">Help</a></td></tr></table>';
}
//--------------------
// COMPOSE MESSAGE
//--------------------
function composeNew()
{
page = "Compose";
setParametersCompose(new Array("","",""));
drawMainMenu();
}
function messageTo(t,n)
{
page = "Compose";
setParametersCompose(new Array(t.toString(),n.toString(),""));
drawMainMenu();
}
function composeReply(t,n,r)
{
page = "Compose";
setParametersCompose(new Array(t.toString(),n.toString(),r));
drawMainMenu();
}
function setParametersCompose(p)
{
var tt, tid, trp;
tt = p[0] ? p[0] : "p";
tid = p[1] ? p[1] : -1;
trp = p[2] ? p[2] : -1;
pCompose = new ComposeParameters(tt, tid, trp);
if (tid != -1)
{
x_getTargetName(tt, tid, targetNameReceived);
setTimeout('checkComposeReady()', 500);
}
else
{
pCompose.ready = true;
buildComposePage();
}
}
function targetNameReceived(data)
{
pCompose.tText = data;
if (pCompose.rId != -1)
x_getMessageText(pCompose.rId, gotOriginalMessage);
else
pCompose.ready = true;
}
function gotOriginalMessage(data)
{
var a = data.split('\n');
a.shift();
if (a[0].indexOf('Re:') == 0)
pCompose.sText = a.shift();
else
pCompose.sText = 'Re: ' + a.shift();
if (a.length > 0)
pCompose.rText = a.join('\n');
pCompose.ready = true;
}
function checkComposeReady()
{
if (pCompose.ready)
buildComposePage();
else
setTimeout('checkComposeReady()', 500);
}
function buildComposePage()
{
drawComposePage();
document.getElementById('mcmsg').value = pCompose.cText;
}
function composePageStatus(s)
{
var allids = new Array('mcmtype', 'mcmto', 'mcmsub', 'mcmsg', 'mcmsend');
var i;
for (i=0;i<allids.length;i++)
document.getElementById(allids[i]).disabled = !s;
}
function sendMessage()
{
composePageStatus(false);
pCompose.tType = document.getElementById('mcmtype').value;
pCompose.tText = document.getElementById('mcmto').value;
pCompose.sText = document.getElementById('mcmsub').value;
pCompose.cText = document.getElementById('mcmsg').value;
if (!pCompose.check())
{
buildComposePage();
composePageStatus(true);
}
else
x_sendMessage(pCompose.tType, pCompose.tText, pCompose.sText, pCompose.cText, pCompose.rId, messageSent);
}
function messageSent(data)
{
if (data == "OK")
{
pCompose.tType = 0;
pCompose.tText = pCompose.sText = pCompose.cText = "";
pCompose.tId = pCompose.rId = -1;
pCompose.sent = true;
}
else
{
var i, d = data.split('#');
for (i=0;i<d.length;i++)
pCompose.errors[i] = parseInt(d[i], 10);
}
buildComposePage();
composePageStatus(true);
}
//--------------------
// BROWSE FOLDER
//--------------------
function browseFolder(i)
{
clearTimeout(udFolder);
page = 'Browse';
vFolder = i;
buildFolderPage();
drawMainMenu();
}
function setParametersBrowse(p)
{
var idx;
if (p.length == 1 && p[0] != "-1")
idx = findFolder(p[0], 0);
else if (p.length == 1)
idx = -1;
else
idx = findFolder(p[0], p[1]);
if (idx == -1)
page = 'NotFound';
else
vFolder = idx;
buildFolderPage();
}
function setParametersNotFound(p)
{
drawPageNotFound();
}
function buildFolderPage()
{
fpBuilding = true;
if (page == 'NotFound')
{
drawPageNotFound();
return;
}
drawFolderLayout();
if (folders[vFolder].settings.length == 0)
{
folders[vFolder].settings[4] = 0;
x_getFolderSettings(folders[vFolder].type, folders[vFolder].id, settingsReceived);
}
else
{
drawFolderControls(folders[vFolder].settings);
getMessageList();
}
}
function settingsReceived(data)
{
if (data != "")
{
var a = data.split('\n');
var b = a[0].split('#');
folders[vFolder].settings[0] = parseInt(b[0], 10);
folders[vFolder].settings[1] = b[1];
folders[vFolder].settings[2] = (b[2] == "1");
folders[vFolder].settings[3] = (b[3] == "1");
drawFolderControls(folders[vFolder].settings);
getMessageList();
}
else
{
page = "NotFound";
drawPageNotFound();
}
}
function getMessageList()
{
if (page != 'Browse')
return;
with(folders[vFolder]){
var a = new Array(), i, l = messages.length;
for (i=0;i<l;i++)
a.push(messages[i].id);
x_getMessageList(type, id, a.join('#'), messageListReceived);
}
}
function messageListReceived(data)
{
var ml = data.split('\n');
var i = 0, l = ml.length;
while (data != "" && i<l)
{
var dl = ml[i].split('#');
if (dl[0] == '-')
folders[vFolder].deleteMessage(dl[1]);
else
{
dl.shift();
var m = new Message(dl[0], dl[1], dl[2], dl[3], dl[4], dl[5], ml[i+1], ml[i+2], ml[i+3], dl[6]);
m.selected = folders[vFolder].selAll;
folders[vFolder].messages.push(m);
i+=3;
}
i++;
}
if (i>0)
{
if (udFList)
clearTimeout(udFList);
x_updateFolders(parseFolderList);
}
if (i>0||fpBuilding)
{
fpBuilding = false;
buildMessageDisplay();
}
}
function buildMessageDisplay()
{with(folders[vFolder]){
var mcl = messages.length, mcm = mcl % settings[0];
if (mcl == 0)
{
drawEmptyFolder();
return;
}
var smet = 'messages.sort(ms_' + settings[1] + '_' + (settings[2] ? "asc" : "desc") + ')';
eval(smet);
if (settings[3])
prepareThreading();
var npg = (mcl - mcm) / settings[0] + (mcm > 0 ? 1 : 0);
if (settings[4] >= npg)
settings[4] = npg - 1;
drawPageSelector(npg, settings[4]);
drawListHeader();
drawList();
updateControls();
udFolder = setTimeout('getMessageList()', 30000);
}}
function drawListHeader()
{with(folders[vFolder]){
var i, str = '<table class="msghdr" cellspacing="0" cellpadding="0">';
str += '<tr><td class="msgview">&nbsp;</td>';
str += '<td class="msgview"><input type="checkbox"' + msgtt[80] + 'name="selall" id="mlsa" onClick="switchSelAll();return true"';
str += (selAll ? ' checked="checked"':'') + '/></td>';
for (i=0;i<colTypes.length;i++)
{
var t = colTypes[i];
str += '<th class="mct'+t+'" onClick="switchSort(\''+t+'\');"' + msgtt[81] + '>';
if (settings[1] == t)
str += '<b>';
str += colTitles[i];
if (settings[1] == t)
{
str += '</b><img src="'+staticurl+'/beta5/pics/';
str += settings[2] ? "down" : "up";
str += '_' + color + '.gif" alt="' + (settings[2] ? "down" : "up");
str += '" />';
}
str += '</th>';
}
str += '<td class="msgview">&nbsp;</td></tr><tr><td id="msglist2" colspan="' + (colTypes.length+3);
str += '">&nbsp;</td></tr></table>';
document.getElementById('msglist').innerHTML = str;
}}
function drawList()
{with(folders[vFolder]){
var i, j, m, str = '<table class="list" cellspacing="0" cellpadding="0">';
var crc = false;
m = settings[4]*settings[0];
for (j=m;j<m+settings[0]&&j<messages.length;j++)
{
i = settings[3] ? threadOrder[j] : j;
var oct = ' onClick="switchOpen('+i+')"';
str += '<tr><td><table cellspacing="0" cellpadding="0">';
str += '<tr><td class="msgview">&nbsp;</td>';
str += '<td class="msgview"><input type="checkbox" name="msg" ' + msgtt[82] + 'id="msgck'+i+'" value="';
str += messages[i].id + '" onClick="switchSelection('+i+');"';
str += (messages[i].selected ? ' checked="checked"' : '');
str += '/></td><td class="mctst"'+oct+'><img src="'+staticurl+'/beta5/pics/msg';
str += (messages[i].status == 'N' ? 'u' : (messages[i].status == 'r' ? 'r' : 'rep'));
str += '.gif" alt="' + messages[i].status + '" /></td>';
str += '<td class="mctsub"'+oct+'>';
if (settings[3])
{
var k;
for (k=0;k<messages[i].depth;k++)
str += '-&nbsp;';
}
if (messages[i].status == 'N')
str += '<b>';
str += '<u' + msgtt[83] + '>'+messages[i].subject+'</u>';
if (messages[i].status == 'N')
str += '</b>';
str += '</td>';
str += '<td class="mctdate"'+oct+'>' + formatDate(messages[i].moment) + '</td>';
str += '<td class="mctfrom">';
if (messages[i].slink != "")
str += '<a href="#"' + msgtt[84] + ' onClick="messageTo('+messages[i].slink+');return false">';
str += messages[i].from;
if (messages[i].slink != "")
str += '</a>';
str += '</td>';
str += '<td class="mctto">';
if (messages[i].rlink != "")
str += '<a href="#"' + msgtt[84] + 'onClick="messageTo(' + messages[i].rlink + ');return false">';
str += messages[i].to;
if (messages[i].rlink != "")
str += '</a>';
str += '</td>';
str += '<td class="msgview">&nbsp;</td></tr>';
if (messages[i].isopen && messages[i].message != "")
{
if (messages[i].status == 'N')
{
messages[i].status = 'r';
nCount--;
crc = true;
}
str += '<tr><td colspan="3">&nbsp;</td><td class="mbody" colspan="4"><p>';
str += messages[i].message + '</p>';
if (messages[i].replink)
{
str += '<a class="rlink" href="#"' + msgtt[85] + 'onClick="composeReply(' + messages[i].replink + ');return false">[ ';
str += replyText + ' ]</a>';
}
str += '</td><td>&nbsp;</td></tr>';
}
str += '</table></td></tr>';
}
str += '</table>';
document.getElementById('msglist2').innerHTML = str;
if (crc)
{
drawMainMenu();
updateHeader();
}
}}
function switchSort(t)
{with(folders[vFolder]){
if (settings[1] != t)
settings[1] = t;
settings[2] = !settings[2];
x_setSortParameters(type, id, settings[1], settings[2] ? "1" : "0", emptyCB);
buildMessageDisplay();
}}
function setMsgPerPage()
{with(folders[vFolder]){
var sel = document.getElementById('fcmpp'), si = sel.selectedIndex;
settings[0] = parseInt(sel.options[si].value, 10) * 10;
x_setMessagesPerPage(type, id, sel.options[si].value, emptyCB);
buildMessageDisplay();
}}
function switchThreaded()
{with(folders[vFolder]){
settings[3] = !settings[3];
x_switchThreaded(type, id, emptyCB);
buildMessageDisplay();
}}
function changePage()
{with(folders[vFolder]){
var sel = document.getElementById('pgs'), si = sel.selectedIndex;
settings[4] = parseInt(sel.options[si].value, 10);
buildMessageDisplay();
}}
function switchOpen(i)
{with(folders[vFolder]){
messages[i].isopen = !messages[i].isopen;
if (messages[i].isopen && messages[i].message == "")
x_getMessageText(messages[i].id, gotMessageText);
else
drawList();
}}
function gotMessageText(data)
{
var i, a = data.split('\n');
var mId = a[0].split('#');
if (mId.length == 1)
return;
idx = findFolder(mId[0], mId[1]);
if (idx == -1)
return;
with (folders[idx])
{
for (i=0;i<messages.length&&messages[i].id!=mId[2];i++)
;
if (i == messages.length)
return;
if (a.length > 2)
{
a.shift();
a.shift();
messages[i].message = a.join('\n');
}
else
messages[i].message = msgNotFound;
}
drawList();
}
function switchSelection(idx)
{with(folders[vFolder]){
messages[idx].selected = !messages[idx].selected;
if (!messages[idx].selected && selAll)
{
selAll = false;
document.getElementById('mlsa').checked = false;
}
updateControls();
}}
function switchSelAll()
{with(folders[vFolder]){
var i,j=settings[0]*settings[4];
selAll = !selAll;
for (i=0;i<messages.length;i++)
messages[i].selected = selAll;
for (i=j;i<j+settings[0];i++)
{
var idx = settings[3] ? threadOrder[i] : i;
var e = document.getElementById('msgck' + idx);
if (!e)
break;
e.checked = selAll;
}
updateControls();
}}
function getPageSelection()
{with(folders[vFolder]){
var a = new Array();
var i, j = settings[0], k = j*settings[4];
for (i=k;i<j+k&&i<messages.length;i++)
if (messages[i].selected)
a.push(messages[i].id);
return a;
}}
function updateControls()
{
var str;
var s = getPageSelection();
if (s.length == 0)
str = '&nbsp;';
else
{
var i = document.getElementById('msgmvt');
if (i)
str = genMsgControls(i.options[i.selectedIndex].value);
else
str = genMsgControls('');
}
document.getElementById('msgctrl').innerHTML = str;
}
function deleteSelected()
{with(folders[vFolder]){
var a = getPageSelection(), b = new Array();
var i;
if (!confirmDelete(a.length))
return;
for (i=0;i<messages.length;i++)
b.push(messages[i].id);
clearTimeout(udFolder);
x_deleteMessages(type, id, a.join('#'), b.join('#'), messageListReceived);
}}
function moveSelected()
{with(folders[vFolder]){
var a = getPageSelection(), b = new Array();
var i, j, k;
i = document.getElementById('msgmvt');
j = i.selectedIndex;
k = i.options[j].value;
if (k == "")
{
moveError();
return;
}
c = k.split('#');
if (!c[1])
c[1] = 0;
for (i=0;i<messages.length;i++)
b.push(messages[i].id);
clearTimeout(udFolder);
x_moveMessages(type, id, c[0], c[1], a.join('#'), b.join('#'), messageListReceived);
}}
//--------------------
// FOLDER MANAGER
//--------------------
function manageFolders()
{
page = "Folders";
buildFoldersList();
drawMainMenu();
}
function setParametersFolders(p)
{
buildFoldersList();
}
function buildFoldersList()
{
drawFoldersList();
updateFControls();
updateHeader();
}
function switchFSel(fid)
{
var a = fid.split('#');
if (a[0] != "CUS")
a[1] = 0;
var i = findFolder(a[0], a[1]);
if (i == -1)
return;
folders[i].selected = !folders[i].selected;
updateFControls();
}
function updateFControls()
{
var str, fs, cd, i;
if (folders.length < 18)
drawAddFolder();
else
document.getElementById('addfld').innerHTML = '&nbsp;';
fs = 0;
cd = true;
for (i=0;i<folders.length;i++)
{
if (!folders[i].selected)
continue;
fs++;
cd = cd && (folders[i].type == 'CUS');
}
if (fs > 0)
drawSFControls(fs, cd);
else
document.getElementById('chgfld').innerHTML = '&nbsp;';
}
function renameFolder(fid)
{
var i = findFolder("CUS", fid);
if (i == -1)
return;
var nn = "";
while (nn == "")
{
nn = promptRename(folders[i].name);
if (typeof nn == 'object' && !nn)
return;
if (nn == "")
alertFolderName(0);
else if (nn.length > 32)
{
alertFolderName(1);
nn = "";
}
}
if (udFList)
clearTimeout(udFList);
x_renameFolder(fid, nn, parseFolderList);
}
function addFolder()
{
var n = document.getElementById('adfldn').value;
if (n == "")
{
alertFolderName(0);
return;
}
else if (n.length > 32)
{
alertFolderName(1);
return;
}
if (udFList)
clearTimeout(udFList);
x_addFolder(n, parseFolderList);
}
function deleteFolders()
{
var i, a = new Array(), tm = 0;
for (i=0;i<folders.length;i++)
{
if (folders[i].selected)
{
a.push(folders[i].id);
tm += parseInt(folders[i].mCount, 10);
}
}
if (tm > 0 && !confirmFDelete(a.length, tm))
return;
x_deleteFolders(a.join('#'), parseFolderList);
}
function flushFolders()
{
var i, a = new Array(), tm = 0;
for (i=0;i<folders.length;i++)
{
if (folders[i].selected)
{
a.push(folders[i].type + '!' + folders[i].id);
tm += parseInt(folders[i].mCount, 10);
}
}
if (tm == 0 || !confirmFFlush(a.length, tm))
return;
x_flushFolders(a.join('#'), parseFolderList);
}