0) {$_SESSION['step'] = $thisstep-1;} if (isset($move) && $move == "movenext") { if ($_SESSION['step']==$thisstep) $_SESSION['step'] = $thisstep+1; } if (isset($move) && bIsNumericInt($move) && $thissurvey['allowjumps']=='Y') { $move = (int)$move; if ($move > 0 && (($move <= $_SESSION['step']) || (isset($_SESSION['maxstep']) && $move <= $_SESSION['maxstep']))) $_SESSION['step'] = $move; } // We do not keep the participant session anymore when the same browser is used to answer a second time a survey (let's think of a library PC for instance). // Previously we used to keep the session and redirect the user to the // submit page. //if (isset($_SESSION['finished'])) {$move="movesubmit"; } //CHECK IF ALL MANDATORY QUESTIONS HAVE BEEN ANSWERED ############################################ //First, see if we are moving backwards or doing a Save so far, and its OK not to check: if ($allowmandbackwards==1 && ( (isset($move) && ($move == "moveprev" || (is_int($move) && $_SESSION['prevstep'] == $_SESSION['maxstep']))) || (isset($_POST['saveall']) && $_POST['saveall'] == $clang->gT("Save your responses so far")))) { $backok="Y"; } else { $backok="N"; } //Now, we check mandatory questions if necessary //CHECK IF ALL CONDITIONAL MANDATORY QUESTIONS THAT APPLY HAVE BEEN ANSWERED $notanswered=addtoarray_single(checkmandatorys($move,$backok),checkconditionalmandatorys($move,$backok)); //CHECK INPUT $notvalidated=checkpregs($move,$backok); // CHECK UPLOADED FILES $filenotvalidated = checkUploadedFileValidity($move, $backok); //SEE IF $surveyid EXISTS #################################################################### if ($surveyexists <1) { sendcacheheaders(); doHeader(); //SURVEY DOES NOT EXIST. POLITELY EXIT. echo templatereplace(file_get_contents("$thistpl/startpage.pstpl")); echo "\t

