diff --git a/lib/WebGUI/Wobject/Survey.pm b/lib/WebGUI/Wobject/Survey.pm
new file mode 100644
index 000000000..4dd16dc94
--- /dev/null
+++ b/lib/WebGUI/Wobject/Survey.pm
@@ -0,0 +1,846 @@
+package WebGUI::Wobject::Survey;
+
+#-------------------------------------------------------------------
+# WebGUI is Copyright 2001-2002 Plain Black LLC.
+#-------------------------------------------------------------------
+# Please read the legal notices (docs/legal.txt) and the license
+# (docs/license.txt) that came with this distribution before using
+# this software.
+#-------------------------------------------------------------------
+# http://www.plainblack.com info@plainblack.com
+#-------------------------------------------------------------------
+
+use strict;
+use Tie::CPHash;
+use WebGUI::DateTime;
+use WebGUI::HTMLForm;
+use WebGUI::Icon;
+use WebGUI::International;
+use WebGUI::Privilege;
+use WebGUI::Session;
+use WebGUI::SQL;
+use WebGUI::URL;
+use WebGUI::Utility;
+use WebGUI::Wobject;
+
+our @ISA = qw(WebGUI::Wobject);
+our $namespace = "Survey";
+our $name = WebGUI::International::get(1,$namespace);
+
+
+#-------------------------------------------------------------------
+sub _addAnswer {
+ $_[0]->setCollateral("Survey_answer","Survey_answerId",{
+ Survey_id=>$_[0]->get("Survey_id"),
+ Survey_questionId=>$_[2],
+ Survey_answerId=>"new",
+ answer=>WebGUI::International::get($_[1],$namespace)
+ },1,0,"Survey_id");
+}
+
+#-------------------------------------------------------------------
+sub _setAnswerType {
+ $_[0]->setCollateral("Survey_question","Survey_questionId",{
+ Survey_questionId=>$_[2],
+ Survey_id=>$_[0]->get("Survey_id"),
+ answerFieldType=>$_[1]
+ },1,0,"Survey_id");
+}
+
+#-------------------------------------------------------------------
+sub _submenu {
+ my ($output, $key);
+ return $_[1] if ($session{form}{makePrintable});
+ $output = '
+ | ';
+ $output .= $_[1];
+ $output .= ' |
';
+ return $output;
+}
+
+#-------------------------------------------------------------------
+sub duplicate {
+ my ($w, $newSurveyId, $qdata, $adata, $rdata, $a, $b, $c);
+ $w = $_[0]->SUPER::duplicate($_[1]);
+ $w = WebGUI::Wobject::Survey->new({wobjectId=>$w,namespace=>$namespace});
+ $newSurveyId = getNextId("Survey_id");
+ $w->set({
+ questionOrder=>$_[0]->get("questionOrder"),
+ groupToTakeSurvey=>$_[0]->get("groupToTakeSurvey"),
+ Survey_id=>$newSurveyId,
+ groupToViewReports=>$_[0]->get("groupToViewReports"),
+ mode=>$_[0]->get("mode")
+ });
+ $a = WebGUI::SQL->read("select * from Survey_question where Survey_id=".$_[0]->get("Survey_id")
+ ." order by sequenceNumber");
+ while ($qdata = $a->hashRef) {
+ $b = WebGUI::SQL->read("select * from Survey_answer where Survey_questionId=".$qdata->{Survey_questionId}
+ ." order by sequenceNumber");
+ $qdata->{Survey_questionId} = "new";
+ $qdata->{Survey_id} = $newSurveyId;
+ $qdata->{Survey_questionId} = $w->setCollateral("Survey_question","Survey_questionId",$qdata,1,0,"Survey_id");
+ while ($adata = $b->hashRef) {
+ $c = WebGUI::SQL->read("select * from Survey_response where Survey_answerId=".$adata->{Survey_answerId});
+ $adata->{Survey_answerId} = "new";
+ $adata->{Survey_questionId} = $qdata->{Survey_questionId};
+ $adata->{Survey_id} = $newSurveyId;
+ $adata->{Survey_answerId} = $w->setCollateral("Survey_answer", "Survey_answerId", $adata,
+ 1, 0, "Survey_Id");
+ while ($rdata = $c->hashRef) {
+ $rdata->{Survey_responseId} = "new";
+ $rdata->{Survey_answerId} = $adata->{Survey_answerId};
+ $rdata->{Survey_id} = $newSurveyId;
+ $rdata->{Survey_questionId} = $qdata->{Survey_questionId};
+ $w->setCollateral("Survey_response","Survey_responseId",$rdata,0,0);
+ }
+ $c->finish;
+ }
+ $b->finish;
+ }
+ $a->finish;
+}
+
+#-------------------------------------------------------------------
+sub purge {
+ my ($count) = WebGUI::SQL->quickArray("select count(*) from Survey where Survey_id=".$_[0]->get("Survey_id"));
+ if ($count < 2) { ### Check for other wobjects using this survey.
+ WebGUI::SQL->write("delete from Survey_question where Survey_id=".$_[0]->get("Survey_id"));
+ WebGUI::SQL->write("delete from Survey_answer where Survey_id=".$_[0]->get("Survey_id"));
+ WebGUI::SQL->write("delete from Survey_response where Survey_id=".$_[0]->get("Survey_id"));
+ }
+ $_[0]->SUPER::purge();
+}
+
+#-------------------------------------------------------------------
+sub set {
+ $_[0]->SUPER::set($_[1],[qw(Survey_id questionOrder groupToTakeSurvey groupToViewReports mode)]);
+}
+
+#-------------------------------------------------------------------
+sub uiLevel {
+ return 5;
+}
+
+#-------------------------------------------------------------------
+sub www_deleteAnswer {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ return $_[0]->confirm(WebGUI::International::get(45,$namespace),
+ WebGUI::URL::page('func=deleteAnswerConfirm&wid='.$_[0]->get("wobjectId").'&aid='
+ .$session{form}{aid}.'&qid='.$session{form}{qid}));
+}
+
+#-------------------------------------------------------------------
+sub www_deleteAnswerConfirm {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ WebGUI::SQL->write("delete from Survey_response where Survey_answerId=$session{form}{aid}");
+ $_[0]->deleteCollateral("Survey_answer","Survey_answerId",$session{form}{aid});
+ $_[0]->reorderCollateral("Survey_answer","Survey_answerId","Survey_id");
+ return $_[0]->www_editQuestion;
+}
+
+#-------------------------------------------------------------------
+sub www_deleteQuestion {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ return $_[0]->confirm(WebGUI::International::get(44,$namespace),
+ WebGUI::URL::page('func=deleteQuestionConfirm&wid='.$_[0]->get("wobjectId").'&qid='.$session{form}{qid}));
+}
+
+#-------------------------------------------------------------------
+sub www_deleteQuestionConfirm {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ WebGUI::SQL->write("delete from Survey_answer where Survey_questionId=$session{form}{qid}");
+ WebGUI::SQL->write("delete from Survey_response where Survey_questionId=$session{form}{qid}");
+ $_[0]->deleteCollateral("Survey_question","Survey_questionId",$session{form}{qid});
+ $_[0]->reorderCollateral("Survey_question","Survey_questionId","Survey_id");
+ return $_[0]->www_edit;
+}
+
+#-------------------------------------------------------------------
+sub www_deleteResponses {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ return $_[0]->_submenu($_[0]->confirm(WebGUI::International::get(72,$namespace),
+ WebGUI::URL::page('func=deleteResponsesConfirm&wid='.$_[0]->get("wobjectId").'&uid='
+ .$session{form}{uid}.'&ip='.$session{form}{ip})));
+}
+
+#-------------------------------------------------------------------
+sub www_deleteResponsesConfirm {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ WebGUI::SQL->write("delete from Survey_response where ((userId=$session{form}{uid}
+ and userId<>1) or (userId=1 and ipAddress='$session{form}{ip}')) and Survey_id=".$_[0]->get("Survey_id"));
+ return $_[0]->www_viewGradebook;
+}
+
+#-------------------------------------------------------------------
+sub www_deleteAllResponses {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ return $_[0]->_submenu($_[0]->confirm(WebGUI::International::get(74,$namespace),
+ WebGUI::URL::page('func=deleteAllResponsesConfirm&wid='.$_[0]->get("wobjectId"))));
+}
+
+#-------------------------------------------------------------------
+sub www_deleteAllResponsesConfirm {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ WebGUI::SQL->write("delete from Survey_response where Survey_id=".$_[0]->get("Survey_id"));
+ return "";
+}
+
+#-------------------------------------------------------------------
+sub www_edit {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ my ($f, $output, $surveyId, $questionOrder, $mode, $groupToViewReports, $sth, %data, $groupToTakeSurvey);
+ $mode = $_[0]->get("mode") || "survey";
+ $questionOrder = $_[0]->get("questionOrder") || "sequential";
+ $groupToViewReports = $_[0]->get("groupToViewReports") || 4;
+ $groupToTakeSurvey = $_[0]->get("groupToTakeSurvey") || 2;
+ $surveyId = $_[0]->get("Survey_id") || getNextId("Survey_id");
+ $output = helpIcon(1,$namespace);
+ $output .= ''.WebGUI::International::get(2,$namespace).'
';
+ $f = WebGUI::HTMLForm->new;
+ $f->hidden("Survey_id",$surveyId);
+ $f->select(
+ -name=>"questionOrder",
+ -options=>{
+ sequential => WebGUI::International::get(5,$namespace),
+ random => WebGUI::International::get(6,$namespace),
+ response => WebGUI::International::get(7,$namespace)
+ },
+ -label=>WebGUI::International::get(8,$namespace),
+ -value=>[$questionOrder]
+ );
+ $f->select(
+ -name=>"mode",
+ -options=>{
+ survey => WebGUI::International::get(9,$namespace),
+ quiz => WebGUI::International::get(10,$namespace)
+ },
+ -label=>WebGUI::International::get(11,$namespace),
+ -value=>[$mode]
+ );
+ $f->group(
+ -name=>"groupToTakeSurvey",
+ -value=>[$groupToTakeSurvey],
+ -label=>WebGUI::International::get(12,$namespace)
+ );
+ $f->group(
+ -name=>"groupToViewReports",
+ -label=>WebGUI::International::get(13,$namespace),
+ -value=>[$groupToViewReports]
+ );
+ if ($_[0]->get("wobjectId") eq "new") {
+ $f->whatNext(
+ -options=>{
+ addQuestion=>WebGUI::International::get(28,$namespace),
+ backToPage=>WebGUI::International::get(745)
+ },
+ -value=>"addQuestion"
+ );
+ }
+ $output .= $_[0]->SUPER::www_edit($f->printRowsOnly);
+ if ($_[0]->get("wobjectId") ne "new") {
+ $output .= ''.WebGUI::International::get(30,$namespace).'';
+ $sth = WebGUI::SQL->read("select Survey_questionId,question from Survey_question where Survey_id="
+ .$_[0]->get("Survey_id")." order by sequenceNumber");
+ while (%data = $sth->hash) {
+ $output .= deleteIcon('func=deleteQuestion&wid='.$_[0]->get("wobjectId").'&qid='.$data{Survey_questionId})
+ .editIcon('func=editQuestion&wid='.$_[0]->get("wobjectId").'&qid='.$data{Survey_questionId})
+ .moveUpIcon('func=moveQuestionUp&wid='.$_[0]->get("wobjectId").'&qid='.$data{Survey_questionId})
+ .moveDownIcon('func=moveQuestionDown&wid='.$_[0]->get("wobjectId").'&qid='.$data{Survey_questionId})
+ .' '.$data{question}.'
';
+ }
+ $sth->finish;
+ }
+ return $output;
+}
+
+#-------------------------------------------------------------------
+sub www_editSave {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->SUPER::www_editSave({
+ groupToTakeSurvey=>$session{form}{groupToTakeSurvey},
+ groupToViewReports=>$session{form}{groupToViewReports},
+ mode=>$session{form}{mode},
+ Survey_id=>$session{form}{Survey_id},
+ questionOrder=>$session{form}{questionOrder}
+ });
+ if ($session{form}{proceed} eq "addQuestion") {
+ $session{form}{qid} = "new";
+ return $_[0]->www_editQuestion;
+ }
+ return "";
+}
+
+#-------------------------------------------------------------------
+sub www_editAnswer {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ my ($question, $output, $f, $answer);
+ $answer = $_[0]->getCollateral("Survey_answer","Survey_answerId",$session{form}{aid});
+ $output = '
'.WebGUI::International::get(18,$namespace).'
';
+ $f = WebGUI::HTMLForm->new;
+ $f->hidden("wid",$session{form}{wid});
+ $f->hidden("func","editAnswerSave");
+ $f->hidden("qid",$session{form}{qid});
+ $f->hidden("aid",$answer->{Survey_answerId});
+ $f->text(
+ -name=>"answer",
+ -value=>$answer->{answer},
+ -label=>WebGUI::International::get(19,$namespace)
+ );
+ if ($_[0]->get("mode") eq "quiz") {
+ $f->yesNo(
+ -name=>"isCorrect",
+ -value=>$answer->{isCorrect},
+ -label=>WebGUI::International::get(20,$namespace)
+ );
+ } else {
+ $f->hidden("isCorrect",0);
+ }
+ if ($_[0]->get("questionOrder") eq "response") {
+ $question = WebGUI::SQL->buildHashRef("select Survey_questionId,question
+ from Survey_question where Survey_id=".$_[0]->get("Survey_id")." order by sequenceNumber");
+ $f->select(
+ -name=>"goto",
+ -options=>$question,
+ -value=>[$answer->{goto}],
+ -label=>WebGUI::International::get(21,$namespace)
+ );
+ }
+ if ($answer->{Survey_answerId} eq "new") {
+ my %options;
+ tie %options, 'Tie::IxHash';
+ %options = (
+ "addAnswer"=>WebGUI::International::get(24,$namespace),
+ "addQuestion"=>WebGUI::International::get(28,$namespace),
+ "editQuestion"=>WebGUI::International::get(75,$namespace),
+ "backToPage"=>WebGUI::International::get(745)
+ );
+ $f->whatNext(
+ -options=>\%options,
+ -value=>"addAnswer"
+ );
+ }
+ $f->submit;
+ $output .= $f->print;
+ return $output;
+}
+
+#-------------------------------------------------------------------
+sub www_editAnswerSave {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->setCollateral("Survey_answer", "Survey_answerId", {
+ Survey_answerId => $session{form}{aid},
+ Survey_questionId => $session{form}{qid},
+ answer => $session{form}{answer},
+ isCorrect => $session{form}{isCorrect},
+ Survey_id=>$_[0]->get("Survey_id"),
+ goto => $session{form}{goto}
+ },1,0,"Survey_Id");
+ if ($session{form}{proceed} eq "addQuestion") {
+ $session{form}{qid} = "new";
+ } elsif ($session{form}{proceed} eq "addAnswer") {
+ $session{form}{aid} = "new";
+ $_[0]->www_editAnswer();
+ } elsif ($session{form}{proceed} eq "backToPage") {
+ return "";
+ }
+ return $_[0]->www_editQuestion();
+}
+
+#-------------------------------------------------------------------
+sub www_editQuestion {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ my ($output, $f, $question, $answerFieldType, $sth, %data);
+ $question = $_[0]->getCollateral("Survey_question","Survey_questionId",$session{form}{qid});
+ $output = ''.WebGUI::International::get(17,$namespace).'
';
+ $answerFieldType = $question->{answerFieldType} || "radioList";
+ $f = WebGUI::HTMLForm->new;
+ $f->hidden("wid",$_[0]->get("wobjectId"));
+ $f->hidden("func","editQuestionSave");
+ $f->hidden("qid",$question->{Survey_questionId});
+ $f->hidden("answerFieldType",$answerFieldType);
+ $f->HTMLArea(
+ -name=>"question",
+ -value=>$question->{question},
+ -label=>WebGUI::International::get(14,$namespace)
+ );
+ $f->yesNo(
+ -name=>"allowComment",
+ -value=>$question->{allowComment},
+ -label=>WebGUI::International::get(15,$namespace)
+ );
+ $f->yesNo(
+ -name=>"randomizeAnswers",
+ -value=>$question->{randomizeAnswers},
+ -label=>WebGUI::International::get(16,$namespace)
+ );
+ if ($question->{Survey_questionId} eq "new") {
+ my %options;
+ tie %options, 'Tie::IxHash';
+ %options = (
+ "addMultipleChoiceAnswer"=>WebGUI::International::get(24,$namespace),
+ "addTextAnswer"=>WebGUI::International::get(29,$namespace),
+ "addBooleanAnswer"=>WebGUI::International::get(25,$namespace),
+ "addFrequencyAnswer"=>WebGUI::International::get(26,$namespace),
+ "addOpinionAnswer"=>WebGUI::International::get(27,$namespace),
+ "addQuestion"=>WebGUI::International::get(28,$namespace),
+ "backToPage"=>WebGUI::International::get(745)
+ );
+ $f->whatNext(
+ -options=>\%options,
+ -value=>"addMultipleChoiceAnswer"
+ );
+ }
+ $f->submit;
+ $output .= $f->print;
+ if ($question->{Survey_questionId} ne "new" && $question->{answerFieldType} ne "text") {
+ $output .= '{Survey_questionId}).'">'.WebGUI::International::get(23,$namespace).'';
+ $sth = WebGUI::SQL->read("select Survey_answerId,answer from Survey_answer
+ where Survey_questionId=".$question->{Survey_questionId}." order by sequenceNumber");
+ while (%data = $sth->hash) {
+ $output .= deleteIcon('func=deleteAnswer&wid='.$_[0]->get("wobjectId")
+ .'&qid='.$question->{Survey_questionId}.'&aid='.$data{Survey_answerId})
+ .editIcon('func=editAnswer&wid='.$_[0]->get("wobjectId").'&qid='.$question->{Survey_questionId}
+ .'&aid='.$data{Survey_answerId})
+ .moveUpIcon('func=moveAnswerUp&wid='.$_[0]->get("wobjectId")
+ .'&qid='.$question->{Survey_questionId}.'&aid='.$data{Survey_answerId})
+ .moveDownIcon('func=moveAnswerDown&wid='.$_[0]->get("wobjectId").'&qid='
+ .$question->{Survey_questionId}.'&aid='.$data{Survey_answerId})
+ .' '.$data{answer}.'
';
+ }
+ $sth->finish;
+ }
+ return $output;
+}
+
+#-------------------------------------------------------------------
+sub www_editQuestionSave {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $session{form}{qid} = $_[0]->setCollateral("Survey_question", "Survey_questionId", {
+ question=>$session{form}{question},
+ Survey_questionId=>$session{form}{qid},
+ Survey_id=>$_[0]->get("Survey_id"),
+ allowComment=>$session{form}{allowComment},
+ answerFieldType=>$session{form}{answerFieldType},
+ randomizeAnswers=>$session{form}{randomizeAnswers}
+ },1,0,"Survey_id");
+ if ($session{form}{proceed} eq "addMultipleChoiceAnswer") {
+ $session{form}{aid} = "new";
+ return $_[0]->www_editAnswer();
+ } elsif ($session{form}{proceed} eq "addTextAnswer") {
+ $_[0]->_setAnswerType("text",$session{form}{qid});
+ $_[0]->_addAnswer(0,$session{form}{qid});
+ } elsif ($session{form}{proceed} eq "addBooleanAnswer") {
+ $_[0]->_addAnswer(31,$session{form}{qid});
+ $_[0]->_addAnswer(32,$session{form}{qid});
+ return $_[0]->www_editQuestion();
+ } elsif ($session{form}{proceed} eq "addOpinionAnswer") {
+ $_[0]->_addAnswer(33,$session{form}{qid});
+ $_[0]->_addAnswer(34,$session{form}{qid});
+ $_[0]->_addAnswer(35,$session{form}{qid});
+ $_[0]->_addAnswer(36,$session{form}{qid});
+ $_[0]->_addAnswer(37,$session{form}{qid});
+ $_[0]->_addAnswer(38,$session{form}{qid});
+ $_[0]->_addAnswer(39,$session{form}{qid});
+ return $_[0]->www_editQuestion();
+ } elsif ($session{form}{proceed} eq "addFrequencyAnswer") {
+ $_[0]->_addAnswer(40,$session{form}{qid});
+ $_[0]->_addAnswer(41,$session{form}{qid});
+ $_[0]->_addAnswer(42,$session{form}{qid});
+ $_[0]->_addAnswer(43,$session{form}{qid});
+ $_[0]->_addAnswer(39,$session{form}{qid});
+ return $_[0]->www_editQuestion();
+ } elsif ($session{form}{proceed} eq "addQuestion") {
+ $session{form}{qid} eq "new";
+ return $_[0]->www_editQuestion();
+ } elsif ($session{form}{proceed} eq "backToPage") {
+ return ""
+ }
+ return $_[0]->www_edit;
+}
+
+#-------------------------------------------------------------------
+sub www_exportAnswers {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ $session{header}{filename} = WebGUI::URL::escape($_[0]->get("title")."_answers.tab");
+ $session{header}{mimetype} = "text/tab";
+ return WebGUI::SQL->quickTab("select * from Survey_answer where Survey_id=".$_[0]->get("Survey_id"));
+}
+
+#-------------------------------------------------------------------
+sub www_exportComposite {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ $session{header}{filename} = WebGUI::URL::escape($_[0]->get("title")."_composite.tab");
+ $session{header}{mimetype} = "text/tab";
+ return WebGUI::SQL->quickTab("select b.question, a.response, a.userId, a.username, a.ipAddress, a.comment,
+ a.dateOfResponse from Survey_response a left join Survey_question b on a.Survey_questionId=b.Survey_questionId
+ where a.Survey_id=".$_[0]->get("Survey_id")." order by a.userId, a.ipAddress, b.sequenceNumber");
+}
+
+#-------------------------------------------------------------------
+sub www_exportQuestions {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ $session{header}{filename} = WebGUI::URL::escape($_[0]->get("title")."_questions.tab");
+ $session{header}{mimetype} = "text/tab";
+ return WebGUI::SQL->quickTab("select * from Survey_question where Survey_id=".$_[0]->get("Survey_id"));
+}
+
+#-------------------------------------------------------------------
+sub www_exportResponses {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ $session{header}{filename} = WebGUI::URL::escape($_[0]->get("title")."_responses.tab");
+ $session{header}{mimetype} = "text/tab";
+ return WebGUI::SQL->quickTab("select * from Survey_response where Survey_id=".$_[0]->get("Survey_id"));
+}
+
+#-------------------------------------------------------------------
+sub www_moveAnswerDown {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->moveCollateralDown("Survey_answer","Survey_answerId",$session{form}{aid},"Survey_id");
+ return $_[0]->www_editQuestion;
+}
+
+#-------------------------------------------------------------------
+sub www_moveAnswerUp {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->moveCollateralUp("Survey_answer","Survey_answerId",$session{form}{aid},"Survey_id");
+ return $_[0]->www_editQuestion;
+}
+
+#-------------------------------------------------------------------
+sub www_moveQuestionDown {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->moveCollateralDown("Survey_question","Survey_questionId",$session{form}{qid},"Survey_id");
+ return $_[0]->www_edit;
+}
+
+#-------------------------------------------------------------------
+sub www_moveQuestionUp {
+ return WebGUI::Privilege::insufficient() unless (WebGUI::Privilege::canEditPage());
+ $_[0]->moveCollateralUp("Survey_question","Survey_questionId",$session{form}{qid},"Survey_id");
+ return $_[0]->www_edit;
+}
+
+#-------------------------------------------------------------------
+sub www_respond {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToTakeSurvey")));
+ return "" unless ($session{form}{Survey_answerId} ne "");
+ my ($previousResponse) = WebGUI::SQL->quickArray("select count(*) from Survey_response
+ where Survey_answerId=$session{form}{Survey_answerId} and ((userId=".$session{user}{userId}." and userId<>1)
+ or (userId=1 and ipAddress='".$session{form}{ip}."'))");
+ return "" if ($previousResponse);
+ my $answer = $_[0]->getCollateral("Survey_answer","Survey_answerId",$session{form}{Survey_answerId});
+ my $response = $session{form}{response} || $answer->{answer};
+ $_[0]->setCollateral("Survey_response","Survey_responseId",{
+ Survey_responseId=>"new",
+ Survey_answerId=>$session{form}{Survey_answerId},
+ Survey_questionId=>$answer->{Survey_questionId},
+ Survey_id=>$answer->{Survey_id},
+ comment=>$session{form}{comment},
+ response=>$response,
+ userId=>$session{user}{userId},
+ username=>$session{user}{username},
+ dateOfResponse=>time(),
+ ipAddress=>$session{env}{REMOTE_ADDR}
+ },0,0);
+ return "";
+}
+
+#-------------------------------------------------------------------
+sub www_view {
+ my ($output, $f, $previous, $questionOrder, $previousResponse, $question);
+ $output = $_[0]->displayTitle;
+ $output .= $_[0]->description;
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports"))) {
+ $output .= ''
+ .WebGUI::International::get(68,$namespace).'
';
+ }
+ if (WebGUI::Privilege::isInGroup($_[0]->get("groupToTakeSurvey"))) {
+ $previousResponse = WebGUI::SQL->quickHashRef("select Survey_questionId, Survey_answerId from Survey_response
+ where Survey_id=".$_[0]->get("Survey_id")
+ ." and ((userId=$session{user}{userId} and userId<>1) or (userId=1 and
+ ipAddress='$session{env}{REMOTE_ADDR}')) order by dateOfResponse desc");
+ $questionOrder = $_[0]->get("questionOrder");
+ unless ($previousResponse) {
+ if ($questionOrder eq "random") {
+ my @questions = WebGUI::SQL->buildArray("select Survey_questionId from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id"));
+ $question = $_[0]->getCollateral("Survey_question","Survey_questionId",
+ $questions[rand($#questions+1)]);
+ } else {
+ $question = WebGUI::SQL->quickHashRef("select * from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id")." order by sequenceNumber");
+ }
+ } else {
+ if ($questionOrder eq "random") {
+ my @questions = WebGUI::SQL->buildArray("select Survey_questionId from Survey_response
+ where Survey_id=".$_[0]->get("Survey_id")." and ((userId=$session{user}{userId}
+ and userId<>1) or (userId=1 and ipAddress='$session{env}{REMOTE_ADDR}'))");
+ @questions = WebGUI::SQL->buildArray("select Survey_questionId from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id")
+ ." and Survey_questionId not in (".join(",",@questions).")");
+ if ($#questions >= 0) {
+ $question = $_[0]->getCollateral("Survey_question","Survey_questionId",
+ $questions[rand($#questions+1)]);
+ }
+ }
+ if ($questionOrder eq "response") {
+ my ($responseDriver) = WebGUI::SQL->quickArray("select goto from Survey_answer where
+ Survey_answerId=".$previousResponse->{Survey_answerId});
+ if ($responseDriver) {
+ $question = $_[0]->getCollateral("Survey_question","Survey_questionId",$responseDriver);
+ } else {
+ $questionOrder = "sequential";
+ }
+ }
+ if ($questionOrder eq "sequential") {
+ my $previousQuestion = $_[0]->getCollateral("Survey_question","Survey_questionId",
+ $previousResponse->{Survey_questionId});
+ $previousQuestion->{sequenceNumber} = 1 unless($previousQuestion->{sequenceNumber});
+ $question = WebGUI::SQL->quickHashRef("select * from Survey_question where Survey_id="
+ .$_[0]->get("Survey_id")." and sequenceNumber>".$previousQuestion->{sequenceNumber}
+ ." order by sequenceNumber");
+ }
+ }
+ if ($question) {
+ $output .= $question->{question};
+ $f = WebGUI::HTMLForm->new;
+ $f->hidden("func","respond");
+ $f->hidden("wid",$_[0]->get("wobjectId"));
+ if ($question->{answerFieldType} eq "text") {
+ my ($answer) = WebGUI::SQL->quickArray("select Survey_answerId from Survey_answer where
+ Survey_questionId=".$question->{Survey_questionId});
+ $f->hidden("Survey_answerId",$answer);
+ $f->text(
+ -name=>"response"
+ );
+ } else {
+ my $answer = WebGUI::SQL->buildHashRef("select Survey_answerId,answer from Survey_answer
+ where Survey_questionId=".$question->{Survey_questionId}." order by sequenceNumber");
+ if ($question->{randomizeAnswers}) {
+ $answer = randomizeHash($answer);
+ }
+ $f->radioList(
+ -options=>$answer,
+ -name=>"Survey_answerId",
+ -vertical=>1
+ );
+ }
+ if ($question->{allowComment}) {
+ $f->textarea(
+ -name=>"comment",
+ -label=>WebGUI::International::get(51,$namespace)
+ );
+ }
+ $f->submit(WebGUI::International::get(50,$namespace));
+ $output .= $f->print;
+ } else {
+ if ($_[0]->get("mode") eq "survey") {
+ $output .= WebGUI::International::get(46,$namespace);
+ } else {
+ $output .= WebGUI::International::get(47,$namespace);
+ my ($questionCount) = WebGUI::SQL->quickArray("select count(*) from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id"));
+ my ($correctCount) = WebGUI::SQL->quickArray("select count(*) from Survey_response a,
+ Survey_answer b where a.Survey_id=".$_[0]->get("Survey_id")."
+ and ((userId=$session{user}{userId} and userId<>1) or
+ (userId=1 and ipAddress='$session{env}{REMOTE_ADDR}'))
+ and a.Survey_answerId=b.Survey_answerId and b.isCorrect=1");
+ $output .= "".WebGUI::International::get(52,$namespace).": ".$correctCount."/".$questionCount
+ ."
".WebGUI::International::get(54,$namespace).": "
+ .round(($correctCount/$questionCount)*100)."%
";
+ }
+ }
+ } else {
+ if ($_[0]->get("mode") eq "survey") {
+ $output .= WebGUI::International::get(48,$namespace);
+ } else {
+ $output .= WebGUI::International::get(49,$namespace);
+ }
+ }
+ return $_[0]->processMacros($output);
+}
+
+#-------------------------------------------------------------------
+sub www_viewComments {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ my ($output, $sth, $comment);
+ $output = ''.WebGUI::International::get(57,$namespace).'
';
+ $sth = WebGUI::SQL->read("select comment from Survey_response where Survey_questionId=".$session{form}{qid});
+ while (($comment) = $sth->array) {
+ $output .= $comment."\n";
+ }
+ $sth->finish;
+ return $_[0]->_submenu($output);
+}
+
+#-------------------------------------------------------------------
+sub www_viewGradebook {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ my ($output, $p, $users, $user);
+ $output = ''.WebGUI::International::get(71,$namespace).'
';
+ $p = WebGUI::Paginator->new('func=viewGradebook&wid='.$_[0]->get("wobjectId"));
+ $p->setDataByQuery("select userId,username,ipAddress from Survey_response
+ group by userId,ipAddress order by username,ipAddress");
+ $users = $p->getPageData;
+ my ($questionCount) = WebGUI::SQL->quickArray("select count(*) from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id"));
+ $output .= '';
+ $output .= $p->getBarTraditional;
+ return $_[0]->_submenu($output);
+}
+
+
+#-------------------------------------------------------------------
+sub www_viewIndividualSurvey {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ my ($output, $questions, $sth, $qdata, $rdata, $adata, $p);
+ $output = ''.WebGUI::International::get(70,$namespace).'
';
+ $output .= ''.WebGUI::International::get(69,$namespace).'';
+ my ($start) = WebGUI::SQL->quickArray("select min(dateOfResponse) from Survey_response
+ where Survey_id=".$_[0]->get("Survey_id")." and ((userId=".$session{form}{uid}." and userId<>1)
+ or (userId=1 and ipAddress='".$session{form}{ip}."'))");
+ my ($end) = WebGUI::SQL->quickArray("select max(dateOfResponse) from Survey_response
+ where Survey_id=".$_[0]->get("Survey_id")." and ((userId=".$session{form}{uid}." and userId<>1)
+ or (userId=1 and ipAddress='".$session{form}{ip}."'))");
+ $output .= ''.WebGUI::International::get(76,$namespace).': '.epochToHuman($start).'
';
+ $output .= ''.WebGUI::International::get(77,$namespace).': '.epochToHuman($end).'
';
+ $output .= ''.WebGUI::International::get(78,$namespace).': '.int(($end-$start)/60).' '
+ .WebGUI::International::get(79,$namespace).', '.(($end-$start)%60).' '
+ .WebGUI::International::get(80,$namespace).'';
+ $p = WebGUI::Paginator->new(WebGUI::URL::page('func=viewIndividualSurvey&wid='.$_[0]->get("wobjectId")
+ .'&uid='.$session{form}{uid}.'&ip='.$session{form}{ip}));
+ $p->setDataByQuery("select Survey_questionId,question,answerFieldType from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id")." order by sequenceNumber");
+ $questions = $p->getPageData;
+ foreach $qdata (@$questions) {
+ $output .= ''.$qdata->{question}.'
'
+ .'';
+ if ($qdata->{answerFieldType} eq "radioList") {
+ $output .= '';
+ $sth = WebGUI::SQL->read("select Survey_answerId,answer from Survey_answer
+ where Survey_questionId=".$qdata->{Survey_questionId}." and isCorrect=1 order by sequenceNumber");
+ while ($adata = $sth->hashRef) {
+ $output .= $adata->{answer}.' ';
+ }
+ $sth->finish;
+ $output .= ' |
';
+ }
+ $output .= '';
+ $rdata = WebGUI::SQL->quickHashRef("select Survey_answerId,response,comment from Survey_response
+ where Survey_questionId=".$qdata->{Survey_questionId}."
+ and ((userId=".$session{form}{uid}." and userId<>1)
+ or (userId=1 and ipAddress='".$session{form}{ip}."'))");
+ $output .= '| '.$rdata->{response}.' |
';
+ if ($rdata->{comment} ne "") {
+ $output .= ''
+ .'| '.$rdata->{comment}.' |
';
+ }
+ $output .= "
\n";
+ }
+ return $_[0]->_submenu($output);
+}
+
+#-------------------------------------------------------------------
+sub www_viewResponses {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ my ($output, $sth, $response);
+ $output = ''.WebGUI::International::get(66,$namespace).'
';
+ $sth = WebGUI::SQL->read("select response from Survey_response where Survey_questionId=".$session{form}{qid});
+ while (($response) = $sth->array) {
+ $output .= $response."\n";
+ }
+ $sth->finish;
+ return $_[0]->_submenu($output);
+}
+
+#-------------------------------------------------------------------
+sub www_viewStatisticalOverview {
+ return "" unless (WebGUI::Privilege::isInGroup($_[0]->get("groupToViewReports")));
+ my ($output, $p, $questions, $question, $sth, $answer, $totalResponses, $data);
+ $output = ''.WebGUI::International::get(58,$namespace).'
';
+ $output .= ''.WebGUI::International::get(73,$namespace).'';
+ $p = WebGUI::Paginator->new(WebGUI::URL::page('op=viewStatisticalOverview'));
+ $p->setDataByQuery("select Survey_questionId,question,answerFieldType,allowComment from Survey_question
+ where Survey_id=".$_[0]->get("Survey_id")." order by sequenceNumber");
+ $questions = $p->getPageData;
+ foreach $question (@$questions) {
+ $output .= ''.$question->{question}.'';
+ if ($question->{answerFieldType} eq "radioList") {
+ $output .= '';
+ $output .= '';
+ ($totalResponses) = WebGUI::SQL->quickArray("select count(*) from Survey_response
+ where Survey_questionId=".$question->{Survey_questionId});
+ $sth = WebGUI::SQL->read("select Survey_answerId,answer,isCorrect from Survey_answer where
+ Survey_questionId=".$question->{Survey_questionId}." order by sequenceNumber");
+ while ($answer = $sth->hashRef) {
+ if ($answer->{isCorrect}) {
+ $output .= '';
+ } else {
+ $output .= '
';
+ }
+ $output .= '| '.$answer->{answer}.' | ';
+ ($data) = WebGUI::SQL->quickArray("select count(*) from Survey_response
+ where Survey_answerId=".$answer->{Survey_answerId});
+ $output .= ''.$data.' | ';
+ $output .= ''.round(($data/$totalResponses)*100).' | ';
+ $output .= '
';
+ }
+ $sth->finish;
+ $output .= "
";
+ } else {
+ $output .= '
{Survey_questionId}).'">'.WebGUI::International::get(55,$namespace)
+ .'
';
+ }
+ if ($question->{allowComment}) {
+ $output .= '{Survey_questionId}).'">'.WebGUI::International::get(56,$namespace).'';
+ }
+ $output .= '
';
+ }
+ $output .= $p->getBarTraditional;
+ return $_[0]->_submenu($output);
+}
+
+1;
+