gecko/browser/app/profile/extensions/testpilot@labs.mozilla.com/content/survey-generator.js

327 lines
12 KiB
JavaScript

const MULTIPLE_CHOICE = 0;
const CHECK_BOXES_WITH_FREE_ENTRY = 1;
const SCALE = 2;
const FREE_ENTRY = 3;
const CHECK_BOXES = 4;
const MULTIPLE_CHOICE_WITH_FREE_ENTRY = 5;
var stringBundle;
function onBuiltinSurveyLoad() {
Components.utils.import("resource://testpilot/modules/setup.js");
Components.utils.import("resource://testpilot/modules/tasks.js");
setStrings();
let eid = getUrlParam("eid");
let task = TestPilotSetup.getTaskById(eid);
let contentDiv = document.getElementById("survey-contents");
let explanation = document.getElementById("survey-explanation");
if (!task) {
// Tasks haven't all loaded yet. Try again in a few seconds.
contentDiv.innerHTML =
stringBundle.GetStringFromName("testpilot.surveyPage.loading");
window.setTimeout(function() { onBuiltinSurveyLoad(); }, 2000);
return;
}
let title = document.getElementById("survey-title");
title.innerHTML = task.title;
let submitButton = document.getElementById("survey-submit");
if (task.relatedStudyId) {
submitButton.innerHTML =
stringBundle.GetStringFromName("testpilot.surveyPage.submitAnswers");
} else {
submitButton.innerHTML =
stringBundle.GetStringFromName("testpilot.surveyPage.saveAnswers");
}
if (task.status == TaskConstants.STATUS_SUBMITTED) {
contentDiv.innerHTML =
"<p>" +
stringBundle.GetStringFromName(
"testpilot.surveyPage.thankYouForFinishingSurvey") + "</p><p>" +
stringBundle.GetStringFromName(
"testpilot.surveyPage.reviewOrChangeYourAnswers") + "</p>";
explanation.innerHTML = "";
submitButton.setAttribute("style", "display:none");
let changeButton = document.getElementById("change-answers");
changeButton.setAttribute("style", "");
} else {
contentDiv.innerHTML = "";
if (task.surveyExplanation) {
explanation.innerHTML = task.surveyExplanation;
} else {
explanation.innerHTML = "";
}
drawSurveyForm(task, contentDiv);
}
}
function drawSurveyForm(task, contentDiv) {
let oldAnswers = task.oldAnswers;
let surveyQuestions = task.surveyQuestions;
let submitButton = document.getElementById("survey-submit");
submitButton.setAttribute("style", "");
let changeButton = document.getElementById("change-answers");
changeButton.setAttribute("style", "display:none");
// Loop through questions and render html form input elements for each
// one.
for (let i = 0; i < surveyQuestions.length; i++) {
let question = surveyQuestions[i].question;
let explanation = surveyQuestions[i].explanation;
let elem;
elem = document.createElement("h3");
elem.innerHTML = (i+1) + ". " + question;
contentDiv.appendChild(elem);
if (explanation) {
elem = document.createElement("p");
elem.setAttribute("class", "survey-question-explanation");
elem.innerHTML = explanation;
contentDiv.appendChild(elem);
}
// If you've done this survey before, preset all inputs using old answers
let choices = surveyQuestions[i].choices;
switch (surveyQuestions[i].type) {
case MULTIPLE_CHOICE:
for (let j = 0; j < choices.length; j++) {
let newRadio = document.createElement("input");
newRadio.setAttribute("type", "radio");
newRadio.setAttribute("name", "answer_to_" + i);
newRadio.setAttribute("value", j);
if (oldAnswers && oldAnswers[i] == String(j)) {
newRadio.setAttribute("checked", "true");
}
let label = document.createElement("span");
label.innerHTML = choices[j];
contentDiv.appendChild(newRadio);
contentDiv.appendChild(label);
contentDiv.appendChild(document.createElement("br"));
}
break;
case CHECK_BOXES:
case CHECK_BOXES_WITH_FREE_ENTRY:
let checkboxName = "answer_to_" + i;
// Check boxes:
for (let j = 0; j < choices.length; j++) {
let newCheck = document.createElement("input");
newCheck.setAttribute("type", "checkbox");
newCheck.setAttribute("name", checkboxName);
newCheck.setAttribute("value", j);
if (oldAnswers && oldAnswers[i]) {
for each (let an in oldAnswers[i]) {
if (an == String(j)) {
newCheck.setAttribute("checked", "true");
break;
}
}
}
let label = document.createElement("span");
label.innerHTML = choices[j];
contentDiv.appendChild(newCheck);
contentDiv.appendChild(label);
contentDiv.appendChild(document.createElement("br"));
}
// Text area:
if (surveyQuestions[i].type == CHECK_BOXES_WITH_FREE_ENTRY &&
surveyQuestions[i].free_entry) {
let freeformId = "freeform_" + i;
let newCheck = document.createElement("input");
newCheck.setAttribute("type", "checkbox");
newCheck.setAttribute("name", checkboxName);
newCheck.setAttribute("value", freeformId);
newCheck.addEventListener(
"click", function(event) {
if (!event.target.checked) {
document.getElementById(freeformId).value = "";
}
}, false);
let label = document.createElement("span");
label.innerHTML = surveyQuestions[i].free_entry + "&nbsp:&nbsp";
let inputBox = document.createElement("textarea");
inputBox.setAttribute("id", freeformId);
inputBox.addEventListener(
"keypress", function() {
let elements = document.getElementsByName(checkboxName);
for (let j = (elements.length - 1); j >= 0; j--) {
if (elements[j].value == freeformId) {
elements[j].checked = true;
break;
}
}
}, false);
if (oldAnswers && oldAnswers[i]) {
for each (let an in oldAnswers[i]) {
if (isNaN(parseInt(an))) {
newCheck.setAttribute("checked", "true");
inputBox.value = an;
break;
}
}
}
contentDiv.appendChild(newCheck);
contentDiv.appendChild(label);
contentDiv.appendChild(inputBox);
}
break;
case SCALE:
let label = document.createElement("span");
label.innerHTML = surveyQuestions[i].min_label;
contentDiv.appendChild(label);
for (let j = surveyQuestions[i].scale_minimum;
j <= surveyQuestions[i].scale_maximum;
j++) {
let newRadio = document.createElement("input");
newRadio.setAttribute("type", "radio");
newRadio.setAttribute("name", "answer_to_" + i);
newRadio.setAttribute("value", j);
if (oldAnswers && oldAnswers[i] == String(j)) {
newRadio.setAttribute("checked", "true");
}
contentDiv.appendChild(newRadio);
}
label = document.createElement("span");
label.innerHTML = surveyQuestions[i].max_label;
contentDiv.appendChild(label);
break;
case FREE_ENTRY:
let inputBox = document.createElement("textarea");
inputBox.setAttribute("id", "freeform_" + i);
if (oldAnswers && oldAnswers[i] && (oldAnswers[i].length > 0)) {
inputBox.value = oldAnswers[i];
}
contentDiv.appendChild(inputBox);
break;
case MULTIPLE_CHOICE_WITH_FREE_ENTRY:
let checked = false;
let freeformId = "freeform_" + i;
let radioName = "answer_to_" + i;
for (let j = 0; j < choices.length; j++) {
let newRadio = document.createElement("input");
newRadio.setAttribute("type", "radio");
newRadio.setAttribute("name", radioName);
newRadio.setAttribute("value", j);
newRadio.addEventListener(
"click", function() {
let inputBox = document.getElementById(freeformId);
if (inputBox) {
inputBox.value = "";
}
}, false);
let label = document.createElement("span");
label.innerHTML = choices[j];
if (oldAnswers && oldAnswers[i] == String(j)) {
newRadio.setAttribute("checked", "true");
checked = true;
}
contentDiv.appendChild(newRadio);
contentDiv.appendChild(label);
contentDiv.appendChild(document.createElement("br"));
}
// Text area:
if (surveyQuestions[i].free_entry) {
let newRadio = document.createElement("input");
newRadio.setAttribute("type", "radio");
newRadio.setAttribute("name", radioName);
newRadio.setAttribute("value", freeformId);
let label = document.createElement("span");
label.innerHTML = surveyQuestions[i].free_entry + "&nbsp:&nbsp";
let inputBox = document.createElement("textarea");
inputBox.setAttribute("id", freeformId);
inputBox.addEventListener(
"keypress", function() {
let elements = document.getElementsByName(radioName);
for (let j = 0; j < elements.length; j++) {
if (elements[j].value == freeformId) {
elements[j].checked = true;
} else {
elements[j].checked = false;
}
}
}, false);
if (oldAnswers && oldAnswers[i] && (oldAnswers[i].length > 0) &&
!checked) {
newRadio.setAttribute("checked", "true");
inputBox.value = oldAnswers[i];
}
contentDiv.appendChild(newRadio);
contentDiv.appendChild(label);
contentDiv.appendChild(inputBox);
}
break;
}
}
}
function onBuiltinSurveySubmit() {
Components.utils.import("resource://testpilot/modules/setup.js");
Components.utils.import("resource://testpilot/modules/log4moz.js");
let logger = Log4Moz.repository.getLogger("TestPilot.Survey");
let eid = getUrlParam("eid");
let task = TestPilotSetup.getTaskById(eid);
logger.info("Storing survey answers for survey id " + eid);
// Read all values from form...
let answers = [];
let surveyQuestions = task.surveyQuestions;
let i;
for (i = 0; i < surveyQuestions.length; i++) {
let elems = document.getElementsByName("answer_to_" + i);
let anAnswer = [];
for each (let elem in elems) {
if (elem.checked && elem.value != ("freeform_" + i)) {
anAnswer.push(elem.value);
}
}
let freeEntry = document.getElementById("freeform_" + i);
if (freeEntry && freeEntry.value) {
anAnswer.push(freeEntry.value);
}
answers.push(anAnswer);
}
let surveyResults = { answers: answers };
logger.info("Storing survey answers " + JSON.stringify(surveyResults));
task.store(surveyResults, function(submitted) {
// Reload page to show submitted status:
if (submitted) {
onBuiltinSurveyLoad();
}
});
}
function onBuiltinSurveyChangeAnswers() {
let eid = getUrlParam("eid");
let task = TestPilotSetup.getTaskById(eid);
let contentDiv = document.getElementById("survey-contents");
drawSurveyForm(task, contentDiv);
}
function setStrings() {
stringBundle =
Components.classes["@mozilla.org/intl/stringbundle;1"].
getService(Components.interfaces.nsIStringBundleService).
createBundle("chrome://testpilot/locale/main.properties");
let map = [
{ id: "page-title", stringKey: "testpilot.fullBrandName" },
{ id: "comments-and-discussions-link",
stringKey: "testpilot.page.commentsAndDiscussions" },
{ id: "propose-test-link",
stringKey: "testpilot.page.proposeATest" },
{ id: "testpilot-twitter-link",
stringKey: "testpilot.page.testpilotOnTwitter" },
{ id: "change-answers",
stringKey: "testpilot.surveyPage.changeAnswers" }
];
let mapLength = map.length;
for (let i = 0; i < mapLength; i++) {
let entry = map[i];
document.getElementById(entry.id).innerHTML =
stringBundle.GetStringFromName(entry.stringKey);
}
}