\n"; echo "\t".$clang->gT("Sorry. There is no matching survey.")."
 \n"; echo templatereplace(file_get_contents("$thistpl/endpage.pstpl")); doFooter(); exit; } //RUN THIS IF THIS IS THE FIRST TIME if (!$_SESSION['step']) { $totalquestions = buildsurveysession(); // queXS Addition - Always skip welcome screen // if(isset($thissurvey['showwelcome']) && $thissurvey['showwelcome'] == 'N') { //If explicitply set, hide the welcome screen $_SESSION['step'] = 1; // } else { // display_first_page(); // exit; // } } //****************************************************************************************************** //PRESENT SURVEY //****************************************************************************************************** //GET GROUP DETAILS if ($_SESSION['step'] == "0") {$currentquestion=$_SESSION['step'];} else {$currentquestion=$_SESSION['step']-1;} $ia=$_SESSION['fieldarray'][$currentquestion]; $ia[]=$_SESSION['step']; list($newgroup, $gid, $groupname, $groupdescription, $gl)=checkIfNewGroup($ia); // MANAGE CONDITIONAL QUESTIONS AND HIDDEN QUESTIONS $qidattributes=getQuestionAttributes($ia[0]); if ($qidattributes===false) // Question was deleted { $qidattributes['hidden']==1; //Workaround to skip the question if it was deleted while the survey is running in test mode } $conditionforthisquestion=$ia[7]; $questionsSkipped=0; while ($conditionforthisquestion == "Y" || $qidattributes['hidden']==1) //IF CONDITIONAL, CHECK IF CONDITIONS ARE MET; IF HIDDEN MOVE TO NEXT { // this is a while, not an IF because if we skip the question we loop on the next question, see below if (checkquestionfordisplay($ia[0]) === true && $qidattributes['hidden']==0) { // question will be displayed we set conditionforthisquestion to N here // because it is used later to select style=display:'' for the question $conditionforthisquestion="N"; } else { $questionsSkipped++; if ($_SESSION['prevstep'] <= $_SESSION['step']) { $currentquestion++; if(isset($_SESSION['fieldarray'][$currentquestion])) { $ia=$_SESSION['fieldarray'][$currentquestion]; } if ($_SESSION['step']>=$_SESSION['totalsteps']) { $move="movesubmit"; submitanswer(); // complete this answer (submitdate) break; } $_SESSION['step']++; foreach ($_SESSION['grouplist'] as $gl) { if ($gl[0] == $ia[5]) { $gid=$gl[0]; $groupname=$gl[1]; $groupdescription=$gl[2]; if (isset($_POST['lastgroupname']) && auto_unescape($_POST['lastgroupname']) != strip_tags($groupname) && trim($groupdescription)!='') {$newgroup = "Y";} else {$newgroup == "N";} } } } else { if ($currentquestion > 0) { $currentquestion--; // if we reach -1, this means we must go back to first page if(isset($_SESSION['fieldarray'][$currentquestion])) { $ia=$_SESSION['fieldarray'][$currentquestion]; } $_SESSION['step']--; } else { $_SESSION['step']=0; display_first_page(); exit; } } // because we skip this question, we need to loop on the same condition 'check-block' // with the new question (we have overwritten $ia) $conditionforthisquestion=$ia[7]; $qidattributes=getQuestionAttributes($ia[0]); } } // End of while conditionforthisquestion=="Y" //Setup an inverted fieldnamesInfo for quick lookup of field answers. $aFieldnamesInfoInv = aArrayInvert($_SESSION['fieldnamesInfo']); if ($_SESSION['step'] > $_SESSION['maxstep']) { $_SESSION['maxstep'] = $_SESSION['step']; } //SUBMIT if ((isset($move) && $move == "movesubmit") && (!isset($notanswered) || !$notanswered) && (!isset($notvalidated) || !$notvalidated ) && (!isset($filenotvalidated) || !$filenotvalidated)) { setcookie ("limesurvey_timers", "", time() - 3600);// remove the timers cookies if ($thissurvey['refurl'] == "Y") { if (!in_array("refurl", $_SESSION['insertarray'])) //Only add this if it doesn't already exist { $_SESSION['insertarray'][] = "refurl"; } // $_SESSION['refurl'] = $_SESSION['refurl']; } //COMMIT CHANGES TO DATABASE if ($thissurvey['active'] != "Y") { //if($thissurvey['printanswers'] != 'Y' && $thissurvey['usecookie'] != 'Y' && $tokensexist !=1) if ($thissurvey['assessments']== "Y") { $assessments = doAssessment($surveyid); } $thissurvey['surveyls_url']=dTexts::run($thissurvey['surveyls_url']); if($thissurvey['printanswers'] != 'Y') { killSession(); } sendcacheheaders(); doHeader(); echo templatereplace(file_get_contents("$thistpl/startpage.pstpl")); //Check for assessments if ($thissurvey['assessments']== "Y" && $assessments) { echo templatereplace(file_get_contents("$thistpl/assessment.pstpl")); } $completed = $thissurvey['surveyls_endtext']; $completed .= "
".$clang->gT("Did Not Save")."

\n\n"; $completed .= $clang->gT("Your survey responses have not been recorded. This survey is not yet active.")."

\n"; if ($thissurvey['printanswers'] == 'Y') { // ClearAll link is only relevant for survey with printanswers enabled // in other cases the session is cleared at submit time $completed .= "".$clang->gT("Clear Responses")."

\n"; } } else //THE FOLLOWING DEALS WITH SUBMITTING ANSWERS AND COMPLETING AN ACTIVE SURVEY { if ($thissurvey['usecookie'] == "Y" && $tokensexist != 1) //don't use cookies if tokens are being used { $cookiename="PHPSID".returnglobal('sid')."STATUS"; setcookie("$cookiename", "COMPLETE", time() + 31536000); //Cookie will expire in 365 days } //Before doing the "templatereplace()" function, check the $thissurvey['url'] //field for limereplace stuff, and do transformations! $thissurvey['surveyls_url']=dTexts::run($thissurvey['surveyls_url']); $thissurvey['surveyls_url']=passthruReplace($thissurvey['surveyls_url'], $thissurvey); $content=''; $content .= templatereplace(file_get_contents("$thistpl/startpage.pstpl")); //Check for assessments if ($thissurvey['assessments']== "Y") { $assessments = doAssessment($surveyid); if ($assessments) { $content .= templatereplace(file_get_contents("$thistpl/assessment.pstpl")); } } if (FlattenText($thissurvey['surveyls_endtext'])=='') { $completed = "
".$clang->gT("Thank you!")."

\n\n" . $clang->gT("Your survey responses have been recorded.")."

\n"; } else { $completed = $thissurvey['surveyls_endtext']; } // Link to Print Answer Preview ********** if ($thissurvey['printanswers']=='Y') { $completed .= "

