/*jslint forin: true, rhino: true, onevar: false, browser: true, evil: true, laxbreak: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, maxerr: 1000, immed: false, white: false, plusplus: false, regexp: false, undef: false, strict: true */
// Released under the MIT/X11 license
// http://www.opensource.org/licenses/mit-license.php
"use strict";
var bugURL = "https://bugzilla.redhat.com/show_bug.cgi?id=";
var BTSPrefNS = "bugzilla-triage.setting.";
// Shared contstants
var NumberOfFrames = 7;
// constants
var SalmonPink = new Color(255, 224, 176); // RGB 255, 224, 176; HSL 36, 2,
// 85
var ReporterColor = new Color(255, 255, 166); // RGB 255, 255, 166; HSL 60, 2,
// 83
var EmptyLogsColor = new Color(0, 255, 0);
var FullLogsColor = new Color(0, 40, 103);
// global variables
var constantData = {}; // This should be probably eliminated ASAP or
// or done by other means. TODO
var submitHandlerInstalled = false; // for setUpLogging
// ============================================
/**
* object to pack messaging. Use as in
postMessage(new Message("GetPassword", {
login: login,
hostname: location.hostname
}));
*/
function Message(cmd, data) {
console.log("Message: cmd = " + cmd + ", data = " + data);
this.cmd = cmd;
this.data = data;
}
function log(msg) {
postMessage(new Message("LogMessage", msg));
}
var NotLoggedinException = function NotLoggedinException (message) {
this.message = message;
this.name = "NotLoggedinException";
};
NotLoggedinException.prototype.toString = function () {
return this.name + ': "' + this.message + '"';
};
/**
* central handler processing messages from the main script.
*/
onMessage = function onMessage(msg) {
switch (msg.cmd) {
case "ReloadThePage":
document.location.reload(true);
break;
case "RetClipboard":
if (msg.data.cmd == "queryLocal") {
queryInNewTab(msg.data.data, getComponent(), getProduct());
} else if (msg.data.cmd == "queryUpstream") {
//
}
break;
case "CreateButtons":
constantData = msg.data.constData;
generateButtons(msg.data.instPkgs, msg.data.kNodes);
break;
case "Error":
alert("Error " + msg.data);
break;
case "Unhandled":
break;
default:
console.error("Error: unknown RPC call " + msg.toSource());
}
};
/**
* @param cmd Object with all commands to be executed
*
* PROBLEM: according to https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference\
* /Statements/for...in there is no guaranteed order of execution of
* commands (i.e., key, commentObj[key] pairs) in for..in cycle.
* According to https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference\
* /Operators/Special_Operators/delete_Operator#Cross-browser_issues it seems that
* everywhere except of Internet Explorer this should work well, but waiting
* impatiently when this bite us.
*/
function executeCommand(cmdObj) {
for (var key in cmdObj) {
centralCommandDispatch(key, cmdObj[key]);
}
}
/**
* Actual execution function
*
* @param cmdLabel String with the name of the command to be executed
* @param cmdParams Object with the appropriate parameters for the command
*/
function centralCommandDispatch (cmdLabel, cmdParams) {
switch (cmdLabel) {
case "resolution":
case "product":
case "component":
case "version":
case "priority":
selectOption(cmdLabel, cmdParams);
break;
case "status":
selectOption("bug_status", cmdParams);
break;
case "platform":
selectOption("rep_platform", cmdParams);
break;
case "os":
selectOption("op_sys", cmdParams);
break;
case "severity":
selectOption("bug_severity", cmdParams);
break;
case "target":
selectOption("target_milestone", cmdParams);
break;
case "addKeyword":
addStuffToTextBox("keywords",cmdParams);
break;
case "removeKeyword":
removeStuffFromTextBox("keywords", cmdParams);
break;
case "addWhiteboard":
addStuffToTextBox("status_whiteboard",cmdParams);
break;
case "removeWhiteboard":
removeStuffFromTextBox("status_whiteboard",cmdParams);
break;
case "assignee":
changeAssignee(cmdParams);
break;
case "qacontact":
clickMouse("bz_qa_contact_edit_action");
document.getElementById("qa_contact").value = cmdParams;
break;
case "url":
clickMouse("bz_url_edit_action");
document.getElementById("bug_file_loc").value = cmdParams;
break;
// TODO dependson/blocked doesn't work. Find out why.
case "addDependsOn":
clickMouse("dependson_edit_action");
addStuffToTextBox("dependson", cmdParams);
break;
case "removeDependsOn":
clickMouse("dependson_edit_action");
removeStuffFromTextBox("dependson", cmdParams);
break;
case "addBlocks":
clickMouse("blocked_edit_action");
addStuffToTextBox("blocked", cmdParams);
break;
case "removeBlocks":
clickMouse("blocked_edit_action");
removeStuffFromTextBox("blocked", cmdParams);
break;
case "comment":
addStuffToTextBox("comment", cmdParams);
break;
case "commentIdx":
throw "There should be no commentIdx here at all.";
break;
case "setNeedinfo":
// cmdParams are actually ignored for now; we may in future
// distinguish different actors to be target of needinfo
setNeedinfoReporter();
break;
case "addCC":
addToCCList(cmdParams);
break;
case "queryStringOurBugzilla":
queryForSelection();
break;
// TODO flags, see also
case "commit":
if (cmdParams) {
// Directly commit the form
document.forms.namedItem("changeform").submit();
}
break;
}
}
/**
* remove elements from the page based on their IDs
*
* @param doc Document object
* @param target String/Array with ID(s)
* @param remove Boolean indicating whether the node should be
* actually removed or just hidden.
* @return none
* TODO remove parameter could be replaced by function which would
* do actual activity.
*/
function killNodes(doc, target, remove) {
var targetArr = target instanceof Array ? target : target.trim().split(/[,\s]+/);
targetArr.forEach(function(x) {
if (remove) {
var targetNode = doc.getElementById(x);
targetNode.parentNode.removeChild(targetNode);
} else {
x.style.display = "none";
}
});
}
/**
* Change assignee of the bug
*
* @param newAssignee String with the email address of new assigneeAElement
* or 'default' if the component's default assignee should be used.
* Value null clears "Reset Assignee to default for component" checkbox
* @return none
*/
function changeAssignee (newAssignee) {
var defAssigneeButton = null;
// Previous assignee should know what's going on in his bug
addToCCList(getOwner());
// Optional value null
if (newAssignee === null) {
document.getElementById("set_default_assignee").removeAttribute(
"checked");
return ;
}
if (getDefaultAssignee) {
if (newAssignee === "default") {
var defAss = getDefaultAssignee();
if (defAss) {
newAssignee = defAss;
} else {
return ;
}
}
}
if (newAssignee) {
clickMouse("bz_assignee_edit_action");
document.getElementById("assigned_to").value = newAssignee;
document.getElementById("set_default_assignee").checked = false;
defAssigneeButton = document.getElementById("setDefaultAssignee_btn");
if (defAssigneeButton) {
defAssigneeButton.style.display = "none";
}
}
}
/**
* Adds new option to the 'comment_action' scroll down box
*
* @param pkg String package name
* @param cmd String with the name of the command
* If the 'comment_action' scroll down box doesn't exist, this
* function will set up new one.
*/
function addToCommentsDropdown (cmdObj) {
var select = document.getElementById("comment_action");
if (!select) {
document.getElementById("comments").innerHTML +=
"