diff --git a/docs/upgrades/packages-7.7.5/root_import_survey_default-questions.wgpkg b/docs/upgrades/packages-7.7.5/root_import_survey_default-questions.wgpkg new file mode 100644 index 000000000..51e6102b0 Binary files /dev/null and b/docs/upgrades/packages-7.7.5/root_import_survey_default-questions.wgpkg differ diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 6e6ceb379..8475d7c2d 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -5,8 +5,9 @@ if (typeof Survey === "undefined") { (function(){ - var CLASS_INVALID = 'survey-invalid'; // For elements that fail input validation - var CLASS_INVALID_MARKER = 'survey-invalid-marker'; // For default '*' invalid field marker + var INVALID_QUESTION_CLASS = 'survey-invalid'; // CSS class for questions that fail input validation + var INVALID_SUBMIT_CLASS = 'survey-submit-invalid'; // CSS class for submit div when questions don't validate + var INVALID_QUESTION_MARKER = 'survey-invalid-marker'; // For default '*' invalid field marker // All specially-handled question types are listed here // (anything else is assumed to be a multi-choice bundle) @@ -50,6 +51,7 @@ if (typeof Survey === "undefined") { function formsubmit(event){ var submit = 1;//boolean for if all was good or not + var lowestInvalidY = 0; for (var i in toValidate) { if (YAHOO.lang.hasOwnProperty(toValidate, i)) { var answered = 0; @@ -111,22 +113,36 @@ if (typeof Survey === "undefined") { if (!answered) { submit = 0; - // Apply CLASS_INVALID to the parent question div for people who want to skin Survey - YAHOO.util.Dom.addClass(q_parent_node, CLASS_INVALID); + // Apply INVALID_QUESTION_CLASS to the parent question div for people who want to skin Survey + YAHOO.util.Dom.addClass(q_parent_node, INVALID_QUESTION_CLASS); // Insert default '*' marker (can be hidden via CSS for those who want something different) - node.innerHTML = "*"; + node.innerHTML = "*"; + + // Keep track of the lowest y-coord invalid question (to scroll to) + var qY = YAHOO.util.Dom.getY(q_parent_node); + lowestInvalidY = lowestInvalidY && lowestInvalidY < qY ? lowestInvalidY : qY; } else { - YAHOO.util.Dom.removeClass(q_parent_node, CLASS_INVALID); + YAHOO.util.Dom.removeClass(q_parent_node, INVALID_QUESTION_CLASS); node.innerHTML = ''; } } } + var submitButton = document.getElementById('submitbutton'); + var submitDiv = submitButton && YAHOO.util.Dom.getAncestorByTagName(submitButton, 'div'); + if (submit) { + submitDiv && YAHOO.util.Dom.removeClass(submitDiv, INVALID_SUBMIT_CLASS); YAHOO.log("Submitting"); Survey.Comm.callServer('', 'submitQuestions', 'surveyForm', hasFile); } + else { + submitDiv && YAHOO.util.Dom.addClass(submitDiv, INVALID_SUBMIT_CLASS); + + // Scroll page to the y-coord of the lowest invalid question + lowestInvalidY && scrollPage(lowestInvalidY, 1.5, YAHOO.util.Easing.easeOut); + } } function goBack(event){ @@ -134,6 +150,23 @@ if (typeof Survey === "undefined") { Survey.Comm.callServer('', 'goBack'); } + function scrollPage(to, dur, ease) { + var setAttr = function(a, v, u) { + window.scroll(0, v); + }; + + var anim = new YAHOO.util.Anim(null, + { 'scroll' : { + from : YAHOO.util.Dom.getDocumentScrollTop(), + to : to } + }, + dur, ease + ); + anim.setAttribute = setAttr; + anim.animate(); + } + + function numberHandler(event, objs){ var keycode = event.keyCode;