" ."" .$clang->gT("Click here to print your answers.") ."
\n"; } //***************************************** if ($thissurvey['publicstatistics']=='Y' && $thissurvey['printanswers']=='Y') {$completed .='
'.$clang->gT("or");} // Link to Public statistics ********** if ($thissurvey['publicstatistics']=='Y') { $completed .= "

" ."" .$clang->gT("View the statistics for this survey.") ."
\n"; } //***************************************** //Update the token if needed and send a confirmation email if (isset($clienttoken) && $clienttoken) { submittokens(); } //Send notification to survey administrator SendSubmitNotifications(); $_SESSION['finished']=true; $_SESSION['sid']=$surveyid; if (isset($thissurvey['autoredirect']) && $thissurvey['autoredirect'] == "Y" && $thissurvey['surveyls_url']) { //Automatically redirect the page to the "url" setting for the survey $url = dTexts::run($thissurvey['surveyls_url']); $url = passthruReplace($url, $thissurvey); $url=str_replace("{SAVEDID}",$saved_id, $url); // to activate the SAVEDID in the END URL $url=str_replace("{TOKEN}",$clienttoken, $url); // to activate the TOKEN in the END URL $url=str_replace("{SID}", $surveyid, $url); // to activate the SID in the END URL $url=str_replace("{LANG}", $clang->getlangcode(), $url); // to activate the LANG in the END URL //queXS Addition include_once("quexs.php"); $quexs_url = get_start_interview_url(); $url = str_replace("{STARTINTERVIEWURL}", $quexs_url, $url); $end_url = get_end_interview_url(); $url = str_replace("{ENDINTERVIEWURL}", $end_url, $url); header("Location: {$url}"); } //if($thissurvey['printanswers'] != 'Y' && $thissurvey['usecookie'] != 'Y' && $tokensexist !=1) if($thissurvey['printanswers'] != 'Y') { killSession(); } doHeader(); if (isset($content)) {echo $content;} } echo templatereplace(file_get_contents("$thistpl/completed.pstpl")); echo "\n
\n"; echo templatereplace(file_get_contents("$thistpl/endpage.pstpl")); doFooter(); exit; } if ($questionsSkipped == 0 && $newgroup == "Y" && isset($move) && $move == "moveprev" && (isset($_POST['grpdesc']) && $_POST['grpdesc']=="Y")) //a small trick to manage moving backwards from a group description { //This does not work properly in all instances. $currentquestion++; $ia=$_SESSION['fieldarray'][$currentquestion]; $_SESSION['step']++; } list($newgroup, $gid, $groupname, $groupdescription, $gl)=checkIfNewGroup($ia); //Check if current page is for group description only $bIsGroupDescrPage = false; if ($newgroup == "Y" && trim($groupdescription)!='' && (isset($move) && $move != "moveprev" && !is_int($move)) && $_SESSION['maxstep'] == $_SESSION['step']) { // This is a group description page // - $ia contains next question description, // but his question is not displayed, it is only used to know current group // - in this case answers' inputnames mustn't be added to filednames hidden input $bIsGroupDescrPage = true; } require_once("qanda.php"); $mandatorys=array(); $mandatoryfns=array(); $conmandatorys=array(); $conmandatoryfns=array(); $conditions=array(); $inputnames=array(); list($plus_qanda, $plus_inputnames)=retrieveAnswers($ia); if ($plus_qanda) { $plus_qanda[] = $ia[4]; $plus_qanda[] = $ia[6]; // adds madatory identifyer for adding mandatory class to question wrapping div $qanda[]=$plus_qanda; } if ($plus_inputnames && !$bIsGroupDescrPage) { // Add answers' inputnames to $inputnames unless this is a group description page $inputnames = addtoarray_single($inputnames, $plus_inputnames); } //Display the "mandatory" popup if necessary if (isset($notanswered) && $notanswered!=false) { list($mandatorypopup, $popup)=mandatory_popup($ia, $notanswered); } //Display the "validation" popup if necessary if (isset($notvalidated)) { list($validationpopup, $vpopup)=validation_popup($ia, $notvalidated); } // Display the "file not valid" popup if necessary if (isset($filenotvalidated)) { list($filevalidationpopup, $fpopup) = file_validation_popup($ia, $filenotvalidated); } //Get list of mandatory questions list($plusman, $pluscon)=create_mandatorylist($ia); if ($plusman !== null) { list($plus_man, $plus_manfns)=$plusman; $mandatorys=addtoarray_single($mandatorys, $plus_man); $mandatoryfns=addtoarray_single($mandatoryfns, $plus_manfns); } if ($pluscon !== null) { list($plus_conman, $plus_conmanfns)=$pluscon; $conmandatorys=addtoarray_single($conmandatorys, $plus_conman); $conmandatoryfns=addtoarray_single($conmandatoryfns, $plus_conmanfns); } //Build an array containing the conditions that apply for this page $plus_conditions=retrieveConditionInfo($ia); //Returns false if no conditions if ($plus_conditions) { $conditions = addtoarray_single($conditions, $plus_conditions); } //------------------------END DEVELOPMENT OF QUESTION if ($thissurvey['showprogress'] == 'Y') { $percentcomplete = makegraph($_SESSION['step'], $_SESSION['totalsteps']); } //READ TEMPLATES, INSERT DATA AND PRESENT PAGE sendcacheheaders(); doHeader(); if (isset($popup)) {echo $popup;} if (isset($vpopup)) {echo $vpopup;} if (isset($fpopup)) {echo $fpopup;} echo templatereplace(file_get_contents("$thistpl/startpage.pstpl")); //ALTER PAGE CLASS TO PROVIDE WHOLE-PAGE ALTERNATION if ($_SESSION['step'] != $_SESSION['prevstep'] || (isset($_SESSION['stepno']) && $_SESSION['stepno'] % 2)) { if (!isset($_SESSION['stepno'])) $_SESSION['stepno'] = 0; if ($_SESSION['step'] != $_SESSION['prevstep']) ++$_SESSION['stepno']; if ($_SESSION['stepno'] % 2) { echo "\n"; } } echo "\n
\n"; echo sDefaultSubmitHandler(); //PUT LIST OF FIELDS INTO HIDDEN FORM ELEMENT echo "\n\n\n"; echo "\t\n"; echo "\n\n\n"; echo templatereplace(file_get_contents("$thistpl/survey.pstpl")); if ($bIsGroupDescrPage) { $presentinggroupdescription = "yes"; echo "\n\n\n"; echo "\t\n"; echo templatereplace(file_get_contents("$thistpl/startgroup.pstpl")); echo "\n"; //if ($groupdescription) //{ echo templatereplace(file_get_contents("$thistpl/groupdescription.pstpl")); //} echo "\n"; echo "\n\n\n"; echo "\t\n\n"; echo "\n\n\n"; echo templatereplace(file_get_contents("$thistpl/endgroup.pstpl")); echo "\n"; $_SESSION['step']--; } else { echo "\n\n\n"; // foreach(file("$thistpl/startgroup.pstpl") as $op) // { // echo "\t".templatereplace($op); // } echo templatereplace(file_get_contents("$thistpl/startgroup.pstpl")); echo "\n"; echo "\n\n\n"; echo "\t\n\n"; //Display the "mandatory" message on page if necessary if (isset($showpopups) && $showpopups == 0 && isset($notanswered) && $notanswered == true) { echo "

