Viewing File: /usr/local/cpanel/base/frontend/jupiter/js2/mail/filters/editfilter.js
/* jshint ignore:start */
/* TODO: Resolve remaining lint errors from legacy code */
(function() {
var LAST_PAGE_NOTICE;
window.save = function(form) {
var data = CPANEL.dom.get_data_from_form(form);
var overlay = new CPANEL.ajax.Page_Progress_Overlay(null, {
covers: form,
status_html: LOCALE.maketext("Saving filter “[output,class,_1,code]” …", data.filtername.html_encode())
});
overlay.show();
// If we are editing, then we reload the page, WITHOUT hiding the overlay.
var callback = CPANEL.ajax.build_page_callback(
function(o) {
if (WE_ARE_EDITING) {
overlay.set_status_now(LOCALE.maketext("Success! The filters list is reloading now."));
location.href = GO_BACK_URL;
} else {
overlay.hide();
LAST_PAGE_NOTICE = new CPANEL.widgets.Dynamic_Page_Notice({
level: "success",
replaces: LAST_PAGE_NOTICE,
content: LOCALE.maketext("You have successfully created a new filter. You can create another one now, or you can [output,url,_1,return to the filters list].", GO_BACK_URL)
});
}
}, {
on_error: function() {
overlay.hide();
}
}
);
CPANEL.api({
module: "Email",
func: "storefilter",
data: data,
callback: callback
});
};
}());
var workingDestEl;
var itags = ["img", "select", "input"];
var VALID_ANY_HEADER_OPTIONS = /(contains|does not contain|matches|does not match)/;
function duperow(tblname) {
var tblC = document.getElementById(tblname + "tbl");
var rowList = (tblC.getElementsByTagName("tbody"))[0].getElementsByClassName("filter-row");
var lastRow = rowList[rowList.length - 1];
var rowMatch = lastRow.id.match(/([0-9]+)/);
var newRowNum = parseInt(rowMatch[0]) + 1;
var newid = tblname + newRowNum;
var newRow = document.createElement("tr");
newRow.id = newid;
newRow.className = "filter-row";
var OldCols = lastRow.getElementsByClassName("filter-col");
var newCols = [];
for (var i = 0; i < OldCols.length; i++) {
var colId = newCols.length;
var newCol = document.createElement("td");
newCol.className = "filter-col";
newCols.push(newCol);
newCols[colId].innerHTML = OldCols[colId].innerHTML;
}
var itaglist = [];
for (var j = 0; j < itags.length; j++) {
for (var cols = 0; cols < newCols.length; cols++) {
itaglist.push.apply(itaglist, newCols[cols].getElementsByTagName(itags[j]));
}
}
if ( tblname === "action" ) {
itaglist.push(newCols[0].getElementsByClassName("tree-view-container")[0]);
itaglist.push(newCols[0].getElementsByClassName("tree-view")[0]);
}
for (var k = 0, length = itaglist.length; k < length; k++ ) {
if ( itaglist[k].name ) {
itaglist[k].name = itaglist[k].name.replace(/(\d+)/, newRowNum);
}
if ( itaglist[k].id ) {
itaglist[k].id = itaglist[k].id.replace(/(\d+)/, newRowNum);
}
if (itaglist[k].type === "button") {
continue;
}
if (itaglist[k].type === "select-one") {
itaglist[k].selectedIndex = 0;
continue;
}
if (itaglist[k].value) {
itaglist[k].value = "";
}
}
for (var i = 0; i < newCols.length; i++) {
newRow.appendChild(newCols[i]);
}
(tblC.getElementsByTagName("tbody"))[0].appendChild(newRow);
checkaddrembuttons(tblname);
return newRowNum;
}
function setDisabled(Ellist, Elmatch, key) {
for (var i = 0; i < Ellist.length; i++) {
if (Ellist[i].name.match(Elmatch)) {
Ellist[i].disabled = key;
}
}
}
function setDisplay(Ellist, Elmatch, key) {
for (var i = 0; i < Ellist.length; i++) {
if (Ellist[i].name.match(Elmatch)) {
Ellist[i].style.display = key;
}
}
}
function checkaddrembuttons(tblname) {
var tblC = document.getElementById(tblname + "tbl");
var rowList = (tblC.getElementsByTagName("tbody"))[0].getElementsByClassName("filter-row");
var rowCount = rowList.length;
for (var i = 0; i < rowList.length; i++) {
var selList = rowList[i].getElementsByTagName("select");
var inputList = rowList[i].getElementsByTagName("input");
if (tblname == "rule") {
if ((i + 1) < rowCount) {
setDisplay(selList, "opt", "");
} else {
setDisplay(selList, "opt", "none");
}
}
if (tblname == "action") {
if (inputList[0].value.match("/dev/null") && !inputList[0].value.match(">")) {
selList[0].selectedIndex = 0; // deliver /dev/null
inputList[0].value = "";
setDisplay(inputList, "dest", "none");
}
}
if (rowCount > 1) {
setDisabled(inputList, "remove", false);
} else {
setDisabled(inputList, "remove", true);
}
}
}
function addaction(bt) {
var newRowNum = duperow("action");
handleactionbynum(newRowNum);
}
function removeaction(bt) {
var matchlist = bt.name.match(/(\d+)/);
removeRow("action", matchlist[0]);
}
function addrule(bt) {
var newRowNum = duperow("rule");
handlepartbynum(newRowNum);
}
function removerule(bt) {
var matchlist = bt.name.match(/(\d+)/);
removeRow("rule", matchlist[0]);
}
function removeRow(tblname, rowid) {
var thisrow = document.getElementById(tblname + rowid);
thisrow.parentNode.removeChild(thisrow);
checkaddrembuttons(tblname);
}
function handlepartbynum(snum) {
handlepart(document.filterform["part" + snum]);
}
function handleactionbynum(snum) {
handleaction(document.filterform["action" + snum]);
}
function handlepart(sb) {
var matchlist = sb.name.match(/(\d+)/);
if (matchlist[0]) {
// default the option value if nothing is selected
var optval = sb.selectedIndex !== -1 ? sb.options[sb.selectedIndex].value : "";
var candonum = 0;
var hasopts = 1;
if (optval.match(/(not delivered|error_message)/)) {
hasopts = 0;
}
if (optval.match(/Spam-Score/)) {
candonum = 1;
}
var partEl = document.filterform["part" + matchlist[0]];
var matchEl = document.filterform["match" + matchlist[0]];
var valEl = document.filterform["val" + matchlist[0]];
if (hasopts) {
matchEl.style.display = "";
valEl.style.display = "";
} else {
matchEl.style.display = "none";
valEl.style.display = "none";
}
for (var i = 0; i < partEl.options.length; i++) {
if (partEl.options[i].value.match(/(Spam-Status|Spam-Score|Spam-Bar)/)) {
if (HAS_SPAM_AS_ACL && SPAM_ASSASSIN_ENABLED) {
partEl.options[i].disabled = false;
} else {
partEl.options[i].disabled = true;
}
}
}
for (var i = 0; i < matchEl.options.length; i++) {
// enable all options by default
matchEl.options[i].disabled = false;
if (matchEl.options[i].value.match(/(above|below)/)) {
if (candonum) {
matchEl.options[i].disabled = false;
} else {
matchEl.options[i].disabled = true;
}
}
// For the Any Header option, we only want to allow the
// contains and matches options.
if (optval === "$message_headers") {
matchEl.options[i].disabled = !VALID_ANY_HEADER_OPTIONS.test(matchEl.options[i].value);
}
}
}
}
var foldertrees = {};
function handlebrowser(sb) {
var matchlist;
if (sb.value == LOCALE.maketext("Browse")) {
sb.value = LOCALE.maketext("Cancel");
matchlist = sb.name.match(/(\d+)/);
if (matchlist[0]) {
document.getElementById("treeviewCont" + matchlist[0]).style.display = "";
workingDestEl = document.filterform["dest" + matchlist[0]];
var idKey = matchlist[0];
inittreeview(idKey, workingDestEl, sb);
}
} else {
matchlist = sb.name.match(/(\d+)/);
var id = "treeviewCont" + matchlist[0];
document.getElementById(id).style.display = "none";
sb.value = LOCALE.maketext("Browse");
workingDestEl = 0;
}
}
function safeencode(st) {
var enc = encodeURIComponent(st);
var ecp = -1;
var safeenc = "";
for (var i = 0; i < enc.length; i++) {
if (ecp >= 0) {
ecp++;
}
if (ecp >= 3) {
ecp = -1;
}
if (ecp == 1 || ecp == 2) {
safeenc += enc.substring(i, i + 1).toLowerCase();
} else {
safeenc += enc.substring(i, i + 1);
}
if (enc.substring(i, i + 1) == "%") {
ecp = 0;
}
}
return safeenc.replace("(", "%28").replace(")", "%29").replace(",", "%2c");
}
function parsejsonFile(o) {
var root = YAHOO.lang.JSON.parse(o.responseText);
if (root == null) {
throw "There was a problem fetching the JSON file list! Please reload and try again.";
return;
}
var node = o.argument.node;
for (var i = 0; i < root.files.length; i++) {
if (!root.files[i].name) {
continue;
}
var name;
name = root.files[i].name;
var filePath = root.files[i].path + "%2f" + safeencode(root.files[i].name);
var fileRelPath = root.files[i].relpath;
var ismailbox = root.files[i].ismailbox;
var data = {
label: name,
path: filePath,
relpath: fileRelPath,
type: root.files[i].type,
depth: node.data.depth + 1
};
var newNode = new YAHOO.widget.TextNode(data, node, false);
if (root.files[i].isleaf == "1") {
newNode.isLeaf = true;
}
if (ismailbox == "1") {
newNode.labelStyle = "icon-mailbox";
}
}
o.argument.fnLoadComplete();
}
function inittreeview(idKey, destEl, sb) {
var thisEl = document.getElementById("treeviewCont" + idKey);
thisEl.style.display = "";
thisEl = document.getElementById("treeview" + idKey);
thisEl.style.display = "";
if (!foldertrees[idKey]) {
var loadNodeData = function(node, fnLoadComplete) {
var callback = {
success: parsejsonFile,
argument: {
node: node,
fnLoadComplete: fnLoadComplete
}
};
var sUrl = "mailbrowser.json?types=dir&dir=" + node.data.path + "&account=" + encodeURIComponent(ACCOUNT_NAME);
YAHOO.util.Connect.asyncRequest("GET", sUrl, callback, null);
};
var foldertree = new YAHOO.widget.TreeView("treeview" + idKey);
foldertree.subscribe("clickEvent", nodeClick);
foldertree.setDynamicLoad(loadNodeData, 1);
var root = foldertree.getRoot();
var data = {
label: "INBOX",
path: "mail",
relpath: "%2f",
type: "dir",
depth: 1
};
if (ACCOUNT_NAME.match(/@/)) {
var acctpts = ACCOUNT_NAME.split("@");
var user = acctpts[0];
var domain = acctpts[1];
data.path += "%2f" + domain + "%2f" + user;
}
var tempNode = new YAHOO.widget.TextNode(data, root, false);
tempNode.labelStyle = "icon-mailbox";
tempNode.expand();
foldertrees[idKey] = foldertree;
}
foldertrees[idKey].draw();
var root = foldertrees[idKey].getRoot();
}
function nodeClick(oArgs) {
var node = oArgs.node;
if (workingDestEl) {
var matchlist = workingDestEl.name.match(/(\d+)/);
var thisEl = document.getElementById("treeviewCont" + matchlist[0]);
thisEl.style.display = "none";
document.filterform["changedest" + matchlist[0]].value = LOCALE.maketext("Browse");
var path = decodeURIComponent(node.data.relpath);
if (path == "/") {
workingDestEl.value = "INBOX";
} else {
workingDestEl.value = path;
}
}
}
function handleaction(sb) {
var matchlist = sb.name.match(/(\d+)/);
if (matchlist[0]) {
document.getElementById("action_menu" + matchlist[0]).disabled = false;
if ( sb.selectedIndex === -1 ) {
document.filterform["dest" + matchlist[0]].style.display = "none";
document.filterform["changedest" + matchlist[0]].style.display = "none";
document.filterform["changedest" + matchlist[0]].value = LOCALE.maketext("Browse");
document.getElementById("treeviewCont" + matchlist[0]).style.display = "none";
return;
}
document.getElementById("treeviewCont" + matchlist[0]).style.display = "none";
var optval = sb.options[sb.selectedIndex].value;
if (optval.match(/save\s*$/i)) {
document.filterform["dest" + matchlist[0]].style.display = "";
document.filterform["changedest" + matchlist[0]].style.display = "";
document.filterform["changedest" + matchlist[0]].value = LOCALE.maketext("Browse");
} else if (optval.match(/finish|null/)) {
document.filterform["dest" + matchlist[0]].style.display = "none";
document.filterform["changedest" + matchlist[0]].style.display = "none";
} else {
document.filterform["dest" + matchlist[0]].readOnly = false;
document.filterform["dest" + matchlist[0]].style.display = "";
document.filterform["changedest" + matchlist[0]].style.display = "none";
}
}
}
function getrowfromBtnEl(btEl) {
var trEl = btEl.parentNode.parentNode;
var matchlist = trEl.id.match(/(\d+)/);
return matchlist[0];
}
function moveup(btEl) {
moverow(getrowfromBtnEl(btEl), -1);
}
function movedown(btEl) {
moverow(getrowfromBtnEl(btEl), 1);
}
function moverow(tid, offset) {
tid--;
var ruletbl = document.getElementById("ruletbl");
var trlist = ruletbl.getElementsByTagName("tr");
var lastid = null;
for (var i = 0; i < trlist.length; i++) {
if (i == tid) {
var targetoffset = (i + parseInt(offset));
if (targetoffset > trlist.length || trlist[targetoffset] == null || (targetoffset) == -1) {
return true;
}
var thisParent = trlist[i].parentNode;
var tmpchld = trlist[i];
thisParent.removeChild(trlist[i]);
thisParent.insertBefore(tmpchld, trlist[targetoffset]);
break;
}
}
for (var i = 0; i < trlist.length; i++) {
trlist[i].id = trlist[i].id.replace(/(\d+)/, (i + 1));
for (var k = 0; k < itags.length; k++) {
var itaglist = trlist[i].getElementsByTagName(itags[k]);
for (var j = 0; j < itaglist.length; j++) {
itaglist[j].name = itaglist[j].name.replace(/(\d+)/, (i + 1));
}
}
}
checkaddrembuttons("rule");
}
// Validation rules for #filtername
var validate_filter_name = function() {
var filter_name = document.getElementById("filtername").value;
// Disallow string "Converted Rule" -- case insensitive
if (/Converted Rule/i.test(filter_name)) {
return false;
}
// Disallow string "Rule ##+" -- case insensitive
if (/Rule \d+/i.test(filter_name)) {
return false;
}
return true;
};
// Page initialization script
var init = function() {
var validation = new CPANEL.validate.validator(LOCALE.maketext("Filter Name"));
validation.add("filtername", validate_filter_name, LOCALE.maketext("The filter name cannot contain “[output,class,_1,code]” or “[output,class,_2,code]”.", "Rule #", "Converted Rule"));
validation.add("filtername", "min_length(%input%, 1)", LOCALE.maketext("The filter name cannot be empty."));
validation.attach();
// validation.verify();
CPANEL.validate.attach_to_form("activate-button", validation);
// Extract the account parameter from the url
var is_webmail = document.location.port in {
2095: 1,
2096: 1
};
if (is_webmail) {
// remove pipe option from all action menus
var actionMenus = DOM.getElementsByClassName("action-menu"),
currentOption,
optionCounter;
for ( var i = 0, length = actionMenus.length; i < length; i++ ) {
optionCounter = 0;
while ( currentOption = actionMenus[i].options[optionCounter++] ) {
if ( currentOption.value === "pipe" ) {
currentOption.parentNode.removeChild(currentOption);
}
}
}
}
DOM.get("filtername").focus();
var action_rows = DOM.get("actiontbl").rows;
var rule_rows = DOM.get("ruletbl").rows;
for (var r = rule_rows.length - 1; r >= 0; r--) {
handlepartbynum(r + 1);
}
for (var a = action_rows.length - 1; a >= 0; a--) {
handleactionbynum(a + 1);
}
checkaddrembuttons("rule");
checkaddrembuttons("action");
};
EVENT.onDOMReady(init);
Back to Directory
File Manager