/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Test Pilot. * * The Initial Developer of the Original Code is Mozilla. * Portions created by the Initial Developer are Copyright (C) 2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Jono X * Raymond Lee * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ 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 = "

" + stringBundle.GetStringFromName( "testpilot.surveyPage.thankYouForFinishingSurvey") + "

" + stringBundle.GetStringFromName( "testpilot.surveyPage.reviewOrChangeYourAnswers") + "

"; 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); // Allow surveys to define arbitrary page load handlers - call them // after creating the rest of the page: task.onPageLoad(task, document); } } function drawSurveyForm(task, contentDiv) { let surveyQuestions = task.surveyQuestions; /* Fill form fields with old survey answers if available -- * but not if the survey version has changed since you stored them!! * (bug 576482) */ let oldAnswers = null; if (task.oldAnswers && (task.version == task.oldAnswers["version_number"])) { oldAnswers = task.oldAnswers["answers"]; } 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, j; 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 (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 (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 + " : "; let inputBox = document.createElement("textarea"); inputBox.setAttribute("id", freeformId); inputBox.addEventListener( "keypress", function() { let elements = document.getElementsByName(checkboxName); for (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 (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 (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 + " : "; 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); } }