]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/javascript/widgets/Survey.js
fixups for IE
[Evergreen.git] / Open-ILS / src / javascript / widgets / Survey.js
1 /* */
2
3 function SurveyQuestion(question, poll) {
4         debug("Creating new survey question " + question.question() );
5         this.question = question;
6         this.node = createAppElement("div");
7         this.node.id    = "survey_question_" + question.id();
8         add_css_class( this.node, "survey_question" );
9         var div = createAppElement("div");
10         add_css_class(div, "survey_question_question");
11         div.appendChild(        
12                 createAppTextNode(question.question()));
13         this.node.appendChild(div);
14
15         if(poll) {
16                 this.selector = createAppElement("div");
17         } else {
18                 this.selector = createAppElement("select");
19         }
20
21         add_css_class( this.selector, "survey_answer_selector" );
22         this.selector.name = "survey_question_" + question.id();
23         this.selector.value = "survey_question_" + question.id();
24         this.node.appendChild(this.selector);
25         this.answers = new Array();
26 }
27
28
29 SurveyQuestion.prototype.getNode = function() {
30         return this.node;
31 }
32
33 SurveyQuestion.prototype.addAnswer = function(answer,poll) {
34         if(poll) {
35                 var ans = new SurveyAnswer(answer, poll);
36                 this.answers.push(ans);
37                 this.selector.appendChild(
38                         createAppTextNode(answer.answer()));
39                 this.selector.appendChild(ans.getNode());
40         } else {
41                 var ans = new SurveyAnswer(answer);
42                 this.answers.push(ans);
43                 this.selector.options[ this.selector.options.length ] = ans.getNode();
44         }
45 }
46
47
48 function SurveyAnswer(answer,poll) {
49         this.answer = answer;
50
51         if(poll) {
52
53                 if(IE) {
54                         this.node = createAppElement(
55                                 "<input name='answer_" + answer.id() + "' type='radio' value='" + answer.id() + "'></input>" );
56                 } else {
57
58                         this.node = createAppElement("input");
59                         this.node.type = "radio";
60                         this.node.setAttribute("type", "radio");
61                         this.node.setAttribute("name", "survey_answer_" + answer.id());
62                         this.node.setAttribute("value", answer.id());
63                 }
64
65         } else {
66                 this.node = new Option( answer.answer(), answer.id() );
67         }
68
69         add_css_class( this.node, "survey_answer" );
70 }
71
72 SurveyAnswer.prototype.getNode = function() {
73         return this.node;
74 }
75
76 function Survey(survey, onclick) {
77
78         debug("Creating new survey " + survey.name() );
79         this.survey = survey;
80
81         this.node                       = createAppElement("div");
82         this.node.id            = "survey_" + survey.id();
83
84         this.wrapperNode        = createAppElement("div");
85         this.wrapperNode.appendChild(this.node);
86         this.nameNode           = createAppElement("div");
87         this.nameNode.appendChild(createAppTextNode(survey.name()));
88         this.descNode           = createAppElement("div");
89         this.descNode.appendChild( createAppTextNode(survey.description()));
90
91         if( survey.poll() == 0 )
92                 survey.poll(false);
93         if( survey.poll() == 1 )
94                 survey.poll(true);
95
96         if(survey.poll())
97                 this.qList                      = createAppElement("ul");
98         else
99                 this.qList                      = createAppElement("ol");
100
101         this.questions          = new Array();
102         this.submittedNode      = createAppElement("div");
103
104         add_css_class(this.submittedNode,       "survey_submitted" );
105         add_css_class(this.nameNode,                    "survey_name");
106         add_css_class(this.descNode,                    "survey_description");
107         add_css_class(this.node,                                "survey" );
108
109         this.node.appendChild( this.nameNode );
110         this.node.appendChild( this.descNode );
111         this.node.appendChild( this.qList );
112
113         for( var i in survey.questions() ) {
114                 this.addQuestion( survey.questions()[i] );
115         }
116
117         this.buttonDiv  = createAppElement("div");
118         add_css_class( this.buttonDiv, "survey_button");
119         this.button = createAppElement("input");
120         this.button.setAttribute("type", "submit");
121         this.button.value = "Submit Survey";
122         if(onclick)
123                 this.button.onclick = onclick;
124         this.buttonDiv.appendChild(this.button);
125         this.node.appendChild(this.buttonDiv);
126         this.node.appendChild( this.submittedNode );
127         this.node.appendChild(createAppElement("hr"));
128
129         var obj = this;
130         this.setAction( function() { obj.submit(); });
131 }
132
133 Survey.prototype.setUserSession = function(userSession) {
134         this.userSession = userSession;
135 }
136
137 Survey.prototype.setAnswerDate = function(date) {
138         this.answerDate = date;
139 }
140
141 Survey.prototype.setEffectiveDate = function(date) {
142         this.effectiveDate = date;
143 }
144
145 Survey.prototype.setAction = function(onclick) {
146         this.button.onclick = onclick;
147 }
148
149 Survey.prototype.getName = function() {
150         debug("getting name for " + this.survey.name() ); 
151         return this.survey.name();
152 }
153
154 Survey.prototype.toString = function() {
155         return this.wrapperNode.innerHTML;
156 }
157
158 Survey.prototype.getNode = function() {
159         return this.node;
160 }
161
162 Survey.prototype.addQuestion = function(question) {
163         var questionObj = new SurveyQuestion(question, this.survey.poll());
164         this.questions.push(questionObj);
165         for( var i in question.answers() ) {
166                 questionObj.addAnswer(question.answers()[i], this.survey.poll());
167         }
168
169         var item = createAppElement("li");
170         item.appendChild(questionObj.getNode());
171         this.qList.appendChild(item); 
172 }
173
174 Survey.prototype.submit = function() {
175
176         var responses = this.buildSurveyResponse();
177         var request = new RemoteRequest(
178                 "open-ils.circ",
179                 "open-ils.circ.survey.submit",
180                 responses );
181         request.send(true);
182
183         /* there is nothing to return, just check for exceptions */
184         request.getResultObject();
185         this.buttonDiv.innerHTML = "";
186         this.submittedNode.appendChild( 
187                 createAppTextNode("* Submitted *"));
188 }
189
190 Survey.prototype.buildSurveyResponse = function() {
191
192         var responses = new Array();
193
194         for( var index in this.questions ) {
195                 var que = this.questions[index];
196                 var ans = null;  
197                 for( var ansindex in que.answers ) {
198                         ansobj = que.answers[ansindex];
199                         if( ansobj.getNode().selected || ansobj.getNode().checked ) {
200                                 ans = ansobj.answer.id();
201                                 debug("User selected answer " + ans );
202                                 break;
203                         }
204                 }
205                 var qid = que.question.id()
206                 var sur = new asvr();
207                 sur.usr(this.userSession);
208                 sur.survey(this.survey.id());
209                 sur.question(qid);
210                 sur.answer(ans);
211                 sur.answer_date(this.answerDate);
212                 sur.effective_date(this.effectiveDate);
213                 responses.push(sur);
214         }
215
216         return responses;
217 }
218
219 /* Global survey retrieval functions.  In each case, if recvCallback
220         is not null, the retrieval will be asynchronous and will
221         call recvCallback(survey) on each survey retrieved.  Otherwise
222         an array of surveys is returned.
223         */
224
225 Survey._retrieve = function(user_session, method, recvCallback) {
226
227         var request = new RemoteRequest(
228                 "open-ils.circ", method, user_session );
229
230         if( recvCallback ) {
231
232                 debug("Retrieving random survey asynchronously");
233                 var c = function(req) {
234                         var surveys = req.getResultObject();
235                         for( var i in surveys ) {
236                                 var s = surveys[i];
237                                 debug("Retrieved survey " + s.name() );
238                                 var surv = new Survey(s);
239                                 surv.setUserSession(user_session);
240                                 recvCallback(surv);
241                         }
242                 }
243
244                 request.setCompleteCallback(c);
245                 request.send();
246
247         } else {
248
249                 request.send(true);
250                 var surveys = new Array();
251                 var results = request.getResultObject();
252                 for(var index in results) {
253                         var s = results[index];
254                         debug("Retrieved survey " + s.name());
255                         var surv = new Survey(s);
256                         surv.setUserSession(user_session);
257                         surveys.push(surv);
258                 }
259                 return surveys;
260         }
261
262 }
263
264 /* this needs a different method for retrieving the correct survey */
265 Survey.retrieveRandom = function(user_session, recvCallback) {
266         return Survey._retrieve(user_session, 
267                 "open-ils.circ.survey.retrieve.all", recvCallback );
268         
269 }
270
271
272 Survey.retrieveAll = function(user_session, recvCallback) {
273         return Survey._retrieve(user_session, 
274                 "open-ils.circ.survey.retrieve.all", recvCallback );
275 }
276
277
278 Survey.retrieveRequired = function(user_session, recvCallback) {
279         return Survey._retrieve(user_session, 
280                 "open-ils.circ.survey.required.retrieve", recvCallback );
281 }
282
283
284
285