" . $clang->gT("One or more mandatory questions have not been answered. You cannot proceed until these have been completed.") . "

"; } //Display the "validation" message on page if necessary if (isset($showpopups) && $showpopups == 0 && isset($notvalidated) && $notvalidated == true) { echo "

" . $clang->gT("One or more questions have not been answered in a valid manner. You cannot proceed until these answers are valid.") . "

"; } // Display the File Validation message on page if necessary if (isset($showpopups) && $showpopups == 0 && isset($filenotvalidated) && $filenotvalidated == true) { echo "

". $clang->gT("One or more uploaded files do not satisfy the criteria") . "

"; } echo "\n\n\n"; if (is_array($qanda)) { foreach ($qanda as $qa) { echo "\n"; $q_class = question_class($qa[8]); // render question class (see common.php) if ($qa[9] == 'Y') { $man_class = ' mandatory'; } else { $man_class = ''; } // Fixed by lemeur: can't rely on javascript checkconditions with // question-by-question display to hide/show conditionnal questions // as conditions are evaluated with php code // Let's use result from previous condition eval instead // (note there is only 1 question, $conditionforthisquestion is the result from // condition eval in php) // if ($qa[3] != 'Y') {$n_q_display = '';} else { $n_q_display = ' style="display: none;"';} if ($conditionforthisquestion != 'Y') {$n_q_display = '';} else { $n_q_display = ' style="display: none;"';} $question= $qa[0]; //=================================================================== // The following four variables offer the templating system the // capacity to fully control the HTML output for questions making the // above echo redundant if desired. $question['essentials'] = 'id="question'.$qa[4].'"'.$n_q_display; $question['class'] = $q_class; $question['man_class'] = $man_class; $question['code'] = $qa[5]; $question['sgq']=$qa[7]; //=================================================================== $answer=$qa[1]; $help=$qa[2]; $question_template = file_get_contents($thistpl.'/question.pstpl'); if( preg_match( '/\{QUESTION_ESSENTIALS\}/' , $question_template ) === false || preg_match( '/\{QUESTION_CLASS\}/' , $question_template ) === false ) { // if {QUESTION_ESSENTIALS} is present in the template but not {QUESTION_CLASS} remove it because you don't want id="" and display="" duplicated. $question_template = str_replace( '{QUESTION_ESSENTIALS}' , '' , $question_template ); $question_template = str_replace( '{QUESTION_CLASS}' , '' , $question_template ); echo '
'; echo templatereplace($question_template); echo '
'; } else { echo templatereplace($question_template); }; } } echo "\n\n\n"; echo templatereplace(file_get_contents("$thistpl/endgroup.pstpl")); echo "\n"; } $navigator = surveymover(); echo "\n\n\n"; echo templatereplace(file_get_contents("$thistpl/navigator.pstpl")); echo "\n"; if ($thissurvey['active'] != "Y") { echo "

