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"> </td><td id="mbody"> </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"> </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"> </td></tr><tr><td id="msglist2" colspan="' + (colTypes.length+3); str += '"> </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"> </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 += '- '; } 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"> </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"> </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> </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 = ' '; 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 = ' '; 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 = ' '; } 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); }