".$clang->gT("This survey is currently not active. You will not be able to save your responses.")."

\n"; } echo "\n"; if($thissurvey['allowjumps']=='Y' && !$bIsGroupDescrPage) { echo "\n\n\n"; $iLastGrp = null; echo '

' . $clang->gT("Question index") . '

'; for($v = 0, $n = 0; $n != $_SESSION['maxstep']; ++$n) { $ia = $_SESSION['fieldarray'][$n]; $qidattributes=getQuestionAttributes($ia[0], $ia[4]); if($qidattributes['hidden']==1 || !checkquestionfordisplay($ia[0])) continue; $sText = FlattenText($ia[3]); $bAnsw = bCheckQuestionForAnswer($ia[1], $aFieldnamesInfoInv); if($iLastGrp != $ia[5]) { $iLastGrp = $ia[5]; foreach ($_SESSION['grouplist'] as $gl) { if ($gl[0] == $iLastGrp) { echo '

' . htmlspecialchars(strip_tags($gl[1]),ENT_QUOTES,'UTF-8') . "

"; break; } } } ++$v; $class = ($n == $_SESSION['step'] - 1? 'current': ($bAnsw? 'answer': 'missing')); if($v % 2) $class .= " odd"; $s = $n + 1; echo "
$v$sText
"; } if($_SESSION['maxstep'] == $_SESSION['totalsteps']) { echo "\n"; } echo '
'; echo "\n"; echo "\n"; } if (isset($conditions) && is_array($conditions) && count($conditions) != 0) { //if conditions exist, create hidden inputs for 'previously' answered questions // Note that due to move 'back' possibility, there may be answers from next pages // However we make sure that no answer from this page are inserted here foreach (array_keys($_SESSION) as $SESak) { if (in_array($SESak, $_SESSION['insertarray']) && !in_array($SESak, $inputnames)) { echo "\n"; } } } //SOME STUFF FOR MANDATORY QUESTIONS if (remove_nulls_from_array($mandatorys) && $newgroup != "Y") { $mandatory=implode("|", remove_nulls_from_array($mandatorys)); echo "\n"; } if (remove_nulls_from_array($conmandatorys)) { $conmandatory=implode("|", remove_nulls_from_array($conmandatorys)); echo "\n"; } if (remove_nulls_from_array($mandatoryfns)) { $mandatoryfn=implode("|", remove_nulls_from_array($mandatoryfns)); echo "\n"; } if (remove_nulls_from_array($conmandatoryfns)) { $conmandatoryfn=implode("|", remove_nulls_from_array($conmandatoryfns)); echo "\n"; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
\n"; //foreach(file("$thistpl/endpage.pstpl") as $op) //{ // echo templatereplace($op); //} echo templatereplace(file_get_contents("$thistpl/endpage.pstpl")); doFooter(); function checkIfNewGroup($ia) { foreach ($_SESSION['grouplist'] as $gl) { if ($gl[0] == $ia[5]) { $gid=$gl[0]; $groupname=$gl[1]; $groupdescription=$gl[2]; if (isset($_POST['lastgroupname']) && auto_unescape($_POST['lastgroupname']) != strip_tags($groupname) && trim($groupdescription)!='') { $newgroup = "Y"; } else { $newgroup = "N"; } if (!isset($_POST['lastgroupname']) && isset($move)) {$newgroup="Y";} } } return array($newgroup, $gid, $groupname, $groupdescription, $gl); } ?>