From 89eba42f0bed7c6ac55734d373ddcb7ae05bdd44 Mon Sep 17 00:00:00 2001 From: JT Smith Date: Fri, 18 Apr 2008 18:28:52 +0000 Subject: [PATCH 01/64] creating a branch for survey work From 9ce0bd80fd861198d7c926a5a2851599df2bbd86 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Sat, 19 Apr 2008 18:48:01 +0000 Subject: [PATCH 02/64] Survey JS original import --- www/extras/wobject/administersurvey.js | 327 ++++++ www/extras/wobject/administersurvey.js.backup | 404 +++++++ .../wobject/administersurvey.js.backup1 | 408 ++++++++ www/extras/wobject/administersurvey/comm.js | 64 ++ www/extras/wobject/bg-fader.gif | Bin 0 -> 433 bytes www/extras/wobject/dd.js | 125 +++ www/extras/wobject/editsurvey.js | 232 ++++ www/extras/wobject/editsurvey.js.backup | 988 ++++++++++++++++++ www/extras/wobject/editsurvey.js.backup.newer | 337 ++++++ www/extras/wobject/editsurvey/answer.js | 67 ++ www/extras/wobject/editsurvey/comm.js | 67 ++ www/extras/wobject/editsurvey/question.js | 107 ++ www/extras/wobject/editsurvey/section.js | 93 ++ www/extras/wobject/loadTemplate.pl | 15 + www/extras/wobject/survey.css | 34 + www/extras/wobject/survey.css.backup | 97 ++ www/extras/wobject/surveyedit.css | 132 +++ www/extras/wobject/template.html.backup | 159 +++ www/extras/wobject/templates/buttonHTML.txt | 6 + .../wobject/templates/fileLoaderHTML.txt | 7 + www/extras/wobject/templates/takeSurvey.html | 151 +++ www/extras/wobject/templates/textHTML.txt | 7 + www/extras/wobject/thumb-n.gif | Bin 0 -> 612 bytes 23 files changed, 3827 insertions(+) create mode 100644 www/extras/wobject/administersurvey.js create mode 100644 www/extras/wobject/administersurvey.js.backup create mode 100644 www/extras/wobject/administersurvey.js.backup1 create mode 100644 www/extras/wobject/administersurvey/comm.js create mode 100644 www/extras/wobject/bg-fader.gif create mode 100644 www/extras/wobject/dd.js create mode 100644 www/extras/wobject/editsurvey.js create mode 100644 www/extras/wobject/editsurvey.js.backup create mode 100644 www/extras/wobject/editsurvey.js.backup.newer create mode 100644 www/extras/wobject/editsurvey/answer.js create mode 100644 www/extras/wobject/editsurvey/comm.js create mode 100644 www/extras/wobject/editsurvey/question.js create mode 100644 www/extras/wobject/editsurvey/section.js create mode 100755 www/extras/wobject/loadTemplate.pl create mode 100644 www/extras/wobject/survey.css create mode 100644 www/extras/wobject/survey.css.backup create mode 100644 www/extras/wobject/surveyedit.css create mode 100644 www/extras/wobject/template.html.backup create mode 100644 www/extras/wobject/templates/buttonHTML.txt create mode 100644 www/extras/wobject/templates/fileLoaderHTML.txt create mode 100644 www/extras/wobject/templates/takeSurvey.html create mode 100644 www/extras/wobject/templates/textHTML.txt create mode 100644 www/extras/wobject/thumb-n.gif diff --git a/www/extras/wobject/administersurvey.js b/www/extras/wobject/administersurvey.js new file mode 100644 index 000000000..f52f732d8 --- /dev/null +++ b/www/extras/wobject/administersurvey.js @@ -0,0 +1,327 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + var hasFile; + + this.displayQuestions = function(params){ + + var qs = params.questions; + var s = params.section; + + + //What to show and where + document.getElementById('survey').innerHTML = params.html; +var te = document.createElement('span'); +te.innerHTML = ""; +document.getElementById('survey').appendChild(te); +YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer('','loadQuestions');}); + + if(qs[0] != undefined){ + if(qs[0].sequenceNumber == '1' || s.everyPageTitle > 0){ + document.getElementById('headertitle').style.display='block'; + } + if(qs[0].sequenceNumber == '1' || s.everyPageText > 0){ + document.getElementById('headertext').style.display = 'block'; + } + + if(qs[0].sequenceNumber == '1' && s.questionsOnSectionPage != '1'){ + var span = document.createElement("div"); + span.innerHTML = ""; + span.style.display = 'block'; + + document.getElementById('header').appendChild(span); + YAHOO.util.Event.addListener("showQuestionsButton", "click", + function(){ + document.getElementById('showQuestionsButton').style.display = 'none'; + if(s.everyPageTitle == 0){ + document.getElementById('headertitle').style.display = 'none'; + } + if(s.everyPageText == 0){ + document.getElementById('headertext').style.display = 'none'; + } + document.getElementById('questions').style.display='inline'; + }); + }else{ + document.getElementById('questions').style.display='inline'; + } + }else{ + document.getElementById('headertitle').style.display='block'; + document.getElementById('headertext').style.display = 'block'; + document.getElementById('questions').style.display='inline'; + } + + //Display questions + + var html; + hasFile = false; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + html += "
"; + html += "
Q"+q.sequenceNumber+": "+q.questionText+"
"; + + if(multipleChoice[q.questionType]){ + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', + value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + b.hid = a.Survey_answerId; + butts.push(b); + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + new this.dualSliders(q); + }else{ + for(var s in q.answers){ + var a = q.answers[s]; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(fileUpload[q.questionType]){ + hasFile = true; + } + } + YAHOO.util.Event.addListener("submitbutton", "click", this.formsubmit); + } + + + this.formsubmit = function(){ + Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); + } + + + + + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId; + var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', + 0, 200, (scale*step)); + // 0, 200, 1); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + document.getElementById(id).value = a.min; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + t -= this.getValue(); + t = Math.round(t); + this.setValue(total-t + scale*step); + }else{ + this.lastValue = this.getValue(); + document.getElementById(this.input).value = this.getRealValue(); + document.getElementById(this.input+'show').innerHTML = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + document.getElementById(butts[i].hid).value = ''; + } + b.set('checked',true); + document.getElementById(b.hid).value = 1; + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + document.getElementById(b.hid).value = ''; + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + document.getElementById(b.hid).value = 1; + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/administersurvey.js.backup b/www/extras/wobject/administersurvey.js.backup new file mode 100644 index 000000000..87ec877aa --- /dev/null +++ b/www/extras/wobject/administersurvey.js.backup @@ -0,0 +1,404 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var sliders; + var dSliders; + var texts; + var buttons; + var cals; + var files; + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + this.displayQuestions = function(params){ + sliders = new Array(); + dSliders = new Array(); + texts = new Array(); + buttons = new Array(); + cals = new Array(); + files = new Array(); + + var section = params.section; + var questions = params.questions; + document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
"; + + if(section.questionsOnSectionPage){ + document.getElementById('headertext').innerHTML = section.sectionText; + } + + var qs = params.questions; + var s = params.survey; + var html = ""; + +// html = '
'; + document.getElementById('survey').innerHTML = html;html = ''; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + if(q.verticalDisplay != 0){ + verts = "

"; + verte = "

"; + } + + html += "
"; + html += "
Q"+q.sequenceNumber+": "+q.questionText+"
"; + + if(multipleChoice[q.questionType]){ + if(q.maxAnswers > 1){ + html += "
Selections left: "+q.maxAnswers+"
"; + } + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""+verte; +// html += verts+""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + butts.push(b); + buttons.push(b); + } + } + else if(text[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + + if(q.questionType == 'Text'){ + html += ""; + }else if(q.questionType == 'Email'){ + html += ""; + }else if(q.questionType == 'Phone Number'){ + html += ""; + }else if(q.questionType == 'Text Date'){ + html += ""; + }else if(q.questionType == 'Currency'){ + html += ""; + } + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + html += verts+""; + html += ""; + html += "
"; + html += ""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(fileUpload[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + files.push(a.Survey_answerId); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + var a1 = q.answers[0]; + var a2 = q.answers[1]; + html += ""; + html += ""; + + html += verts+""; + html += "

"+a.answerText+"
"; + html += "
"; + html += "0"; + html += ""; + html += ""+a2.max+""; + html += "
0  "; + html += "
"; + html += "
\ +
\ +
\ +
"; + + html += "
\ + "; + html += "
"+a1.max+""; + html += "
"; + + html += "
"+verte; + document.getElementById('survey').innerHTML += html;html = ''; + new this.dualSliders(q); + }else{ + for(var i in q.answers){ + var a = q.answers[i]; + html += verts+""; + html += "

"; + html += "
"; + html += a.answerText+" "; + html += "0"; + html += ""; + html += "
0  "; + html += "
"; + if(q.questionType == 'Dual Slider - Range'){ + html += "
\ + \ +
\ + "; + + }else{ + html += "
\ + "; + } + html += "
\ +
"; + html += "
"+a.max+""; + html += "
"; + + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(hidden[q.questionType]){ + } + } + html += "


"; + document.getElementById('survey').innerHTML += html;html = ''; + document.getElementById('footer').innerHTML = "
You are |---| close to being done."; +// var submit = function() {alert(YAHOO.util.Connect.setForm('surveyForm'));} + YAHOO.util.Event.addListener("submit", "click", this.submit); + } + this.submit = function(){ + var butts = new Array(); + for(var i in buttons){ + if(buttons[i].get('checked')){ + butts.push([buttons[i].get('id'),buttons[i].get('value')]); + } + } + for(var i in files){ + console.log(files[i]); + console.log(document.getElementById(files[i]).value); + } + Survey.Comm.callServer(s,'submitQuestions'); + } + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; +console.log(scale); + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + var sliders = new Array(); + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, (scale*step)); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + sliders.push(s); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; +//console.log(s); + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + this.setValue(this.lastValue); + }else{ + this.lastValue = this.getValue(); +// alert("Setting "+this.input+" to "+this.getRealValue()); + document.getElementById(this.input).value = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + //console.log('showing '+objs[0].id); + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + } + b.set('checked',true); + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/administersurvey.js.backup1 b/www/extras/wobject/administersurvey.js.backup1 new file mode 100644 index 000000000..4df16790c --- /dev/null +++ b/www/extras/wobject/administersurvey.js.backup1 @@ -0,0 +1,408 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var sliders; + var dSliders; + var texts; + var buttons; + var cals; + var files; + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + this.displayQuestions = function(params){ + sliders = new Array(); + dSliders = new Array(); + texts = new Array(); + buttons = new Array(); + cals = new Array(); + files = new Array(); + + var section = params.section; + var questions = params.questions; + document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
"; + + if(section.questionsOnSectionPage){ + document.getElementById('headertext').innerHTML = section.sectionText; + } + + var qs = params.questions; + var s = params.survey; + var html = ""; + +// html = ''; + document.getElementById('survey').innerHTML = html;html = ''; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + if(q.verticalDisplay != 0){ + verts = "

"; + verte = "

"; + } + + html += "
"; + html += "
Q"+q.sequenceNumber+": "+q.questionText+"
"; + + if(multipleChoice[q.questionType]){ + if(q.maxAnswers > 1){ + html += "
Selections left: "+q.maxAnswers+"
"; + } + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""+verte; +// html += verts+""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + butts.push(b); + buttons.push(b); + } + } + else if(text[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + + if(q.questionType == 'Text'){ + html += ""; + }else if(q.questionType == 'Email'){ + html += ""; + }else if(q.questionType == 'Phone Number'){ + html += ""; + }else if(q.questionType == 'Text Date'){ + html += ""; + }else if(q.questionType == 'Currency'){ + html += ""; + } + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + html += verts+""; + html += ""; + html += "
"; + html += ""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(fileUpload[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + files.push(a.Survey_answerId); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + var a1 = q.answers[0]; + var a2 = q.answers[1]; + html += ""; + html += ""; + + html += verts+""; + html += "

"+a.answerText+"
"; + html += "
"; + html += "0"; + html += ""; + html += ""+a2.max+""; + html += "
0  "; + html += "
"; + html += "
\ +
\ +
\ +
"; + + html += "
\ + "; + html += "
"+a1.max+""; + html += "
"; + + html += "
"+verte; + document.getElementById('survey').innerHTML += html;html = ''; + new this.dualSliders(q); + }else{ + for(var i in q.answers){ + var a = q.answers[i]; + html += verts+""; + html += "

"; + html += "
"; + html += a.answerText+" "; + html += "0"; + html += ""; + html += "
0  "; + html += "
"; + if(q.questionType == 'Dual Slider - Range'){ + html += "
\ + \ +
\ + "; + + }else{ + html += "
\ + "; + } + html += "
\ +
"; + html += "
"+a.max+""; + html += "
"; + + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(hidden[q.questionType]){ + } + } + html += "


"; + document.getElementById('survey').innerHTML += html;html = ''; + document.getElementById('footer').innerHTML = "
You are |---| close to being done."; + YAHOO.util.Event.addListener("submit", "click", this.submit); + YAHOO.util.Event.addListener("testSubmit", "click", this.tsubmit); + } + + + this.tsubmit = function(){ +// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); +var t = document.getElementById('surveyTest'); +// Survey.Comm.callServer('','submitQuestions',document.getElementById('surveyTest')); + Survey.Comm.callServer('','submitQuestions','surveyTest'); + } + + this.submit = function(){ +// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); + Survey.Comm.callServer('','submitQuestions','surveyForm'); + } + + + + + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; +//console.log(scale); + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + var sliders = new Array(); + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, (scale*step)); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + sliders.push(s); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; +//console.log(s); + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + this.setValue(this.lastValue); + }else{ + this.lastValue = this.getValue(); +// alert("Setting "+this.input+" to "+this.getRealValue()); + document.getElementById(this.input).value = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + //console.log('showing '+objs[0].id); + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + } + b.set('checked',true); + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/administersurvey/comm.js b/www/extras/wobject/administersurvey/comm.js new file mode 100644 index 000000000..33dae620d --- /dev/null +++ b/www/extras/wobject/administersurvey/comm.js @@ -0,0 +1,64 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Comm= new function(){ + + + this.url = ''; + this.setUrl = function(u){this.url = u;} + + var request = function(sUrl,callback,postData,form, hasFile){ + if(form != undefined){ + if(hasFile){ + YAHOO.util.Connect.setForm(form,true); + //console.log('set file was true'); + }else{ + //console.log('set file was false'); + YAHOO.util.Connect.setForm(form); + } + //console.log('setForm was true'); + } + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + + + this.callback = { + upload:function(o){ + Survey.Comm.callServer('','loadQuestions'); + }, + success:function(o){ + var response = ''; + response = YAHOO.lang.JSON.parse(o.responseText); + if(response.type == 'displayquestions'){ + Survey.Form.displayQuestions(response); + }else if(response.type == 'forward'){ +//console.log("going to "+response.url); + location.href=response.url; + }else{ + alert("bad response"); + } + }, + failure: function(o){ + if(o.status == -1){ + alert("Last request timed out, please try again"); + }else{ + alert("Last request failed "+o.statusText); + } + }, + timeout: 15000 + }; + + this.callServer = function(data,functionName,form,hasFile){ + var postData; + if(form == undefined){ + postData = "data="+YAHOO.lang.JSON.stringify(data,data); + //console.log(postData); + } + var sUrl = this.url + "?func="+functionName; + request(sUrl,this.callback,postData,form,hasFile); + } + + + +}(); diff --git a/www/extras/wobject/bg-fader.gif b/www/extras/wobject/bg-fader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7db8eb72ce5849c507d61c2bc0dd4f02f51f8178 GIT binary patch literal 433 zcmV;i0Z#r$Nk%w1VbK5_0J8`H>+9?F_4VQ5;mOI#r>CchiHWzjx7XL#|Ns9000000 z00000000000000000000A^8LW000O8EC2ui0MP&(000F45Xniay*TU5yZ>M)j$~<` zXsWJk>%MR-&%s!WcbJ3w*L%NCkTcvAHN(S5DPo44Am~Txp?0hs>_)4>ax-5{_%gPX zD`!f2vX-dFX%FDt8WCzgE z($mz{*4NnC+S}aS-rwNi*#c(b=I7|?>g(*=M3r#X%8geqYc2CJSxX%)4VR9919 bafuyEwyfE+Xw#})%eJlCw{YW@hyVaP!M@qB literal 0 HcmV?d00001 diff --git a/www/extras/wobject/dd.js b/www/extras/wobject/dd.js new file mode 100644 index 000000000..86559ebba --- /dev/null +++ b/www/extras/wobject/dd.js @@ -0,0 +1,125 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; +var DDM = YAHOO.util.DragDropMgr; + +Survey.DDList = function(id, sGroup, config) { + + Survey.DDList.superclass.constructor.call(this, id, sGroup, config); + + this.logger = this.logger || YAHOO; + var el = this.getDragEl(); + Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent + + this.goingUp = false; + this.lastY = 0; +}; + +YAHOO.extend(Survey.DDList, YAHOO.util.DDProxy, { + + startDrag: function(x, y) { + this.logger.log(this.id + " startDrag"); + + // make the proxy look like the source element + var dragEl = this.getDragEl(); + var clickEl = this.getEl(); + Dom.setStyle(clickEl, "visibility", "hidden"); + + dragEl.innerHTML = clickEl.innerHTML; + + Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color")); + Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor")); + Dom.setStyle(dragEl, "border", "2px solid gray"); + }, + + endDrag: function(e) { + + var srcEl = this.getEl(); + var proxy = this.getDragEl(); + + // Show the proxy element and animate it to the src element's location + Dom.setStyle(proxy, "visibility", ""); + var a = new YAHOO.util.Motion( + proxy, { + points: { + to: Dom.getXY(srcEl) + } + }, + 0.2, + YAHOO.util.Easing.easeOut + ) + var proxyid = proxy.id; + var thisid = this.id; + + // Hide the proxy and show the source element when finished with the animation + a.onComplete.subscribe(function() { + Dom.setStyle(proxyid, "visibility", "hidden"); + Dom.setStyle(thisid, "visibility", ""); + }); + a.animate(); + }, + + onDragDrop: function(e, id) { + + // If there is one drop interaction, the li was dropped either on the list, + // or it was dropped on the current location of the source element. + if (DDM.interactionInfo.drop.length === 1) { + + // The position of the cursor at the time of the drop (YAHOO.util.Point) + var pt = DDM.interactionInfo.point; + + // The region occupied by the source element at the time of the drop + var region = DDM.interactionInfo.sourceRegion; + + // Check to see if we are over the source element's location. We will + // append to the bottom of the list once we are sure it was a drop in + // the negative space (the area of the list without any list items) + if (!region.intersect(pt)) { + var destEl = Dom.get(id); + var destDD = DDM.getDDById(id); + destEl.appendChild(this.getEl()); + destDD.isEmpty = false; + DDM.refreshCache(); + } + + } + Survey.Data.dragDrop(this.getEl()); + }, + + onDrag: function(e) { + + // Keep track of the direction of the drag for use during onDragOver + var y = Event.getPageY(e); + + if (y < this.lastY) { + this.goingUp = true; + } else if (y > this.lastY) { + this.goingUp = false; + } + + this.lastY = y; + }, + + onDragOver: function(e, id) { + + var srcEl = this.getEl(); + var destEl = Dom.get(id); + + // We are only concerned with list items, we ignore the dragover + // notifications for the list. + if (destEl.nodeName.toLowerCase() == "li") { + var orig_p = srcEl.parentNode; + var p = destEl.parentNode; + + if (this.goingUp) { + p.insertBefore(srcEl, destEl); // insert above + } else { + p.insertBefore(srcEl, destEl.nextSibling); // insert below + } + + DDM.refreshCache(); + } + } +}); diff --git a/www/extras/wobject/editsurvey.js b/www/extras/wobject/editsurvey.js new file mode 100644 index 000000000..788ef12e5 --- /dev/null +++ b/www/extras/wobject/editsurvey.js @@ -0,0 +1,232 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Data = new function(){ + var lastDataSet = {}; + var focus; + + + this.dragDrop = function(did){ + var type; + + if(did.className.match("section")){type = 'section';} + else if(did.className.match("question")){type = 'question';} + else{ type = 'answer';} + + var first = {id:did.id,type:type}; + var before = document.getElementById(did.id).previousSibling; + + while(1){ + if( before == undefined || (before.id != undefined && before.id != '') ){ + break; + } + var before = before.previousSibling; + } + + var data = {id:'',type:''}; + + if(before != undefined && before.id != undefined && before.id != ''){ + if(before.className.match("section")){type = 'section';} + else if(before.className.match("question")){type = 'question';} + else{ type = 'answer';} + data = {id:before.id,type:type}; + } + + Survey.Comm.dragDrop(first,data); + } + + + + this.clicked = function(){ + Survey.Comm.loadSurvey(this.id); + } + + + + this.loadData = function(d){ + focus = d.focus;//What is the current highlighted item. + var lastType = '';//What was the last type created. + var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. + var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down + document.getElementById('sections').innerHTML=''; + var scount = 1; + var qcount = 1; + var acount = 1; + for(var x in d.data){ + //Now check to see if this is where an add button goes. + //Add addAnswer when we go from answer to question or section or end + //Add addQuestion when we go from question to section or end + + if(lastType == 'answer' && d.data[x].type == 'question'){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer'] = 1; + acount = 1; + } + else if(lastType == 'answer' && d.data[x].type == 'section'){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer'] = 1; + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(lastType == 'question' && d.data[x].type == 'section'){ + if(!buttons['answer']){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer']=1; + } + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(d.data[x].type != 'answer' && lastType == 'question' && lastId['section'] + '||||'+ lastId['question'] == focus){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer']=1; + acount = 1; + qcount = 1; + } + + var node = document.createElement('li'); + if(focus != undefined && focus.indexOf(d.data[x].id) > -1){ + node.className = "s"+d.data[x].type; + }else{ + node.className = d.data[x].type; + } + if(d.data[x].text == undefined){//== 'null'){ + d.data[x].text = ''; + } + var id = ''; + var delim = "||||"; + var pre; + if(d.data[x].type == 'section'){ + pre = 'S'+ scount++ +':'; + id = d.data[x].id; + } + else if(d.data[x].type == 'question'){ + pre = 'Q'+ qcount++ +':'; + id = lastId['section'] + delim + d.data[x].id; + } + else if(d.data[x].type == 'answer'){ + if(d.data[x].recordedAnswers != null){ + } + pre = 'A'+ acount++ +':'; + id = lastId['section'] + delim + lastId['question'] + delim + d.data[x].id; + } + node.innerHTML = pre + ' ' + d.data[x].text; + node.id = id; + new Survey.DDList(node.id,"sections"); + document.getElementById('sections').appendChild(node); + YAHOO.util.Event.addListener(id, "click", this.clicked); + + lastType = d.data[x].type; + lastId[d.data[x].type] = d.data[x].id; + } + if(lastType == 'answer' && ! buttons['answer']){ + this.addAnswerButton(lastId['section'],lastId['question']); + this.addQuestionButton(lastId['section']); + } + if(lastType == 'question' && ! buttons['question']){ + this.addAnswerButton(lastId['section'],lastId['question']); + } + if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ + this.addQuestionButton(lastId['section']); + } + + this.addSectionButton(); + + this.loadObjectEdit(d.edit); + lastDataSet = d; + } + + + this.addSection = function(){ + Survey.Comm.newSection(); + } + + + this.addQuestion = function(e,sid){ + Survey.Comm.newQuestion(sid); + } + + this.addAnswer = function(e,ids){ + Survey.Comm.newAnswer(ids[0],ids[1]); + } + + + this.addSectionButton = function(){ + var node = document.createElement('li'); + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); + button.on("click", this.addSection); + } + + + this.addQuestionButton = function(sid){ + var node = document.createElement('li'); + node.className = 'newQuestion'; + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); + button.on("click", this.addQuestion,sid); + } + + + this.addAnswerButton = function(sid,qid){ + var node = document.createElement('li'); + node.id = 'newAnswer'; + node.className = 'newAnswer'; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Answer", id:'addanswer', container:"newAnswer" }); + button.on("click", this.addAnswer,[sid,qid]); + } + + + this.loadObjectEdit = function(edit){ + if(edit){ + if(edit.type == "loadSection"){ + Survey.SectionTemplate.loadSection(edit.params); + } + else if(edit.type == "loadQuestion"){ + Survey.QuestionTemplate.loadQuestion(edit.params); + } + else if(edit.type == "loadAnswer"){ + Survey.AnswerTemplate.loadAnswer(edit.params); + } + } + } + + + this.loadLast = function(){ + this.loadData(lastDataSet); + } +}(); + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.util.DDTarget("sections","sections"); + Survey.Comm.loadSurvey(); + }, + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/editsurvey.js.backup b/www/extras/wobject/editsurvey.js.backup new file mode 100644 index 000000000..7a36bca33 --- /dev/null +++ b/www/extras/wobject/editsurvey.js.backup @@ -0,0 +1,988 @@ +// vim:ft=javascript + +//---------------------------------------------------------------- +// +// Initialize namespace +// +//---------------------------------------------------------------- + +(function() { +if (typeof WebGUI == "undefined") { + var WebGUI = {}; +} +var Survey = {}; + +//---------------------------------------------------------------- +// +// Global Params +// +//---------------------------------------------------------------- +var objects = new Array(); +objects[0] = undefined; +var slength = 1; + +//---------------------------------------------------------------- +// +// List Super Object +// +//---------------------------------------------------------------- +//function listObject(type){ +Survey.listObject = function(type){ + var loType = type; + this.dom; + this.toggleOn = function(){ + if(loType == 'section'){ + this.dom.className="sselected"; + }else if(loType == 'question'){ + this.dom.className="qselected"; + } + } + this.toggleOff = function(){ + this.dom.className=loType; + } + this.getType = function(){return loType;} +} + + +//---------------------------------------------------------------- +// +// Section definition +// +//---------------------------------------------------------------- +//function section(text,s,randomize){ +Survey.Section = function(text,s,randomize){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("section"); + + var sectionUL = document.getElementById('sections'); + + this.text = text; + this.sId = "S"+(slength++); + this.id = s.toString(); + this.randomize = randomize; + this.questions = new Array(); + this.dd; + this.ddt; + this.addThyself = function(){ + if(this.dom != undefined){alert("dom already defined");return} + this.dom = document.createElement('li'); + this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects + this.updateHTML(); + // this.className = this.getType(); + + var holder = document.createElement('ul'); + holder.className = "questionList"; + holder.id = this.id + "QL"; + holder.innerHTML = "
  • "; + + + var pli = document.createElement('li');//parent li, containter to hold section li and question ul. + pli.id = this.id+"div"; + pli.className = this.getType(); + sectionUL.appendChild(pli); + pli.appendChild(this.dom); + pli.appendChild(holder); + + this.ddt = new YAHOO.util.DDTarget(this.id+"QL","questions"); + + this.dd = new WebGUI.DDList(this.id+"div","sections"); + this.dd.isTarget = false; + this.dd.addToGroup("trashcan"); + this.dd.setHandleElId(this.id); + + YAHOO.util.Event.addListener(this.id, "click", WebGUI.SectionHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.sId+"]"+ " " + this.text.substr(0,25) + " ..."; + } + this.updateLoc = function(loc){ + this.sId = "S"+loc; + this.updateHTML(); + } + this.removeQuestion = function(id){ + for(var i = 0; i <= this.questions.length; i++){ + if(this.questions[i] == id){ + this.questions.splice(i,1); + break; + } + } + } + this.addThyself(); + + this.noDrag = function(){ + this.dd.lock(); + }, + + this.removeThyself = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id, "click"); + this.dd.setHandleElId(undefined); + this.dd.unreg(); + this.dd = undefined; + var p = this.dom.parentNode; + p.removeChild(this.dom.nextSibling); + p.removeChild(this.dom); + p.parentNode.removeChild(p); + this.dom = undefined; + } + + this.showThyself = function(){ + document.getElementById("sid").innerHTML = this.sId; + document.getElementById("sectioninputtext").value = this.text; + var menu = WebGUI.Menu.getsMenu(); + menu.getItem(0).cfg.setProperty("checked",this.randomize); + } + this.update = function(text,randomize){ + this.text = text; + this.randomize = randomize; + this.updateHTML(); + } + this.DESTROY = function(){ + for(var q in this.questions){ + objects[this.questions[q]].DESTROY(); + } + this.removeThyself(); + slength--; + objects[this.id] = undefined; + WebGUI.Menu.newS(); + } +} +//Notes, use previousSibling,nextSibling to get ids of siblings, and insertBefore or appendChild to add elements. +WebGUI.SectionHandler = function(){ + return{ + clicked: function() {//new section event button, prompts the new section menu + WebGUI.DM.showThis(this.id); + } + } +}(); + + + +//---------------------------------------------------------------- +// +// Answer definition +// +//---------------------------------------------------------------- +Survey.Answer = function(id,qid){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("answer"); + this.avalues = [{'atext':"",'ameta':""}]; //array of associative arrays. Array maps to answer types. associate arrays map to all possible responses + this.qId = qid; + this.id = id; + this.aId = "A"+objects[this.qId].answers.length; + var answerUL = document.getElementById("answers"); + objects[this.qId].answers[objects[this.qId].answers.length] = this.id; + this.addThyself = function(){ + if(this.dom != undefined){alert("dom already defined");return} + this.dom = document.createElement('li'); + this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects + this.dom.className = this.getType(); + this.updateHTML(); + answerUL.appendChild(this.dom); + this.dd = new WebGUI.DDList(this.id.toString(),"answers"); + this.dd.addToGroup("trashcan"); + YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.AnswerHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.aId+"]"; + } + this.showThyself = function(){ + document.getElementById('asid').innerHTML = objects[this.sId].sId; + document.getElementById('aqid').innerHTML = objects[this.qId].qId; + document.getElementById('aid').innerHTML = this.aId; + } + this.hide = function(){ + } + this.show = function(){ + } + this.DESTROY = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id, "click"); + this.dom.parentNode.removeChild(this.dom); + this.dom = undefined; + this.dd.unreg(); + objects[this.id] = undefined; + } +} +WebGUI.AnswerHandler = function(){ + return{ + clicked: function() {//new section event button, prompts the new section menu +alert('click'); +// WebGUI.DM.showThis(this.id); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Question definition +// +//---------------------------------------------------------------- +//function question(qid,type,typeName,text,options,toptions,sid){ +Survey.Question = function(qid,type,typeName,text,options,toptions,sid){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("question"); + this.type = type; //index to the qMenu YUI menu containing this question type + this.typeName = typeName; + this.text = text; //Question text + this.id = qid; + this.sId = sid; //Section parent node id attribute + objects[sid].questions[objects[sid].questions.length] = qid; + this.qId = "Q"+ objects[this.sId].questions.length //Nodes id attribute + this.options = options; //indexes to the oMenu YUI menu + this.textOptions = toptions; //strings indexed by the ids of the option input fields + this.answers = new Array(); + this.answersRef = new Array(); //2D array of [qid][aid] which point at this qid. Used for updating answers when this question is reordered/deleted + + var questionUL = document.getElementById(this.sId.toString()+"QL"); + + this.loc; + + this.addThyself = function(){ + this.dom = document.createElement('li'); //reference to this questions dom object + this.dom.className = this.getType(); + this.dom.id = this.id.toString(); + this.updateHTML(); + questionUL.appendChild(this.dom); + this.dd = new WebGUI.DDList(this.id.toString(),"questions"); + this.dd.addToGroup("trashcan"); + YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.QuestionHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.qId+ " "+ this.typeName+"] " + this.text.substr(0,25) + " ..."; + } + this.addThyself(); + + this.index = function(){ + var t = this.qId.split("-"); + return (t[1].slice(1)-1); + } + + this.removeThyself = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id.toString(), "click"); + this.dom.parentNode.removeChild(this.dom); + this.dom = undefined; + this.dd.unreg(); + objects[this.sId].removeQuestion(this.id); + } + this.showThyself = function(){ + document.getElementById("qid").innerHTML = this.qId; + document.getElementById("qsid").innerHTML = objects[this.sId].sId; + document.getElementById("questioninputtext").value = this.text; + WebGUI.Menu.clearMenus(); + var menu = WebGUI.Menu.getqMenu(); + menu.getItem(this.type).cfg.setProperty("checked",true); + //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); + WebGUI.Menu.loadOMenu(this.type); + var oMenu = WebGUI.Menu.getoMenu(); + for(var i in this.options){ + oMenu.getItem(this.options[i]).cfg.setProperty("checked",true); + } + try{ + document.getElementById('max').value = q['max']; + }catch(e){} + try{ + document.getElementById('min').value = q['min']; + }catch(e){} + try{ + document.getElementById('step').value = q['step']; + }catch(e){} + + } + this.update = function(type, typeName,text,options,toptions){ + this.type=type; + this.typeName = typeName; + this.text = text; + this.options = options; + this.textOptions = toptions; + this.updateHTML(); + } + this.updateLoc = function(sid,loc){ + this.sId = sid; + this.qId = "Q"+loc; + this.updateHTML(); + } + this.DESTROY = function(){ + //remove event handler, dom, answerRefs, question, and answers + for(var i in this.answers){ + this.answers[i].DESTROY(); + } + for(var i in this.answersRef){ + this.answersRef[i].unlink(); + } + this.removeThyself(); + objects[this.id] = undefined; + WebGUI.Menu.newQ(); + } +} +WebGUI.QuestionHandler = function(){ + return{ + clicked: function() {//new question event button, prompts the new question menu + WebGUI.DM.showThis(this.id); + } + } +}(); + + +//---------------------------------------------------------------- +// +// Display Manager +// +//---------------------------------------------------------------- +WebGUI.DM = function(){ + var lastObject;//Current Question + return{ + updateSectionDOMLists: function(){ + //Loop through sections ul then answer ul and make sure everything is in the right place. + var q = document.getElementById('sections'); + var loc = 1; + var tsections = new Array(); + var start = q.firstChild;//the li which contains the a ul which contains the current section li and + while(start){ + var section = start.firstChild.id; + start = start.nextSibling; + objects[section].updateLoc(loc++); + objects[section].questions = new Array(); + this.updateQuestionDOMList(section,section+"QL"); + } + + }, + updateQuestionDOMList: function(sid, parent){ + var q = document.getElementById(parent); + var start = q.firstChild; + var loc = 1; + while(start){ + var section = start.id; + if(! start.id){ + start = start.nextSibling; + continue; + } + start = start.nextSibling; + objects[section].updateLoc(sid,loc++); + objects[sid].questions[objects[sid].questions.length] = section; + } + }, + + updateAnswerDOMLists: function(){ + }, + showThis: function(Id) { + this.clearLast(); + lastObject = Id; + try{ + objects[lastObject].toggleOn(); + WebGUI.Menu.sselected(lastObject); + WebGUI.Menu.showEditSection(); + }catch(e){} + try{ + objects[objects[lastObject].sId].toggleOn(); + WebGUI.Menu.sselected(objects[objects[lastObject].sId].id); + WebGUI.Menu.qselected(lastObject); + WebGUI.Menu.showEditQuestion(); + }catch(e){} + try{ + objects[objects[objects[lastObject].qId].sId].toggleOn(); + WebGUI.Menu.sselected(objects[objects[objects[lastObject].qId].sId].id); + WebGUI.Menu.qselected(objects[objects[lastObject].qId].id); + WebGUI.Menu.aselected(lastObject); + WebGUI.Menu.showEditAnswer(); + }catch(e){} + objects[lastObject].showThyself(); + }, + clearLast: function(){ + try{ + objects[lastObject].toggleOff(); + }catch(e){} + try{ + objects[objects[lastObject].sId].toggleOff(); + }catch(e){} + try{ + objects[objects[objects[lastObject].qId].sId].toggleOff(); + }catch(e){} + lastObject = undefined; + WebGUI.Menu.sselected(undefined); + WebGUI.Menu.qselected(undefined); + WebGUI.Menu.aselected(undefined); + }, + getLastSection: function(){ + var q = document.getElementById('sections'); + try{ + return (parseInt(q.lastChild.firstChild.id))//the li which contains the a ul which contains the current section li and + }catch(e){} + } + } +}(); + +//---------------------------------------------------------------- +// +// Menu definition +// +//---------------------------------------------------------------- +WebGUI.Menu = function(){ + var qMenu = new YAHOO.widget.Menu("qmenu",{position: "static", hidedelay: 750, lazyload: true}); + var oMenu = new YAHOO.widget.Menu("omenu",{position: "static", hidedelay: 750, lazyload: true}); + var sMenu = new YAHOO.widget.Menu("smenu",{position: "static", hidedelay: 750, lazyload: true}); + var aMenu = new YAHOO.widget.Menu("amenu",{position: "static", hidedelay: 750, lazyload: true}); + + var last = -1;//Last qMenu option selected, keep track so we can unselect on next click + var qselected = 0;//Currently selected qMenu item. + var sselected = 'S1'; + + return{ + sselected: function(i){ sselected = i; }, + qselected: function(i){ qselected = i; }, + aselected: function(i){ aselected = i; }, + + init: function() { + document.getElementById("questiontext").innerHTML=""; + WebGUI.Menu.clearMenus(); + qMenu.subscribe("click", this.qTypeClick); + oMenu.subscribe("click", this.oTypeClick); + + sMenu.addItems([ "Randomly Ordered" ] ); + sMenu.render("sectionmenu"); + sMenu.subscribe("click", this.sTypeClick); + + document.getElementById("qsubmitbutton").style.display="none"; + WebGUI.Menu.showEditSection(); + new YAHOO.widget.Button({ type: "button", label: "Submit Question", container: "qsubmitbutton", + onclick: {fn: WebGUI.Menu.addQ} }); + new YAHOO.widget.Button({ type: "button", label: "Submit Section", container: "ssubmitbutton", + onclick: {fn: WebGUI.Menu.addS} }); + new YAHOO.widget.Button({ type: "button", label: "Submit Answer", container: "asubmitbutton", + onclick: {fn: WebGUI.Menu.addA} }); + + }, + + getsMenu: function(){ return sMenu; }, + getqMenu: function(){ return qMenu; }, + getoMenu: function(){ return oMenu; }, + getaMenu: function(){ return aMenu; }, + + addQ: function() { + // var id = document.getElementById("qid").innerHTML; + var text = document.getElementById('questioninputtext').value; + var options = new Array(); + + var qindex; + var qtype; + var temp = qMenu.getItems(); + for(var i in temp){ + if(temp[i].cfg.getProperty("checked")){ + qtype = temp[i].value; + qindex = temp[i].index; + } + } + temp = oMenu.getItems(); + for(var i in temp){ + if(temp[i].cfg.getProperty("checked")){ + options[options.length] = temp[i].index; + } + } + var toptions = new Array(); + var sid = sselected; + + try{toptions['max'] = document.getElementById('max').value;}catch(err){} + try{toptions['min'] = document.getElementById('min').value;}catch(err){} + try{toptions['step'] = document.getElementById('step').value;}catch(err){} + + if(qselected != undefined){ + objects[qselected].update(qindex,qtype,text,options,toptions); + }else{ + objects[objects.length] = new Survey.Question(objects.length,qindex,qtype,text,options,toptions,sselected); + } + WebGUI.Menu.newQ(); + }, + addS: function(){ + var id; + if(sselected){ + id = sselected; + }else{ + id = objects.length; + } + var text = document.getElementById('sectioninputtext').value; + var checked = sMenu.getItem(0).cfg.getProperty("checked"); + if(objects[id] != undefined){//editing an existing section which knows how to update itself + objects[id].update(text,checked); + }else{ + objects[id] = new Survey.Section(text,id,checked); + } + WebGUI.Menu.newS(); + }, + addA: function(){ + var qtype = objects[qselected].type; + var id; + if(aselected){ + id = sselected; + }else{ + id = objects.length; + } + if(objects[id] == undefined){//editing an existing answer which knows how to update itself + objects[id] = new Survey.Answer(id,qselected) + } + for(var q in objects[id].avalues[qtype]){ + objects[id].avalues[qtype][q] = document.getElementById(q).value; + } + objects[id].addThyself(); + WebGUI.Menu.newA(); + }, + + newS: function() {//new section event button, prompts the new section menu + sselected = undefined; + qselected = undefined; + aselected = undefined; + WebGUI.DM.clearLast(); + WebGUI.Menu.showEditSection(); + document.getElementById('sectioninputtext').value = ''; + document.getElementById('sid').innerHTML = "S"+(slength); + sMenu.getItem(0).cfg.setProperty("checked",false); + }, + + newA: function() { + aselected = undefined; + if(!sselected){ + sselected = WebGUI.DM.getLastSection(); + } + if(!qselected){ + qselected = objects[sselected].questions[objects[sselected].questions.length-1]; + } + if(!qselected){ + alert("At least one question must be selected to add an answer."); + return; + } + document.getElementById('asid').innerHTML = objects[sselected].sId; + document.getElementById('aqid').innerHTML = objects[qselected].qId; + document.getElementById('aid').innerHTML = "A"+(objects[qselected].answers.length + 1); + WebGUI.DM.showThis(qselected); + WebGUI.Menu.showEditAnswer(); + WebGUI.Menu.clearOMenus(); + var input = document.getElementById("answerinput"); + input.innerHTML=""; + var qtype = objects[qselected].type; + if(qtype == 0){//multiple choice + input.innerHTML = "Please enter the text:
    "+ + "Please enter the meta tag: "; + }else if(qtype == 1){//Text + alert("Answers can not be added to a text type"); + WebGUI.Menu.newQ(); + }else if(qtype == 2){//Slider + }else if(qtype == 3){//Date + }else if(qtype == 4){//True/False + } + }, + newQ: function() { + qselected = undefined; + aselected = undefined; + if(!sselected){ + sselected = WebGUI.DM.getLastSection(); + } + if(!sselected){ + alert("At least one section must be selected to add an answer."); + return; + } + WebGUI.DM.showThis(sselected); + WebGUI.Menu.showEditQuestion(); + WebGUI.Menu.clearMenus(); + document.getElementById('qsid').innerHTML = objects[sselected].sId; + var nextQ = objects[sselected].questions.length; + document.getElementById('qid').innerHTML = "Q"+ (nextQ + 1); + document.getElementById("questioninputtext").value = ""; + WebGUI.Menu.loadOMenu(0); + }, + clearOMenus: function(){ + aMenu.clearContent(); + }, + + clearMenus: function() { + qMenu.clearContent(); + qMenu.addItems([ + {text: "Multiple Choice",value: "Multiple Choice"}, + {text: "Text",value: "Text"}, + {text: "Slider",value: "Slider"}, + {text: "Date",value: "Date"}, + {text: "True/False",value: "True/False"}, + ] ); + qMenu.render("questionmenu"); + oMenu.clearContent(); + document.getElementById("qsubmitbutton").style.display="none"; + document.getElementById("qoptionmenu").style.display="none"; + }, + + + loadQ: function(e) { + WebGUI.Menu.clearMenus(); + var q = questions[ this.id.slice(1) - 1 ]; + document.getElementById('qid').innerHTML = "Q"+q['id']+":"; + document.getElementById('questioninputtext').value = q['text']; + qMenu.getItem(q['type']).cfg.setProperty("checked"); + //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); + WebGUI.Menu.loadOMenu(qMenu.getItem(q['type']).index); + for(var i in q['moptions']){ + oMenu.getItem(q['moptions'][i]).cfg.setProperty("checked",true); + } + try{ + document.getElementById('max').value = q['max']; + }catch(e){} + try{ + document.getElementById('min').value = q['min']; + }catch(e){} + try{ + document.getElementById('step').value = q['step']; + }catch(e){} + }, + + showEditQuestion: function() { + document.getElementById("editquestion").style.display="inline"; + document.getElementById("editanswer").style.display="none"; + document.getElementById("editsection").style.display="none"; + }, + showEditAnswer: function() { + document.getElementById("editquestion").style.display="none"; + document.getElementById("editanswer").style.display="inline"; + document.getElementById("editsection").style.display="none"; + }, + showEditSection: function() { + document.getElementById("editquestion").style.display="none"; + document.getElementById("editanswer").style.display="none"; + document.getElementById("editsection").style.display="inline"; + }, + + sTypeClick: function(p_sType, p_aArgs, p_oValue) { + if(p_aArgs[1].cfg.getProperty("checked")){ + p_aArgs[1].cfg.setProperty("checked", false); + }else{ + p_aArgs[1].cfg.setProperty("checked", true); + } + + }, + + oTypeClick: function(p_sType, p_aArgs, p_oValue) { + var checked = p_aArgs[1].cfg.getProperty("checked"); + var index = p_aArgs[1].index; + if(qselected == 1 && index >= 0 && index < 4){ + for(var i=0; i<=3; i++){ + oMenu.getItem(i).cfg.setProperty("checked",false); + } + p_aArgs[1].cfg.setProperty("checked",checked); + } + else if(qselected == 4 && index >= 0 && index <= 1){ + for(var i=0; i<=1; i++){ + oMenu.getItem(i).cfg.setProperty("checked",false); + } + p_aArgs[1].cfg.setProperty("checked",checked); + } + + if(p_aArgs[1].cfg.getProperty("checked")){ + p_aArgs[1].cfg.setProperty("checked", false); + }else{ + p_aArgs[1].cfg.setProperty("checked", true); + } + if(qselected == 0 && index == 1 && p_aArgs[1].cfg.getProperty("checked") == false){ + document.getElementById('max').value = 1; + } + }, + + validateMultipleMax: function(){ + var v = this.value; + if (v != parseInt(v) || v < 1){ + this.value = 1; + } + }, + + qTypeClick: function(p_sType, p_aArgs, p_oValue) { + var index = p_aArgs[1].index; + + WebGUI.Menu.showEditQuestion(); + + WebGUI.Menu.loadOMenu(index); + }, + + loadOMenu: function(index) { + + if(last > -1){ + qMenu.getItem(last).cfg.setProperty("checked",false); + } + qMenu.getItem(index).cfg.setProperty("checked",true); + last = index; + + oMenu.clearContent(); + + document.getElementById("qsubmitbutton").style.display="inline"; + document.getElementById("qoptionmenu").style.display="inline"; + document.getElementById("textoptions").innerHTML=""; + + var temp = document.createElement("div"); + + if(index == 0){//Multipe choice options + try{ + YAHOO.util.Event.removeListener("max", "click"); + }catch(e){} + YAHOO.util.Event.addListener("max", "blur", WebGUI.Menu.validateMultipleMax); + temp.innerHTML = "Max Answers:
    "; + oMenu.addItems([ + "Randomize", + "Horizontal display", + "Multiple Answers", + "Comment Box", + ] ); + } + else if(index == 1){//Text options + temp.innerHTML = "Max length
    "; + oMenu.addItems([ + "Multi-Line", + "Numerical", + "Phone Number", + "Currency Amount", + ] ); + } + else if(index == 2){//Slider options + temp.innerHTML = "Start Value:
    End Value:
    Step Value:
    "; + } + else if(index == 3){//Date options + oMenu.addItems([ + "Range", + ] ); + } + else if(index == 4){//True/False options + oMenu.addItems([ + "Yes/No", + "Male/Female", + ] ); + } + document.getElementById("textoptions").appendChild(temp); + oMenu.addItems(["Optional"]); + oMenu.render("qoptionmenu"); + }, + + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +WebGUI.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.widget.Button({ type: "button", label: "New Question", container: "addqbutton", + onclick: {fn: WebGUI.Menu.newQ} }); + new YAHOO.widget.Button({ type: "button", label: "New Answer", container: "addabutton", + onclick: {fn: WebGUI.Menu.newA} }); + new YAHOO.widget.Button({ type: "button", label: "New Section", container: "addsbutton", + onclick: {fn: WebGUI.Menu.newS} }); + + WebGUI.Menu.init(); + + document.getElementById("editanswer").style.display="none"; + objects[objects.length] = new Survey.Section("First Section",objects.length,false); + WebGUI.DM.showThis(objects.length-1); + WebGUI.Menu.newQ(); + }, + } +}(); + +WebGUI.OnLoad.init(); + + + +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; +var DDM = YAHOO.util.DragDropMgr; + +////////////////////////////////////////////////////////////////////////////// +// example app +////////////////////////////////////////////////////////////////////////////// +//YAHOO.example.DDApp = { +WebGUI.DD = { + init: function() { + + new YAHOO.util.DDTarget("sections","sections"); + new YAHOO.util.DDTarget("answers","answers"); + new YAHOO.util.DDTarget("trashcan","trashcan"); + + Event.on("showButton", "click", this.showOrder); + Event.on("switchButton", "click", this.switchStyles); + }, + + showOrder: function() { + var parseList = function(ul, title) { + var items = ul.getElementsByTagName("li"); + var out = title + ": "; + for (i=0;i this.lastY) { + this.goingUp = false; + } + + this.lastY = y; + }, + + onDragOver: function(e, id) { + + var srcEl = this.getEl(); + var destEl = Dom.get(id); + + // We are only concerned with list items, we ignore the dragover + // notifications for the list. + document.getElementById('log1').innerHTML = srcEl.className; + document.getElementById('log2').innerHTML = destEl.className; + document.getElementById('log').innerHTML = destEl.nodeName; + + if ( destEl.nodeName.toLowerCase() == "li" ) + { + //destEl.className == "questionList" || destEl.className == "question" || destEl.className == "qselected") + var orig_p = srcEl.parentNode; + var p = destEl.parentNode; + + if (this.goingUp) { + p.insertBefore(srcEl, destEl); // insert above + } else { + p.insertBefore(srcEl, destEl.nextSibling); // insert below + } + + DDM.refreshCache(); + } + } +}); + +//Event.onDOMReady(YAHOO.example.DDApp.init, YAHOO.example.DDApp, true); +Event.onDOMReady(WebGUI.DD.init, WebGUI.DD, true); + +})(); + diff --git a/www/extras/wobject/editsurvey.js.backup.newer b/www/extras/wobject/editsurvey.js.backup.newer new file mode 100644 index 000000000..78fc93177 --- /dev/null +++ b/www/extras/wobject/editsurvey.js.backup.newer @@ -0,0 +1,337 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Data = new function(){ + var lastDataSet = {}; + var focus; + + this.dragDrop = function(did){ + var type; + + if(did.className.match("section")){type = 'section';} + else if(did.className.match("question")){type = 'question';} + else{ type = 'answer';} + + var first = {id:did.id,type:type}; + var before = document.getElementById(did.id).previousSibling; + + while(1){ + if( before == undefined || (before.id != undefined && before.id != '') ){ + break; + } + var before = before.previousSibling; + } + + var data = {id:'',type:''}; + + if(before != undefined && before.id != undefined && before.id != ''){ + if(before.className.match("section")){type = 'section';} + else if(before.className.match("question")){type = 'question';} + else{ type = 'answer';} + data = {id:before.id,type:type}; + } + + Survey.Comm.dragDrop(first,data); + } + + + + this.clicked = function(){ + Survey.Comm.loadSurvey(this.id); + } + + + + this.loadData = function(d){ + focus = d.focus;//What is the current highlighted item. + var lastType = '';//What was the last type created. + var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. + var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down + document.getElementById('sections').innerHTML=''; + + for(var x in d.data){ + //Now check to see if this is where an add button goes. + //Add addAnswer when we go from answer to question or section or end + //Add addQuestion when we go from question to section or end + + if(lastType == 'answer' && (d.data[x].type == 'question' || d.data[x].type == 'section')){ + this.addAnswerButton(lastId['question']); + buttons['answer'] = 1; + } + else if(lastType == 'question' && d.data[x].type == 'section'){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + } + else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + } + + var node = document.createElement('li'); + + if(d.data[x].id == focus){ + node.className = "s"+d.data[x].type; + }else{ + node.className = d.data[x].type; + } + + node.innerHTML = d.data[x].text; + node.id = d.data[x].id; + new Survey.DDList(node.id,"sections"); + document.getElementById('sections').appendChild(node); + YAHOO.util.Event.addListener(d.data[x].id, "click", this.clicked); + + lastType = d.data[x].type; + lastId[d.data[x].type] = d.data[x].id; + } + if(lastType == 'answer' && ! buttons['answer']){ + this.addAnswerButton(lastId['question']); + this.addQuestionButton(lastId['section']); + }else if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ + this.addQuestionButton(lastId['section']); + } + + this.addSectionButton(); + + this.loadObjectEdit(d.edit); + lastDataSet = d; + } + + + this.addSection = function(){ + Survey.Comm.newSection(); + } + + + this.addQuestion = function(e,sid){ + Survey.Comm.newQuestion(sid); + } + + + this.addSectionButton = function(){ + var node = document.createElement('li'); + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); + button.on("click", this.addSection); + } + + + this.addQuestionButton = function(qid){ + var node = document.createElement('li'); + node.className = 'newQuestion'; + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); + button.on("click", this.addQuestion,qid); + } + + + this.addAnswerButton = function(aid){ + var node = document.createElement('li'); + node.id = 'newAnswer'; + node.className = 'newAnswer'; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Answer", id:aid, container:"newAnswer" }); + button.on("click", this.addAnswer); + } + + + this.loadObjectEdit = function(edit){ + if(edit){ +console.log('was an edit'+edit.type); + if(edit.type == "loadSection"){ +console.log('loadsection'); + Survey.SectionTemplate.loadSection(edit.params); + } + else if(edit.type == "loadQuestion"){ +console.log('loadquestion'); + Survey.QuestionTemplate.loadQuestion(edit.params); + } + else if(edit.type == "loadAnswer"){ + Survey.AnswerTemplate.loadAnswer(edit.params); + } + } + } + + + this.loadLast = function(){ + this.loadData(lastDataSet); + } +}(); + + +//--------------------------------------------- + + +/*Survey.SectionTemplate = new function(){ + this.qpp; + this.randomizeQuestions; + this.questionsOnSectionPage; + + this.returnData = function(){ + var data = {}; + data['type'] = "section"; + data["sectionText"] = document.getElementById('text').value; + data['sectionName'] = document.getElementById('sectionName').value; + data['questionsPerPage'] = this.qpp.get('label'); + data['randomizeQuestions'] = this.randomizeQuestions.get('checkedButton').get('value'); + data['questionsOnSectionPage'] = this.questionsOnSectionPage.get('checkedButton').get('value'); + data['Survey_sectionId'] = document.getElementById('Survey_sectionId').value; + Survey.Comm.submitEdit(data); + return data; + } + this.qppClick = function(p_sType, p_aArgs, p_oItem) { + Survey.SectionTemplate.qpp.set("label", p_oItem.cfg.getProperty("text")); + } + this.loadSection = function(params){ + document.getElementById('edit').innerHTML = "\ +

    Section Number: "+params.sequenceNumber + "\ + \ +

    Section Name: \ +


    \ +

    Randomize Questions: \ +

    Question per Page: \ +

    Questions on Section Page: \ +


    \ +

    Section Text:

    \ +

    \ + "; + + this.randomizeQuestions = new YAHOO.widget.ButtonGroup({ + id: "randomizeQuestions", + name: "randomizeQuestions", + container: "randomQuestions" }); + + this.randomizeQuestions.addButtons([ + { label: "Yes", value: "1" }, + { label: "No", value: "0" } + ]); + + if(params['randomizeQuestions'] == 1){this.randomizeQuestions.check(0);} + else{this.randomizeQuestions.check(1);} + + var qppList = []; + + for(var i = 1; i <= 10; i++){ + qppList.push({ text: i.toString(), onclick: { fn: Survey.SectionTemplate.qppClick } }); + } + + this.qpp = new YAHOO.widget.Button({ + type: "menu", + label: "1", + name: "mymenubutton", + menu: qppList, + container: "questionsPerPage" }); + this.qpp.set("label", params['questionsPerPage']); + + + this.questionsOnSectionPage = new YAHOO.widget.ButtonGroup({ + id: "questionsOnSectionPage", + name: "questionsOnSectionpage", + container: "questionsOnSectionPage" }); + this.questionsOnSectionPage.addButtons([ + { label: "Yes", value: "1" }, + { label: "No", value: "0" } + ]); + if(params['questionsOnSectionPage'] == 1){this.questionsOnSectionPage.check(0);} + else{this.questionsOnSectionPage.check(1);} + } +}(); +*/ +/*Survey.QuestionTemplate = new function(){ + this.loadQuestion = function(params){ +for(var i in params){ + console.log(i+' '+params[i]); +} + document.getElementById('edit').innerHTML = "\ +

    Question Number: "+params.sequenceNumber + "\ + \ + \ + +

    Randomize Questions: \ +

    Question per Page: \ +

    Questions on Section Page: \ +


    \ +

    Section Text:

    \ +

    \ + "; + } +}(); +*/ +Survey.AnswerTemplate = new function(){ + this.loadAnswer = function(){ + } +}(); + + + +//---------------------------------------- + +Survey.Comm = new function(){ + + //p is a string that contains the id of the Survey that is of interest. To get Section 2 Question 3 Answer 4 pass '2-3-4'. + var request = function(sUrl,callback,postData){ + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + var callback = { + success:function(o){ + Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); + }, + failure: function(o){ + alert("Last request failed"); + Survey.Data.loadLast(); + }, + argument:["what","is","this","for"], + timeout: 1000 + }; + this.loadSurvey = function(p){ + var postData = "data="+p; + var sUrl = "?func=loadSurvey"; + request(sUrl,callback,postData); + } + this.dragDrop = function(target,before){ + var p = {}; + p['target'] = target; + p['before'] = before; + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=dragDrop"; + request(sUrl,callback,postData); + } + this.submitEdit = function(p){ + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=submitEdit"; + request(sUrl,callback,postData); + } + this.newSection = function(){ + var sUrl = "?func=newSection"; + request(sUrl,callback); + } + this.newQuestion = function(sid){ + var postData = "data="+sid; + var sUrl = "?func=newQuestion"; + request(sUrl,callback,postData); + } +}(); + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.util.DDTarget("sections","sections"); + Survey.Comm.loadSurvey(); + }, + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/editsurvey/answer.js b/www/extras/wobject/editsurvey/answer.js new file mode 100644 index 000000000..7db2d7910 --- /dev/null +++ b/www/extras/wobject/editsurvey/answer.js @@ -0,0 +1,67 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.AnswerTemplate = new function(){ + this.params; + this.loadAnswer = function(params){ + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +

    \ +
    Please enter answer information
    \ +
    \ +\ + \ +\ +

    Answer Number: "+params.sequenceNumber + "\ +\ + \ + \ + "; + html = html + "

    Answer Text:\n\n"; + html = html + "

    Recorded Answer\n\n"; + html = html + "

    Jump to Question:"; + html = html + "

    Is this the correct answer:\n" + + this.makeRadio('isCorrect',[{text:'Yes',value:1},{text:'No',value:0}],params.isCorrect); + html = html + "

    Min:"; + html = html + "

    Max:"; + html = html + "

    Step:"; + html = html + "

    Verbatim:\n" + + this.makeRadio('verbatim',[{text:'Yes',value:1},{text:'No',value:0}],params.verbatim); + document.getElementById('edit').innerHTML = html; + + var butts = [{ text:"Submit", handler:function(){this.submit();}, isDefault:true },{ text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_answerId != ''){ + butts[2] = { text:"Delete", handler:function(){Survey.Comm.deleteAnswer(Survey.AnswerTemplate.params.Survey_answerId);}}; + } + + var form = new YAHOO.widget.Dialog("answer", + { width : "300px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + }); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + this.params = params; + }; + + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } +}(); diff --git a/www/extras/wobject/editsurvey/comm.js b/www/extras/wobject/editsurvey/comm.js new file mode 100644 index 000000000..76f19cfcd --- /dev/null +++ b/www/extras/wobject/editsurvey/comm.js @@ -0,0 +1,67 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Comm = new function(){ + + var request = function(sUrl,callback,postData){ + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + this.callback = { + success:function(o){ + Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); + }, + failure: function(o){ + alert("Last request failed"); + Survey.Data.loadLast(); + }, + timeout: 1000 + }; + this.loadSurvey = function(p){ + var postData = "data="+p; + var sUrl = "?func=loadSurvey"; + request(sUrl,this.callback,postData); + } + this.dragDrop = function(target,before){ + var p = {}; + p['target'] = target; + p['before'] = before; + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=dragDrop"; + request(sUrl,this.callback,postData); + } + this.submitEdit = function(p){ + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=submitEdit"; + request(sUrl,this.callback,postData); + } + this.newSection = function(){ + var sUrl = "?func=newSection"; + request(sUrl,this.callback); + } + this.newQuestion = function(sid){ + var postData = "data="+sid; + var sUrl = "?func=newQuestion"; + request(sUrl,this.callback,postData); + } + this.newAnswer = function(sid,qid){ + var postData = "data="+YAHOO.lang.JSON.stringify([sid,qid]); + var sUrl = "?func=newAnswer"; + request(sUrl,this.callback,postData); + } + this.deleteAnswer = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteAnswer"; + request(sUrl,this.callback,postData); + } + this.deleteQuestion = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteQuestion"; + request(sUrl,this.callback,postData); + } + this.deleteSection = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteSection"; + request(sUrl,this.callback,postData); + } +}(); diff --git a/www/extras/wobject/editsurvey/question.js b/www/extras/wobject/editsurvey/question.js new file mode 100644 index 000000000..49990a482 --- /dev/null +++ b/www/extras/wobject/editsurvey/question.js @@ -0,0 +1,107 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.QuestionTemplate = new function(){ + + this.loadQuestion = function(params){ + + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +

    \ +
    Please enter question information
    \ +
    \ +\ + \ +

    Question Number: "+params.sequenceNumber + "\ +\ + \ + \ +

    Question Text:\n"; + if(params.questionText == ''){ + html = html + "\n"; + } + else{ + html = html + "\n"; + } + html = html + "

    Question custom variable name:"; + html = html + "

    Randomize answers:"; + + html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); + html = html + "

    Previous answers to display:"; + html = html + "

    Question type:"; + + var questions = ['Multiple Choice','Gender','Yes/No','True/False','Agree/Disagree','Oppose/Support','Importance','Likelihood','Certainty','Satisfaction', + 'Confidence','Effectiveness','Concern','Risk','Threat','Security','Ideology','Race','Party','Education', + 'Text', 'Email', 'Phone Number', 'Text Date', 'Currency', + 'Slider','Dual Slider - Range','Multi Slider - Allocate', 'Date','Date Range', 'File Upload','Hidden']; + + html = html + this.makeMenu('questionType',questions,questions,params.questionType); + + html = html + "\ +

    Randomized words:\ + \ +

    Vertical display:"; + + html = html+ this.makeRadio('verticalDisplay',[{text:'Yes',value:1},{text:'No',value:0}],params.verticalDisplay); + html = html + "

    Allow comment:"; + html = html+ this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}],params.allowComment); + html = html + "

    Maximum number of answers:"; + html = html + "

    Required:"; + html = html+ this.makeRadio('required',[{text:'Yes',value:1},{text:'No',value:0}],params.required); + html = html + "\ +

    \ +
    \ +
    \ + "; + + document.getElementById('edit').innerHTML = html; + + + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_questionId != ''){ + butts[2] = {text:"Delete", handler:function(){Survey.Comm.deleteQuestion(params.Survey_questionId);}}; + } + + var form = new YAHOO.widget.Dialog("question", + { width : "315px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + } ); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + + } + this.makeMenu = function(name,values,text,selected){ + var html = "\n"; + return html; + } + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } + +}(); diff --git a/www/extras/wobject/editsurvey/section.js b/www/extras/wobject/editsurvey/section.js new file mode 100644 index 000000000..d95ce86a7 --- /dev/null +++ b/www/extras/wobject/editsurvey/section.js @@ -0,0 +1,93 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.SectionTemplate = new function(){ + + this.loadSection = function(params){ + + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +
    \ +
    Please enter section formation
    \ +
    \ +
    \ +

    Section Number: "+params.sequenceNumber + "\ + \ +

    Section Name: \ +


    \ +

    Randomize Questions:"; + if(params.randomizeQuestions == 1){ + html = html+ "\ + Yes\ + No"; + }else{ + html = html+ "\ + Yes\ + No"; + } + html = html + "\ +

    Question per Page:\ + \ +

    Questions on Section Page: "; + if(params.questionsOnSectionPage == 1){ + html = html+ "\ + Yes\ + No"; + }else{ + html = html+ "\ + Yes\ + No"; + } + html = html + "\ +


    \ +

    Section Text:

    \ + "; + html = html + "

    Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); + html = html + "

    Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); + html = html + "

    Terminal section: " + this.makeRadio('terminal',[{text:'Yes',value:1},{text:'No',value:0}],params.terminal); + html = html + "

    Terminal section URL: "; + document.getElementById('edit').innerHTML = html; + + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_sectionId != ''){ + butts[2] = {text:"Delete", handler:function(){Survey.Comm.deleteSection(params.Survey_sectionId);}}; + } + + var form = new YAHOO.widget.Dialog("section", + { width : "300px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + } ); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + } + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } +}(); + diff --git a/www/extras/wobject/loadTemplate.pl b/www/extras/wobject/loadTemplate.pl new file mode 100755 index 000000000..3501b0076 --- /dev/null +++ b/www/extras/wobject/loadTemplate.pl @@ -0,0 +1,15 @@ +#!/usr/bin/perl + + +use strict; + +use DBI; +use File::Slurp; +my $dbh = DBI->connect("DBI:mysql:database=www_norman_com;host=localhost;port=3306", "webgui", "webgui", { RaiseError => 1, AutoCommit => 1 }) or die $!; + +my $file = read_file("template.html"); + +my $sth = $dbh->prepare(qq{ UPDATE template SET template = ?,revisionDate = ? WHERE assetid = ? }); +$sth->execute($file, time(),"M3RkJY763xgE1SLYQ4pBqA"); +$dbh->disconnect(); + diff --git a/www/extras/wobject/survey.css b/www/extras/wobject/survey.css new file mode 100644 index 000000000..bae7b65b3 --- /dev/null +++ b/www/extras/wobject/survey.css @@ -0,0 +1,34 @@ +div.dateanswer { + min-height: 250px; +} +div.slider-bg { + position: relative; + background:url(/extras/wobject/Survey/bg-fader.gif) 5px 0 no-repeat; + height:28px; + width:228px; +} +div.slider-thumb { + cursor:default; + position: absolute; + top: 4px; +} +div.slider-min-thumb { + cursor:default; + position: absolute; + top: 4px; +} +div.slider-max-thumb { + cursor:default; + position: absolute; + top: 4px; +} +#headertitle { + display: none; +} +#headertext { + display: none; +} +#questions { + display: none; +} + diff --git a/www/extras/wobject/survey.css.backup b/www/extras/wobject/survey.css.backup new file mode 100644 index 000000000..e0e1e3327 --- /dev/null +++ b/www/extras/wobject/survey.css.backup @@ -0,0 +1,97 @@ + +div.trashcan { + border: 1px solid gray; + width: 175px; + height: 50px; +} +div.workarea { + padding:10px; + padding-top:40px; + float:left +} + +div.editarea { + margin-top:40px; + padding:10px; + float:left; + border: 1px solid gray; +} + +div.editquestion { + padding:10px; + float:left; +} +div.editanswer { + padding:10px; + float:left; +} + +#submitbutton { padding:20px; } + +div.entry { + padding-bottom:10px; + padding-left:10px; +} + +ul.draglist { + position: relative; + width: 300px; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + padding-bottom:20px; +} + +ul.draglist li { + margin: 5px; +} + +ul.questionList { + position: relative; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + min-height: 40px +} + +li.section { + background-color: #CCCCFF; + border:1px solid #7EA6B2; + cursor: move; +} + +li.sselected { + background-color: #E76300; + border:1px solid #7EA6B2; + cursor: move; +} + +li.qselected { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; +} + +li.question { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + padding-left:15px; + cursor: move; +} + +li.answer { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; +} +li.aselected { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; +} + diff --git a/www/extras/wobject/surveyedit.css b/www/extras/wobject/surveyedit.css new file mode 100644 index 000000000..1d6d48e21 --- /dev/null +++ b/www/extras/wobject/surveyedit.css @@ -0,0 +1,132 @@ + +div.testarea { + width: 200px; + height: 100px; + z-index: 999; + border: 1px solid gray; + background: #f7f7f7; + position: absolute; + top: 5%; + left:5%; +} + +div.trashcan { + border: 1px solid gray; + width: 175px; + height: 50px; +} +div.workarea { + padding:10px; + padding-top:40px; + float:left +} + +div.editarea { + margin-top:40px; + padding:10px; + float:left; + border: 1px solid gray; +} + +div.editquestion { + padding:10px; + float:left; +} +div.editanswer { + padding:10px; + float:left; +} + +#submitbutton { padding:20px; } + +div.entry { + padding-bottom:10px; + padding-left:10px; +} + +ul.draglist { + position: relative; + width: 300px; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + padding-bottom:20px; +} + +ul.draglist li { + margin: 5px; +} + +ul.questionList { + position: relative; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + min-height: 40px +} + +li.section { + background-color: #CCCCFF; + border:1px solid #7EA6B2; + cursor: move; + min-height: 10px; +} + +li.ssection { + background-color: #E76300; + border:1px solid #7EA6B2; + cursor: move; + min-height: 10px; +} + +li.squestion { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; + width: 80%; + min-height: 10px; +} +li.newQuestion { +# background-color: #D1E6EC; +# border:1px solid #7EA6B2; +# cursor: move; + padding-left:25px; +} + +li.question { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; + width:80%; + min-height: 10px; +} + +li.answer { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; + padding-left:50px; + width:60%; + min-height: 10px; +} +li.sanswer { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:50px; + width:60%; + min-height: 10px; +} +li.newAnswer { +# background-color: #D1E6EC; +# border:1px solid #7EA6B2; + padding-left:50px; +# cursor: move; +} + diff --git a/www/extras/wobject/template.html.backup b/www/extras/wobject/template.html.backup new file mode 100644 index 000000000..627a01672 --- /dev/null +++ b/www/extras/wobject/template.html.backup @@ -0,0 +1,159 @@ +WebGUI Survey Alpha I ROCK A LOT!!! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +

    Questions

    + +
    + +
    + +
    + +
      + +
      + + + +
      + +

      Answers

      + +
      + +
      + +
        + +
      + +
      + + + +
      + +
      TrashCan.img
      + +
      + +

      Edit Section

      + +

      + +

      Displayed Text:

      + + + +
      + +
      + +
      + +
      + +
      + +

      Edit Question

      + +

      + +

      + +

      Question Text:

      + +
      + +

      Question Type:

      + +
      + +
      + +

      Options:

      + +
      + +
      + +
      + +
      + +

      Edit Answer

      + +

      + +

      + +

      + +
      + +
      + +
      + +
      + +
      + + + +
      + +
      + +
      + +
      + +
      + + diff --git a/www/extras/wobject/templates/buttonHTML.txt b/www/extras/wobject/templates/buttonHTML.txt new file mode 100644 index 000000000..3d11c5a24 --- /dev/null +++ b/www/extras/wobject/templates/buttonHTML.txt @@ -0,0 +1,6 @@ + + + + + id=> + diff --git a/www/extras/wobject/templates/fileLoaderHTML.txt b/www/extras/wobject/templates/fileLoaderHTML.txt new file mode 100644 index 000000000..a23e89784 --- /dev/null +++ b/www/extras/wobject/templates/fileLoaderHTML.txt @@ -0,0 +1,7 @@ + + + + + + diff --git a/www/extras/wobject/templates/takeSurvey.html b/www/extras/wobject/templates/takeSurvey.html new file mode 100644 index 000000000..c5ab9f306 --- /dev/null +++ b/www/extras/wobject/templates/takeSurvey.html @@ -0,0 +1,151 @@ + + +
      + + + +'> + + +
      +
      Q:
      + + + +
      selections left: max'>
      +
      +
      + + + + + + + + + + + + + verbatim' > + + + + + + + + + + + + + verbatim'> + + + + + + + + + + + verbatim'> + + + id=> + + + + + + + + +
      container'>
      + ' id='' type=text> + button'> + + verbatim'> + + + + + + + + + + ' name='' value=0> + + + ' name='' value=""> + + + +

      +
      + + show'>0 + + + + show'> + +
      0   +
      slider-bg' tabindex='-1' title='Slider' class=slider-bg> + +
      slider-min-thumb' class=slider-min-thumb> + +
      + +
      slider-max-thumb' class=slider-max-thumb> + +
      +
      + + +
      + +
      + +
      + + + + + + +

      +
      +   + show'>0 + ' name=''> +
      0   +
      slider-bg' tabindex='-1' title='Slider' class=slider-bg> +
      slider-thumb' class=slider-thumb> + +
      +
      +
      +
      + + + + + + + + +


      + + +
      + + + + diff --git a/www/extras/wobject/templates/textHTML.txt b/www/extras/wobject/templates/textHTML.txt new file mode 100644 index 000000000..80605e73d --- /dev/null +++ b/www/extras/wobject/templates/textHTML.txt @@ -0,0 +1,7 @@ + + + + + + + diff --git a/www/extras/wobject/thumb-n.gif b/www/extras/wobject/thumb-n.gif new file mode 100644 index 0000000000000000000000000000000000000000..c91a3329392770f552a68e04cbfc88d9f12fdd98 GIT binary patch literal 612 zcmZ?wbhEHb6l4%(c;>^fcHPGR|NrmUxo7*1-RCb{TD^9|$x~+zA31jJ{Dq&teyv=+ z?&z@-4<0@|d+x%62M-@TezI!K`o&9^uUNHa$IjjF-o3wc`O3B(yLRv0fAiMu=PzCy zJAU%*+jrNl-#Bpa@ZG!j9zA+|@zUiTyY`$sb$aXeofj@%x^eT?moHz>oISUB>-KFs zcCTK$e&gn?GiJ?MzH-f*H*b%hIJI`&hMzxwo;iDd`_A2)w`@Co=G@~aPrrZv@$TKb zt=o6)*}H$u+6_N`{M@#E*WbT?zkd7nU{Yi1 z?rG}tX7rvo*_xS?aULf#b33b;q381D7Oa}Bww5+4HcAVKH}i9u+wI!DTaQbmiJQ;m z$kAgiEDBAEX5PS<^yXD*GM0A$2EKzjOOvvfJuo8e**Kas zXLi#j4;d#0W-gIS2OAVbMf)^jPJHO-6K_&c&~Vzg=%|vg7)O($Q|Ix1g{c=T6jr#f dsAvSQayis=P(jr(>C_xamBUMBH!?6-0|0CW2iyPv literal 0 HcmV?d00001 From 98523078f19329037897c78b314994b10ef152c8 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Sat, 19 Apr 2008 18:50:45 +0000 Subject: [PATCH 03/64] removing old Survey.pm --- lib/WebGUI/Asset/Wobject/Survey.pm | 1422 ---------------------------- 1 file changed, 1422 deletions(-) delete mode 100644 lib/WebGUI/Asset/Wobject/Survey.pm diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm deleted file mode 100644 index b14bc2626..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ /dev/null @@ -1,1422 +0,0 @@ -package WebGUI::Asset::Wobject::Survey; - -#------------------------------------------------------------------- -# WebGUI is Copyright 2001-2008 Plain Black Corporation. -#------------------------------------------------------------------- -# 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 List::Util; -use Tie::CPHash; -use WebGUI::HTMLForm; -use WebGUI::International; -use WebGUI::SQL; -use WebGUI::Utility; -use WebGUI::Asset::Wobject; -use Digest::MD5 qw(md5_hex); - -our @ISA = qw(WebGUI::Asset::Wobject); - -#------------------------------------------------------------------- -sub addAnswer { - my $self = shift; - my $answer = shift; - my $qid = shift; - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - $self->setCollateral("Survey_answer","Survey_answerId",{ - Survey_id=>$self->get("Survey_id"), - Survey_questionId=>$qid, - Survey_answerId=>"new", - answer=>$i18n->get($answer) - },1,0,"Survey_id"); -} - -#------------------------------------------------------------------- -sub addSection { - my $self = shift; - my $sectionName = shift; - my $sectionId = $self->setCollateral("Survey_section","Survey_sectionId",{ - Survey_id=>$self->get("Survey_id"), - Survey_sectionId=>"new", - sectionName=>$sectionName - },1,0,"Survey_id"); - - return $sectionId; -} - -#------------------------------------------------------------------- -sub completeResponse { - my $self = shift; - my $responseId = shift; - $self->session->db->setRow("Survey_response","Survey_responseId",{ - 'Survey_responseId'=>$responseId, - isComplete=>1 - }); - $self->session->scratch->delete($self->getResponseIdString); -} - -#------------------------------------------------------------------- -sub definition { - my $class = shift; - my $session = shift; - my $definition = shift; - my $i18n = WebGUI::International->new($session,'Asset_Survey'); - push(@{$definition}, { - assetName=>$i18n->get('assetName'), - uiLevel => 5, - icon=>'survey.gif', - tableName => 'Survey', - className => 'WebGUI::Asset::Wobject::Survey', - properties => { - templateId => { - fieldType => 'template', - defaultValue => 'PBtmpl0000000000000061' - }, - Survey_id => { - fieldType => 'text', - defaultValue => undef - }, - questionOrder => { - fieldType => 'text', - defaultValue => 'sequential' - }, - groupToTakeSurvey => { - fieldType => 'group', - defaultValue => 2 - }, - groupToViewReports => { - fieldType => 'group', - defaultValue => 4 - }, - mode => { - fieldType => 'text', - defaultValue => 'survey' - }, - anonymous=>{ - fieldType => 'yesNo', - defaultValue => 0 - }, - maxResponsesPerUser=>{ - fieldType => 'integer', - defaultValue => 1 - }, - questionsPerResponse=>{ - fieldType => 'integer', - defaultValue =>99999 - }, - questionsPerPage=>{ - fieldType => 'integer', - defaultValue => 1 - }, - overviewTemplateId=>{ - fieldType => 'template', - defaultValue => 'PBtmpl0000000000000063' - }, - gradebookTemplateId => { - fieldType => 'template', - defaultValue => 'PBtmpl0000000000000062' - }, - responseTemplateId => { - fieldType => 'template', - defaultValue => 'PBtmpl0000000000000064' - }, - defaultSectionId => { - fieldType => 'text', - defaultValue => 'undef' - }, - } - }); - return $class->SUPER::definition($session, $definition); -} - -#------------------------------------------------------------------- -sub duplicate { - my $self = shift; - my $newAsset = $self->SUPER::duplicate(@_); - my $newSurveyId = $self->session->id->generate(); - $newAsset->update({ - Survey_id=>$newSurveyId - }); - - my $sections = $self->session->db->read("select * from Survey_section where Survey_id=? order by sequenceNumber",[$self->get("Survey_id")]); - while (my $sdata = $sections->hashRef) { - my $oldSectionId = $sdata->{Survey_sectionId}; - $sdata->{Survey_sectionId} = "new"; - $sdata->{Survey_id} = $newSurveyId; - $sdata->{Survey_sectionId} = $newAsset->setCollateral("Survey_section", "Survey_sectionId",$sdata,1,0, "Survey_id"); - - my $questions = $self->session->db->read("select * from Survey_question where Survey_id=? and Survey_sectionId=?",[$self->get("Survey_id"), $oldSectionId]); - while (my $qdata = $questions->hashRef) { - my $oldQuestionId = $qdata->{Survey_questionId}; - $qdata->{Survey_questionId} = "new"; - $qdata->{Survey_id} = $newSurveyId; - $qdata->{Survey_sectionId} = $sdata->{Survey_sectionId}; - $qdata->{Survey_questionId} = $newAsset->setCollateral("Survey_question","Survey_questionId",$qdata,1,0,"Survey_id"); - my $answers = $self->session->db->read("select * from Survey_answer where Survey_questionId=? order by sequenceNumber",[$oldQuestionId]); - while (my $adata = $answers->hashRef) { - my $oldAnswerId = $adata->{Survey_answerId}; - $adata->{Survey_answerId} = "new"; - $adata->{Survey_questionId} = $qdata->{Survey_questionId}; - $adata->{Survey_id} = $newSurveyId; - $adata->{Survey_answerId} = $newAsset->setCollateral("Survey_answer", "Survey_answerId", $adata, 1, 0, "Survey_Id"); - my $responses = $self->session->db->read("select * from Survey_questionResponse where Survey_answerId=?",[$oldAnswerId]); - while (my $rdata = $responses->hashRef) { - $rdata->{Survey_responseId} = "new"; - $rdata->{Survey_answerId} = $adata->{Survey_answerId}; - $rdata->{Survey_id} = $newSurveyId; - $rdata->{Survey_questionId} = $qdata->{Survey_questionId}; - $newAsset->setCollateral("Survey_questionResponse","Survey_responseId",$rdata,0,0); - } - } - } - } - - return $newAsset; -} - -#------------------------------------------------------------------- -sub generateResponseId { - my $self = shift; - my $varname = $self->getResponseIdString; - if ($self->session->scratch->get($varname)) { - $self->completeResponse; - } - my $ipAddress = $self->getIp; - my $userId = $self->getUserId; - my $responseId = $self->session->db->setRow("Survey_response","Survey_responseId",{ - 'Survey_responseId'=>"new", - userId=>$userId, - ipAddress=>$ipAddress, - username=>$self->session->user->username, - startDate=>$self->session->datetime->time(), - 'Survey_id'=>$self->get("Survey_id") - }); - $self->session->scratch->set($varname,$responseId); - return $responseId; -} - -#------------------------------------------------------------------- -sub getEditForm { - my $self = shift; - my $tabform = $self->SUPER::getEditForm; - - my $i18n = WebGUI::International->new($self->session, 'Asset_Survey'); - $tabform->getTab('properties')->hidden( - -name => "Survey_id", - -value => ($self->get("Survey_id") || $self->session->id->generate()) - ); - $tabform->getTab('display')->template( - -name => 'templateId', - -label => $i18n->get('view template'), - -hoverHelp => $i18n->get('view template description'), - -value => $self->getValue('templateId'), - -namespace => 'Survey', - -afterEdit => 'func=edit' - ); - $tabform->getTab('display')->template( - -name => 'responseTemplateId', - -label => $i18n->get('response template'), - -hoverHelp => $i18n->get('response template description'), - -value => $self->getValue('responseTemplateId'), - -namespace => 'Survey/Response', - -afterEdit => 'func=edit' - ); - $tabform->getTab('display')->template( - -name => 'gradebookTemplateId', - -label => $i18n->get('gradebook template'), - -hoverHelp => $i18n->get('gradebook template description'), - -value => $self->getValue('gradebookTemplateId'), - -namespace => 'Survey/Gradebook', - -afterEdit => 'func=edit' - ); - $tabform->getTab('display')->template( - -name => 'overviewTemplateId', - -label => $i18n->get('overview template'), - -hoverHelp => $i18n->get('overview template description'), - -value => $self->getValue('overviewTemplateId'), - -namespace => 'Survey/Overview', - -afterEdit => 'func=edit' - ); - - $tabform->getTab('display')->selectBox( - -name => "questionOrder", - -options => { - sequential => $i18n->get(5), - random => $i18n->get(6), - response => $i18n->get(7), - section => $i18n->get(106) - }, - -label => $i18n->get(8), - -hoverHelp => $i18n->get('8 description'), - -value => [$self->getValue("questionOrder")] - ); - $tabform->getTab('display')->integer( - -name => "questionsPerPage", - -value => $self->getValue("questionsPerPage"), - -label => $i18n->get(83), - -hoverHelp => $i18n->get('83 description') - ); - $tabform->getTab('properties')->selectBox( - -name => "mode", - -options => { - survey => $i18n->get(9), - quiz => $i18n->get(10) - }, - -label => $i18n->get(11), - -hoverHelp => $i18n->get('11 description'), - -value => [$self->getValue("mode")] - ); - $tabform->getTab('properties')->yesNo( - -name => "anonymous", - -value => $self->getValue("anonymous"), - -label => $i18n->get(81), - -hoverHelp => $i18n->get('81 description') - ); - $tabform->getTab('properties')->integer( - -name => "maxResponsesPerUser", - -value => $self->getValue("maxResponsesPerUser"), - -label => $i18n->get(84), - -hoverHelp => $i18n->get('84 description') - ); - $tabform->getTab('properties')->integer( - -name => "questionsPerResponse", - -value => $self->getValue("questionsPerResponse"), - -label => $i18n->get(85), - -hoverHelp => $i18n->get('85 description') - ); - $tabform->getTab('security')->group( - -name => "groupToTakeSurvey", - -value => [$self->getValue("groupToTakeSurvey")], - -label => $i18n->get(12), - -hoverHelp => $i18n->get('12 description') - ); - $tabform->getTab('security')->group( - -name => "groupToViewReports", - -label => $i18n->get(13), - -hoverHelp => $i18n->get('13 description'), - -value => [$self->getValue("groupToViewReports")] - ); - if ($self->get("assetId") eq "new") { - $tabform->getTab('properties')->whatNext( - -options=>{ - editQuestion=>$i18n->get(28), - viewParent=>$i18n->get(745) - }, - -value=>"editQuestion", - -hoverHelp => $i18n->get('what next description'), - ); - } - - return $tabform; -} - -#------------------------------------------------------------------- -sub getIp { - my $self = shift; - my $ip = ($self->get("anonymous")) ? substr(md5_hex($self->session->env->getIp),0,8) : $self->session->env->getIp; - return $ip; -} - -#------------------------------------------------------------------- -sub getMenuVars { - my $self = shift; - my %var; - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - $var{'user.canViewReports'} = ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $var{'delete.all.responses.url'} = $self->getUrl('func=deleteAllResponses'); - $var{'delete.all.responses.label'} = $i18n->get(73); - $var{'export.answers.url'} = $self->getUrl('func=exportAnswers'); - $var{'export.answers.label'} = $i18n->get(62); - $var{'export.questions.url'} = $self->getUrl('func=exportQuestions'); - $var{'export.questions.label'} = $i18n->get(63); - $var{'export.responses.url'} = $self->getUrl('func=exportResponses'); - $var{'export.responses.label'} = $i18n->get(64); - $var{'export.composite.url'} = $self->getUrl('func=exportComposite'); - $var{'export.composite.label'} = $i18n->get(65); - $var{'report.gradebook.url'} = $self->getUrl('func=viewGradebook'); - $var{'report.gradebook.label'} = $i18n->get(61); - $var{'report.overview.url'} = $self->getUrl('func=viewStatisticalOverview'); - $var{'report.overview.label'} = $i18n->get(59); - $var{'survey.url'} = $self->getUrl; - $var{'survey.label'} = $i18n->get(60); - return \%var; -} - -#------------------------------------------------------------------- -sub getQuestionCount { - my $self = shift; - my ($count) = $self->session->db->quickArray("select count(*) from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - return ($count < $self->getValue("questionsPerResponse")) ? $count : $self->getValue("questionsPerResponse"); -} - -#------------------------------------------------------------------- -sub getQuestionsLoop { - my $self = shift; - my $responseId = shift; - my @ids; - if ($self->get("questionOrder") eq "sequential") { - @ids = $self->getSequentialQuestionIds($responseId); - } elsif ($self->get("questionOrder") eq "response") { - @ids = $self->getResponseDrivenQuestionIds($responseId); - } elsif ($self->get("questionOrder") eq "section") { - @ids = $self->getSectionDrivenQuestionIds($responseId); - } else { - @ids = $self->getRandomQuestionIds($responseId); - } - my $length = scalar(@ids); - my $i = 1; - my @loop; - - #Ignore questions per page when using sections, return all questions for current section - if ($self->get("questionOrder") eq "section") { - while ($i <= $length) { - push(@loop,$self->getQuestionVars($ids[($i-1)])); - $i++; - } - return \@loop; - } - - my $questionResponseCount = $self->getQuestionResponseCount($responseId); - while ($i <= $length && $i<= $self->get("questionsPerPage") && ($questionResponseCount + $i) <= $self->getValue("questionsPerResponse")) { - push(@loop,$self->getQuestionVars($ids[($i-1)])); - $i++; - } - return \@loop; -} - - -#------------------------------------------------------------------- -sub getQuestionResponseCount { - my $self = shift; - my $responseId = shift; - my ($count) = $self->session->db->quickArray("select count(*) from Survey_questionResponse where Survey_responseId=".$self->session->db->quote($responseId)); - return $count; -} - -#------------------------------------------------------------------- -sub getQuestionVars { - my $self = shift; - my $questionId = shift; - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - my %var; - my $question = $self->session->db->getRow("Survey_question","Survey_questionId",$questionId); - $var{'question.question'} = $question->{question}; - $var{'question.allowComment'} = $question->{allowComment}; - $var{'question.id'} = $question->{Survey_questionId}; - $var{'question.comment.field'} = WebGUI::Form::textarea($self->session,{ - name=>'comment_'.$questionId - }); - $var{'question.comment.label'} = $i18n->get(51); - - my $answer; - ($answer) = $self->session->db->quickArray("select Survey_answerId from Survey_answer where Survey_questionId=".$self->session->db->quote($question->{Survey_questionId})); - $var{'question.answer.field'} = WebGUI::Form::hidden($self->session,{ - name=>'answerId_'.$questionId, - value=>$answer - }); - if ($question->{answerFieldType} eq "text") { - $var{'question.answer.field'} .= WebGUI::Form::text($self->session,{ - name=>'textResponse_'.$questionId - }); - } elsif ($question->{answerFieldType} eq "HTMLArea") { - $var{'question.answer.field'} .= WebGUI::Form::HTMLArea($self->session,{ - name=>'textResponse_'.$questionId - }); - } elsif ($question->{answerFieldType} eq "textArea") { - $var{'question.answer.field'} .= WebGUI::Form::textarea($self->session,{ - name=>'textResponse_'.$questionId - }); - } else { - my $answer = $self->session->db->buildHashRef("select Survey_answerId,answer from Survey_answer where Survey_questionId=? order by sequenceNumber", [$question->{Survey_questionId}]); - if ($question->{randomizeAnswers}) { - $answer = randomizeHash($answer); - } - $var{'question.answer.field'} = WebGUI::Form::radioList($self->session,{ - options=>$answer, - name=>"answerId_".$questionId, - vertical=>1 - }); - } - return \%var; -} - -#------------------------------------------------------------------- -sub getRandomQuestionIds { - my $self = shift; - my $responseId = shift; - my @usedQuestionIds = $self->session->db->buildArray("select Survey_questionId from Survey_questionResponse where Survey_responseId=".$self->session->db->quote($responseId)); - my $where = " where Survey_id=".$self->session->db->quote($self->get("Survey_id")); - if ($#usedQuestionIds+1 > 0) { - $where .= " and Survey_questionId not in (".$self->session->db->quoteAndJoin(\@usedQuestionIds).")"; - } - my @questions = $self->session->db->buildArray("select Survey_questionId from Survey_question".$where); - @questions = List::Util::shuffle(@questions); - return @questions; -} - -#------------------------------------------------------------------- -sub getResponseCount { - my $self = shift; - my $ipAddress = $self->getIp; - my $userId = $self->getUserId; - my ($count) = $self->session->db->quickArray("select count(*) from Survey_response where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." and - ((userId<>'1' and userId=".$self->session->db->quote($userId).") or ( userId='1' and ipAddress=".$self->session->db->quote($ipAddress)."))"); - return $count; -} - - -#------------------------------------------------------------------- -sub getResponseDrivenQuestionIds { - my $self = shift; - my $responseId = shift; - my $previousResponse = $self->session->db->quickHashRef("select Survey_questionId, Survey_answerId from Survey_questionResponse - where Survey_responseId=".$self->session->db->quote($responseId)." order by dateOfResponse desc"); - my $questionId; - my @questions; - if ($previousResponse->{Survey_answerId}) { - ($questionId) = $self->session->db->quickArray("select gotoQuestion from Survey_answer where - Survey_answerId=".$self->session->db->quote($previousResponse->{Survey_answerId})); - unless ($questionId) { - ($questionId) = $self->session->db->quickArray("select gotoQuestion from Survey_question where - Survey_questionId=".$self->session->db->quote($previousResponse->{Survey_questionId})); - } - if (!$questionId || $questionId eq '-1') { # terminate survey - $self->completeResponse($responseId); - return (); - } - } else { - ($questionId) = $self->session->db->quickArray("select Survey_questionId from Survey_question where Survey_id=".$self->session->db->quote($self->getValue("Survey_id"))." - order by sequenceNumber"); - } - push(@questions,$questionId); - return @questions; -} - -#------------------------------------------------------------------- -sub getSectionDrivenQuestionIds { - my $self = shift; - my $responseId = shift; - my @usedQuestionIds = $self->session->db->buildArray("select Survey_questionId from Survey_questionResponse where Survey_responseId=".$self->session->db->quote($responseId)); - my @questions; - my $where = " where Survey_question.Survey_id=".$self->session->db->quote($self->get("Survey_id")); - $where .= " and Survey_question.Survey_sectionId=Survey_section.Survey_sectionId"; - - if ($#usedQuestionIds+1 > 0) { - $where .= " and Survey_questionId not in (".$self->session->db->quoteAndJoin(\@usedQuestionIds).")"; - } - - my $sth = $self->session->db->read("select Survey_questionId, Survey_question.Survey_sectionId from Survey_question, - Survey_section $where order by Survey_section.sequenceNumber, Survey_question.sequenceNumber"); - - my $loopCount=0; - my $currentSection; - while (my $hashRef = $sth->hashRef) { - if ($loopCount == 0){ $currentSection = $hashRef->{Survey_sectionId}; } - if ($currentSection eq $hashRef->{Survey_sectionId}) { - push (@questions, $hashRef->{Survey_questionId}); - } - $loopCount++; - } - $sth->finish; - return @questions; -} - - - -#------------------------------------------------------------------- -sub getResponseId { - my $self = shift; - return $self->session->scratch->get($self->getResponseIdString); -} - -#------------------------------------------------------------------- -sub getResponseIdString { - my $self = shift; - return "Survey-".$self->get("Survey_id")."-ResponseId"; -} - - -#------------------------------------------------------------------- -sub getSequentialQuestionIds { - my $self = shift; - my $responseId = shift; - my @usedQuestionIds = $self->session->db->buildArray("select Survey_questionId from Survey_questionResponse where Survey_responseId=".$self->session->db->quote($responseId)); - my $where = " where Survey_id=".$self->session->db->quote($self->get("Survey_id")); - if ($#usedQuestionIds+1 > 0) { - $where .= " and Survey_questionId not in (".$self->session->db->quoteAndJoin(\@usedQuestionIds).")"; - } - my @questions = $self->session->db->buildArray("select Survey_questionId from Survey_question $where order by sequenceNumber"); - return @questions; -} - -#------------------------------------------------------------------- -sub getUserId { - my $self = shift; - my $userId = ($self->get("anonymous") && $self->session->user->userId != 1) ? substr(md5_hex($self->session->user->userId),0,8) : $self->session->user->userId; - return $userId; -} - -#------------------------------------------------------------------- - -=head2 prepareView ( ) - -See WebGUI::Asset::prepareView() for details. - -=cut - -sub prepareView { - my $self = shift; - $self->SUPER::prepareView(); - my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); - $template->prepare; - $self->{_viewTemplate} = $template; -} - - -#------------------------------------------------------------------- -sub processPropertiesFromFormPost { - my $self = shift; - $self->SUPER::processPropertiesFromFormPost; - my $i18n = WebGUI::International->new($self->session,"Asset_Survey"); - if ($self->session->form->process("assetId") eq "new") { - my $defaultSectionId = $self->addSection($i18n->get(107)); - $self->update({'defaultSectionId' => $defaultSectionId}); - $self->session->errorHandler->warn($defaultSectionId); - } - -} -#------------------------------------------------------------------- -sub purge { - my $self = shift; - my ($count) = $self->session->db->quickArray("select count(*) from Survey where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - if ($count < 2) { ### Check for other wobjects using this survey. - $self->session->db->write("delete from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - $self->session->db->write("delete from Survey_answer where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - $self->session->db->write("delete from Survey_response where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - $self->session->db->write("delete from Survey_section where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - } - $self->SUPER::purge(); -} - - -#------------------------------------------------------------------- -sub responseIsComplete { - my $self = shift; - my $responseId = shift; - my $response = $self->session->db->getRow("Survey_response","Survey_responseId",$responseId); - return $response->{isComplete}; -} - - -#------------------------------------------------------------------- -sub setAnswerType { - my $self = shift; - my $answerFieldType = shift; - my $qid = shift; - $self->setCollateral("Survey_question","Survey_questionId",{ - Survey_questionId=>$qid, - Survey_id=>$self->get("Survey_id"), - answerFieldType=>$answerFieldType - },1,0,"Survey_id"); -} - -#------------------------------------------------------------------- -sub view { - my $self = shift; - my $i18n = WebGUI::International->new($self->session, 'Asset_Survey'); - my $var = $self->getMenuVars; - $var->{'question.add.url'} = $self->getUrl('func=editQuestion;qid=new'); - $var->{'question.add.label'} = $i18n->get(30); - $var->{'section.add.url'} = $self->getUrl('func=editSection;sid=new'); - $var->{'section.add.label'} = $i18n->get(104); - my @sectionEdit; - - # Get Sections - my $sth = $self->session->db->read("select Survey_sectionId,sectionName from Survey_section where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - while (my %sectionData = $sth->hash) { - my @edit; - - # Get Questions for this section - my $sth2 = $self->session->db->read("select Survey_questionId,question from Survey_question - where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." - and Survey_sectionId=".$self->session->db->quote($sectionData{Survey_sectionId})." order by sequenceNumber"); - while (my %data = $sth2->hash) { - push(@edit,{ - 'question.edit.controls'=> - $self->session->icon->delete('func=deleteQuestionConfirm;qid='.$data{Survey_questionId}, $self->get("url"), $i18n->get(44)). - $self->session->icon->edit('func=editQuestion;qid='.$data{Survey_questionId}, $self->get("url")). - $self->session->icon->moveUp('func=moveQuestionUp;qid='.$data{Survey_questionId}, $self->get("url")). - $self->session->icon->moveDown('func=moveQuestionDown;qid='.$data{Survey_questionId}, $self->get("url")), - 'question.edit.question'=>$data{question}, - 'question.edit.id'=>$data{Survey_questionId} - }); - } - $sth2->finish; - - push(@sectionEdit,{ - 'section.edit.controls'=> - $self->session->icon->delete('func=deleteSectionConfirm;sid='.$sectionData{Survey_sectionId}, $self->get("url"), $i18n->get(105)). - $self->session->icon->edit('func=editSection;sid='.$sectionData{Survey_sectionId}, $self->get("url")). - $self->session->icon->moveUp('func=moveSectionUp;sid='.$sectionData{Survey_sectionId}, $self->get("url")). - $self->session->icon->moveDown('func=moveSectionDown;sid='.$sectionData{Survey_sectionId}, $self->get("url")), - 'section.edit.sectionName'=>$sectionData{sectionName}, - 'section.edit.id'=>$sectionData{Survey_sectionId}, - 'section.questions_loop'=>\@edit - }); - $var->{'section.edit_loop'} = \@sectionEdit; - - } - $sth->finish; - - $var->{'user.canTakeSurvey'} = $self->session->user->isInGroup($self->get("groupToTakeSurvey")); - if ($var->{'user.canTakeSurvey'}) { - $var->{'response.Id'} = $self->getResponseId; - $var->{'response.Count'} = $self->getResponseCount; - $var->{'user.isFirstResponse'} = ($var->{'response.Count'} == 0 && !(exists $var->{'response.id'})); - $var->{'user.canRespondAgain'} = ($var->{'response.Count'} < $self->get("maxResponsesPerUser")); - if ($self->session->form->process("startNew") && $var->{'user.canRespondAgain'}) { - $var->{'response.Id'} = "new"; - } - elsif ($var->{'user.isFirstResponse'}) { - $var->{'response.Id'} ||= "new"; - } - if ($var->{'response.Id'}) { - $var->{'questions.soFar.count'} = $self->getQuestionResponseCount($var->{'response.Id'}); - ($var->{'questions.correct.count'}) = $self->session->db->quickArray("select count(*) from Survey_questionResponse a, Survey_answer b where a.Survey_responseId=" - .$self->session->db->quote($var->{'response.Id'})." and a.Survey_answerId=b.Survey_answerId and b.isCorrect=1"); - if ($var->{'questions.soFar.count'} > 0) { - $var->{'questions.correct.percent'} = round(($var->{'questions.correct.count'}/$var->{'questions.soFar.count'})*100) - } - $var->{question_loop} = $self->getQuestionsLoop($var->{'response.Id'}); - $var->{'response.isComplete'} = $self->responseIsComplete($var->{'response.Id'}); - } - } - $var->{'form.header'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl}) - .WebGUI::Form::hidden($self->session,{ - name=>'func', - value=>'respond' - }); - if ($var->{'response.Id'}) { - $var->{'form.header'} .= WebGUI::Form::hidden($self->session,{name=>'responseId',value=>$var->{'response.Id'}}); - } - $var->{'form.footer'} = WebGUI::Form::formFooter($self->session,); - $var->{'form.submit'} = WebGUI::Form::submit($self->session,{ - value=>$i18n->get(50) - }); - $var->{'questions.sofar.label'} = $i18n->get(86); - $var->{'start.newResponse.label'} = $i18n->get(87); - $var->{'start.newResponse.url'} = $self->getUrl("func=view;startNew=1"); - $var->{'thanks.survey.label'} = $i18n->get(46); - $var->{'thanks.quiz.label'} = $i18n->get(47); - $var->{'questions.total'} = $self->getQuestionCount; - $var->{'questions.correct.count.label'} = $i18n->get(52); - $var->{'questions.correct.percent.label'} = $i18n->get(54); - $var->{'mode.isSurvey'} = ($self->get("mode") eq "survey"); - $var->{'survey.noprivs.label'} = $i18n->get(48); - $var->{'quiz.noprivs.label'} = $i18n->get(49); - return $self->processTemplate($var, undef, $self->{_viewTemplate}); -} - -#------------------------------------------------------------------- -sub www_deleteAnswerConfirm { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - my ($answerCount) = $self->session->db->quickArray("select count(*) from Survey_answer where Survey_questionId=".$self->session->db->quote($self->session->form->process("qid"))); - return $self->i18n("cannot delete the last answer") unless($answerCount); - $self->session->db->write("delete from Survey_questionResponse where Survey_answerId=".$self->session->db->quote($self->session->form->process("aid"))); - $self->deleteCollateral("Survey_answer","Survey_answerId",$self->session->form->process("aid")); - $self->reorderCollateral("Survey_answer","Survey_answerId","Survey_id"); - return $self->www_editQuestion; -} - -#------------------------------------------------------------------- -sub www_deleteQuestionConfirm { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->session->db->write("delete from Survey_answer where Survey_questionId=".$self->session->db->quote($self->session->form->process("qid"))); - $self->session->db->write("delete from Survey_questionResponse where Survey_questionId=".$self->session->db->quote($self->session->form->process("qid"))); - $self->deleteCollateral("Survey_question","Survey_questionId",$self->session->form->process("qid")); - $self->reorderCollateral("Survey_question","Survey_questionId","Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_deleteSectionConfirm { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - my $section_id = $self->session->form->get("sid"); - if ($section_id eq $self->get("defaultSectionId")) { - return $self->session->privilege->vitalComponent(); - } - - $self->session->db->write("delete from Survey_section where Survey_sectionId=?",[$section_id]); - $self->deleteCollateral("Survey_section","Survey_sectionId",$section_id); - $self->reorderCollateral("Survey_section","Survey_sectionId","Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_deleteResponse { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - my $i18n = WebGUI::International->new($self->session, 'Asset_Survey'); - return $self->session->style->process($self->confirm($i18n->get(72), - $self->getUrl('func=deleteResponseConfirm;responseId='.$self->session->form->process("responseId"))),$self->getValue("styleTemplateId")); -} - -#------------------------------------------------------------------- -sub www_deleteResponseConfirm { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->db->write("delete from Survey_response where Survey_responseId=".$self->session->db->quote($self->session->form->process("responseId"))); - $self->session->db->write("delete from Survey_questionResponse where Survey_responseId=".$self->session->db->quote($self->session->form->process("responseId"))); - return $self->www_viewGradebook; -} - -#------------------------------------------------------------------- -sub www_deleteAllResponses { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - return $self->session->style->process($self->confirm($i18n->get(74),$self->getUrl('func=deleteAllResponsesConfirm')),$self->getValue("styleTemplateId")); -} - -#------------------------------------------------------------------- -sub www_deleteAllResponsesConfirm { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->db->write("delete from Survey_response where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - $self->session->db->write("delete from Survey_questionResponse where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - return ""; -} - -#------------------------------------------------------------------- -sub www_editAnswer { - my $self = shift; - my ($question, $f, $answer); - return $self->session->privilege->insufficient() unless ($self->canEdit); - my $aid = shift || $self->session->form->process('aid'); - my $qid = shift || $self->session->form->process('qid'); - - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - $answer = $self->getCollateral("Survey_answer","Survey_answerId",$aid); - $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); - $f->hidden( - -name => "assetId", - -value => $self->session->form->process("assetId") - ); - $f->hidden( - -name => "func", - -value => "editAnswerSave" - ); - $f->hidden( - -name => "qid", - -value => $qid - ); - $f->hidden( - -name => "aid", - -value => $answer->{Survey_answerId} - ); - $f->text( - -name=>"answer", - -value=>$answer->{answer}, - -label=>$i18n->get(19), - -hoverHelp=>$i18n->get('19 description') - ); - if ($self->get("mode") eq "quiz") { - $f->yesNo( - -name=>"isCorrect", - -value=>$answer->{isCorrect}, - -label=>$i18n->get(20), - -hoverHelp=>$i18n->get('20 description') - ); - } else { - $f->hidden( - -name => "isCorrect", - -value => 0 - ); - } - if ($self->get("questionOrder") eq "response") { - $question = $self->session->db->buildHashRef("select Survey_questionId,question - from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - $question = { ('-1' => $i18n->get(82),%$question) }; - $f->selectBox( - -name=>"gotoQuestion", - -options=>$question, - -value=>[$answer->{gotoQuestion}], - -label=>$i18n->get(21), - -hoverHelp=>$i18n->get('21 description') - ); - } - if ($answer->{Survey_answerId} eq "new") { - my %options; - tie %options, 'Tie::IxHash'; - %options = ( - "addAnswer"=>$i18n->get(24), - "addQuestion"=>$i18n->get(28), - "editQuestion"=>$i18n->get(75), - "backToPage"=>$i18n->get(745) - ); - $f->whatNext( - -options=>\%options, - -value=>"addAnswer", - -hoverHelp=>$i18n->get('what next answer description') - ); - } - $f->submit; - - return $self->getAdminConsole->render($f->print, $i18n->get(18)); - -} - -#------------------------------------------------------------------- -sub www_editAnswerSave { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - my $qid = $self->session->form->process("qid"); - $self->setCollateral("Survey_answer", "Survey_answerId", { - Survey_answerId => $self->session->form->process("aid"), - Survey_questionId => $qid, - answer => $self->session->form->process("answer"), - isCorrect => $self->session->form->process("isCorrect"), - Survey_id=>$self->get("Survey_id"), - gotoQuestion => $self->session->form->process("gotoQuestion") - },1,0,"Survey_questionId", $qid); - if ($self->session->form->process("proceed") eq "addQuestion") { - return $self->www_editQuestion('new'); - } elsif ($self->session->form->process("proceed") eq "addAnswer") { - return $self->www_editAnswer('new'); - } elsif ($self->session->form->process("proceed") eq "backToPage") { - return ""; - } - return $self->www_editQuestion(); -} - -#------------------------------------------------------------------- -sub www_editQuestion { - my $self = shift; - my ($f, $question, $answerFieldType, $sth, %data); - my $qid = shift || $self->session->form->process('qid'); - - return $self->session->privilege->insufficient() unless ($self->canEdit); - - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - tie %data, 'Tie::CPHash'; - $question = $self->getCollateral("Survey_question","Survey_questionId", $qid); - $answerFieldType = $question->{answerFieldType} || "radioList"; - - $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); - $f->hidden( - -name => "assetId", - -value => $self->get("assetId") - ); - $f->hidden( - -name => "func", - -value => "editQuestionSave" - ); - $f->hidden( - -name => "qid", - -value => $question->{Survey_questionId} - ); - $f->hidden( - -name => "answerFieldType", - -value => $answerFieldType - ); - $f->HTMLArea( - -name => "question", - -value => $question->{question}, - -label => $i18n->get(14), - -hoverHelp => $i18n->get('14 description') - ); - $f->yesNo( - -name => "allowComment", - -value => $question->{allowComment}, - -label => $i18n->get(15), - -hoverHelp => $i18n->get('15 description') - ); - $f->yesNo( - -name => "randomizeAnswers", - -value => $question->{randomizeAnswers}, - -label => $i18n->get(16), - -hoverHelp => $i18n->get('16 description') - ); - - my $sectionList = $self->session->db->buildHashRef("select Survey_sectionId,sectionName - from Survey_section where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - - $f->selectBox( - -name => "section", - -options=> $sectionList, - -value => [$question->{Survey_sectionId}], - -label => $i18n->get(106), - -hoverHelp => $i18n->get('106 description'), - ); - - if ($self->get("questionOrder") eq "response") { - my $ql = $self->session->db->buildHashRef("select Survey_questionId,question - from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - $ql = { ('-1' => $i18n->get(82),%$ql) }; - $f->selectBox( - -name => "gotoQuestion", - -options=> $ql, - -value => [$question->{gotoQuestion}], - -label => $i18n->get(21), - -hoverHelp => $i18n->get('21 description') - ); - } - - if ($question->{Survey_questionId} eq "new") { - my %options; - tie %options, 'Tie::IxHash'; - %options = ( - "addMultipleChoiceAnswer" => $i18n->get(24), - "addTextAnswer" => $i18n->get(29), - "addBooleanAnswer" => $i18n->get(25), - "addFrequencyAnswer" => $i18n->get(26), - "addOpinionAnswer" => $i18n->get(27), - "addHTMLAreaAnswer" => $i18n->get(100), - "addTextAreaAnswer" => $i18n->get(101), - #"addQuestion" => $i18n->get(28), - "backToPage" => $i18n->get(745) - ); - $f->whatNext( - -options=> \%options, - -value => "addMultipleChoiceAnswer", - -hoverHelp => $i18n->get('what next question description') - ); - } - $f->submit; - my $output = $f->print; - if ($question->{Survey_questionId} ne "new" - && $question->{answerFieldType} ne "text" - && $question->{answerFieldType} ne "HTMLArea" - && $question->{answerFieldType} ne "textArea" - ) { - $output .= ''.$i18n->get(23).'

      '; - $sth = $self->session->db->read("select Survey_answerId,answer from Survey_answer - where Survey_questionId=".$self->session->db->quote($question->{Survey_questionId})." order by sequenceNumber"); - while (%data = $sth->hash) { - $output .= - $self->session->icon->delete('func=deleteAnswerConfirm;qid='.$question->{Survey_questionId}.';aid='.$data{Survey_answerId}, - $self->get("url"),$i18n->get(45)). - $self->session->icon->edit('func=editAnswer;qid='.$question->{Survey_questionId}.';aid='.$data{Survey_answerId}, $self->get("url")). - $self->session->icon->moveUp('func=moveAnswerUp'.';qid='.$question->{Survey_questionId}.';aid='.$data{Survey_answerId}, $self->get("url")). - $self->session->icon->moveDown('func=moveAnswerDown;qid='.$question->{Survey_questionId}.';aid='.$data{Survey_answerId}, $self->get("url")). - ' '.$data{answer}.'
      '; - } - $sth->finish; - } - return $self->getAdminConsole->render($output, $i18n->get(17)); -} - -#------------------------------------------------------------------- -sub www_editQuestionSave { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - - my $qid = $self->setCollateral("Survey_question", "Survey_questionId", { - # XXX: In some cases not all form fields are present and then the SQL query failes - # because the array is not complete - # There has to be a better way to fix this problem, but adding "|| 1" works for now - question=>$self->session->form->process("question", 'HTMLArea') || 1, - Survey_questionId=>$self->session->form->process("qid") || 1, - Survey_id=>$self->get("Survey_id") || 1, - allowComment=>$self->session->form->process("allowComment", 'yesNo'), - gotoQuestion=>$self->session->form->process("gotoQuestion", 'selectBox') || 1, - answerFieldType=>$self->session->form->process("answerFieldType") || 1, - randomizeAnswers=>$self->session->form->process("randomizeAnswers", 'yesNo'), - Survey_sectionId=>$self->session->form->process("section") || 1 - },1,0,"Survey_id"); - - if ($self->session->form->process("proceed") eq "addMultipleChoiceAnswer") { - return $self->www_editAnswer('new',$qid); - } elsif ($self->session->form->process("proceed") eq "addTextAnswer") { - $self->setAnswerType("text",$qid); - $self->addAnswer(0,$qid); - } elsif ($self->session->form->process("proceed") eq "addBooleanAnswer") { - $self->addAnswer(31,$qid); - $self->addAnswer(32,$qid); - } elsif ($self->session->form->process("proceed") eq "addOpinionAnswer") { - $self->addAnswer(33,$qid); - $self->addAnswer(34,$qid); - $self->addAnswer(35,$qid); - $self->addAnswer(36,$qid); - $self->addAnswer(37,$qid); - $self->addAnswer(38,$qid); - $self->addAnswer(39,$qid); - } elsif ($self->session->form->process("proceed") eq "addFrequencyAnswer") { - $self->addAnswer(40,$qid); - $self->addAnswer(41,$qid); - $self->addAnswer(42,$qid); - $self->addAnswer(43,$qid); - $self->addAnswer(39,$qid); - } elsif ($self->session->form->process("proceed") eq "addHTMLAreaAnswer") { - $self->setAnswerType("HTMLArea",$qid); - $self->addAnswer(0,$qid); - } elsif ($self->session->form->process("proceed") eq "addTextAreaAnswer") { - $self->setAnswerType("textArea",$qid); - $self->addAnswer(0,$qid); - } elsif ($self->session->form->process("proceed") eq "addQuestion") { - return $self->www_editQuestion('new'); - } - return ""; -} - -#------------------------------------------------------------------- -sub www_editSection { - my $self = shift; - my ($f, $section, $sectionName); - my $i18n = WebGUI::International->new($self->session, 'Asset_Survey'); - return $self->session->privilege->insufficient() unless ($self->canEdit); - $section = $self->getCollateral("Survey_section","Survey_sectionId",$self->session->form->process("sid")); - - if ($section->{Survey_sectionId} eq $self->get("defaultSectionId") && $section->{Survey_sectionId} ne "") { - return $self->session->privilege->vitalComponent; - } - - $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); - $f->hidden( - -name => "assetId", - -value => $self->get("assetId") - ); - $f->hidden( - -name => "func", - -value => "editSectionSave" - ); - $f->hidden( - -name => "sid", - -value => $section->{Survey_sectionId} - ); - - $f->text( - -name => "sectionName", - -value => $section->{sectionName}, - -label => $i18n->get(102) - ); - $f->submit; - my $output = $f->print; - return $self->getAdminConsole->render($output, $i18n->get(103)); -} - -#------------------------------------------------------------------- -sub www_editSectionSave { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->setCollateral("Survey_section", "Survey_sectionId", { - sectionName => $self->session->form->process("sectionName"), - Survey_sectionId=>$self->session->form->process("sid"), - Survey_id=>$self->get("Survey_id"), - },1,0,"Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_exportAnswers { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->http->setFilename($self->session->url->escape($self->get("title")."_answers.tab"),"text/tab"); - return $self->session->db->quickTab("select * from Survey_answer where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); -} - -#------------------------------------------------------------------- -sub www_exportComposite { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->http->setFilename($self->session->url->escape($self->get("title")."_composite.tab"),"text/tab"); - return $self->session->db->quickTab("select b.question, c.response, a.userId, a.username, a.ipAddress, c.comment, c.dateOfResponse from Survey_response a - left join Survey_questionResponse c on a.Survey_responseId=c.Survey_responseId - left join Survey_question b on c.Survey_questionId=b.Survey_questionId - where a.Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by a.userId, a.ipAddress, b.sequenceNumber"); -} - -#------------------------------------------------------------------- -sub www_exportQuestions { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->http->setFilename($self->session->url->escape($self->get("title")."_questions.tab"),"text/tab"); - return $self->session->db->quickTab("select * from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); -} - -#------------------------------------------------------------------- -sub www_exportResponses { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->session->http->setFilename($self->session->url->escape($self->get("title")."_responses.tab"),"text/tab"); - return $self->session->db->quickTab("select * from Survey_response where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); -} - -#------------------------------------------------------------------- -sub www_moveAnswerDown { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralDown("Survey_answer","Survey_answerId",$self->session->form->process("aid"),"Survey_id"); - return $self->www_editQuestion; -} - -#------------------------------------------------------------------- -sub www_moveAnswerUp { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralUp("Survey_answer","Survey_answerId",$self->session->form->process("aid"),"Survey_id"); - return $self->www_editQuestion; -} - -#------------------------------------------------------------------- -sub www_moveQuestionDown { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralDown("Survey_question","Survey_questionId",$self->session->form->process("qid"),"Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_moveQuestionUp { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralUp("Survey_question","Survey_questionId",$self->session->form->process("qid"),"Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_moveSectionDown { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralDown("Survey_section","Survey_sectionId",$self->session->form->process("sid"),"Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_moveSectionUp { - my $self = shift; - return $self->session->privilege->insufficient() unless ($self->canEdit); - $self->moveCollateralUp("Survey_section","Survey_sectionId",$self->session->form->process("sid"),"Survey_id"); - return ""; -} - -#------------------------------------------------------------------- -sub www_respond { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToTakeSurvey"))); - #If user has not responded before, create the responseId binding the survey to this session: fdillon 7-11-07 - my $responseCount = $self->getResponseCount; - my $responseId = $self->getResponseId; - my $canRespond = ($responseCount < $self->get("maxResponsesPerUser")); - if ($canRespond && (!defined $responseId || $self->session->form->param('responseId') eq 'new')) { - $self->generateResponseId; - } - - my $varname = $self->getResponseIdString; - return "" unless ($self->session->scratch->get($varname)); - my $userId = ($self->get("anonymous")) ? substr(md5_hex($self->session->user->userId),0,8) : $self->session->user->userId; - my $terminate = 0; - foreach my $key ($self->session->form->param) { - if ($key =~ /^answerId_(.+)$/) { - my $id = $1; - my ($previousResponse) = $self->session->db->quickArray("select count(*) from Survey_questionResponse - where Survey_answerId=".$self->session->db->quote($self->session->form->process("answerId_".$id))." and Survey_responseId=".$self->session->db->quote($self->session->scratch->get($varname))); - next if ($previousResponse); - my $answer = $self->getCollateral("Survey_answer","Survey_answerId",$self->session->form->process("answerId_".$id)); - if ($self->get("questionOrder") eq "response" && $answer->{gotoQuestion} eq "") { - $terminate = 1; - } - my $response = $self->session->form->process("textResponse_".$id) || $answer->{answer}; - $self->session->db->write("insert into Survey_questionResponse (Survey_answerId,Survey_questionId,Survey_responseId,Survey_id,comment,response,dateOfResponse) values ( - ".$self->session->db->quote($answer->{Survey_answerId}).", ".$self->session->db->quote($answer->{Survey_questionId}).", ".$self->session->db->quote($self->session->scratch->get($varname)).", ".$self->session->db->quote($answer->{Survey_id}).", - ".$self->session->db->quote($self->session->form->process("comment_".$id)).", ".$self->session->db->quote($response).", ".$self->session->datetime->time().")"); - } - } - - $responseCount = $self->getQuestionResponseCount($self->session->scratch->get($varname)); - if ($terminate || $responseCount >= $self->getValue("questionsPerResponse") || $responseCount >= $self->getQuestionCount) { - $self->session->db->setRow("Survey_response","Survey_responseId",{ - isComplete=>1, - endDate=>$self->session->datetime->time(), - Survey_responseId=>$self->session->scratch->get($varname) - }); - } - $self->logView() if ($self->session->setting->get("passiveProfilingEnabled")); - return ""; -} - - -#------------------------------------------------------------------- -sub www_viewGradebook { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->logView() if ($self->session->setting->get("passiveProfilingEnabled")); - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - my $var = $self->getMenuVars; - $var->{title} = $i18n->get(71); - my $p = WebGUI::Paginator->new($self->session,$self->getUrl('func=viewGradebook')); - $p->setDataByQuery("select userId,username,ipAddress,Survey_responseId,startDate,endDate from Survey_response - where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by username,ipAddress,startDate"); - my $users = $p->getPageData; - ($var->{'question.count'}) = $self->session->db->quickArray("select count(*) from Survey_question where Survey_id=".$self->session->db->quote($self->get("Survey_id"))); - if ($var->{'question.count'} > $self->get("questionsPerResponse")) { - $var->{'question.count'} = $self->get("questionsPerResponse"); - } - $var->{'response.user.label'} = $i18n->get(67); - $var->{'response.count.label'} = $i18n->get(52); - $var->{'response.percent.label'} = $i18n->get(54); - my @responseloop; - foreach my $user (@$users) { - my ($correctCount) = $self->session->db->quickArray("select count(*) from Survey_questionResponse a left join - Survey_answer b on a.Survey_answerId=b.Survey_answerId where a.Survey_responseId=".$self->session->db->quote($user->{Survey_responseId}) - ." and b.isCorrect=1"); - push(@responseloop, { - 'response.url'=>$self->getUrl('func=viewIndividualSurvey;responseId='.$user->{Survey_responseId}), - 'response.user.name'=>($user->{userId} eq '1') ? $user->{ipAddress} : $user->{username}, - 'response.count.correct' => $correctCount, - 'response.percent' => round(($correctCount/$var->{'question.count'})*100) - }); - } - $var->{response_loop} = \@responseloop; - $p->appendTemplateVars($var); - return $self->session->style->process($self->processTemplate($var,$self->getValue("gradebookTemplateId")),$self->getValue("styleTemplateId")); -# return $self->processTemplate($self->getValue("gradebookTemplateId"),$var,"Survey/Gradebook"); -} - - -#------------------------------------------------------------------- -sub www_viewIndividualSurvey { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->logView() if ($self->session->setting->get("passiveProfilingEnabled")); - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - my $var = $self->getMenuVars; - $var->{'title'} = $i18n->get(70); - $var->{'delete.url'} = $self->getUrl('func=deleteResponse;responseId='.$self->session->form->process("responseId")); - $var->{'delete.label'} = $i18n->get(69); - my $response = $self->session->db->getRow("Survey_response","Survey_responseId",$self->session->form->process("responseId")); - $var->{'start.date.label'} = $i18n->get(76); - $var->{'start.date.epoch'} = $response->{startDate}; - $var->{'start.date.human'} =$self->session->datetime->epochToHuman($response->{startDate},"%z"); - $var->{'start.time.human'} =$self->session->datetime->epochToHuman($response->{startDate},"%Z"); - $var->{'end.date.label'} = $i18n->get(77); - $var->{'end.date.epoch'} = $response->{endDate}; - $var->{'end.date.human'} =$self->session->datetime->epochToHuman($response->{endDate},"%z"); - $var->{'end.time.human'} =$self->session->datetime->epochToHuman($response->{endDate},"%Z"); - $var->{'duration.label'} = $i18n->get(78); - $var->{'duration.minutes'} = int(($response->{end} - $response->{start})/60); - $var->{'duration.minutes.label'} = $i18n->get(79); - $var->{'duration.seconds'} = (($response->{endDate} - $response->{start})%60); - $var->{'duration.seconds.label'} = $i18n->get(80); - $var->{'answer.label'} = $i18n->get(19) if ($self->get("mode") eq "quiz"); - $var->{'response.label'} = $i18n->get(66); - $var->{'comment.label'} = $i18n->get(57); - my $questions = $self->session->db->read("select Survey_questionId,question,answerFieldType from Survey_question - where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - my @questionloop; - while (my $qdata = $questions->hashRef) { - my @aid; - my @answer; - if ($qdata->{answerFieldType} eq "radioList") { - my $sth = $self->session->db->read("select Survey_answerId,answer from Survey_answer - where Survey_questionId=".$self->session->db->quote($qdata->{Survey_questionId})." and isCorrect=1 order by sequenceNumber"); - while (my $adata = $sth->hashRef) { - push(@aid,$adata->{Survey_answerId}); - push(@answer,$adata->{answer}); - } - $sth->finish; - } - my $rdata = $self->session->db->quickHashRef("select Survey_answerId,response,comment from Survey_questionResponse - where Survey_questionId=".$self->session->db->quote($qdata->{Survey_questionId})." and Survey_responseId=".$self->session->db->quote($self->session->form->process("responseId"))); - push(@questionloop,{ - question => $qdata->{question}, - 'question.id'=>$qdata->{Survey_questionId}, - 'question.isRadioList' => ($qdata->{answerFieldType} eq "radioList"), - 'question.response' => $rdata->{response}, - 'question.comment' => $rdata->{comment}, - 'question.isCorrect' => isIn($rdata->{Survey_answerId}, @aid), - 'question.answer' => join(", ",@answer), - }); - } - $questions->finish; - $var->{question_loop} = \@questionloop; - return $self->session->style->process($self->processTemplate($var, $self->getValue("responseTemplateId")),$self->getValue("styleTemplateId")); -# return $self->processTemplate($self->getValue("responseTemplateId"),$var,"Survey/Response"); -} - -#------------------------------------------------------------------- -sub www_viewStatisticalOverview { - my $self = shift; - return "" unless ($self->session->user->isInGroup($self->get("groupToViewReports"))); - $self->logView() if ($self->session->setting->get("passiveProfilingEnabled")); - my $var = $self->getMenuVars; - my $i18n = WebGUI::International->new($self->session,'Asset_Survey'); - $var->{title} = $i18n->get(58); - my $p = WebGUI::Paginator->new($self->session,$self->getUrl('func=viewStatisticalOverview')); - $p->setDataByQuery("select Survey_questionId,question,answerFieldType,allowComment from Survey_question - where Survey_id=".$self->session->db->quote($self->get("Survey_id"))." order by sequenceNumber"); - my $questions = $p->getPageData; - my @questionloop; - $var->{'answer.label'} = $i18n->get(19); - $var->{'response.count.label'} = $i18n->get(53); - $var->{'response.percent.label'} = $i18n->get(54); - $var->{'show.responses.label'} = $i18n->get(55); - $var->{'show.comments.label'} = $i18n->get(56); - foreach my $question (@$questions) { - my @answerloop; - my ($totalResponses) = $self->session->db->quickArray("select count(*) from Survey_questionResponse where Survey_questionId=".$self->session->db->quote($question->{Survey_questionId})); - if ($question->{answerFieldType} eq "radioList") { - my $sth = $self->session->db->read("select Survey_answerId,answer,isCorrect from Survey_answer where - Survey_questionId=".$self->session->db->quote($question->{Survey_questionId})." order by sequenceNumber"); - while (my $answer = $sth->hashRef) { - my ($numResponses) = $self->session->db->quickArray("select count(*) from Survey_questionResponse where Survey_answerId=".$self->session->db->quote($answer->{Survey_answerId})); - my $responsePercent; - if ($totalResponses) { - $responsePercent = round(($numResponses/$totalResponses)*100); - } else { - $responsePercent = 0; - } - my @commentloop; - my $sth2 = $self->session->db->read("select comment from Survey_questionResponse where Survey_answerId=".$self->session->db->quote($answer->{Survey_answerId})); - while (my ($comment) = $sth2->array) { - push(@commentloop,{ - 'answer.comment'=>$comment - }); - } - $sth2->finish; - push(@answerloop,{ - 'answer.isCorrect'=>$answer->{isCorrect}, - 'answer' => $answer->{answer}, - 'answer.response.count' =>$numResponses, - 'answer.response.percent' =>$responsePercent, - 'comment_loop'=>\@commentloop - }); - } - $sth->finish; - } else { - my $sth = $self->session->db->read("select response,comment from Survey_questionResponse where Survey_questionId=".$self->session->db->quote($question->{Survey_questionId})); - while (my $response = $sth->hashRef) { - push(@answerloop,{ - 'answer.response'=>$response->{response}, - 'answer.comment'=>$response->{comment} - }); - } - $sth->finish; - } - push(@questionloop,{ - question=>$question->{question}, - 'question.id'=>$question->{Survey_questionId}, - 'question.isRadioList' => ($question->{answerFieldType} eq "radioList"), - 'question.response.total' => $totalResponses, - 'answer_loop'=>\@answerloop, - 'question.allowComment'=>$question->{allowComment} - }); - } - $var->{question_loop} = \@questionloop; - $p->appendTemplateVars($var); - - return $self->session->style->process($self->processTemplate($var, $self->getValue("overviewTemplateId")),$self->getValue("styleTemplateId")); -} - -1; - From bf4a25c20602ec9bf79018697540bc459847c1cc Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Sat, 19 Apr 2008 18:51:28 +0000 Subject: [PATCH 04/64] Importing new Survey.pm --- lib/WebGUI/Asset/Wobject/Survey.pm | 1526 ++++++++++++++++++++++++++++ 1 file changed, 1526 insertions(+) create mode 100644 lib/WebGUI/Asset/Wobject/Survey.pm diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm new file mode 100644 index 000000000..17a08150e --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -0,0 +1,1526 @@ +package WebGUI::Asset::Wobject::Survey; + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2008 Plain Black Corporation. +#------------------------------------------------------------------- +# 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::IxHash; +use JSON; +use WebGUI::International; +use WebGUI::Form::File; +use base 'WebGUI::Asset::Wobject'; +# +#------------------------------------------------------------------- +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; + my $i18n = WebGUI::International->new($session,'Asset_Survey'); + my %properties; + tie %properties, 'Tie::IxHash'; + %properties = ( + templateId =>{ + fieldType=>"template", + defaultValue=>'PBtmpl0000000000000061', + tab=>"display", + namespace=>"Survey", + hoverHelp=>"A Survey System", + label=>"Template ID" + }, + groupToTakeSurvey => { + fieldType => 'group', + defaultValue => 2, + label => "Group to take survey", + }, + groupToViewReports => { + fieldType => 'group', + defaultValue => 4, + label => "Group to view reports", + }, + exitURL => { + fieldType => 'text', + defaultValue => undef, + label => "Set the URL that the survey will exit to", + hoverHelp=>"When the user finishes the survey, they will be sent to this URL. Leave blank if no forwarding required.", + }, + maxResponsesPerUser=>{ + fieldType => 'integer', + defaultValue => 1, + label => "Max user reponses", + }, + overviewTemplateId=>{ + tab => 'display', + fieldType => 'template', + defaultValue => 'PBtmpl0000000000000063', + label => "Overview template id", + namespace => 'Survey/Overview', + }, + gradebookTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Grabebook template id", + defaultValue => 'PBtmpl0000000000000062', + namespace => 'Survey/Gradebook', + }, + responseTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Response template id", + defaultValue => 'PBtmpl0000000000000064', + namespace => 'Survey/Response', + }, + surveyEditTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Survey edit template id", + defaultValue => 'lWcFPcZOf6f84fNNKo3LGw', + namespace => 'Survey/Edit', + }, + surveyTakeTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Take survey template id", + defaultValue => 'TOCwx3VNHVmNr5eSPIAMNg', + namespace => 'Survey/Take', + }, + surveyQuestionsId => { + tab => 'display', + fieldType => 'template', + label => "Questions template id", + defaultValue => 'h0pJBF7LVqCCfWYr_g6YXQ', + namespace => 'Survey/Take', + }, + ); + + push(@{$definition}, { + assetName=>$i18n->get('assetName'), + icon=>'survey.gif', + autoGenerateForms=>1, + tableName=>'Survey', + className=>'WebGUI::Asset::Wobject::Survey', + properties=>\%properties + }); + return $class->SUPER::definition($session, $definition); +} + +#------------------------------------------------------------------- +=head2 getEditForm + +getEditForm is called when creating/editing the asset. +This overloads the normal call to the super, to call the super call like normal and then add to the tab form. + +=cut + +#sub getEditForm { +# my $self = shift; + +# my $tabform = $self->SUPER::getEditForm(@_); + +# $tabform->getTab("properties")->hidden( +# -value => "editSurvey", +# -name => 'proceed' +# ); + +# return $tabform; +# return $self->www_editSurvey(@_); +#} + + + +#------------------------------------------------------------------- +sub processPropertiesFromFormPost { + my $self = shift; + $self->SUPER::processPropertiesFromFormPost; + my $firstSection = $self->getFirstSection(); + if(! $firstSection){ + $self->insertSection( [$self->getId,$self->session->id->generate(),"First Section",1,1,"Tis is the first page",0,0,1,0,0,''] ); +# $self->insertSection( [$self->getId,$self->session->id->generate(),"Last Section",9999,0,"This is the last page",0,0] ); + } +} + + + +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub www_editSurvey { + my $self = shift; + my %var; +# my $out = $self->processStyle($self->processTemplate(\%var,$self->get("surveyEditTemplateId"))); + my $out = $self->processTemplate(\%var,$self->get("surveyEditTemplateId")); + + return $out; +} + +#------------------------------------------------------------------- +sub www_submitAnswerEdit{ + my $self = shift; + my $ref = $self->session->form->paramsHashRef(); + + if($ref->{'Survey_answerId'}){ + $self->session->db->write(" + update Survey_answer + set answerText = ?, gotoQuestion = ?, recordedAnswer = ?, isCorrect = ?, min = ?, max = ?, step = ?, verbatim = ? + where Survey_answerId = ?", + [ + $$ref{'answerText'},$$ref{'gotoQuestion'},$$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'}, + $$ref{'max'},$$ref{'step'},$$ref{'verbatim'} + ,$$ref{'Survey_answerId'} + ] + ); + }else{ + my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_answer where Survey_questionId = ?",[$ref->{'Survey_questionId'}]); + $seqNum++; + $ref->{'Survey_answerId'} = $self->session->id->generate(); + $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?)", + [ $self->getId,$$ref{'Survey_sectionId'},$$ref{'Survey_questionId'},$$ref{'Survey_answerId'},$seqNum,$$ref{'gotoQuestion'},$$ref{'answerText'}, + $$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'},$$ref{'max'},$$ref{'step'},$$ref{'verbatim'} ] + ); + } + return $self->www_loadSurvey($ref->{'Survey_sectionId'}."||||".$ref->{'Survey_questionId'}."||||".$$ref{'Survey_answerId'}); +} +#------------------------------------------------------------------- +sub www_submitQuestionEdit{ + my $self = shift; + my $ref = $self->session->form->paramsHashRef(); + + if($ref->{'Survey_questionId'}){ + my $type = $self->session->db->quickScalar("select questionType from Survey_question where Survey_questionId = ?",[$ref->{'Survey_questionId'}]); + + $self->session->db->write(" + update Survey_question + set questionText = ?, allowComment = ?, randomizeAnswers = ?, questionType = ?, randomizedWords = ?, previousAnswerWords = ?, verticalDisplay = ?, + required = ?, maxAnswers = ?, questionVariable = ?, points = ? + where Survey_questionId = ?", + [ + $$ref{'questionText'},$$ref{'allowComment'},$$ref{'randomizeAnswers'},$$ref{'questionType'},$$ref{'randomizedWords'}, + $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'questionVariable'}, $$ref{'points'}, + $$ref{'Survey_questionId'} + ] + ); + +$self->session->errorHandler->warn("questionVariable was ".$$ref{'questionVariable'}); + if($type ne $ref->{'questionType'}){ + $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); + } + + }else{ + my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$ref->{'Survey_sectionId'}]); + $seqNum++; + $ref->{'Survey_questionId'} = $self->session->id->generate(); + $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'randomizeAnswers'}, + $$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'},$$ref{'previousAnswerWords'},$$ref{'verticalDisplay'}, + $$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'} ] + ); + + $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); + } + return $self->www_loadSurvey($ref->{'Survey_sectionId'}."||||".$ref->{'Survey_questionId'}); +} + + +#------------------------------------------------------------------- +sub www_submitSectionEdit{ + my $self = shift; + + my $p = $self->session->form->paramsHashRef(); + if(!$p->{'Survey_sectionId'}){ + my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_section where assetId = ?",[$self->getId]); + my $id = $self->session->id->generate(); + + $self->insertSection([$self->getId, $id, $p->{'sectionName'},$seqNum+1,$p->{'questionsPerPage'},$p->{'sectionText'},$p->{'randomizeQuestions'}, + $p->{'questionsOnSectionPage'}, $p->{'everyPageTitle'},$p->{'everyPageText'},$p->{'terminal'},$p->{'terminalURL'}]); + + $p->{'Survey_sectionId'} = $id; + + }else{ + + $self->session->db->write("update Survey_section set sectionName = ?, questionsPerPage = ?, sectionText = ?, randomizeQuestions = ?, questionsOnSectionPage = ?, + everyPageTitle = ?, everyPageText = ?,terminal = ?, terminalURL = ? + where Survey_sectionId = ?", + [ $p->{'sectionName'}, $p->{'questionsPerPage'}, $p->{'sectionText'}, $p->{'randomizeQuestions'}, $p->{'questionsOnSectionPage'},$p->{'everyPageTitle'}, + $p->{'everyPageText'}, $p->{'terminal'}, $p->{'terminalURL'}, + $p->{'Survey_sectionId'} ] + ); + +$self->session->errorHandler->warn("here"); + } + use Data::Dumper; + $self->session->errorHandler->warn(Dumper $p); + return $self->www_loadSurvey($p->{'Survey_sectionId'}); +} + + +#------------------------------------------------------------------- +sub www_newAnswer{ + my $self = shift; + my ($sid,$qid) = @{decode_json($self->session->form->process("data"))}; +$self->session->errorHandler->warn("NEW ANSWER ".$sid."\t\t".$qid); + + my $id = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_answer where Survey_questionId = ?",[$qid]); + if(!$id){$id = 1;}else{$id++;} + my $edit; + $edit->{'type'} = 'loadAnswer'; + $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId',$qid, 'Survey_answerId','', 'sequenceNumber', $id, 'gotoQuestion','', + 'answerText','','recordedAnswer','','isCorrect',1,'min',1,'max',10,'step',1,'verbatim',0 }; + $sid .= "||||".$qid; + return $self->www_loadSurvey($sid,$edit); +} + + +#------------------------------------------------------------------- +sub www_newQuestion{ + my $self = shift; + my $sid = $self->session->form->process("data"); + + my $id = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$sid]); + if(!$id){$id = 1;}else{$id++;} +$self->session->errorHandler->warn("MAX SeqNumber was $id"); + my $edit; + $edit->{'type'} = 'loadQuestion'; + $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId','', 'questionText','', 'sequenceNumber', $id, + 'allowComment',0, 'randomizeAnswers',0, 'questionType',1, 'required',0,'randomizedWords','','previousAnswerWords','','verticalDisplay',0,'maxAnswers','1', + 'questionVariable','' }; + return $self->www_loadSurvey($sid,$edit); +} + + +#------------------------------------------------------------------- +sub www_newSection{ + my $self = shift; + my $last = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_section where assetId = ?",[$self->getId]); + my $focus = ''; + my $edit; + $edit->{'type'} = 'loadSection'; + $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $focus, 'sectionName', 'New Section', 'sequenceNumber', ++$last, + 'questionsPerPage',1, 'sectionText', 'Text goes here', 'randomizeQuestions',0, 'questionsOnSectionPage', 0, 'everyPageTitle',1,'everyPageText',0,'terminal',0}; + return $self->www_loadSurvey('',$edit); +} + + + +#------------------------------------------------------------------- +sub www_deleteAnswer{ + my $self = shift; + my $id = $self->session->form->process("data"); + my $ref = $self->session->db->quickHashRef("select Survey_sectionId,Survey_questionId,sequenceNumber from Survey_answer where Survey_answerId = ?",[$id]); + $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber -1 where Survey_questionId = ? and sequenceNumber > ?", + [$$ref{'Survey_questionId'},$$ref{'sequenceNumber'}]); + $self->session->db->write("delete from Survey_answer where Survey_answerId = ?",[$id]); + return $self->www_loadSurvey($$ref{'Survey_sectionId'}."||||".$$ref{'Survey_questionId'}); +} +sub www_deleteQuestion{ + my $self = shift; + my $id = $self->session->form->process("data"); + my $ref = $self->session->db->quickHashRef("select Survey_sectionId,sequenceNumber from Survey_question where Survey_questionId = ?",[$id]); + + $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber -1 where Survey_sectionId = ? and sequenceNumber > ?", + [$$ref{'Survey_sectionId'},$$ref{'sequenceNumber'}]); + + $self->session->db->write("delete from Survey_question where Survey_questionId = ?",[$id]); + $self->session->db->write("delete from Survey_answer where Survey_questionId = ?",[$id]); + return $self->www_loadSurvey($$ref{'Survey_sectionId'}); +} +sub www_deleteSection{ + my $self = shift; + my $id = $self->session->form->process("data"); + + my $seq = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$id]); + + $self->session->db->write("update Survey_section set sequenceNumber = sequenceNumber -1 where assetId= ? and sequenceNumber > ?", + [$self->getId(),$seq]); + + $self->session->db->write("delete from Survey_answer where Survey_sectionId = ?",[$id]); + $self->session->db->write("delete from Survey_question where Survey_sectionId = ?",[$id]); + $self->session->db->write("delete from Survey_section where Survey_sectionId = ?",[$id]); + return $self->www_loadSurvey('undefined');#faking an empty JS entry +} + + + + +#------------------------------------------------------------------- +sub www_dragDrop{ + my $self = shift; + my $p = decode_json($self->session->form->process("data")); + + my $target = $p->{'target'};#The item moved + my $before = $p->{'before'};#The item directly in front of it, empty for first in list + + if($target->{'type'} eq 'section'){ + my $pid; + + my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$target->{'id'}]); + + if($before->{'id'} eq ''){#before doens't exist, object was moved to the front + $self->session->db->write("update Survey_section set sequenceNumber = sequenceNumber +1 where sequenceNumber < ? and assetId = ?",[$tseqNum,$self->getId]); + $self->session->db->write("update Survey_section set sequenceNumber = 1 where Survey_sectionId = ?",[$target->{'id'}]); + }else{#before exists + $pid = $before->{'id'}; + if($before->{'type'} eq 'question'){ + $pid = my $section = $self->session->db->quickScalar("select Survey_sectionId from Survey_question where Survey_questionId = ?",[$before->{'id'}]); + } + elsif($before->{'type'} eq 'answer'){ + $pid = my $section = $self->session->db->quickScalar(" + select sq.Survey_sectionId + from Survey_answer as, Survey_question sq + where sa.Survey_answerId = ? and sa.Survey_questionId = sq.Survey_questionId", + [$before->{'id'}]); + } + my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$pid]); + if($tseqNum > $bseqNum){ + $self->session->db->write(" + update Survey_section + set sequenceNumber = sequenceNumber+1 + where sequenceNumber > ? and sequenceNumber < ? and assetId = ?",[$bseqNum, $tseqNum,$self->getId]); + $self->session->db->write("update Survey_section set sequenceNumber = ? where Survey_sectionId = ?",[$bseqNum+1,$target->{'id'}]); + }elsif($bseqNum > $tseqNum){ + $self->session->db->write(" + update Survey_section + set sequenceNumber = sequenceNumber-1 + where sequenceNumber > ? and sequenceNumber <= ? and assetId = ?",[$tseqNum, $bseqNum,$self->getId]); + $self->session->db->write("update Survey_section set sequenceNumber = ? where Survey_sectionId = ?",[$bseqNum,$target->{'id'}]); + } + } + + + } + + elsif($target->{'type'} eq 'question'){ + if($before->{'id'} ne ''){ + my @tids = split(/\|\|\|\|/,$target->{'id'}); + my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$tids[1]]); + if($before->{'type'} eq 'section' and $before->{'id'} eq $tids[0]){#moved to front of section question belongs to + $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber +1 where sequenceNumber < ? and Survey_sectionId = ?", + [$tseqNum,$tids[0]]); + $self->session->db->write("update Survey_question set sequenceNumber = 1 where Survey_questionId = ?",[$tids[1]]); + } + elsif($before->{'type'} eq 'section' and $before->{'id'} ne $tids[0]){#question moved to new section + #move down 1 seqnumber all questions higher up in section + $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber - 1 where sequenceNumber > ? and Survey_sectionId = ?", + [$tseqNum,$tids[0]]); + #append question to last question in new section + my $lastSeq = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$$before{'id'}]); + $self->session->db->write("update Survey_question set Survey_sectionId = ?, sequenceNumber = ? where Survey_questionId = ?", + [ $$before{'id'}, $lastSeq + 1, $tids[1] ]); + $target->{'id'} = $before->{'id'}."||||".$tids[1]; + } + elsif($before->{'type'} eq 'question'){#will always have the same sectionid. + my @bids = split(/\|\|\|\|/,$before->{'id'}); + my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$bids[1]]); + if($bseqNum > $tseqNum){#target was in front of before so before + all in between moved up + $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber - 1 where sequenceNumber > ? and + sequenceNumber <= ? and Survey_sectionId = ?",[$tseqNum,$bseqNum,$tids[0]]); + $self->session->db->write("update Survey_question set sequenceNumber = ? where Survey_questionId = ?",[$bseqNum,$tids[1]]); + }else{ + $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber + 1 where sequenceNumber > ? and + sequenceNumber < ? and Survey_sectionId = ?",[$bseqNum,$tseqNum,$tids[0]]); + $self->session->db->write("update Survey_question set sequenceNumber = ? where Survey_questionId = ?",[$bseqNum+1,$tids[1]]); + } + + } + } + } + + else{#is an answer + + my @tids = split(/\|\|\|\|/,$target->{'id'}); + my @bids = split(/\|\|\|\|/,$before->{'id'}); + my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_answer where Survey_answerId = ?",[$tids[2]]); + if($before->{'type'} eq 'question' and $bids[1] eq $tids[1]){#answer has been moved to the front + $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber + 1 where Survey_questionId = ? and sequenceNumber < ?",[$tids[1],$tseqNum]); + $self->session->db->write("update Survey_answer set sequenceNumber = 1 where Survey_answerId = ?",[$tids[2]]); + }elsif($before->{'type'} eq 'answer'){#will always be in the same quesiton + my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_answer where Survey_answerId = ?",[$bids[2]]); + if($tseqNum > $bseqNum){ + $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber + 1 where Survey_questionId = ? + and sequenceNumber > ? and sequenceNumber < ?",[$tids[1],$bseqNum,$tseqNum]); + $self->session->db->write("update Survey_answer set sequenceNumber = ? + 1 where Survey_answerId = ?",[$bseqNum,$tids[2]]); + }else{ + $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber - 1 where Survey_questionId = ? + and sequenceNumber <= ? and sequenceNumber > ?",[$tids[1],$bseqNum,$tseqNum]); + $self->session->db->write("update Survey_answer set sequenceNumber = ? where Survey_answerId = ?",[$bseqNum,$tids[2]]); + } + } + } + + return $self->www_loadSurvey($target->{'id'}); +} + + +#------------------------------------------------------------------- +sub www_loadSurvey{ + my $self = shift; + my $p = shift;#The id of the the object(s) in focus, can be empty. + my $edit = shift;#If edit data has already been generated and does not need to be grabbed for the focus id, usually is empty. + + if(!$p){ + $p = $self->session->form->process("data"); + } + + my $focus;#Survey object that has the focus + + if($p eq "undefined"){ + $focus = $self->getFirstSection(); + }else{$focus = $p;} + + my @dfocus = split(/\|\|\|\|/,$focus); + + my $sections = $self->getSections(); + my $questions = $self->getQuestions($dfocus[0]);#pass in the section + my $answers = $self->getAnswers($dfocus[1]);#pass in the question + + + if(! $edit){ + if($#dfocus == 0){ + $edit->{"type"} = "loadSection"; + $edit->{"params"} = $self->getSpecificSection($dfocus[0]); + #get specific data/edit template for section + }elsif($#dfocus == 1){ + $edit->{"type"} = "loadQuestion"; + $edit->{"params"} = $self->getSpecificQuestion($dfocus[1]); + #get specific data/edit template for question + }elsif($#dfocus == 2){ + $edit->{"type"} = "loadAnswer"; + $edit->{"params"} = $self->getSpecificAnswer($dfocus[2]); + #get specific data/edit template for answer + } + } + + my @data; + foreach my $s(@$sections){ + push( @data, { "type","section","text",$s->{"sectionName"},"id",$s->{'Survey_sectionId'} } ); + if($#$questions >= 0 and $questions->[0]->{'Survey_sectionId'} eq $s->{'Survey_sectionId'}){ + foreach my $q(@$questions){ + push( @data, { "type","question","text",$q->{"text"},"id",$q->{'Survey_questionId'} } ); + if($#$answers >= 0 and $answers->[0]->{'Survey_questionId'} eq $q->{'Survey_questionId'}){ + foreach my $a(@$answers){ + push( @data, { "type","answer","text",$a->{"text"},"id",$a->{'Survey_answerId'}, "recorded", $a->{'recordedAnswer'} } ); + } + } + } + } + } + + my $return = {"focus",$focus,"data",\@data,"edit",$edit}; +# $self->session->errorHandler->warn(encode_json($return)); + return encode_json($return); +} + +#------------------------------------------------------------------- +sub getSpecificSection{ + my $self = shift; + my $Id = shift; + return $self->session->db->quickHashRef( + "select * from Survey_section where Survey_sectionId = ?", + [ $Id ]); +} +#------------------------------------------------------------------- +sub getSpecificQuestion{ + my $self = shift; + my $Id = shift; + return $self->session->db->quickHashRef( + "select * from Survey_question where Survey_questionId = ?", + [ $Id ]); +} +#------------------------------------------------------------------- +sub getSpecificAnswer{ + my $self = shift; + my $Id = shift; + return $self->session->db->quickHashRef( + "select * from Survey_answer where Survey_answerId = ?", + [ $Id ]); +} + +#------------------------------------------------------------------- +sub getAnswers{ + my $self = shift; + my $qId = shift; + if(! $qId){ return;} + return $self->session->db->buildArrayRefOfHashRefs( + "select substr(answerText,1,40) as text, Survey_answerId, Survey_questionId + from Survey_answer + where Survey_questionId = ? + order by sequenceNumber ASC" + ,[ $qId ]); +} + +#------------------------------------------------------------------- +sub getQuestions{ + my $self = shift; + my $sId = shift; + if(! $sId){ return;} + return $self->session->db->buildArrayRefOfHashRefs( + "select substr(questionText,1,40) as text, Survey_questionId, Survey_sectionId + from Survey_question + where Survey_sectionId = ? + order by sequenceNumber ASC" + ,[ $sId ]); +} + + + + +#------------------------------------------------------------------- +sub getSections{ + my $self = shift; + return $self->session->db->buildArrayRefOfHashRefs( + "select Survey_sectionId, sectionName + from Survey_section + where assetId = ? + order by sequenceNumber ASC" + ,[ $self->getId() ]); +} + +#------------------------------------------------------------------- +sub getFirstSection{ + my $self = shift; + $self->session->errorHandler->warn("In get first section with assid as ".$self->getId()); + return $self->session->db->quickScalar( + "select Survey_sectionId from Survey_section where assetId = ? order by sequenceNumber asc", + [ $self->getId() ]); +} + +#------------------------------------------------------------------- +sub insertSection{ + my $self = shift; + my $data = shift;#array ref + $self->session->db->write("insert into Survey_section values(?,?,?,?,?,?,?,?,?,?,?,?)",$data); +} + + +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $templateId = $self->get("templateId"); + if ($self->session->form->process("overrideTemplateId") ne "") { + $templateId = $self->session->form->process("overrideTemplateId"); + } + my $template = WebGUI::Asset::Template->new($self->session, $templateId); + $template->prepare; + $self->{_viewTemplate} = $template; +} + +#------------------------------------------------------------------- + +sub purge { + my $self = shift; + $self->session->db->write("delete from Survey_answer where assetId = ?",[$self->getId()]); + $self->session->db->write("delete from Survey_question where assetId = ?",[$self->getId()]); + $self->session->db->write("delete from Survey_section where assetId = ?",[$self->getId()]); + $self->session->db->write("delete from Survey_response where assetId = ?",[$self->getId()]); + $self->session->db->write("delete from Survey_questionResponse where assetId = ?",[$self->getId()]); + return $self->SUPER::purge; +} + +#------------------------------------------------------------------- + +=head2 purgeCache ( ) + +See WebGUI::Asset::purgeCache() for details. + +=cut + +sub purgeCache { + my $self = shift; + WebGUI::Cache->new($self->session,"view_".$self->getId)->delete; + $self->SUPER::purgeCache; +} + +#------------------------------------------------------------------- + +sub purgeRevision { + my $self = shift; + return $self->SUPER::purgeRevision; +} + +#------------------------------------------------------------------- + +=head2 view ( ) + +view defines all template variables, processes the template and +returns the output. + +=cut + +sub view { + my $self = shift; + my %var; + $var{'edit_survey_url'} = $self->getUrl('func=editSurvey'); + $var{'take_survey_url'} = $self->getUrl('func=takeSurvey'); + $var{'user_canTakeSurvey'} = $self->session->user->isInGroup($self->get("groupToTakeSurvey")); + + $var{'user_canTakeSurvey'} = 1; + + my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate}); + + return $out; +} + + +#------------------------------------------------------------------- + +=head2 www_view ( ) + +See WebGUI::Asset::Wobject::www_view() for details. + +=cut + +sub www_view { + my $self = shift; + $self->SUPER::www_view(@_); +} + + +#------------------------------------------------------------------- +sub www_takeSurvey{ + my $self = shift; + my %var; +$self->session->errorHandler->warn("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); +# my $out = $self->processStyle($self->processTemplate(\%var,$self->get("surveyEditTemplateId"))); + my $out = $self->processTemplate(\%var,$self->get("surveyTakeTemplateId")); + my $responseId = $self->getResponseId(); +# if(!$responseId){return $self->surveyEnd();} + return $out; +} + + + + + +#handles questions that were submitted +#------------------------------------------------------------------- +sub www_submitQuestions{ + my $self=shift; + #can user take survey + if(!$self->canTakeSurvey()){ + # return encode_json({"type","FAIL LOGIN"}); + return $self->surveyEnd(); + } + + my $responseId = $self->getResponseId(); + if(!$responseId){return $self->surveyEnd();} + + $self->session->errorHandler->warn("\n\nIn submitQuestions with reponseId $responseId"); + +####If we get back only a section id but with no questions, we need to move to the next section + my $responses = $self->session->form->paramsHashRef(); + +# if((scalar keys %$responses) < 3){#func and section are the first two +# return $self->www_loadQuestions($responseId, $$responses{'section'}); +# } + + delete $$responses{'func'}; + + #list of responses with values +# my @goodResponses = grep($$responses{$_} =~ /[\d\w]/,keys %$responses); +########### + +# GO THROUGH ALL RESPONSES LOOKING FOR VERBATIMS AND ADD THEM ACCORDINGLY + +####### + my @goodResponses = keys %$responses;#load everything. Responses without values were skipped, so don't jump on them and remember that in reports + + if(@goodResponses == 0){##nothing to load + return $self->www_loadQuestions($responseId); + } + + my $sql = "select max(answerOrder) from Survey_questionResponse where Survey_responseId = ?"; + my $lastOrder = $self->session->db->quickScalar($sql, [$responseId]); + + if(!$lastOrder){$lastOrder = 0;} + + #get order of responses + my $orderOf = $self->session->db->buildArrayRefOfHashRefs("select distinct(a.Survey_answerId), q.questionType + from Survey_answer a, Survey_question q where a.Survey_answerId in (". + (join (',',map("?",@goodResponses))). + ") and a.Survey_questionId = q.Survey_questionId order by q.sequenceNumber ASC", + \@goodResponses); + + my $files = 0; + + for my $id(@$orderOf){ + #if a file upload, write to disk + my $path; + if($id->{'questionType'} eq 'File Upload'){ + $files = 1; + my $storage = WebGUI::Storage->create($self->session); + my $filename = $storage->addFileFromFormPost( $id->{'Survey_answerId'} ); + $path = $storage->getPath($filename); + } + $self->session->db->write("insert into Survey_questionResponse + select ?, Survey_sectionId, Survey_questionId, Survey_answerId, ?, ?, ?, now(), ?, ? from Survey_answer where Survey_answerId = ?", + [$self->getId(), $responseId, $$responses{ $id->{'Survey_answerId'} }, '', $path, ++$lastOrder, $id->{'Survey_answerId'}]); + } + if($files){ + ##special case, need to check for more questions in section, if not, more current up one + my $lastA = $self->getLastAnswerInfo($responseId); + my $questionId = $self->getNextQuestionId($lastA->{'Survey_questionId'}); + if(!$questionId){ + my $currentSection = $self->getCurrentSection($responseId); + $currentSection = $self->getNextSection($currentSection); + if($currentSection){ + $self->setCurrentSection($responseId,$currentSection); + } + } + return; + } + return $self->www_loadQuestions($responseId); +} + + + + + + +#finds the questions to display next and builds the data structre to hold them +#------------------------------------------------------------------- +sub www_loadQuestions{ + my $self=shift; + my $responseId = shift; + + $self->session->errorHandler->warn("\n\n\n\n\t\t\t\t\t\t\t\t\t---In loadQuestions with responseId $responseId"); + + if(!$self->canTakeSurvey()){ + return $self->surveyEnd(); +# return encode_json({"type","FAIL LOGIN"}); + } + + my $fromSubmit = 0; + + if($responseId){ +$self->session->errorHandler->warn("Setting fromSubmit to true"); + $fromSubmit = 1; + }else{ + $responseId = $self->getResponseId(); + if(!$responseId){ + return $self->surveyEnd(); + } + } + + my $currentSection = $self->getCurrentSection($responseId); + if(!$currentSection){ + $currentSection = $self->getFirstSection(); + } + +$self->session->errorHandler->warn("Current Section is $currentSection"); + + my $lastAfj = $self->getLastAnswerInfoForJump($responseId); + +$self->session->errorHandler->warn("Last Answer for jump was for section: ".$lastAfj->{'Survey_sectionId'}); + + if(exists $lastAfj->{'Survey_sectionId'} and $lastAfj->{'Survey_sectionId'} eq $currentSection){ + my ($sectionId,$questionId) = $self->getJumpTo($lastAfj->{'Survey_answerId'}); + if($sectionId){ + my $section = $self->getSpecificSection($sectionId); + my $questions = $self->getQuestionsAndAnswers($section,$questionId); + $self->setCurrentSection($responseId,$sectionId); +$self->session->errorHandler->warn("Jump"); + return $self->showQuestions($section,$questions); + } + } +$self->session->errorHandler->warn("No Jump"); + + + my ($section,$questions,$questionId); + + my $lastA = $self->getLastAnswerInfo($responseId); +$self->session->errorHandler->warn("Last Answer was for section: ".$lastA->{'Survey_sectionId'}); + + #if we're called from submit, see if there are anymore questions in section, show them, else go to next section. If not called, then show this section. + $section = $self->getSpecificSection($currentSection); + if(exists $lastA->{'Survey_sectionId'} and $lastA->{'Survey_sectionId'} eq $currentSection){ + $questionId = $self->getNextQuestionId($lastA->{'Survey_questionId'}); + } + + if($section->{'randomizeQuestions'} and $self->sectionHasQuestions($section->{'Survey_sectionId'})){#check to see if any questions are left in section to ask +$self->session->errorHandler->warn("Random Questions Section ".$section->{'sequenceNumber'}); + my $questionsAnsweredInSection = $self->questionsAnsweredInSection($section->{'Survey_sectionId'},$responseId); + my $questionsInSection = $self->questionsInSection($section->{'Survey_sectionId'}); + if($questionsInSection == $questionsAnsweredInSection){ +$self->session->errorHandler->warn("1"); + if($section->{'terminal'}){ +$self->session->errorHandler->warn("1-1"); + return $self->surveyEnd($responseId,$section->{'terminalURL'}); + } + my $nextSection = $self->getNextSection($section->{'Survey_sectionId'}); + if(! $nextSection){ +$self->session->errorHandler->warn("1-2"); + return $self->surveyEnd($responseId,$section->{'terminalURL'}); + }else{ +$self->session->errorHandler->warn("1-3"); + $self->setCurrentSection($responseId,$nextSection); + return $self->www_loadQuestions();#We don't pass in the responseId so that it we think it is refresh and are not looking for previous questions in this section + } + } +$self->session->errorHandler->warn("2"); + $questions = $self->getRandomQuestionsAndAnswers($section,$responseId); + } + elsif($fromSubmit){ +$self->session->errorHandler->warn("Not Random"); + if(!$questionId and $section->{'terminal'}){ +$self->session->errorHandler->warn("1"); + return $self->surveyEnd($responseId,$section->{'terminalURL'}); + }elsif(!$questionId){ +$self->session->errorHandler->warn("2"); + $currentSection = $self->getNextSection($currentSection); + if(!$currentSection){ +$self->session->errorHandler->warn("2-2 with $responseId"); + return $self->surveyEnd($responseId,$section->{'terminalURL'}); + }else{ +$self->session->errorHandler->warn("2-3"); + $section = $self->getSpecificSection($currentSection); + $questions = $self->getQuestionsAndAnswers($section); + } + }else{ +$self->session->errorHandler->warn("3"); + $section = $self->getSpecificSection($currentSection); + $questions = $self->getQuestionsAndAnswers($section,$questionId); + } + }else{ +$self->session->errorHandler->warn("4"); + if($questionId){ +$self->session->errorHandler->warn("4-5"); + $questions = $self->getQuestionsAndAnswers($section,$questionId); + }else{ +$self->session->errorHandler->warn("4-6"); + $questions = $self->getQuestionsAndAnswers($section); + } + if($self->sectionHasQuestions($currentSection) and @$questions == 0){ +$self->session->errorHandler->warn("5"); + if($section->{'terminal'}){ +$self->session->errorHandler->warn("5-1"); + return $self->surveyEnd($responseId,$section->{'terminalURL'}); + } +$self->session->errorHandler->warn("5-2"); + $currentSection = $self->getNextSection($currentSection); + $section = $self->getSpecificSection($currentSection); + $questions = $self->getQuestionsAndAnswers($section); + } + } + +$self->session->errorHandler->warn("6"); + $self->setCurrentSection($responseId,$currentSection); + return $self->showQuestions($section,$questions); + +} + + + + +sub sectionHasQuestions{ + my $self=shift; + my $sectionId = shift; + return $self->session->db->quickScalar("select '1' from Survey_question where Survey_sectionId = ? limit 1",[$sectionId]); +} + +#called when the survey is over. +sub surveyEnd{ + my $self = shift; + my $responseId = shift; + my $url = shift; +$self->session->errorHandler->warn("--SurveyEnd There wasn't a responseId $responseId"); +# $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]); + $self->session->db->setRow("Survey_response","Survey_responseId",{ + Survey_responseId=>$responseId, + endDate=>WebGUI::DateTime->now->toDatabase, + isComplete=>1 + }); + if($url !~ /\w/){ $url = 0; } + if($url eq "undefined"){ $url = 0; } + if(!$url){ + $url = $self->session->db->quickScalar("select exitURL from Survey where assetId = ? order by revisionDate desc limit 1",[$self->getId()]); + if(!$url){ + $url = "/"; + } + } +$self->session->errorHandler->warn("-------SurveyEnd $url"); + return encode_json({"type","forward","url",$url}); +} + + + +#sends the processed template and questions structure to the client +sub showQuestions{ + my ($self,$section,$questions) = @_; + my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1,'Agree/Disagree',1,'Oppose/Support',1,'Importance',1, + 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1,'Effectiveness',1,'Concern',1,'Risk',1,'Threat',1,'Security',1,'Ideology',1, + 'Race',1,'Party',1,'Education',1); + my %text = ('Text',1, 'Email',1, 'Phone Number',1, 'Text Date',1, 'Currency',1); + my %slider = ('Slider',1, 'Dual Slider - Range',1, 'Multi Slider - Allocate',1); + my %dateType = ('Date',1,'Date Range',1); + my %fileUpload = ('File Upload',1); + my %hidden = ('Hidden',1); + + foreach my $q(@$questions){ + + if($fileUpload{$$q{'questionType'}}){ $q->{'fileLoader'} = 1; } + elsif($text{$$q{'questionType'}}){ $q->{'text'} = 1; } + elsif($multipleChoice{$$q{'questionType'}}){ + $q->{'multipleChoice'} = 1; + if($$q{'maxAnswers'} > 1){ + $q->{'maxMoreOne'} = 1; + } + } + elsif($dateType{$$q{'questionType'}}){ + $q->{'dateType'} = 1; + } + elsif($slider{$$q{'questionType'}}){ + $q->{'slider'} = 1; + if($$q{'questionType'} eq 'Dual Slider - Range'){ + $q->{'dualSlider'} = 1; + $q->{'a1'} = [$q->{'answers'}->[0]]; + $q->{'a2'} = [$q->{'answers'}->[1]]; + } + } + + if($$q{'verticalDisplay'}){ $$q{'verts'} = "

      "; $$q{'verte'} = "

      "; } + } + + $section->{'questions'} = $questions; + my $survey = $self->get('surveyQuestionsId'); + +#$self->session->errorHandler->warn(Dumper $section); +#$self->session->errorHandler->warn(Dumper $survey); + my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); + +use Data::Dumper; +$self->session->errorHandler->warn("Sending Back"); +#$self->session->errorHandler->warn("$out"); + + return encode_json({"type","displayquestions","section",$section,"questions",$questions,"html",$out}); +} + + + +sub test{ + my $self = shift; + my $p = 'lkasjdflkashg,lkasdjfalskfdlkjasfh'; + my $ref = $self->session->db->buildArrayRefOfHashRefs("select s.sequenceNumber, q.sequenceNumber as 'qseq' from Survey_section s, Survey_question q where s.Survey_sectionId = q.Survey_sectionId and s.sequenceNumber not in (?)",[$p]); + use Data::Dumper; +$self->session->errorHandler->warn(Dumper $ref); +} + +sub getRandomQuestionsAndAnswers{ + my ($self,$section,$responseId) = @_; + my @completed = $self->session->db->buildArray("select Survey_questionId from Survey_questionResponse where Survey_sectionId = ? and Survey_responseId = ?", + [$section->{'Survey_sectionId'},$responseId]); + my $placeHolders; +$self->session->errorHandler->warn('In get random questions'); + my @params; + if(@completed > 0){ + map($placeHolders .= "?,",@completed); + chop($placeHolders);#get rid of trailing comma + }else{ + $placeHolders = "?"; + push(@completed,''); + } +$self->session->errorHandler->warn($placeHolders); + +$self->session->errorHandler->warn('Random build survey section'.$section->{'Survey_sectionId'}); + push(@params,$section->{'Survey_sectionId'}); + push(@params, @completed); + push(@params,$section->{'questionsPerPage'}); +$self->session->errorHandler->warn(join(',',@params)); + + my $questions = $self->session->db->buildArrayRefOfHashRefs(" + select q.* + from Survey_question q + where q.Survey_sectionId = ? and q.Survey_questionId not in ($placeHolders) + order by RAND() + LIMIT ? + ",\@params); + for(my $i=0; $i<=$#$questions; $i++){ + $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs(" + select a.* + from Survey_answer a + where a.Survey_questionId = ? + order by a.sequenceNumber ASC + ",[$$questions[$i]{'Survey_questionId'}]); + } +use Data::Dumper; +$self->session->errorHandler->warn(Dumper $questions); + + return $questions; + + +} +sub getQuestionsAndAnswers{ + my ($self,$section,$questionId) = @_; + my $qNeeded = $section->{'questionsPerPage'}; + my $ref; + my $seqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$questionId]); + if(!$seqNum){$seqNum = 1;} +$self->session->errorHandler->warn("getQuestionsAndAnwers seqnum: $seqNum\tsectionid: ".$section->{'Survey_sectionId'}); + my $questions = $self->session->db->buildArrayRefOfHashRefs(" + select q.* + from Survey_question q + where q.Survey_sectionId = ? and q.sequenceNumber >= ? and q.sequenceNumber < ? + order by q.sequenceNumber ASC + ",[$section->{'Survey_sectionId'},$seqNum,$seqNum+$section->{'questionsPerPage'}]); + + for(my $i=0; $i<=$#$questions; $i++){ + $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs(" + select a.* + from Survey_answer a + where a.Survey_questionId = ? + order by a.sequenceNumber ASC + ",[$$questions[$i]{'Survey_questionId'}]); + } + return $questions; + + +} + +sub getNextQuestionId{ + my ($self,$qid) = @_; + return $self->session->db->quickScalar("select q1.Survey_questionId from Survey_question q, Survey_question q1 + where q.Survey_questionId = ? and q.assetId = q1.assetId and q.Survey_sectionId = q1.Survey_sectionId and q.sequenceNumber + 1 = q1.sequenceNumber", + [$qid]); +} + +sub getNextRandomQuestions{ + my ($self,$section,$questions) = @_; +} + +sub getNextSection{ + my ($self,$sid) = @_; + return $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s, Survey_section s1 + where s.assetId = ? and s.Survey_sectionId = ? and s1.assetId = ? and s1.sequenceNumber = s.sequenceNumber + 1", + [$self->getId(), $sid, $self->getId()]); +} +sub questionsAnsweredInSection{ + my ($self,$sid,$rid) = @_; + return $self->session->db->quickScalar("select count(distinct(Survey_questionId)) + from Survey_questionResponse where Survey_responseId = ? and Survey_sectionId = ?",[$rid,$sid]); +} + +sub questionsInSection{ + my ($self,$sid) = @_; + return $self->session->db->quickScalar("select count(*) from Survey_question where Survey_sectionId = ?",[$sid]); +} + +#last answer not skipped +sub getLastAnswerInfoForJump{ + my ($self,$rId) = @_; + return $self->session->db->quickHashRef(" + select r.Survey_sectionId, r.Survey_questionId, r.Survey_answerId,q.sequenceNumber + from Survey_section s, Survey_question q, Survey_answer a, Survey_questionResponse r + where r.Survey_responseId = ? and r.Survey_answerId = a.Survey_answerId and a.Survey_questionId = q.Survey_questionId and r.response != '' and + q.Survey_sectionId = s.Survey_sectionId and r.answerOrder = (select max(r1.answerOrder) from Survey_questionResponse r1 where r1.Survey_responseId = ? + and r1.response != '') LIMIT 1", + [$rId,$rId]); +} +#last answer, skipped or not +sub getLastAnswerInfo{ + my ($self,$rId) = @_; + return $self->session->db->quickHashRef(" + select r.Survey_sectionId, r.Survey_questionId, r.Survey_answerId,q.sequenceNumber + from Survey_section s, Survey_question q, Survey_answer a, Survey_questionResponse r + where r.Survey_responseId = ? and r.Survey_answerId = a.Survey_answerId and a.Survey_questionId = q.Survey_questionId and + q.Survey_sectionId = s.Survey_sectionId and r.answerOrder = (select max(r1.answerOrder) from Survey_questionResponse r1 where r1.Survey_responseId = ?) LIMIT 1", + [$rId,$rId]); +} + +sub getJumpTo{ + my ($self,$aId) = @_; + my $string = $self->session->db->quickScalar("select gotoQuestion from Survey_answer where Survey_answerId = ?",[$aId]); + if($string !~ /\w/ or $string eq "undefined"){ +$self->session->errorHandler->warn("No string or undefined $string"); + return; + } + my @array = split/\s*\,\s*/,$string; + + my $picked = int(rand(scalar @array)); + +$self->session->errorHandler->warn("Jupm was ".$array[$picked]." and picked was $picked"); + my $ref = $self->session->db->buildArrayRefOfHashRefs(" + select Survey_sectionId, Survey_questionId + from Survey_question + where questionVariable = ? + ",[$array[$picked]]); + if(@$ref > 0){ +$self->session->errorHandler->warn("JUMPING To ".$array[$picked]); + return ($ref->[0]->{'Survey_sectionId'},$ref->[0]->{'Survey_questionId'}); + } +$self->session->errorHandler->warn("Jump ended"); + return; +} + +sub getCurrentSection{ + my $self = shift; + my $responseId = shift; + return $self->session->db->quickScalar("select currentSection from Survey_response where Survey_responseId = ?",[$responseId]); +} + +sub setCurrentSection{ + my $self = shift; + my $responseId = shift; + my $newSectionId = shift; + $self->session->db->write('update Survey_response set currentSection = ? where Survey_responseId = ?',[$newSectionId, $responseId]); +} + +sub getResponseId{ + my $self = shift; + + my $ip = $self->session->env->getIp; + my $id = $self->session->user->userId(); + my $anonId = $self->session->form->process("id"); + + + my $responseId; + + my $string; + if($anonId or $id != 1){ +$self->session->errorHandler->warn("Response - 1"); + $string = 'userId'; + if($anonId){ +$self->session->errorHandler->warn("Response - 1-1"); + $string = 'anonId'; + $id = $anonId; + } + $responseId = $self->session->db->quickScalar("select Survey_responseId from Survey_response where $string = ? and assetId = ? and isComplete = 0", + [$id,$self->getId()]); + }elsif($id == 1){ +$self->session->errorHandler->warn("Response - 2"); + $responseId = $self->session->db->quickScalar("select Survey_responseId from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete = 0", + [$id,$ip,$self->getId()]); + } + + if(! $responseId){ +$self->session->errorHandler->warn("Response - 3"); + + my $allowedTakes = $self->session->db->quickScalar("select maxResponsesPerUser from Survey where assetId = ? order by revisionDate desc limit 1",[$self->getId()]); + my $haveTaken; + if($id ==1 ){ +$self->session->errorHandler->warn("Response - 4"); + $haveTaken = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ?", + [$id,$ip,$self->getId()]); + }else{ +$self->session->errorHandler->warn("Response - 5"); + $haveTaken = $self->session->db->quickScalar("select count(*) from Survey_response where $string = ? and assetId = ?", + [$id,$self->getId()]); + } + + if($haveTaken < $allowedTakes){ +$self->session->errorHandler->warn("Response - 6"); + $responseId = $self->session->db->setRow("Survey_response","Survey_responseId",{ + Survey_responseId=>"new", + userId=>$id, + ipAddress=>$ip, + username=>$self->session->user->username, + startDate=>WebGUI::DateTime->now->toDatabase, + endDate=>WebGUI::DateTime->now->toDatabase, + assetId=>$self->getId(), + anonId=>$anonId + }); + }else{ +$self->session->errorHandler->warn("No responses left max=$allowedTakes used up=$haveTaken"); +} + } + $self->session->errorHandler->warn("Survey Response was ".$responseId); + return $responseId; +} + + + +sub canTakeSurvey{ + my $self = shift; + + if(!$self->session->user->isInGroup($self->get("groupToTakeSurvey"))){ + return 0; + } + + #Does user have too many finished survey responses + my $maxTakes = $self->getValue("maxResponsesPerUser"); + my $ip = $self->session->env->getIp; + my $id = $self->session->user->userId(); + my $takenCount = 0; + + + if($id == 1){ + $takenCount = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ? + and isComplete = ?",[$id,$ip,$self->getId(),1]); + }else{ + $takenCount = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",[$id,$self->getId(),1]); + } + + $self->session->errorHandler->warn("userid is ".$id."\t and ip is ".$ip); + $self->session->errorHandler->warn("max ".$maxTakes." taken ".$takenCount); + + if($takenCount >= $maxTakes){ + return 0; + } + + return 1; +} + + +#------------------------------------------------------------------- +sub createDefaultAnswers{ + my ($self,$sid,$qid,$type) = @_; + $self->session->db->write("delete from Survey_answer where Survey_questionId = ?",[$qid]); + if($type eq 'Gender'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'male', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'female', 0, undef, undef,undef,undef,0]); + + }elsif($type eq 'Yes/No'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'yes', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'no', 0, undef, undef,undef,undef,0]); + + }elsif($type eq 'True/False'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'true', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'false', 0, undef, undef,undef,undef,0]); + + }elsif($type eq 'Agree/Disagree'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'strongly disagree', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, + undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'strongly agree', 7, undef, undef,undef,undef,0]); + + }elsif($type eq 'Oppose/Support'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'strongly oppose', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, + undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'strongly support', 7, undef, undef,undef,undef,0]); + + }elsif($type eq 'Importance'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all important', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely important', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Likelihood'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all likely', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely likely', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Certainty'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all certain', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely certain', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Satisfaction'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all satisfied', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'completely satisfied', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Confidence'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all confident', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely confident', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Effectiveness'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all effective', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely effective', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Concern'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all concerned', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely concerned', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Risk'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'no risk', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extreme risk', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Threat'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'no threat', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extreme threat', 10, undef, undef,undef,undef,0]); + + }elsif($type eq 'Security'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'not at all secure', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'extremely secure', 10, undef, undef,undef,undef,0]); + + + }elsif($type eq 'Ideology'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'strongly liberal', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'liberal', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'somewhat liberal', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'middle of the road', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'slightly conservative', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'conservative', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'strongly conservative', 7, undef, undef,undef,undef,0]); + + }elsif($type eq 'Race'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'American Indian', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Asian', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Black', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Hispanic', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'White non-Hispanic', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Something else (verbatim)', 6, undef, undef,undef,undef,0,]); + + }elsif($type eq 'Party'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Democratic party', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Republican party (or GOP)', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Independant party', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'other party (verbatim)', 4, undef, undef,undef,undef,1,]); + + }elsif($type eq 'Education'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'elementary or some high school', 1, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'high school/GED', 2, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'some college/vocational school', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'college graduate', 4, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'some graduate work', 5, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'master\'s degree', 6, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'doctorate (of any type)', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, 'other degree (verbatim)', 8, undef, undef,undef,undef,1,]); + + }elsif($type eq 'Text'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Email'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Email:', undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Phone Number'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Phone Number:', undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Text Date'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Date:', undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Currency'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Currency Amount:', undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Slider'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); + + }elsif($type eq 'Dual Slider - Range'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0]); + + }elsif($type eq 'Multi Slider - Allocate'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0]); + + }elsif($type eq 'Date'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Date Range'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'File Upload'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + + }elsif($type eq 'Hidden'){ + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + } + +} +sub AnswersInsert{ + my ($self,$array) = @_; + $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?)",$array); +} + +1; From 4e05a51f1596f93eaa1eebef7537770b0ca151a1 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Sat, 19 Apr 2008 18:55:56 +0000 Subject: [PATCH 05/64] Importing JS --- www/extras/wobject/Survey/administersurvey.js | 327 ++++++ .../wobject/Survey/administersurvey.js.backup | 404 +++++++ .../Survey/administersurvey.js.backup1 | 408 ++++++++ .../wobject/Survey/administersurvey/comm.js | 64 ++ www/extras/wobject/Survey/bg-fader.gif | Bin 0 -> 433 bytes www/extras/wobject/Survey/dd.js | 125 +++ www/extras/wobject/Survey/editsurvey.js | 232 ++++ .../wobject/Survey/editsurvey.js.backup | 988 ++++++++++++++++++ .../wobject/Survey/editsurvey.js.backup.newer | 337 ++++++ .../wobject/Survey/editsurvey/answer.js | 67 ++ www/extras/wobject/Survey/editsurvey/comm.js | 67 ++ .../wobject/Survey/editsurvey/question.js | 107 ++ .../wobject/Survey/editsurvey/section.js | 93 ++ www/extras/wobject/Survey/loadTemplate.pl | 15 + www/extras/wobject/Survey/survey.css | 34 + www/extras/wobject/Survey/survey.css.backup | 97 ++ www/extras/wobject/Survey/surveyedit.css | 132 +++ .../wobject/Survey/template.html.backup | 159 +++ .../wobject/Survey/templates/buttonHTML.txt | 6 + .../Survey/templates/fileLoaderHTML.txt | 7 + .../wobject/Survey/templates/takeSurvey.html | 151 +++ .../wobject/Survey/templates/textHTML.txt | 7 + www/extras/wobject/Survey/thumb-n.gif | Bin 0 -> 612 bytes 23 files changed, 3827 insertions(+) create mode 100644 www/extras/wobject/Survey/administersurvey.js create mode 100644 www/extras/wobject/Survey/administersurvey.js.backup create mode 100644 www/extras/wobject/Survey/administersurvey.js.backup1 create mode 100644 www/extras/wobject/Survey/administersurvey/comm.js create mode 100644 www/extras/wobject/Survey/bg-fader.gif create mode 100644 www/extras/wobject/Survey/dd.js create mode 100644 www/extras/wobject/Survey/editsurvey.js create mode 100644 www/extras/wobject/Survey/editsurvey.js.backup create mode 100644 www/extras/wobject/Survey/editsurvey.js.backup.newer create mode 100644 www/extras/wobject/Survey/editsurvey/answer.js create mode 100644 www/extras/wobject/Survey/editsurvey/comm.js create mode 100644 www/extras/wobject/Survey/editsurvey/question.js create mode 100644 www/extras/wobject/Survey/editsurvey/section.js create mode 100755 www/extras/wobject/Survey/loadTemplate.pl create mode 100644 www/extras/wobject/Survey/survey.css create mode 100644 www/extras/wobject/Survey/survey.css.backup create mode 100644 www/extras/wobject/Survey/surveyedit.css create mode 100644 www/extras/wobject/Survey/template.html.backup create mode 100644 www/extras/wobject/Survey/templates/buttonHTML.txt create mode 100644 www/extras/wobject/Survey/templates/fileLoaderHTML.txt create mode 100644 www/extras/wobject/Survey/templates/takeSurvey.html create mode 100644 www/extras/wobject/Survey/templates/textHTML.txt create mode 100644 www/extras/wobject/Survey/thumb-n.gif diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js new file mode 100644 index 000000000..f52f732d8 --- /dev/null +++ b/www/extras/wobject/Survey/administersurvey.js @@ -0,0 +1,327 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + var hasFile; + + this.displayQuestions = function(params){ + + var qs = params.questions; + var s = params.section; + + + //What to show and where + document.getElementById('survey').innerHTML = params.html; +var te = document.createElement('span'); +te.innerHTML = ""; +document.getElementById('survey').appendChild(te); +YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer('','loadQuestions');}); + + if(qs[0] != undefined){ + if(qs[0].sequenceNumber == '1' || s.everyPageTitle > 0){ + document.getElementById('headertitle').style.display='block'; + } + if(qs[0].sequenceNumber == '1' || s.everyPageText > 0){ + document.getElementById('headertext').style.display = 'block'; + } + + if(qs[0].sequenceNumber == '1' && s.questionsOnSectionPage != '1'){ + var span = document.createElement("div"); + span.innerHTML = ""; + span.style.display = 'block'; + + document.getElementById('header').appendChild(span); + YAHOO.util.Event.addListener("showQuestionsButton", "click", + function(){ + document.getElementById('showQuestionsButton').style.display = 'none'; + if(s.everyPageTitle == 0){ + document.getElementById('headertitle').style.display = 'none'; + } + if(s.everyPageText == 0){ + document.getElementById('headertext').style.display = 'none'; + } + document.getElementById('questions').style.display='inline'; + }); + }else{ + document.getElementById('questions').style.display='inline'; + } + }else{ + document.getElementById('headertitle').style.display='block'; + document.getElementById('headertext').style.display = 'block'; + document.getElementById('questions').style.display='inline'; + } + + //Display questions + + var html; + hasFile = false; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + html += "
      "; + html += "
      Q"+q.sequenceNumber+": "+q.questionText+"
      "; + + if(multipleChoice[q.questionType]){ + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', + value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + b.hid = a.Survey_answerId; + butts.push(b); + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + new this.dualSliders(q); + }else{ + for(var s in q.answers){ + var a = q.answers[s]; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(fileUpload[q.questionType]){ + hasFile = true; + } + } + YAHOO.util.Event.addListener("submitbutton", "click", this.formsubmit); + } + + + this.formsubmit = function(){ + Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); + } + + + + + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId; + var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', + 0, 200, (scale*step)); + // 0, 200, 1); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + document.getElementById(id).value = a.min; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + t -= this.getValue(); + t = Math.round(t); + this.setValue(total-t + scale*step); + }else{ + this.lastValue = this.getValue(); + document.getElementById(this.input).value = this.getRealValue(); + document.getElementById(this.input+'show').innerHTML = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + document.getElementById(butts[i].hid).value = ''; + } + b.set('checked',true); + document.getElementById(b.hid).value = 1; + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + document.getElementById(b.hid).value = ''; + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + document.getElementById(b.hid).value = 1; + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/administersurvey.js.backup b/www/extras/wobject/Survey/administersurvey.js.backup new file mode 100644 index 000000000..87ec877aa --- /dev/null +++ b/www/extras/wobject/Survey/administersurvey.js.backup @@ -0,0 +1,404 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var sliders; + var dSliders; + var texts; + var buttons; + var cals; + var files; + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + this.displayQuestions = function(params){ + sliders = new Array(); + dSliders = new Array(); + texts = new Array(); + buttons = new Array(); + cals = new Array(); + files = new Array(); + + var section = params.section; + var questions = params.questions; + document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
      "; + + if(section.questionsOnSectionPage){ + document.getElementById('headertext').innerHTML = section.sectionText; + } + + var qs = params.questions; + var s = params.survey; + var html = ""; + +// html = '
      '; + document.getElementById('survey').innerHTML = html;html = ''; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + if(q.verticalDisplay != 0){ + verts = "

      "; + verte = "

      "; + } + + html += "
      "; + html += "
      Q"+q.sequenceNumber+": "+q.questionText+"
      "; + + if(multipleChoice[q.questionType]){ + if(q.maxAnswers > 1){ + html += "
      Selections left: "+q.maxAnswers+"
      "; + } + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""+verte; +// html += verts+""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + butts.push(b); + buttons.push(b); + } + } + else if(text[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + + if(q.questionType == 'Text'){ + html += ""; + }else if(q.questionType == 'Email'){ + html += ""; + }else if(q.questionType == 'Phone Number'){ + html += ""; + }else if(q.questionType == 'Text Date'){ + html += ""; + }else if(q.questionType == 'Currency'){ + html += ""; + } + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + html += verts+""; + html += ""; + html += "
      "; + html += ""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(fileUpload[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + files.push(a.Survey_answerId); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + var a1 = q.answers[0]; + var a2 = q.answers[1]; + html += ""; + html += ""; + + html += verts+""; + html += "

      "+a.answerText+"
      "; + html += "
      "; + html += "0"; + html += ""; + html += ""+a2.max+""; + html += "
      0  "; + html += "
      "; + html += "
      \ +
      \ +
      \ +
      "; + + html += "
      \ + "; + html += "
      "+a1.max+""; + html += "
      "; + + html += "
      "+verte; + document.getElementById('survey').innerHTML += html;html = ''; + new this.dualSliders(q); + }else{ + for(var i in q.answers){ + var a = q.answers[i]; + html += verts+""; + html += "

      "; + html += "
      "; + html += a.answerText+" "; + html += "0"; + html += ""; + html += "
      0  "; + html += "
      "; + if(q.questionType == 'Dual Slider - Range'){ + html += "
      \ + \ +
      \ + "; + + }else{ + html += "
      \ + "; + } + html += "
      \ +
      "; + html += "
      "+a.max+""; + html += "
      "; + + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(hidden[q.questionType]){ + } + } + html += "


      "; + document.getElementById('survey').innerHTML += html;html = ''; + document.getElementById('footer').innerHTML = "
      You are |---| close to being done."; +// var submit = function() {alert(YAHOO.util.Connect.setForm('surveyForm'));} + YAHOO.util.Event.addListener("submit", "click", this.submit); + } + this.submit = function(){ + var butts = new Array(); + for(var i in buttons){ + if(buttons[i].get('checked')){ + butts.push([buttons[i].get('id'),buttons[i].get('value')]); + } + } + for(var i in files){ + console.log(files[i]); + console.log(document.getElementById(files[i]).value); + } + Survey.Comm.callServer(s,'submitQuestions'); + } + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; +console.log(scale); + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + var sliders = new Array(); + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, (scale*step)); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + sliders.push(s); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; +//console.log(s); + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + this.setValue(this.lastValue); + }else{ + this.lastValue = this.getValue(); +// alert("Setting "+this.input+" to "+this.getRealValue()); + document.getElementById(this.input).value = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + //console.log('showing '+objs[0].id); + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + } + b.set('checked',true); + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/administersurvey.js.backup1 b/www/extras/wobject/Survey/administersurvey.js.backup1 new file mode 100644 index 000000000..4df16790c --- /dev/null +++ b/www/extras/wobject/Survey/administersurvey.js.backup1 @@ -0,0 +1,408 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Form = new function() { + + var sliders; + var dSliders; + var texts; + var buttons; + var cals; + var files; + + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, + 'Race':1,'Party':1,'Education':1}; + var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; + var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; + var dateType = {'Date':1,'Date Range':1}; + var fileUpload = {'File Upload':1}; + var hidden = {'Hidden':1}; + + this.displayQuestions = function(params){ + sliders = new Array(); + dSliders = new Array(); + texts = new Array(); + buttons = new Array(); + cals = new Array(); + files = new Array(); + + var section = params.section; + var questions = params.questions; + document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
      "; + + if(section.questionsOnSectionPage){ + document.getElementById('headertext').innerHTML = section.sectionText; + } + + var qs = params.questions; + var s = params.survey; + var html = ""; + +// html = ''; + document.getElementById('survey').innerHTML = html;html = ''; + for(var i = 0; i < qs.length; i++){ + var q = qs[i]; + var verts = ''; + var verte = ''; + for(var x in q.answers){ + for(var y in q.answers[x]){ + if(q.answers[x][y] == undefined){q.answers[x][y] = '';} + } + } + + if(q.verticalDisplay != 0){ + verts = "

      "; + verte = "

      "; + } + + html += "
      "; + html += "
      Q"+q.sequenceNumber+": "+q.questionText+"
      "; + + if(multipleChoice[q.questionType]){ + if(q.maxAnswers > 1){ + html += "
      Selections left: "+q.maxAnswers+"
      "; + } + var butts = new Array(); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""+verte; +// html += verts+""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + butts.push(b); + buttons.push(b); + } + } + else if(text[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + + if(q.questionType == 'Text'){ + html += ""; + }else if(q.questionType == 'Email'){ + html += ""; + }else if(q.questionType == 'Phone Number'){ + html += ""; + }else if(q.questionType == 'Text Date'){ + html += ""; + }else if(q.questionType == 'Currency'){ + html += ""; + } + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + } + } + else if(dateType[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + var calid = a.Survey_answerId+'container'; + html += verts+""; + html += ""; + html += "
      "; + html += ""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); + c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.render(); + c.hide(); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + b.on("click", this.showCalendar,[c]); + } + } + else if(fileUpload[q.questionType]){ + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + html += verts+""; + html += ""; + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + files.push(a.Survey_answerId); + } + } + else if(slider[q.questionType]){ + //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. + var max = 0; + if(q.questionType == 'Dual Slider - Range'){ + var a1 = q.answers[0]; + var a2 = q.answers[1]; + html += ""; + html += ""; + + html += verts+""; + html += "

      "+a.answerText+"
      "; + html += "
      "; + html += "0"; + html += ""; + html += ""+a2.max+""; + html += "
      0  "; + html += "
      "; + html += "
      \ +
      \ +
      \ +
      "; + + html += "
      \ + "; + html += "
      "+a1.max+""; + html += "
      "; + + html += "
      "+verte; + document.getElementById('survey').innerHTML += html;html = ''; + new this.dualSliders(q); + }else{ + for(var i in q.answers){ + var a = q.answers[i]; + html += verts+""; + html += "

      "; + html += "
      "; + html += a.answerText+" "; + html += "0"; + html += ""; + html += "
      0  "; + html += "
      "; + if(q.questionType == 'Dual Slider - Range'){ + html += "
      \ + \ +
      \ + "; + + }else{ + html += "
      \ + "; + } + html += "
      \ +
      "; + html += "
      "+a.max+""; + html += "
      "; + + html += ""+verte; + document.getElementById('survey').innerHTML += html;html = ''; + if(a.max - a.min > max){max = a.max - a.min;} + } + } + if(q.questionType == 'Multi Slider - Allocate'){ + //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + new this.sliderManager(q,max); + } + else if(q.questionType == 'Slider'){ + new this.sliders(q); + } + } + else if(hidden[q.questionType]){ + } + } + html += "


      "; + document.getElementById('survey').innerHTML += html;html = ''; + document.getElementById('footer').innerHTML = "
      You are |---| close to being done."; + YAHOO.util.Event.addListener("submit", "click", this.submit); + YAHOO.util.Event.addListener("testSubmit", "click", this.tsubmit); + } + + + this.tsubmit = function(){ +// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); +var t = document.getElementById('surveyTest'); +// Survey.Comm.callServer('','submitQuestions',document.getElementById('surveyTest')); + Survey.Comm.callServer('','submitQuestions','surveyTest'); + } + + this.submit = function(){ +// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); + Survey.Comm.callServer('','submitQuestions','surveyForm'); + } + + + + + this.dualSliders = function(q){ + var total = 200; + var sliders = new Array(); + var a1 = q.answers[0]; + var a2 = q.answers[1]; + var scale = 200/a1.max; +//console.log(scale); + + var id = q.Survey_questionId; + var a1id = a1.Survey_answerId; + var a2id = a2.Survey_answerId; + + var a1h = document.getElementById(a1id); + var a2h = document.getElementById(a2id); + var a1s = document.getElementById(a1id+'show'); + var a2s = document.getElementById(a2id+'show'); + var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', + a1id+"slider-min-thumb", a2id+"slider-max-thumb", + 200, 1*scale, [1,200]); + + s.minRange = 4; + var updateUI = function () { + var min = Math.round(s.minVal/scale), + max = Math.round(s.maxVal/scale); + a1h.value = min; + a1s.innerHTML = min; + a2h.value = max; + a2s.innerHTML = max; + }; + + // Subscribe to the dual thumb slider's change and ready events to + // report the state. +// s.subscribe('ready', updateUI); + s.subscribe('change', updateUI); + } + this.sliders = function(q){ + var total = 200; + var sliders = new Array(); + for(var i in q.answers){ + var a = q.answers[i]; + var step = q.answers[i].step; + var scale = 200/q.answers[i].max; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, (scale*step)); + s.max = a.max*scale; + s.input = a.Survey_answerId; + s.scale = scale; + var check = function() { + var t = document.getElementById(this.input); + var tshow = document.getElementById(this.input+'show'); + t.value = this.getRealValue(); + tshow.innerHTML = this.getRealValue(); + }; + s.getRealValue = function() { + return this.getValue() / this.scale; + } + s.subscribe("slideEnd", check); + s.subscribe("change", check); + sliders.push(s); + } + } + //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating + this.sliderManager = function(q,t){ + var total = 200; + var step = q.answers[0].step; + var scale = 200/q.answers[0].max; + var sliders = new Array(); + + for(var i in q.answers){ + var a = q.answers[i]; + var Event = YAHOO.util.Event; + var lang = YAHOO.lang; + var id = a.Survey_answerId+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + 0, 200, scale*step); + s.input = a.Survey_answerId; + s.lastValue = 0; +//console.log(s); + var check = function() { + var t = 0; + for(var x in sliders){ + t+= sliders[x].getValue(); + } + if(t > total){ + this.setValue(this.lastValue); + }else{ + this.lastValue = this.getValue(); +// alert("Setting "+this.input+" to "+this.getRealValue()); + document.getElementById(this.input).value = this.getRealValue(); + } + }; + s.subscribe("slideEnd", check); + s.subscribe("change", check); + var manualEntry = function(e){ + // set the value when the 'return' key is detected + if (Event.getCharCode(e) === 13 || e.type == 'blur') { + var v = parseFloat(this.value, 10); + v = (lang.isNumber(v)) ? v : 0; + v *= scale; + + // convert the real value into a pixel offset + for(var sl in sliders){ + if(sliders[sl].input == this.id){ + sliders[sl].setValue(Math.round(v)); + } + } + } + } + Event.on(document.getElementById(s.input), "keydown", manualEntry); + Event.on(document.getElementById(s.input), "blur", manualEntry); + + s.getRealValue = function() { + return Math.round(this.getValue() / scale); + } + sliders.push(s); + document.getElementById(s.input).value = s.getRealValue(); + } + } + + this.selectCalendar = function(event,args,obj){ + var id = obj[1]; + var selected = args[0]; + var date = selected[0]; + var year = date[0], month = date[1], day = date[2]; + var input = document.getElementById(id); + input.value = month + "/" + day + "/" + year; + obj[0].hide(); + } + + + this.showCalendar = function(event,objs){ + //console.log('showing '+objs[0].id); + objs[0].show(); + } + this.buttonChanged = function(event,objs){ + var b = objs[0]; + var qid = objs[1]; + var maxA = objs[2]; + var butts = objs[3]; + max = parseInt(max); + if(maxA == 1){ + for(var i in butts){ + butts[i].set('checked',false); + } + b.set('checked',true); + } + else if(b.get('checked')){ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + if(max == 0){ + b.set('checked',false); + //warn that options used up + } + else{ + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + } + }else{ + var max = parseInt(document.getElementById(qid+'max').innerHTML); + document.getElementById(qid+'max').innerHTML = parseInt(max+1); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = new function() { + var e = YAHOO.util.Event; + this.init = function() { + e.onDOMReady(this.initHandler); + } + this.initHandler = function(){ + Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); + Survey.Comm.callServer('','loadQuestions'); + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js new file mode 100644 index 000000000..33dae620d --- /dev/null +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -0,0 +1,64 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Comm= new function(){ + + + this.url = ''; + this.setUrl = function(u){this.url = u;} + + var request = function(sUrl,callback,postData,form, hasFile){ + if(form != undefined){ + if(hasFile){ + YAHOO.util.Connect.setForm(form,true); + //console.log('set file was true'); + }else{ + //console.log('set file was false'); + YAHOO.util.Connect.setForm(form); + } + //console.log('setForm was true'); + } + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + + + this.callback = { + upload:function(o){ + Survey.Comm.callServer('','loadQuestions'); + }, + success:function(o){ + var response = ''; + response = YAHOO.lang.JSON.parse(o.responseText); + if(response.type == 'displayquestions'){ + Survey.Form.displayQuestions(response); + }else if(response.type == 'forward'){ +//console.log("going to "+response.url); + location.href=response.url; + }else{ + alert("bad response"); + } + }, + failure: function(o){ + if(o.status == -1){ + alert("Last request timed out, please try again"); + }else{ + alert("Last request failed "+o.statusText); + } + }, + timeout: 15000 + }; + + this.callServer = function(data,functionName,form,hasFile){ + var postData; + if(form == undefined){ + postData = "data="+YAHOO.lang.JSON.stringify(data,data); + //console.log(postData); + } + var sUrl = this.url + "?func="+functionName; + request(sUrl,this.callback,postData,form,hasFile); + } + + + +}(); diff --git a/www/extras/wobject/Survey/bg-fader.gif b/www/extras/wobject/Survey/bg-fader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7db8eb72ce5849c507d61c2bc0dd4f02f51f8178 GIT binary patch literal 433 zcmV;i0Z#r$Nk%w1VbK5_0J8`H>+9?F_4VQ5;mOI#r>CchiHWzjx7XL#|Ns9000000 z00000000000000000000A^8LW000O8EC2ui0MP&(000F45Xniay*TU5yZ>M)j$~<` zXsWJk>%MR-&%s!WcbJ3w*L%NCkTcvAHN(S5DPo44Am~Txp?0hs>_)4>ax-5{_%gPX zD`!f2vX-dFX%FDt8WCzgE z($mz{*4NnC+S}aS-rwNi*#c(b=I7|?>g(*=M3r#X%8geqYc2CJSxX%)4VR9919 bafuyEwyfE+Xw#})%eJlCw{YW@hyVaP!M@qB literal 0 HcmV?d00001 diff --git a/www/extras/wobject/Survey/dd.js b/www/extras/wobject/Survey/dd.js new file mode 100644 index 000000000..86559ebba --- /dev/null +++ b/www/extras/wobject/Survey/dd.js @@ -0,0 +1,125 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; +var DDM = YAHOO.util.DragDropMgr; + +Survey.DDList = function(id, sGroup, config) { + + Survey.DDList.superclass.constructor.call(this, id, sGroup, config); + + this.logger = this.logger || YAHOO; + var el = this.getDragEl(); + Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent + + this.goingUp = false; + this.lastY = 0; +}; + +YAHOO.extend(Survey.DDList, YAHOO.util.DDProxy, { + + startDrag: function(x, y) { + this.logger.log(this.id + " startDrag"); + + // make the proxy look like the source element + var dragEl = this.getDragEl(); + var clickEl = this.getEl(); + Dom.setStyle(clickEl, "visibility", "hidden"); + + dragEl.innerHTML = clickEl.innerHTML; + + Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color")); + Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor")); + Dom.setStyle(dragEl, "border", "2px solid gray"); + }, + + endDrag: function(e) { + + var srcEl = this.getEl(); + var proxy = this.getDragEl(); + + // Show the proxy element and animate it to the src element's location + Dom.setStyle(proxy, "visibility", ""); + var a = new YAHOO.util.Motion( + proxy, { + points: { + to: Dom.getXY(srcEl) + } + }, + 0.2, + YAHOO.util.Easing.easeOut + ) + var proxyid = proxy.id; + var thisid = this.id; + + // Hide the proxy and show the source element when finished with the animation + a.onComplete.subscribe(function() { + Dom.setStyle(proxyid, "visibility", "hidden"); + Dom.setStyle(thisid, "visibility", ""); + }); + a.animate(); + }, + + onDragDrop: function(e, id) { + + // If there is one drop interaction, the li was dropped either on the list, + // or it was dropped on the current location of the source element. + if (DDM.interactionInfo.drop.length === 1) { + + // The position of the cursor at the time of the drop (YAHOO.util.Point) + var pt = DDM.interactionInfo.point; + + // The region occupied by the source element at the time of the drop + var region = DDM.interactionInfo.sourceRegion; + + // Check to see if we are over the source element's location. We will + // append to the bottom of the list once we are sure it was a drop in + // the negative space (the area of the list without any list items) + if (!region.intersect(pt)) { + var destEl = Dom.get(id); + var destDD = DDM.getDDById(id); + destEl.appendChild(this.getEl()); + destDD.isEmpty = false; + DDM.refreshCache(); + } + + } + Survey.Data.dragDrop(this.getEl()); + }, + + onDrag: function(e) { + + // Keep track of the direction of the drag for use during onDragOver + var y = Event.getPageY(e); + + if (y < this.lastY) { + this.goingUp = true; + } else if (y > this.lastY) { + this.goingUp = false; + } + + this.lastY = y; + }, + + onDragOver: function(e, id) { + + var srcEl = this.getEl(); + var destEl = Dom.get(id); + + // We are only concerned with list items, we ignore the dragover + // notifications for the list. + if (destEl.nodeName.toLowerCase() == "li") { + var orig_p = srcEl.parentNode; + var p = destEl.parentNode; + + if (this.goingUp) { + p.insertBefore(srcEl, destEl); // insert above + } else { + p.insertBefore(srcEl, destEl.nextSibling); // insert below + } + + DDM.refreshCache(); + } + } +}); diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js new file mode 100644 index 000000000..788ef12e5 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey.js @@ -0,0 +1,232 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Data = new function(){ + var lastDataSet = {}; + var focus; + + + this.dragDrop = function(did){ + var type; + + if(did.className.match("section")){type = 'section';} + else if(did.className.match("question")){type = 'question';} + else{ type = 'answer';} + + var first = {id:did.id,type:type}; + var before = document.getElementById(did.id).previousSibling; + + while(1){ + if( before == undefined || (before.id != undefined && before.id != '') ){ + break; + } + var before = before.previousSibling; + } + + var data = {id:'',type:''}; + + if(before != undefined && before.id != undefined && before.id != ''){ + if(before.className.match("section")){type = 'section';} + else if(before.className.match("question")){type = 'question';} + else{ type = 'answer';} + data = {id:before.id,type:type}; + } + + Survey.Comm.dragDrop(first,data); + } + + + + this.clicked = function(){ + Survey.Comm.loadSurvey(this.id); + } + + + + this.loadData = function(d){ + focus = d.focus;//What is the current highlighted item. + var lastType = '';//What was the last type created. + var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. + var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down + document.getElementById('sections').innerHTML=''; + var scount = 1; + var qcount = 1; + var acount = 1; + for(var x in d.data){ + //Now check to see if this is where an add button goes. + //Add addAnswer when we go from answer to question or section or end + //Add addQuestion when we go from question to section or end + + if(lastType == 'answer' && d.data[x].type == 'question'){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer'] = 1; + acount = 1; + } + else if(lastType == 'answer' && d.data[x].type == 'section'){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer'] = 1; + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(lastType == 'question' && d.data[x].type == 'section'){ + if(!buttons['answer']){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer']=1; + } + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + acount = 1; + qcount = 1; + } + else if(d.data[x].type != 'answer' && lastType == 'question' && lastId['section'] + '||||'+ lastId['question'] == focus){ + this.addAnswerButton(lastId['section'],lastId['question']); + buttons['answer']=1; + acount = 1; + qcount = 1; + } + + var node = document.createElement('li'); + if(focus != undefined && focus.indexOf(d.data[x].id) > -1){ + node.className = "s"+d.data[x].type; + }else{ + node.className = d.data[x].type; + } + if(d.data[x].text == undefined){//== 'null'){ + d.data[x].text = ''; + } + var id = ''; + var delim = "||||"; + var pre; + if(d.data[x].type == 'section'){ + pre = 'S'+ scount++ +':'; + id = d.data[x].id; + } + else if(d.data[x].type == 'question'){ + pre = 'Q'+ qcount++ +':'; + id = lastId['section'] + delim + d.data[x].id; + } + else if(d.data[x].type == 'answer'){ + if(d.data[x].recordedAnswers != null){ + } + pre = 'A'+ acount++ +':'; + id = lastId['section'] + delim + lastId['question'] + delim + d.data[x].id; + } + node.innerHTML = pre + ' ' + d.data[x].text; + node.id = id; + new Survey.DDList(node.id,"sections"); + document.getElementById('sections').appendChild(node); + YAHOO.util.Event.addListener(id, "click", this.clicked); + + lastType = d.data[x].type; + lastId[d.data[x].type] = d.data[x].id; + } + if(lastType == 'answer' && ! buttons['answer']){ + this.addAnswerButton(lastId['section'],lastId['question']); + this.addQuestionButton(lastId['section']); + } + if(lastType == 'question' && ! buttons['question']){ + this.addAnswerButton(lastId['section'],lastId['question']); + } + if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ + this.addQuestionButton(lastId['section']); + } + + this.addSectionButton(); + + this.loadObjectEdit(d.edit); + lastDataSet = d; + } + + + this.addSection = function(){ + Survey.Comm.newSection(); + } + + + this.addQuestion = function(e,sid){ + Survey.Comm.newQuestion(sid); + } + + this.addAnswer = function(e,ids){ + Survey.Comm.newAnswer(ids[0],ids[1]); + } + + + this.addSectionButton = function(){ + var node = document.createElement('li'); + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); + button.on("click", this.addSection); + } + + + this.addQuestionButton = function(sid){ + var node = document.createElement('li'); + node.className = 'newQuestion'; + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); + button.on("click", this.addQuestion,sid); + } + + + this.addAnswerButton = function(sid,qid){ + var node = document.createElement('li'); + node.id = 'newAnswer'; + node.className = 'newAnswer'; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Answer", id:'addanswer', container:"newAnswer" }); + button.on("click", this.addAnswer,[sid,qid]); + } + + + this.loadObjectEdit = function(edit){ + if(edit){ + if(edit.type == "loadSection"){ + Survey.SectionTemplate.loadSection(edit.params); + } + else if(edit.type == "loadQuestion"){ + Survey.QuestionTemplate.loadQuestion(edit.params); + } + else if(edit.type == "loadAnswer"){ + Survey.AnswerTemplate.loadAnswer(edit.params); + } + } + } + + + this.loadLast = function(){ + this.loadData(lastDataSet); + } +}(); + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.util.DDTarget("sections","sections"); + Survey.Comm.loadSurvey(); + }, + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/editsurvey.js.backup b/www/extras/wobject/Survey/editsurvey.js.backup new file mode 100644 index 000000000..7a36bca33 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey.js.backup @@ -0,0 +1,988 @@ +// vim:ft=javascript + +//---------------------------------------------------------------- +// +// Initialize namespace +// +//---------------------------------------------------------------- + +(function() { +if (typeof WebGUI == "undefined") { + var WebGUI = {}; +} +var Survey = {}; + +//---------------------------------------------------------------- +// +// Global Params +// +//---------------------------------------------------------------- +var objects = new Array(); +objects[0] = undefined; +var slength = 1; + +//---------------------------------------------------------------- +// +// List Super Object +// +//---------------------------------------------------------------- +//function listObject(type){ +Survey.listObject = function(type){ + var loType = type; + this.dom; + this.toggleOn = function(){ + if(loType == 'section'){ + this.dom.className="sselected"; + }else if(loType == 'question'){ + this.dom.className="qselected"; + } + } + this.toggleOff = function(){ + this.dom.className=loType; + } + this.getType = function(){return loType;} +} + + +//---------------------------------------------------------------- +// +// Section definition +// +//---------------------------------------------------------------- +//function section(text,s,randomize){ +Survey.Section = function(text,s,randomize){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("section"); + + var sectionUL = document.getElementById('sections'); + + this.text = text; + this.sId = "S"+(slength++); + this.id = s.toString(); + this.randomize = randomize; + this.questions = new Array(); + this.dd; + this.ddt; + this.addThyself = function(){ + if(this.dom != undefined){alert("dom already defined");return} + this.dom = document.createElement('li'); + this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects + this.updateHTML(); + // this.className = this.getType(); + + var holder = document.createElement('ul'); + holder.className = "questionList"; + holder.id = this.id + "QL"; + holder.innerHTML = "
    • "; + + + var pli = document.createElement('li');//parent li, containter to hold section li and question ul. + pli.id = this.id+"div"; + pli.className = this.getType(); + sectionUL.appendChild(pli); + pli.appendChild(this.dom); + pli.appendChild(holder); + + this.ddt = new YAHOO.util.DDTarget(this.id+"QL","questions"); + + this.dd = new WebGUI.DDList(this.id+"div","sections"); + this.dd.isTarget = false; + this.dd.addToGroup("trashcan"); + this.dd.setHandleElId(this.id); + + YAHOO.util.Event.addListener(this.id, "click", WebGUI.SectionHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.sId+"]"+ " " + this.text.substr(0,25) + " ..."; + } + this.updateLoc = function(loc){ + this.sId = "S"+loc; + this.updateHTML(); + } + this.removeQuestion = function(id){ + for(var i = 0; i <= this.questions.length; i++){ + if(this.questions[i] == id){ + this.questions.splice(i,1); + break; + } + } + } + this.addThyself(); + + this.noDrag = function(){ + this.dd.lock(); + }, + + this.removeThyself = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id, "click"); + this.dd.setHandleElId(undefined); + this.dd.unreg(); + this.dd = undefined; + var p = this.dom.parentNode; + p.removeChild(this.dom.nextSibling); + p.removeChild(this.dom); + p.parentNode.removeChild(p); + this.dom = undefined; + } + + this.showThyself = function(){ + document.getElementById("sid").innerHTML = this.sId; + document.getElementById("sectioninputtext").value = this.text; + var menu = WebGUI.Menu.getsMenu(); + menu.getItem(0).cfg.setProperty("checked",this.randomize); + } + this.update = function(text,randomize){ + this.text = text; + this.randomize = randomize; + this.updateHTML(); + } + this.DESTROY = function(){ + for(var q in this.questions){ + objects[this.questions[q]].DESTROY(); + } + this.removeThyself(); + slength--; + objects[this.id] = undefined; + WebGUI.Menu.newS(); + } +} +//Notes, use previousSibling,nextSibling to get ids of siblings, and insertBefore or appendChild to add elements. +WebGUI.SectionHandler = function(){ + return{ + clicked: function() {//new section event button, prompts the new section menu + WebGUI.DM.showThis(this.id); + } + } +}(); + + + +//---------------------------------------------------------------- +// +// Answer definition +// +//---------------------------------------------------------------- +Survey.Answer = function(id,qid){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("answer"); + this.avalues = [{'atext':"",'ameta':""}]; //array of associative arrays. Array maps to answer types. associate arrays map to all possible responses + this.qId = qid; + this.id = id; + this.aId = "A"+objects[this.qId].answers.length; + var answerUL = document.getElementById("answers"); + objects[this.qId].answers[objects[this.qId].answers.length] = this.id; + this.addThyself = function(){ + if(this.dom != undefined){alert("dom already defined");return} + this.dom = document.createElement('li'); + this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects + this.dom.className = this.getType(); + this.updateHTML(); + answerUL.appendChild(this.dom); + this.dd = new WebGUI.DDList(this.id.toString(),"answers"); + this.dd.addToGroup("trashcan"); + YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.AnswerHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.aId+"]"; + } + this.showThyself = function(){ + document.getElementById('asid').innerHTML = objects[this.sId].sId; + document.getElementById('aqid').innerHTML = objects[this.qId].qId; + document.getElementById('aid').innerHTML = this.aId; + } + this.hide = function(){ + } + this.show = function(){ + } + this.DESTROY = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id, "click"); + this.dom.parentNode.removeChild(this.dom); + this.dom = undefined; + this.dd.unreg(); + objects[this.id] = undefined; + } +} +WebGUI.AnswerHandler = function(){ + return{ + clicked: function() {//new section event button, prompts the new section menu +alert('click'); +// WebGUI.DM.showThis(this.id); + } + } +}(); + + + + +//---------------------------------------------------------------- +// +// Question definition +// +//---------------------------------------------------------------- +//function question(qid,type,typeName,text,options,toptions,sid){ +Survey.Question = function(qid,type,typeName,text,options,toptions,sid){ + //inheritence + this.inherit= Survey.listObject; + this.inherit("question"); + this.type = type; //index to the qMenu YUI menu containing this question type + this.typeName = typeName; + this.text = text; //Question text + this.id = qid; + this.sId = sid; //Section parent node id attribute + objects[sid].questions[objects[sid].questions.length] = qid; + this.qId = "Q"+ objects[this.sId].questions.length //Nodes id attribute + this.options = options; //indexes to the oMenu YUI menu + this.textOptions = toptions; //strings indexed by the ids of the option input fields + this.answers = new Array(); + this.answersRef = new Array(); //2D array of [qid][aid] which point at this qid. Used for updating answers when this question is reordered/deleted + + var questionUL = document.getElementById(this.sId.toString()+"QL"); + + this.loc; + + this.addThyself = function(){ + this.dom = document.createElement('li'); //reference to this questions dom object + this.dom.className = this.getType(); + this.dom.id = this.id.toString(); + this.updateHTML(); + questionUL.appendChild(this.dom); + this.dd = new WebGUI.DDList(this.id.toString(),"questions"); + this.dd.addToGroup("trashcan"); + YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.QuestionHandler.clicked); + } + this.updateHTML = function(){ + this.dom.innerHTML="["+this.qId+ " "+ this.typeName+"] " + this.text.substr(0,25) + " ..."; + } + this.addThyself(); + + this.index = function(){ + var t = this.qId.split("-"); + return (t[1].slice(1)-1); + } + + this.removeThyself = function(){ + if(this.dom == undefined){ alert("dom is not defined"); return; } + YAHOO.util.Event.removeListener(this.id.toString(), "click"); + this.dom.parentNode.removeChild(this.dom); + this.dom = undefined; + this.dd.unreg(); + objects[this.sId].removeQuestion(this.id); + } + this.showThyself = function(){ + document.getElementById("qid").innerHTML = this.qId; + document.getElementById("qsid").innerHTML = objects[this.sId].sId; + document.getElementById("questioninputtext").value = this.text; + WebGUI.Menu.clearMenus(); + var menu = WebGUI.Menu.getqMenu(); + menu.getItem(this.type).cfg.setProperty("checked",true); + //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); + WebGUI.Menu.loadOMenu(this.type); + var oMenu = WebGUI.Menu.getoMenu(); + for(var i in this.options){ + oMenu.getItem(this.options[i]).cfg.setProperty("checked",true); + } + try{ + document.getElementById('max').value = q['max']; + }catch(e){} + try{ + document.getElementById('min').value = q['min']; + }catch(e){} + try{ + document.getElementById('step').value = q['step']; + }catch(e){} + + } + this.update = function(type, typeName,text,options,toptions){ + this.type=type; + this.typeName = typeName; + this.text = text; + this.options = options; + this.textOptions = toptions; + this.updateHTML(); + } + this.updateLoc = function(sid,loc){ + this.sId = sid; + this.qId = "Q"+loc; + this.updateHTML(); + } + this.DESTROY = function(){ + //remove event handler, dom, answerRefs, question, and answers + for(var i in this.answers){ + this.answers[i].DESTROY(); + } + for(var i in this.answersRef){ + this.answersRef[i].unlink(); + } + this.removeThyself(); + objects[this.id] = undefined; + WebGUI.Menu.newQ(); + } +} +WebGUI.QuestionHandler = function(){ + return{ + clicked: function() {//new question event button, prompts the new question menu + WebGUI.DM.showThis(this.id); + } + } +}(); + + +//---------------------------------------------------------------- +// +// Display Manager +// +//---------------------------------------------------------------- +WebGUI.DM = function(){ + var lastObject;//Current Question + return{ + updateSectionDOMLists: function(){ + //Loop through sections ul then answer ul and make sure everything is in the right place. + var q = document.getElementById('sections'); + var loc = 1; + var tsections = new Array(); + var start = q.firstChild;//the li which contains the a ul which contains the current section li and + while(start){ + var section = start.firstChild.id; + start = start.nextSibling; + objects[section].updateLoc(loc++); + objects[section].questions = new Array(); + this.updateQuestionDOMList(section,section+"QL"); + } + + }, + updateQuestionDOMList: function(sid, parent){ + var q = document.getElementById(parent); + var start = q.firstChild; + var loc = 1; + while(start){ + var section = start.id; + if(! start.id){ + start = start.nextSibling; + continue; + } + start = start.nextSibling; + objects[section].updateLoc(sid,loc++); + objects[sid].questions[objects[sid].questions.length] = section; + } + }, + + updateAnswerDOMLists: function(){ + }, + showThis: function(Id) { + this.clearLast(); + lastObject = Id; + try{ + objects[lastObject].toggleOn(); + WebGUI.Menu.sselected(lastObject); + WebGUI.Menu.showEditSection(); + }catch(e){} + try{ + objects[objects[lastObject].sId].toggleOn(); + WebGUI.Menu.sselected(objects[objects[lastObject].sId].id); + WebGUI.Menu.qselected(lastObject); + WebGUI.Menu.showEditQuestion(); + }catch(e){} + try{ + objects[objects[objects[lastObject].qId].sId].toggleOn(); + WebGUI.Menu.sselected(objects[objects[objects[lastObject].qId].sId].id); + WebGUI.Menu.qselected(objects[objects[lastObject].qId].id); + WebGUI.Menu.aselected(lastObject); + WebGUI.Menu.showEditAnswer(); + }catch(e){} + objects[lastObject].showThyself(); + }, + clearLast: function(){ + try{ + objects[lastObject].toggleOff(); + }catch(e){} + try{ + objects[objects[lastObject].sId].toggleOff(); + }catch(e){} + try{ + objects[objects[objects[lastObject].qId].sId].toggleOff(); + }catch(e){} + lastObject = undefined; + WebGUI.Menu.sselected(undefined); + WebGUI.Menu.qselected(undefined); + WebGUI.Menu.aselected(undefined); + }, + getLastSection: function(){ + var q = document.getElementById('sections'); + try{ + return (parseInt(q.lastChild.firstChild.id))//the li which contains the a ul which contains the current section li and + }catch(e){} + } + } +}(); + +//---------------------------------------------------------------- +// +// Menu definition +// +//---------------------------------------------------------------- +WebGUI.Menu = function(){ + var qMenu = new YAHOO.widget.Menu("qmenu",{position: "static", hidedelay: 750, lazyload: true}); + var oMenu = new YAHOO.widget.Menu("omenu",{position: "static", hidedelay: 750, lazyload: true}); + var sMenu = new YAHOO.widget.Menu("smenu",{position: "static", hidedelay: 750, lazyload: true}); + var aMenu = new YAHOO.widget.Menu("amenu",{position: "static", hidedelay: 750, lazyload: true}); + + var last = -1;//Last qMenu option selected, keep track so we can unselect on next click + var qselected = 0;//Currently selected qMenu item. + var sselected = 'S1'; + + return{ + sselected: function(i){ sselected = i; }, + qselected: function(i){ qselected = i; }, + aselected: function(i){ aselected = i; }, + + init: function() { + document.getElementById("questiontext").innerHTML=""; + WebGUI.Menu.clearMenus(); + qMenu.subscribe("click", this.qTypeClick); + oMenu.subscribe("click", this.oTypeClick); + + sMenu.addItems([ "Randomly Ordered" ] ); + sMenu.render("sectionmenu"); + sMenu.subscribe("click", this.sTypeClick); + + document.getElementById("qsubmitbutton").style.display="none"; + WebGUI.Menu.showEditSection(); + new YAHOO.widget.Button({ type: "button", label: "Submit Question", container: "qsubmitbutton", + onclick: {fn: WebGUI.Menu.addQ} }); + new YAHOO.widget.Button({ type: "button", label: "Submit Section", container: "ssubmitbutton", + onclick: {fn: WebGUI.Menu.addS} }); + new YAHOO.widget.Button({ type: "button", label: "Submit Answer", container: "asubmitbutton", + onclick: {fn: WebGUI.Menu.addA} }); + + }, + + getsMenu: function(){ return sMenu; }, + getqMenu: function(){ return qMenu; }, + getoMenu: function(){ return oMenu; }, + getaMenu: function(){ return aMenu; }, + + addQ: function() { + // var id = document.getElementById("qid").innerHTML; + var text = document.getElementById('questioninputtext').value; + var options = new Array(); + + var qindex; + var qtype; + var temp = qMenu.getItems(); + for(var i in temp){ + if(temp[i].cfg.getProperty("checked")){ + qtype = temp[i].value; + qindex = temp[i].index; + } + } + temp = oMenu.getItems(); + for(var i in temp){ + if(temp[i].cfg.getProperty("checked")){ + options[options.length] = temp[i].index; + } + } + var toptions = new Array(); + var sid = sselected; + + try{toptions['max'] = document.getElementById('max').value;}catch(err){} + try{toptions['min'] = document.getElementById('min').value;}catch(err){} + try{toptions['step'] = document.getElementById('step').value;}catch(err){} + + if(qselected != undefined){ + objects[qselected].update(qindex,qtype,text,options,toptions); + }else{ + objects[objects.length] = new Survey.Question(objects.length,qindex,qtype,text,options,toptions,sselected); + } + WebGUI.Menu.newQ(); + }, + addS: function(){ + var id; + if(sselected){ + id = sselected; + }else{ + id = objects.length; + } + var text = document.getElementById('sectioninputtext').value; + var checked = sMenu.getItem(0).cfg.getProperty("checked"); + if(objects[id] != undefined){//editing an existing section which knows how to update itself + objects[id].update(text,checked); + }else{ + objects[id] = new Survey.Section(text,id,checked); + } + WebGUI.Menu.newS(); + }, + addA: function(){ + var qtype = objects[qselected].type; + var id; + if(aselected){ + id = sselected; + }else{ + id = objects.length; + } + if(objects[id] == undefined){//editing an existing answer which knows how to update itself + objects[id] = new Survey.Answer(id,qselected) + } + for(var q in objects[id].avalues[qtype]){ + objects[id].avalues[qtype][q] = document.getElementById(q).value; + } + objects[id].addThyself(); + WebGUI.Menu.newA(); + }, + + newS: function() {//new section event button, prompts the new section menu + sselected = undefined; + qselected = undefined; + aselected = undefined; + WebGUI.DM.clearLast(); + WebGUI.Menu.showEditSection(); + document.getElementById('sectioninputtext').value = ''; + document.getElementById('sid').innerHTML = "S"+(slength); + sMenu.getItem(0).cfg.setProperty("checked",false); + }, + + newA: function() { + aselected = undefined; + if(!sselected){ + sselected = WebGUI.DM.getLastSection(); + } + if(!qselected){ + qselected = objects[sselected].questions[objects[sselected].questions.length-1]; + } + if(!qselected){ + alert("At least one question must be selected to add an answer."); + return; + } + document.getElementById('asid').innerHTML = objects[sselected].sId; + document.getElementById('aqid').innerHTML = objects[qselected].qId; + document.getElementById('aid').innerHTML = "A"+(objects[qselected].answers.length + 1); + WebGUI.DM.showThis(qselected); + WebGUI.Menu.showEditAnswer(); + WebGUI.Menu.clearOMenus(); + var input = document.getElementById("answerinput"); + input.innerHTML=""; + var qtype = objects[qselected].type; + if(qtype == 0){//multiple choice + input.innerHTML = "Please enter the text:
      "+ + "Please enter the meta tag: "; + }else if(qtype == 1){//Text + alert("Answers can not be added to a text type"); + WebGUI.Menu.newQ(); + }else if(qtype == 2){//Slider + }else if(qtype == 3){//Date + }else if(qtype == 4){//True/False + } + }, + newQ: function() { + qselected = undefined; + aselected = undefined; + if(!sselected){ + sselected = WebGUI.DM.getLastSection(); + } + if(!sselected){ + alert("At least one section must be selected to add an answer."); + return; + } + WebGUI.DM.showThis(sselected); + WebGUI.Menu.showEditQuestion(); + WebGUI.Menu.clearMenus(); + document.getElementById('qsid').innerHTML = objects[sselected].sId; + var nextQ = objects[sselected].questions.length; + document.getElementById('qid').innerHTML = "Q"+ (nextQ + 1); + document.getElementById("questioninputtext").value = ""; + WebGUI.Menu.loadOMenu(0); + }, + clearOMenus: function(){ + aMenu.clearContent(); + }, + + clearMenus: function() { + qMenu.clearContent(); + qMenu.addItems([ + {text: "Multiple Choice",value: "Multiple Choice"}, + {text: "Text",value: "Text"}, + {text: "Slider",value: "Slider"}, + {text: "Date",value: "Date"}, + {text: "True/False",value: "True/False"}, + ] ); + qMenu.render("questionmenu"); + oMenu.clearContent(); + document.getElementById("qsubmitbutton").style.display="none"; + document.getElementById("qoptionmenu").style.display="none"; + }, + + + loadQ: function(e) { + WebGUI.Menu.clearMenus(); + var q = questions[ this.id.slice(1) - 1 ]; + document.getElementById('qid').innerHTML = "Q"+q['id']+":"; + document.getElementById('questioninputtext').value = q['text']; + qMenu.getItem(q['type']).cfg.setProperty("checked"); + //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); + WebGUI.Menu.loadOMenu(qMenu.getItem(q['type']).index); + for(var i in q['moptions']){ + oMenu.getItem(q['moptions'][i]).cfg.setProperty("checked",true); + } + try{ + document.getElementById('max').value = q['max']; + }catch(e){} + try{ + document.getElementById('min').value = q['min']; + }catch(e){} + try{ + document.getElementById('step').value = q['step']; + }catch(e){} + }, + + showEditQuestion: function() { + document.getElementById("editquestion").style.display="inline"; + document.getElementById("editanswer").style.display="none"; + document.getElementById("editsection").style.display="none"; + }, + showEditAnswer: function() { + document.getElementById("editquestion").style.display="none"; + document.getElementById("editanswer").style.display="inline"; + document.getElementById("editsection").style.display="none"; + }, + showEditSection: function() { + document.getElementById("editquestion").style.display="none"; + document.getElementById("editanswer").style.display="none"; + document.getElementById("editsection").style.display="inline"; + }, + + sTypeClick: function(p_sType, p_aArgs, p_oValue) { + if(p_aArgs[1].cfg.getProperty("checked")){ + p_aArgs[1].cfg.setProperty("checked", false); + }else{ + p_aArgs[1].cfg.setProperty("checked", true); + } + + }, + + oTypeClick: function(p_sType, p_aArgs, p_oValue) { + var checked = p_aArgs[1].cfg.getProperty("checked"); + var index = p_aArgs[1].index; + if(qselected == 1 && index >= 0 && index < 4){ + for(var i=0; i<=3; i++){ + oMenu.getItem(i).cfg.setProperty("checked",false); + } + p_aArgs[1].cfg.setProperty("checked",checked); + } + else if(qselected == 4 && index >= 0 && index <= 1){ + for(var i=0; i<=1; i++){ + oMenu.getItem(i).cfg.setProperty("checked",false); + } + p_aArgs[1].cfg.setProperty("checked",checked); + } + + if(p_aArgs[1].cfg.getProperty("checked")){ + p_aArgs[1].cfg.setProperty("checked", false); + }else{ + p_aArgs[1].cfg.setProperty("checked", true); + } + if(qselected == 0 && index == 1 && p_aArgs[1].cfg.getProperty("checked") == false){ + document.getElementById('max').value = 1; + } + }, + + validateMultipleMax: function(){ + var v = this.value; + if (v != parseInt(v) || v < 1){ + this.value = 1; + } + }, + + qTypeClick: function(p_sType, p_aArgs, p_oValue) { + var index = p_aArgs[1].index; + + WebGUI.Menu.showEditQuestion(); + + WebGUI.Menu.loadOMenu(index); + }, + + loadOMenu: function(index) { + + if(last > -1){ + qMenu.getItem(last).cfg.setProperty("checked",false); + } + qMenu.getItem(index).cfg.setProperty("checked",true); + last = index; + + oMenu.clearContent(); + + document.getElementById("qsubmitbutton").style.display="inline"; + document.getElementById("qoptionmenu").style.display="inline"; + document.getElementById("textoptions").innerHTML=""; + + var temp = document.createElement("div"); + + if(index == 0){//Multipe choice options + try{ + YAHOO.util.Event.removeListener("max", "click"); + }catch(e){} + YAHOO.util.Event.addListener("max", "blur", WebGUI.Menu.validateMultipleMax); + temp.innerHTML = "Max Answers:
      "; + oMenu.addItems([ + "Randomize", + "Horizontal display", + "Multiple Answers", + "Comment Box", + ] ); + } + else if(index == 1){//Text options + temp.innerHTML = "Max length
      "; + oMenu.addItems([ + "Multi-Line", + "Numerical", + "Phone Number", + "Currency Amount", + ] ); + } + else if(index == 2){//Slider options + temp.innerHTML = "Start Value:
      End Value:
      Step Value:
      "; + } + else if(index == 3){//Date options + oMenu.addItems([ + "Range", + ] ); + } + else if(index == 4){//True/False options + oMenu.addItems([ + "Yes/No", + "Male/Female", + ] ); + } + document.getElementById("textoptions").appendChild(temp); + oMenu.addItems(["Optional"]); + oMenu.render("qoptionmenu"); + }, + + } +}(); + + + + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +WebGUI.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.widget.Button({ type: "button", label: "New Question", container: "addqbutton", + onclick: {fn: WebGUI.Menu.newQ} }); + new YAHOO.widget.Button({ type: "button", label: "New Answer", container: "addabutton", + onclick: {fn: WebGUI.Menu.newA} }); + new YAHOO.widget.Button({ type: "button", label: "New Section", container: "addsbutton", + onclick: {fn: WebGUI.Menu.newS} }); + + WebGUI.Menu.init(); + + document.getElementById("editanswer").style.display="none"; + objects[objects.length] = new Survey.Section("First Section",objects.length,false); + WebGUI.DM.showThis(objects.length-1); + WebGUI.Menu.newQ(); + }, + } +}(); + +WebGUI.OnLoad.init(); + + + +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; +var DDM = YAHOO.util.DragDropMgr; + +////////////////////////////////////////////////////////////////////////////// +// example app +////////////////////////////////////////////////////////////////////////////// +//YAHOO.example.DDApp = { +WebGUI.DD = { + init: function() { + + new YAHOO.util.DDTarget("sections","sections"); + new YAHOO.util.DDTarget("answers","answers"); + new YAHOO.util.DDTarget("trashcan","trashcan"); + + Event.on("showButton", "click", this.showOrder); + Event.on("switchButton", "click", this.switchStyles); + }, + + showOrder: function() { + var parseList = function(ul, title) { + var items = ul.getElementsByTagName("li"); + var out = title + ": "; + for (i=0;i this.lastY) { + this.goingUp = false; + } + + this.lastY = y; + }, + + onDragOver: function(e, id) { + + var srcEl = this.getEl(); + var destEl = Dom.get(id); + + // We are only concerned with list items, we ignore the dragover + // notifications for the list. + document.getElementById('log1').innerHTML = srcEl.className; + document.getElementById('log2').innerHTML = destEl.className; + document.getElementById('log').innerHTML = destEl.nodeName; + + if ( destEl.nodeName.toLowerCase() == "li" ) + { + //destEl.className == "questionList" || destEl.className == "question" || destEl.className == "qselected") + var orig_p = srcEl.parentNode; + var p = destEl.parentNode; + + if (this.goingUp) { + p.insertBefore(srcEl, destEl); // insert above + } else { + p.insertBefore(srcEl, destEl.nextSibling); // insert below + } + + DDM.refreshCache(); + } + } +}); + +//Event.onDOMReady(YAHOO.example.DDApp.init, YAHOO.example.DDApp, true); +Event.onDOMReady(WebGUI.DD.init, WebGUI.DD, true); + +})(); + diff --git a/www/extras/wobject/Survey/editsurvey.js.backup.newer b/www/extras/wobject/Survey/editsurvey.js.backup.newer new file mode 100644 index 000000000..78fc93177 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey.js.backup.newer @@ -0,0 +1,337 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Data = new function(){ + var lastDataSet = {}; + var focus; + + this.dragDrop = function(did){ + var type; + + if(did.className.match("section")){type = 'section';} + else if(did.className.match("question")){type = 'question';} + else{ type = 'answer';} + + var first = {id:did.id,type:type}; + var before = document.getElementById(did.id).previousSibling; + + while(1){ + if( before == undefined || (before.id != undefined && before.id != '') ){ + break; + } + var before = before.previousSibling; + } + + var data = {id:'',type:''}; + + if(before != undefined && before.id != undefined && before.id != ''){ + if(before.className.match("section")){type = 'section';} + else if(before.className.match("question")){type = 'question';} + else{ type = 'answer';} + data = {id:before.id,type:type}; + } + + Survey.Comm.dragDrop(first,data); + } + + + + this.clicked = function(){ + Survey.Comm.loadSurvey(this.id); + } + + + + this.loadData = function(d){ + focus = d.focus;//What is the current highlighted item. + var lastType = '';//What was the last type created. + var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. + var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down + document.getElementById('sections').innerHTML=''; + + for(var x in d.data){ + //Now check to see if this is where an add button goes. + //Add addAnswer when we go from answer to question or section or end + //Add addQuestion when we go from question to section or end + + if(lastType == 'answer' && (d.data[x].type == 'question' || d.data[x].type == 'section')){ + this.addAnswerButton(lastId['question']); + buttons['answer'] = 1; + } + else if(lastType == 'question' && d.data[x].type == 'section'){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + } + else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ + this.addQuestionButton(lastId['section']); + buttons['question'] = 1; + } + + var node = document.createElement('li'); + + if(d.data[x].id == focus){ + node.className = "s"+d.data[x].type; + }else{ + node.className = d.data[x].type; + } + + node.innerHTML = d.data[x].text; + node.id = d.data[x].id; + new Survey.DDList(node.id,"sections"); + document.getElementById('sections').appendChild(node); + YAHOO.util.Event.addListener(d.data[x].id, "click", this.clicked); + + lastType = d.data[x].type; + lastId[d.data[x].type] = d.data[x].id; + } + if(lastType == 'answer' && ! buttons['answer']){ + this.addAnswerButton(lastId['question']); + this.addQuestionButton(lastId['section']); + }else if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ + this.addQuestionButton(lastId['section']); + } + + this.addSectionButton(); + + this.loadObjectEdit(d.edit); + lastDataSet = d; + } + + + this.addSection = function(){ + Survey.Comm.newSection(); + } + + + this.addQuestion = function(e,sid){ + Survey.Comm.newQuestion(sid); + } + + + this.addSectionButton = function(){ + var node = document.createElement('li'); + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); + button.on("click", this.addSection); + } + + + this.addQuestionButton = function(qid){ + var node = document.createElement('li'); + node.className = 'newQuestion'; + node.innerHTML = ""; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); + button.on("click", this.addQuestion,qid); + } + + + this.addAnswerButton = function(aid){ + var node = document.createElement('li'); + node.id = 'newAnswer'; + node.className = 'newAnswer'; + document.getElementById('sections').appendChild(node); + var button = new YAHOO.widget.Button({ label:"Add Answer", id:aid, container:"newAnswer" }); + button.on("click", this.addAnswer); + } + + + this.loadObjectEdit = function(edit){ + if(edit){ +console.log('was an edit'+edit.type); + if(edit.type == "loadSection"){ +console.log('loadsection'); + Survey.SectionTemplate.loadSection(edit.params); + } + else if(edit.type == "loadQuestion"){ +console.log('loadquestion'); + Survey.QuestionTemplate.loadQuestion(edit.params); + } + else if(edit.type == "loadAnswer"){ + Survey.AnswerTemplate.loadAnswer(edit.params); + } + } + } + + + this.loadLast = function(){ + this.loadData(lastDataSet); + } +}(); + + +//--------------------------------------------- + + +/*Survey.SectionTemplate = new function(){ + this.qpp; + this.randomizeQuestions; + this.questionsOnSectionPage; + + this.returnData = function(){ + var data = {}; + data['type'] = "section"; + data["sectionText"] = document.getElementById('text').value; + data['sectionName'] = document.getElementById('sectionName').value; + data['questionsPerPage'] = this.qpp.get('label'); + data['randomizeQuestions'] = this.randomizeQuestions.get('checkedButton').get('value'); + data['questionsOnSectionPage'] = this.questionsOnSectionPage.get('checkedButton').get('value'); + data['Survey_sectionId'] = document.getElementById('Survey_sectionId').value; + Survey.Comm.submitEdit(data); + return data; + } + this.qppClick = function(p_sType, p_aArgs, p_oItem) { + Survey.SectionTemplate.qpp.set("label", p_oItem.cfg.getProperty("text")); + } + this.loadSection = function(params){ + document.getElementById('edit').innerHTML = "\ +

      Section Number: "+params.sequenceNumber + "\ + \ +

      Section Name: \ +


      \ +

      Randomize Questions: \ +

      Question per Page: \ +

      Questions on Section Page: \ +


      \ +

      Section Text:

      \ +

      \ + "; + + this.randomizeQuestions = new YAHOO.widget.ButtonGroup({ + id: "randomizeQuestions", + name: "randomizeQuestions", + container: "randomQuestions" }); + + this.randomizeQuestions.addButtons([ + { label: "Yes", value: "1" }, + { label: "No", value: "0" } + ]); + + if(params['randomizeQuestions'] == 1){this.randomizeQuestions.check(0);} + else{this.randomizeQuestions.check(1);} + + var qppList = []; + + for(var i = 1; i <= 10; i++){ + qppList.push({ text: i.toString(), onclick: { fn: Survey.SectionTemplate.qppClick } }); + } + + this.qpp = new YAHOO.widget.Button({ + type: "menu", + label: "1", + name: "mymenubutton", + menu: qppList, + container: "questionsPerPage" }); + this.qpp.set("label", params['questionsPerPage']); + + + this.questionsOnSectionPage = new YAHOO.widget.ButtonGroup({ + id: "questionsOnSectionPage", + name: "questionsOnSectionpage", + container: "questionsOnSectionPage" }); + this.questionsOnSectionPage.addButtons([ + { label: "Yes", value: "1" }, + { label: "No", value: "0" } + ]); + if(params['questionsOnSectionPage'] == 1){this.questionsOnSectionPage.check(0);} + else{this.questionsOnSectionPage.check(1);} + } +}(); +*/ +/*Survey.QuestionTemplate = new function(){ + this.loadQuestion = function(params){ +for(var i in params){ + console.log(i+' '+params[i]); +} + document.getElementById('edit').innerHTML = "\ +

      Question Number: "+params.sequenceNumber + "\ + \ + \ + +

      Randomize Questions: \ +

      Question per Page: \ +

      Questions on Section Page: \ +


      \ +

      Section Text:

      \ +

      \ + "; + } +}(); +*/ +Survey.AnswerTemplate = new function(){ + this.loadAnswer = function(){ + } +}(); + + + +//---------------------------------------- + +Survey.Comm = new function(){ + + //p is a string that contains the id of the Survey that is of interest. To get Section 2 Question 3 Answer 4 pass '2-3-4'. + var request = function(sUrl,callback,postData){ + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + var callback = { + success:function(o){ + Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); + }, + failure: function(o){ + alert("Last request failed"); + Survey.Data.loadLast(); + }, + argument:["what","is","this","for"], + timeout: 1000 + }; + this.loadSurvey = function(p){ + var postData = "data="+p; + var sUrl = "?func=loadSurvey"; + request(sUrl,callback,postData); + } + this.dragDrop = function(target,before){ + var p = {}; + p['target'] = target; + p['before'] = before; + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=dragDrop"; + request(sUrl,callback,postData); + } + this.submitEdit = function(p){ + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=submitEdit"; + request(sUrl,callback,postData); + } + this.newSection = function(){ + var sUrl = "?func=newSection"; + request(sUrl,callback); + } + this.newQuestion = function(sid){ + var postData = "data="+sid; + var sUrl = "?func=newQuestion"; + request(sUrl,callback,postData); + } +}(); + +//---------------------------------------------------------------- +// +// Initialize survey +// +//---------------------------------------------------------------- +Survey.OnLoad = function() { + var e = YAHOO.util.Event; + return { + init: function() { + //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); + e.onDOMReady(this.initHandler); + }, + initHandler: function(){ + new YAHOO.util.DDTarget("sections","sections"); + Survey.Comm.loadSurvey(); + }, + } +}(); + +Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/editsurvey/answer.js b/www/extras/wobject/Survey/editsurvey/answer.js new file mode 100644 index 000000000..7db2d7910 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey/answer.js @@ -0,0 +1,67 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.AnswerTemplate = new function(){ + this.params; + this.loadAnswer = function(params){ + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +

      \ +
      Please enter answer information
      \ +
      \ +\ + \ +\ +

      Answer Number: "+params.sequenceNumber + "\ +\ + \ + \ + "; + html = html + "

      Answer Text:\n\n"; + html = html + "

      Recorded Answer\n\n"; + html = html + "

      Jump to Question:"; + html = html + "

      Is this the correct answer:\n" + + this.makeRadio('isCorrect',[{text:'Yes',value:1},{text:'No',value:0}],params.isCorrect); + html = html + "

      Min:"; + html = html + "

      Max:"; + html = html + "

      Step:"; + html = html + "

      Verbatim:\n" + + this.makeRadio('verbatim',[{text:'Yes',value:1},{text:'No',value:0}],params.verbatim); + document.getElementById('edit').innerHTML = html; + + var butts = [{ text:"Submit", handler:function(){this.submit();}, isDefault:true },{ text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_answerId != ''){ + butts[2] = { text:"Delete", handler:function(){Survey.Comm.deleteAnswer(Survey.AnswerTemplate.params.Survey_answerId);}}; + } + + var form = new YAHOO.widget.Dialog("answer", + { width : "300px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + }); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + this.params = params; + }; + + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } +}(); diff --git a/www/extras/wobject/Survey/editsurvey/comm.js b/www/extras/wobject/Survey/editsurvey/comm.js new file mode 100644 index 000000000..76f19cfcd --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey/comm.js @@ -0,0 +1,67 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.Comm = new function(){ + + var request = function(sUrl,callback,postData){ + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } + this.callback = { + success:function(o){ + Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); + }, + failure: function(o){ + alert("Last request failed"); + Survey.Data.loadLast(); + }, + timeout: 1000 + }; + this.loadSurvey = function(p){ + var postData = "data="+p; + var sUrl = "?func=loadSurvey"; + request(sUrl,this.callback,postData); + } + this.dragDrop = function(target,before){ + var p = {}; + p['target'] = target; + p['before'] = before; + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=dragDrop"; + request(sUrl,this.callback,postData); + } + this.submitEdit = function(p){ + var postData = "data="+YAHOO.lang.JSON.stringify(p); + var sUrl = "?func=submitEdit"; + request(sUrl,this.callback,postData); + } + this.newSection = function(){ + var sUrl = "?func=newSection"; + request(sUrl,this.callback); + } + this.newQuestion = function(sid){ + var postData = "data="+sid; + var sUrl = "?func=newQuestion"; + request(sUrl,this.callback,postData); + } + this.newAnswer = function(sid,qid){ + var postData = "data="+YAHOO.lang.JSON.stringify([sid,qid]); + var sUrl = "?func=newAnswer"; + request(sUrl,this.callback,postData); + } + this.deleteAnswer = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteAnswer"; + request(sUrl,this.callback,postData); + } + this.deleteQuestion = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteQuestion"; + request(sUrl,this.callback,postData); + } + this.deleteSection = function(id){ + var postData = "data="+id; + var sUrl = "?func=deleteSection"; + request(sUrl,this.callback,postData); + } +}(); diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js new file mode 100644 index 000000000..49990a482 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -0,0 +1,107 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.QuestionTemplate = new function(){ + + this.loadQuestion = function(params){ + + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +

      \ +
      Please enter question information
      \ +
      \ +\ + \ +

      Question Number: "+params.sequenceNumber + "\ +\ + \ + \ +

      Question Text:\n"; + if(params.questionText == ''){ + html = html + "\n"; + } + else{ + html = html + "\n"; + } + html = html + "

      Question custom variable name:"; + html = html + "

      Randomize answers:"; + + html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); + html = html + "

      Previous answers to display:"; + html = html + "

      Question type:"; + + var questions = ['Multiple Choice','Gender','Yes/No','True/False','Agree/Disagree','Oppose/Support','Importance','Likelihood','Certainty','Satisfaction', + 'Confidence','Effectiveness','Concern','Risk','Threat','Security','Ideology','Race','Party','Education', + 'Text', 'Email', 'Phone Number', 'Text Date', 'Currency', + 'Slider','Dual Slider - Range','Multi Slider - Allocate', 'Date','Date Range', 'File Upload','Hidden']; + + html = html + this.makeMenu('questionType',questions,questions,params.questionType); + + html = html + "\ +

      Randomized words:\ + \ +

      Vertical display:"; + + html = html+ this.makeRadio('verticalDisplay',[{text:'Yes',value:1},{text:'No',value:0}],params.verticalDisplay); + html = html + "

      Allow comment:"; + html = html+ this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}],params.allowComment); + html = html + "

      Maximum number of answers:"; + html = html + "

      Required:"; + html = html+ this.makeRadio('required',[{text:'Yes',value:1},{text:'No',value:0}],params.required); + html = html + "\ +

      \ +
      \ +
      \ + "; + + document.getElementById('edit').innerHTML = html; + + + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_questionId != ''){ + butts[2] = {text:"Delete", handler:function(){Survey.Comm.deleteQuestion(params.Survey_questionId);}}; + } + + var form = new YAHOO.widget.Dialog("question", + { width : "315px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + } ); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + + } + this.makeMenu = function(name,values,text,selected){ + var html = "\n"; + return html; + } + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } + +}(); diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js new file mode 100644 index 000000000..d95ce86a7 --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -0,0 +1,93 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.SectionTemplate = new function(){ + + this.loadSection = function(params){ + + for(var p in params){ + if(params[p] == undefined){params[p] = '';} + } + + var html = "\ +
      \ +
      Please enter section formation
      \ +
      \ +
      \ +

      Section Number: "+params.sequenceNumber + "\ + \ +

      Section Name: \ +


      \ +

      Randomize Questions:"; + if(params.randomizeQuestions == 1){ + html = html+ "\ + Yes\ + No"; + }else{ + html = html+ "\ + Yes\ + No"; + } + html = html + "\ +

      Question per Page:\ + \ +

      Questions on Section Page: "; + if(params.questionsOnSectionPage == 1){ + html = html+ "\ + Yes\ + No"; + }else{ + html = html+ "\ + Yes\ + No"; + } + html = html + "\ +


      \ +

      Section Text:

      \ + "; + html = html + "

      Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); + html = html + "

      Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); + html = html + "

      Terminal section: " + this.makeRadio('terminal',[{text:'Yes',value:1},{text:'No',value:0}],params.terminal); + html = html + "

      Terminal section URL: "; + document.getElementById('edit').innerHTML = html; + + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}} ]; + if(params.Survey_sectionId != ''){ + butts[2] = {text:"Delete", handler:function(){Survey.Comm.deleteSection(params.Survey_sectionId);}}; + } + + var form = new YAHOO.widget.Dialog("section", + { width : "300px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + } ); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + } + this.makeRadio = function(name,values,checked){ + var html = ''; + for(var i in values){ + if(checked == values[i]['value']){ + html = html+ "" + values[i]['text']; + }else{ + html = html+ "" + values[i]['text']; + } + } + html = html + "\n"; + return html; + } +}(); + diff --git a/www/extras/wobject/Survey/loadTemplate.pl b/www/extras/wobject/Survey/loadTemplate.pl new file mode 100755 index 000000000..3501b0076 --- /dev/null +++ b/www/extras/wobject/Survey/loadTemplate.pl @@ -0,0 +1,15 @@ +#!/usr/bin/perl + + +use strict; + +use DBI; +use File::Slurp; +my $dbh = DBI->connect("DBI:mysql:database=www_norman_com;host=localhost;port=3306", "webgui", "webgui", { RaiseError => 1, AutoCommit => 1 }) or die $!; + +my $file = read_file("template.html"); + +my $sth = $dbh->prepare(qq{ UPDATE template SET template = ?,revisionDate = ? WHERE assetid = ? }); +$sth->execute($file, time(),"M3RkJY763xgE1SLYQ4pBqA"); +$dbh->disconnect(); + diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css new file mode 100644 index 000000000..bae7b65b3 --- /dev/null +++ b/www/extras/wobject/Survey/survey.css @@ -0,0 +1,34 @@ +div.dateanswer { + min-height: 250px; +} +div.slider-bg { + position: relative; + background:url(/extras/wobject/Survey/bg-fader.gif) 5px 0 no-repeat; + height:28px; + width:228px; +} +div.slider-thumb { + cursor:default; + position: absolute; + top: 4px; +} +div.slider-min-thumb { + cursor:default; + position: absolute; + top: 4px; +} +div.slider-max-thumb { + cursor:default; + position: absolute; + top: 4px; +} +#headertitle { + display: none; +} +#headertext { + display: none; +} +#questions { + display: none; +} + diff --git a/www/extras/wobject/Survey/survey.css.backup b/www/extras/wobject/Survey/survey.css.backup new file mode 100644 index 000000000..e0e1e3327 --- /dev/null +++ b/www/extras/wobject/Survey/survey.css.backup @@ -0,0 +1,97 @@ + +div.trashcan { + border: 1px solid gray; + width: 175px; + height: 50px; +} +div.workarea { + padding:10px; + padding-top:40px; + float:left +} + +div.editarea { + margin-top:40px; + padding:10px; + float:left; + border: 1px solid gray; +} + +div.editquestion { + padding:10px; + float:left; +} +div.editanswer { + padding:10px; + float:left; +} + +#submitbutton { padding:20px; } + +div.entry { + padding-bottom:10px; + padding-left:10px; +} + +ul.draglist { + position: relative; + width: 300px; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + padding-bottom:20px; +} + +ul.draglist li { + margin: 5px; +} + +ul.questionList { + position: relative; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + min-height: 40px +} + +li.section { + background-color: #CCCCFF; + border:1px solid #7EA6B2; + cursor: move; +} + +li.sselected { + background-color: #E76300; + border:1px solid #7EA6B2; + cursor: move; +} + +li.qselected { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; +} + +li.question { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + padding-left:15px; + cursor: move; +} + +li.answer { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; +} +li.aselected { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; +} + diff --git a/www/extras/wobject/Survey/surveyedit.css b/www/extras/wobject/Survey/surveyedit.css new file mode 100644 index 000000000..1d6d48e21 --- /dev/null +++ b/www/extras/wobject/Survey/surveyedit.css @@ -0,0 +1,132 @@ + +div.testarea { + width: 200px; + height: 100px; + z-index: 999; + border: 1px solid gray; + background: #f7f7f7; + position: absolute; + top: 5%; + left:5%; +} + +div.trashcan { + border: 1px solid gray; + width: 175px; + height: 50px; +} +div.workarea { + padding:10px; + padding-top:40px; + float:left +} + +div.editarea { + margin-top:40px; + padding:10px; + float:left; + border: 1px solid gray; +} + +div.editquestion { + padding:10px; + float:left; +} +div.editanswer { + padding:10px; + float:left; +} + +#submitbutton { padding:20px; } + +div.entry { + padding-bottom:10px; + padding-left:10px; +} + +ul.draglist { + position: relative; + width: 300px; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + padding-bottom:20px; +} + +ul.draglist li { + margin: 5px; +} + +ul.questionList { + position: relative; + background: #f7f7f7; + border: 1px solid gray; + list-style: none; + margin:0; + padding:0; + min-height: 40px +} + +li.section { + background-color: #CCCCFF; + border:1px solid #7EA6B2; + cursor: move; + min-height: 10px; +} + +li.ssection { + background-color: #E76300; + border:1px solid #7EA6B2; + cursor: move; + min-height: 10px; +} + +li.squestion { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; + width: 80%; + min-height: 10px; +} +li.newQuestion { +# background-color: #D1E6EC; +# border:1px solid #7EA6B2; +# cursor: move; + padding-left:25px; +} + +li.question { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; + padding-left:15px; + width:80%; + min-height: 10px; +} + +li.answer { + background-color: #D1E6EC; + border:1px solid #7EA6B2; + cursor: move; + padding-left:50px; + width:60%; + min-height: 10px; +} +li.sanswer { + background-color: #CC6600; + border:1px solid #7EA6B2; + cursor: move; + padding-left:50px; + width:60%; + min-height: 10px; +} +li.newAnswer { +# background-color: #D1E6EC; +# border:1px solid #7EA6B2; + padding-left:50px; +# cursor: move; +} + diff --git a/www/extras/wobject/Survey/template.html.backup b/www/extras/wobject/Survey/template.html.backup new file mode 100644 index 000000000..627a01672 --- /dev/null +++ b/www/extras/wobject/Survey/template.html.backup @@ -0,0 +1,159 @@ +WebGUI Survey Alpha I ROCK A LOT!!! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      + +

      Questions

      + +
      + +
      + +
      + +
        + +
        + + + +
        + +

        Answers

        + +
        + +
        + +
          + +
        + +
        + + + +
        + +
        TrashCan.img
        + +
        + +

        Edit Section

        + +

        + +

        Displayed Text:

        + + + +
        + +
        + +
        + +
        + +
        + +

        Edit Question

        + +

        + +

        + +

        Question Text:

        + +
        + +

        Question Type:

        + +
        + +
        + +

        Options:

        + +
        + +
        + +
        + +
        + +

        Edit Answer

        + +

        + +

        + +

        + +
        + +
        + +
        + +
        + +
        + + + +
        + +
        + +
        + +
        + +
        + + diff --git a/www/extras/wobject/Survey/templates/buttonHTML.txt b/www/extras/wobject/Survey/templates/buttonHTML.txt new file mode 100644 index 000000000..3d11c5a24 --- /dev/null +++ b/www/extras/wobject/Survey/templates/buttonHTML.txt @@ -0,0 +1,6 @@ + + + + + id=> + diff --git a/www/extras/wobject/Survey/templates/fileLoaderHTML.txt b/www/extras/wobject/Survey/templates/fileLoaderHTML.txt new file mode 100644 index 000000000..a23e89784 --- /dev/null +++ b/www/extras/wobject/Survey/templates/fileLoaderHTML.txt @@ -0,0 +1,7 @@ + + + + + + diff --git a/www/extras/wobject/Survey/templates/takeSurvey.html b/www/extras/wobject/Survey/templates/takeSurvey.html new file mode 100644 index 000000000..c5ab9f306 --- /dev/null +++ b/www/extras/wobject/Survey/templates/takeSurvey.html @@ -0,0 +1,151 @@ + + +
        + + + +'> + + +
        +
        Q:
        + + + +
        selections left: max'>
        +
        +
        + + + + + + + + + + + + + verbatim' > + + + + + + + + + + + + + verbatim'> + + + + + + + + + + + verbatim'> + + + id=> + + + + + + + + +
        container'>
        + ' id='' type=text> + button'> + + verbatim'> + + + + + + + + + + ' name='' value=0> + + + ' name='' value=""> + + + +

        +
        + + show'>0 + + + + show'> + +
        0   +
        slider-bg' tabindex='-1' title='Slider' class=slider-bg> + +
        slider-min-thumb' class=slider-min-thumb> + +
        + +
        slider-max-thumb' class=slider-max-thumb> + +
        +
        + + +
        + +
        + +
        + + + + + + +

        +
        +   + show'>0 + ' name=''> +
        0   +
        slider-bg' tabindex='-1' title='Slider' class=slider-bg> +
        slider-thumb' class=slider-thumb> + +
        +
        +
        +
        + + + + + + + + +


        + + +
        + + + + diff --git a/www/extras/wobject/Survey/templates/textHTML.txt b/www/extras/wobject/Survey/templates/textHTML.txt new file mode 100644 index 000000000..80605e73d --- /dev/null +++ b/www/extras/wobject/Survey/templates/textHTML.txt @@ -0,0 +1,7 @@ + + + + + + + diff --git a/www/extras/wobject/Survey/thumb-n.gif b/www/extras/wobject/Survey/thumb-n.gif new file mode 100644 index 0000000000000000000000000000000000000000..c91a3329392770f552a68e04cbfc88d9f12fdd98 GIT binary patch literal 612 zcmZ?wbhEHb6l4%(c;>^fcHPGR|NrmUxo7*1-RCb{TD^9|$x~+zA31jJ{Dq&teyv=+ z?&z@-4<0@|d+x%62M-@TezI!K`o&9^uUNHa$IjjF-o3wc`O3B(yLRv0fAiMu=PzCy zJAU%*+jrNl-#Bpa@ZG!j9zA+|@zUiTyY`$sb$aXeofj@%x^eT?moHz>oISUB>-KFs zcCTK$e&gn?GiJ?MzH-f*H*b%hIJI`&hMzxwo;iDd`_A2)w`@Co=G@~aPrrZv@$TKb zt=o6)*}H$u+6_N`{M@#E*WbT?zkd7nU{Yi1 z?rG}tX7rvo*_xS?aULf#b33b;q381D7Oa}Bww5+4HcAVKH}i9u+wI!DTaQbmiJQ;m z$kAgiEDBAEX5PS<^yXD*GM0A$2EKzjOOvvfJuo8e**Kas zXLi#j4;d#0W-gIS2OAVbMf)^jPJHO-6K_&c&~Vzg=%|vg7)O($Q|Ix1g{c=T6jr#f dsAvSQayis=P(jr(>C_xamBUMBH!?6-0|0CW2iyPv literal 0 HcmV?d00001 From 94b73f3c7371f2306409755482d927c7fbff9762 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Sat, 19 Apr 2008 19:04:30 +0000 Subject: [PATCH 06/64] Deleting old junk files --- .../wobject/Survey/administersurvey.js.backup | 404 ------- .../Survey/administersurvey.js.backup1 | 408 -------- .../wobject/Survey/editsurvey.js.backup | 988 ------------------ .../wobject/Survey/editsurvey.js.backup.newer | 337 ------ .../wobject/Survey/template.html.backup | 159 --- 5 files changed, 2296 deletions(-) delete mode 100644 www/extras/wobject/Survey/administersurvey.js.backup delete mode 100644 www/extras/wobject/Survey/administersurvey.js.backup1 delete mode 100644 www/extras/wobject/Survey/editsurvey.js.backup delete mode 100644 www/extras/wobject/Survey/editsurvey.js.backup.newer delete mode 100644 www/extras/wobject/Survey/template.html.backup diff --git a/www/extras/wobject/Survey/administersurvey.js.backup b/www/extras/wobject/Survey/administersurvey.js.backup deleted file mode 100644 index 87ec877aa..000000000 --- a/www/extras/wobject/Survey/administersurvey.js.backup +++ /dev/null @@ -1,404 +0,0 @@ -if (typeof Survey == "undefined") { - var Survey = {}; -} - -Survey.Form = new function() { - - var sliders; - var dSliders; - var texts; - var buttons; - var cals; - var files; - - var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, - 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, - 'Race':1,'Party':1,'Education':1}; - var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; - var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; - var dateType = {'Date':1,'Date Range':1}; - var fileUpload = {'File Upload':1}; - var hidden = {'Hidden':1}; - - this.displayQuestions = function(params){ - sliders = new Array(); - dSliders = new Array(); - texts = new Array(); - buttons = new Array(); - cals = new Array(); - files = new Array(); - - var section = params.section; - var questions = params.questions; - document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
        "; - - if(section.questionsOnSectionPage){ - document.getElementById('headertext').innerHTML = section.sectionText; - } - - var qs = params.questions; - var s = params.survey; - var html = ""; - -// html = '
        '; - document.getElementById('survey').innerHTML = html;html = ''; - for(var i = 0; i < qs.length; i++){ - var q = qs[i]; - var verts = ''; - var verte = ''; - for(var x in q.answers){ - for(var y in q.answers[x]){ - if(q.answers[x][y] == undefined){q.answers[x][y] = '';} - } - } - - if(q.verticalDisplay != 0){ - verts = "

        "; - verte = "

        "; - } - - html += "
        "; - html += "
        Q"+q.sequenceNumber+": "+q.questionText+"
        "; - - if(multipleChoice[q.questionType]){ - if(q.maxAnswers > 1){ - html += "
        Selections left: "+q.maxAnswers+"
        "; - } - var butts = new Array(); - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""+verte; -// html += verts+""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); - b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); - butts.push(b); - buttons.push(b); - } - } - else if(text[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""; - - if(q.questionType == 'Text'){ - html += ""; - }else if(q.questionType == 'Email'){ - html += ""; - }else if(q.questionType == 'Phone Number'){ - html += ""; - }else if(q.questionType == 'Text Date'){ - html += ""; - }else if(q.questionType == 'Currency'){ - html += ""; - } - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - } - } - else if(dateType[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - var calid = a.Survey_answerId+'container'; - html += verts+""; - html += ""; - html += "
        "; - html += ""; - html += ""; - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); - c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); - c.render(); - c.hide(); - var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); - b.on("click", this.showCalendar,[c]); - } - } - else if(fileUpload[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""; - html += ""; - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - files.push(a.Survey_answerId); - } - } - else if(slider[q.questionType]){ - //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. - var max = 0; - if(q.questionType == 'Dual Slider - Range'){ - var a1 = q.answers[0]; - var a2 = q.answers[1]; - html += ""; - html += ""; - - html += verts+""; - html += "

        "+a.answerText+"
        "; - html += "
        "; - html += "0"; - html += ""; - html += ""+a2.max+""; - html += "
        0  "; - html += "
        "; - html += "
        \ -
        \ -
        \ -
        "; - - html += "
        \ - "; - html += "
        "+a1.max+""; - html += "
        "; - - html += "
        "+verte; - document.getElementById('survey').innerHTML += html;html = ''; - new this.dualSliders(q); - }else{ - for(var i in q.answers){ - var a = q.answers[i]; - html += verts+""; - html += "

        "; - html += "
        "; - html += a.answerText+" "; - html += "0"; - html += ""; - html += "
        0  "; - html += "
        "; - if(q.questionType == 'Dual Slider - Range'){ - html += "
        \ - \ -
        \ - "; - - }else{ - html += "
        \ - "; - } - html += "
        \ -
        "; - html += "
        "+a.max+""; - html += "
        "; - - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - if(a.max - a.min > max){max = a.max - a.min;} - } - } - if(q.questionType == 'Multi Slider - Allocate'){ - //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); - new this.sliderManager(q,max); - } - else if(q.questionType == 'Slider'){ - new this.sliders(q); - } - } - else if(hidden[q.questionType]){ - } - } - html += "


        "; - document.getElementById('survey').innerHTML += html;html = ''; - document.getElementById('footer').innerHTML = "
        You are |---| close to being done."; -// var submit = function() {alert(YAHOO.util.Connect.setForm('surveyForm'));} - YAHOO.util.Event.addListener("submit", "click", this.submit); - } - this.submit = function(){ - var butts = new Array(); - for(var i in buttons){ - if(buttons[i].get('checked')){ - butts.push([buttons[i].get('id'),buttons[i].get('value')]); - } - } - for(var i in files){ - console.log(files[i]); - console.log(document.getElementById(files[i]).value); - } - Survey.Comm.callServer(s,'submitQuestions'); - } - this.dualSliders = function(q){ - var total = 200; - var sliders = new Array(); - var a1 = q.answers[0]; - var a2 = q.answers[1]; - var scale = 200/a1.max; -console.log(scale); - - var id = q.Survey_questionId; - var a1id = a1.Survey_answerId; - var a2id = a2.Survey_answerId; - - var a1h = document.getElementById(a1id); - var a2h = document.getElementById(a2id); - var a1s = document.getElementById(a1id+'show'); - var a2s = document.getElementById(a2id+'show'); - var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', - a1id+"slider-min-thumb", a2id+"slider-max-thumb", - 200, 1*scale, [1,200]); - - s.minRange = 4; - var updateUI = function () { - var min = Math.round(s.minVal/scale), - max = Math.round(s.maxVal/scale); - a1h.value = min; - a1s.innerHTML = min; - a2h.value = max; - a2s.innerHTML = max; - }; - - // Subscribe to the dual thumb slider's change and ready events to - // report the state. -// s.subscribe('ready', updateUI); - s.subscribe('change', updateUI); - } - this.sliders = function(q){ - var total = 200; - var sliders = new Array(); - for(var i in q.answers){ - var a = q.answers[i]; - var step = q.answers[i].step; - var scale = 200/q.answers[i].max; - var Event = YAHOO.util.Event; - var lang = YAHOO.lang; - var id = a.Survey_answerId+'slider-bg'; - var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', - 0, 200, (scale*step)); - s.max = a.max*scale; - s.input = a.Survey_answerId; - s.scale = scale; - var check = function() { - var t = document.getElementById(this.input); - var tshow = document.getElementById(this.input+'show'); - t.value = this.getRealValue(); - tshow.innerHTML = this.getRealValue(); - }; - s.getRealValue = function() { - return this.getValue() / this.scale; - } - s.subscribe("slideEnd", check); - s.subscribe("change", check); - sliders.push(s); - } - } - //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating - this.sliderManager = function(q,t){ - var total = 200; - var step = q.answers[0].step; - var scale = 200/q.answers[0].max; - var sliders = new Array(); - - for(var i in q.answers){ - var a = q.answers[i]; - var Event = YAHOO.util.Event; - var lang = YAHOO.lang; - var id = a.Survey_answerId+'slider-bg'; - var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', - 0, 200, scale*step); - s.input = a.Survey_answerId; - s.lastValue = 0; -//console.log(s); - var check = function() { - var t = 0; - for(var x in sliders){ - t+= sliders[x].getValue(); - } - if(t > total){ - this.setValue(this.lastValue); - }else{ - this.lastValue = this.getValue(); -// alert("Setting "+this.input+" to "+this.getRealValue()); - document.getElementById(this.input).value = this.getRealValue(); - } - }; - s.subscribe("slideEnd", check); - s.subscribe("change", check); - var manualEntry = function(e){ - // set the value when the 'return' key is detected - if (Event.getCharCode(e) === 13 || e.type == 'blur') { - var v = parseFloat(this.value, 10); - v = (lang.isNumber(v)) ? v : 0; - v *= scale; - - // convert the real value into a pixel offset - for(var sl in sliders){ - if(sliders[sl].input == this.id){ - sliders[sl].setValue(Math.round(v)); - } - } - } - } - Event.on(document.getElementById(s.input), "keydown", manualEntry); - Event.on(document.getElementById(s.input), "blur", manualEntry); - - s.getRealValue = function() { - return Math.round(this.getValue() / scale); - } - sliders.push(s); - document.getElementById(s.input).value = s.getRealValue(); - } - } - - this.selectCalendar = function(event,args,obj){ - var id = obj[1]; - var selected = args[0]; - var date = selected[0]; - var year = date[0], month = date[1], day = date[2]; - var input = document.getElementById(id); - input.value = month + "/" + day + "/" + year; - obj[0].hide(); - } - - - this.showCalendar = function(event,objs){ - //console.log('showing '+objs[0].id); - objs[0].show(); - } - this.buttonChanged = function(event,objs){ - var b = objs[0]; - var qid = objs[1]; - var maxA = objs[2]; - var butts = objs[3]; - max = parseInt(max); - if(maxA == 1){ - for(var i in butts){ - butts[i].set('checked',false); - } - b.set('checked',true); - } - else if(b.get('checked')){ - var max = parseInt(document.getElementById(qid+'max').innerHTML); - if(max == 0){ - b.set('checked',false); - //warn that options used up - } - else{ - document.getElementById(qid+'max').innerHTML = parseInt(max-1); - } - }else{ - var max = parseInt(document.getElementById(qid+'max').innerHTML); - document.getElementById(qid+'max').innerHTML = parseInt(max+1); - } - } -}(); - - - - -//---------------------------------------------------------------- -// -// Initialize survey -// -//---------------------------------------------------------------- -Survey.OnLoad = new function() { - var e = YAHOO.util.Event; - this.init = function() { - e.onDOMReady(this.initHandler); - } - this.initHandler = function(){ - Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); - Survey.Comm.callServer('','loadQuestions'); - } -}(); - -Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/administersurvey.js.backup1 b/www/extras/wobject/Survey/administersurvey.js.backup1 deleted file mode 100644 index 4df16790c..000000000 --- a/www/extras/wobject/Survey/administersurvey.js.backup1 +++ /dev/null @@ -1,408 +0,0 @@ -if (typeof Survey == "undefined") { - var Survey = {}; -} - -Survey.Form = new function() { - - var sliders; - var dSliders; - var texts; - var buttons; - var cals; - var files; - - var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, - 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, - 'Race':1,'Party':1,'Education':1}; - var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; - var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; - var dateType = {'Date':1,'Date Range':1}; - var fileUpload = {'File Upload':1}; - var hidden = {'Hidden':1}; - - this.displayQuestions = function(params){ - sliders = new Array(); - dSliders = new Array(); - texts = new Array(); - buttons = new Array(); - cals = new Array(); - files = new Array(); - - var section = params.section; - var questions = params.questions; - document.getElementById('headertitle').innerHTML = "Section: "+section.sequenceNumber+" "+section.sectionName + "
        "; - - if(section.questionsOnSectionPage){ - document.getElementById('headertext').innerHTML = section.sectionText; - } - - var qs = params.questions; - var s = params.survey; - var html = ""; - -// html = ''; - document.getElementById('survey').innerHTML = html;html = ''; - for(var i = 0; i < qs.length; i++){ - var q = qs[i]; - var verts = ''; - var verte = ''; - for(var x in q.answers){ - for(var y in q.answers[x]){ - if(q.answers[x][y] == undefined){q.answers[x][y] = '';} - } - } - - if(q.verticalDisplay != 0){ - verts = "

        "; - verte = "

        "; - } - - html += "
        "; - html += "
        Q"+q.sequenceNumber+": "+q.questionText+"
        "; - - if(multipleChoice[q.questionType]){ - if(q.maxAnswers > 1){ - html += "
        Selections left: "+q.maxAnswers+"
        "; - } - var butts = new Array(); - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""+verte; -// html += verts+""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId, name: a.Survey_answerId, value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); - b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); - butts.push(b); - buttons.push(b); - } - } - else if(text[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""; - - if(q.questionType == 'Text'){ - html += ""; - }else if(q.questionType == 'Email'){ - html += ""; - }else if(q.questionType == 'Phone Number'){ - html += ""; - }else if(q.questionType == 'Text Date'){ - html += ""; - }else if(q.questionType == 'Currency'){ - html += ""; - } - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - } - } - else if(dateType[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - var calid = a.Survey_answerId+'container'; - html += verts+""; - html += ""; - html += "
        "; - html += ""; - html += ""; - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); - c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); - c.render(); - c.hide(); - var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); - b.on("click", this.showCalendar,[c]); - } - } - else if(fileUpload[q.questionType]){ - for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; - html += verts+""; - html += ""; - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - files.push(a.Survey_answerId); - } - } - else if(slider[q.questionType]){ - //First run through and put up the span placeholders and find the max value for an answer, to know how big the allocation points will be. - var max = 0; - if(q.questionType == 'Dual Slider - Range'){ - var a1 = q.answers[0]; - var a2 = q.answers[1]; - html += ""; - html += ""; - - html += verts+""; - html += "

        "+a.answerText+"
        "; - html += "
        "; - html += "0"; - html += ""; - html += ""+a2.max+""; - html += "
        0  "; - html += "
        "; - html += "
        \ -
        \ -
        \ -
        "; - - html += "
        \ - "; - html += "
        "+a1.max+""; - html += "
        "; - - html += "
        "+verte; - document.getElementById('survey').innerHTML += html;html = ''; - new this.dualSliders(q); - }else{ - for(var i in q.answers){ - var a = q.answers[i]; - html += verts+""; - html += "

        "; - html += "
        "; - html += a.answerText+" "; - html += "0"; - html += ""; - html += "
        0  "; - html += "
        "; - if(q.questionType == 'Dual Slider - Range'){ - html += "
        \ - \ -
        \ - "; - - }else{ - html += "
        \ - "; - } - html += "
        \ -
        "; - html += "
        "+a.max+""; - html += "
        "; - - html += ""+verte; - document.getElementById('survey').innerHTML += html;html = ''; - if(a.max - a.min > max){max = a.max - a.min;} - } - } - if(q.questionType == 'Multi Slider - Allocate'){ - //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); - new this.sliderManager(q,max); - } - else if(q.questionType == 'Slider'){ - new this.sliders(q); - } - } - else if(hidden[q.questionType]){ - } - } - html += "


        "; - document.getElementById('survey').innerHTML += html;html = ''; - document.getElementById('footer').innerHTML = "
        You are |---| close to being done."; - YAHOO.util.Event.addListener("submit", "click", this.submit); - YAHOO.util.Event.addListener("testSubmit", "click", this.tsubmit); - } - - - this.tsubmit = function(){ -// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); -var t = document.getElementById('surveyTest'); -// Survey.Comm.callServer('','submitQuestions',document.getElementById('surveyTest')); - Survey.Comm.callServer('','submitQuestions','surveyTest'); - } - - this.submit = function(){ -// console.log(YAHOO.util.Connect.setForm('surveyForm',1)); - Survey.Comm.callServer('','submitQuestions','surveyForm'); - } - - - - - this.dualSliders = function(q){ - var total = 200; - var sliders = new Array(); - var a1 = q.answers[0]; - var a2 = q.answers[1]; - var scale = 200/a1.max; -//console.log(scale); - - var id = q.Survey_questionId; - var a1id = a1.Survey_answerId; - var a2id = a2.Survey_answerId; - - var a1h = document.getElementById(a1id); - var a2h = document.getElementById(a2id); - var a1s = document.getElementById(a1id+'show'); - var a2s = document.getElementById(a2id+'show'); - var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', - a1id+"slider-min-thumb", a2id+"slider-max-thumb", - 200, 1*scale, [1,200]); - - s.minRange = 4; - var updateUI = function () { - var min = Math.round(s.minVal/scale), - max = Math.round(s.maxVal/scale); - a1h.value = min; - a1s.innerHTML = min; - a2h.value = max; - a2s.innerHTML = max; - }; - - // Subscribe to the dual thumb slider's change and ready events to - // report the state. -// s.subscribe('ready', updateUI); - s.subscribe('change', updateUI); - } - this.sliders = function(q){ - var total = 200; - var sliders = new Array(); - for(var i in q.answers){ - var a = q.answers[i]; - var step = q.answers[i].step; - var scale = 200/q.answers[i].max; - var Event = YAHOO.util.Event; - var lang = YAHOO.lang; - var id = a.Survey_answerId+'slider-bg'; - var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', - 0, 200, (scale*step)); - s.max = a.max*scale; - s.input = a.Survey_answerId; - s.scale = scale; - var check = function() { - var t = document.getElementById(this.input); - var tshow = document.getElementById(this.input+'show'); - t.value = this.getRealValue(); - tshow.innerHTML = this.getRealValue(); - }; - s.getRealValue = function() { - return this.getValue() / this.scale; - } - s.subscribe("slideEnd", check); - s.subscribe("change", check); - sliders.push(s); - } - } - //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating - this.sliderManager = function(q,t){ - var total = 200; - var step = q.answers[0].step; - var scale = 200/q.answers[0].max; - var sliders = new Array(); - - for(var i in q.answers){ - var a = q.answers[i]; - var Event = YAHOO.util.Event; - var lang = YAHOO.lang; - var id = a.Survey_answerId+'slider-bg'; - var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', - 0, 200, scale*step); - s.input = a.Survey_answerId; - s.lastValue = 0; -//console.log(s); - var check = function() { - var t = 0; - for(var x in sliders){ - t+= sliders[x].getValue(); - } - if(t > total){ - this.setValue(this.lastValue); - }else{ - this.lastValue = this.getValue(); -// alert("Setting "+this.input+" to "+this.getRealValue()); - document.getElementById(this.input).value = this.getRealValue(); - } - }; - s.subscribe("slideEnd", check); - s.subscribe("change", check); - var manualEntry = function(e){ - // set the value when the 'return' key is detected - if (Event.getCharCode(e) === 13 || e.type == 'blur') { - var v = parseFloat(this.value, 10); - v = (lang.isNumber(v)) ? v : 0; - v *= scale; - - // convert the real value into a pixel offset - for(var sl in sliders){ - if(sliders[sl].input == this.id){ - sliders[sl].setValue(Math.round(v)); - } - } - } - } - Event.on(document.getElementById(s.input), "keydown", manualEntry); - Event.on(document.getElementById(s.input), "blur", manualEntry); - - s.getRealValue = function() { - return Math.round(this.getValue() / scale); - } - sliders.push(s); - document.getElementById(s.input).value = s.getRealValue(); - } - } - - this.selectCalendar = function(event,args,obj){ - var id = obj[1]; - var selected = args[0]; - var date = selected[0]; - var year = date[0], month = date[1], day = date[2]; - var input = document.getElementById(id); - input.value = month + "/" + day + "/" + year; - obj[0].hide(); - } - - - this.showCalendar = function(event,objs){ - //console.log('showing '+objs[0].id); - objs[0].show(); - } - this.buttonChanged = function(event,objs){ - var b = objs[0]; - var qid = objs[1]; - var maxA = objs[2]; - var butts = objs[3]; - max = parseInt(max); - if(maxA == 1){ - for(var i in butts){ - butts[i].set('checked',false); - } - b.set('checked',true); - } - else if(b.get('checked')){ - var max = parseInt(document.getElementById(qid+'max').innerHTML); - if(max == 0){ - b.set('checked',false); - //warn that options used up - } - else{ - document.getElementById(qid+'max').innerHTML = parseInt(max-1); - } - }else{ - var max = parseInt(document.getElementById(qid+'max').innerHTML); - document.getElementById(qid+'max').innerHTML = parseInt(max+1); - } - } -}(); - - - - -//---------------------------------------------------------------- -// -// Initialize survey -// -//---------------------------------------------------------------- -Survey.OnLoad = new function() { - var e = YAHOO.util.Event; - this.init = function() { - e.onDOMReady(this.initHandler); - } - this.initHandler = function(){ - Survey.Comm.setUrl('/'+document.getElementById('assetPath').value); - Survey.Comm.callServer('','loadQuestions'); - } -}(); - -Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/editsurvey.js.backup b/www/extras/wobject/Survey/editsurvey.js.backup deleted file mode 100644 index 7a36bca33..000000000 --- a/www/extras/wobject/Survey/editsurvey.js.backup +++ /dev/null @@ -1,988 +0,0 @@ -// vim:ft=javascript - -//---------------------------------------------------------------- -// -// Initialize namespace -// -//---------------------------------------------------------------- - -(function() { -if (typeof WebGUI == "undefined") { - var WebGUI = {}; -} -var Survey = {}; - -//---------------------------------------------------------------- -// -// Global Params -// -//---------------------------------------------------------------- -var objects = new Array(); -objects[0] = undefined; -var slength = 1; - -//---------------------------------------------------------------- -// -// List Super Object -// -//---------------------------------------------------------------- -//function listObject(type){ -Survey.listObject = function(type){ - var loType = type; - this.dom; - this.toggleOn = function(){ - if(loType == 'section'){ - this.dom.className="sselected"; - }else if(loType == 'question'){ - this.dom.className="qselected"; - } - } - this.toggleOff = function(){ - this.dom.className=loType; - } - this.getType = function(){return loType;} -} - - -//---------------------------------------------------------------- -// -// Section definition -// -//---------------------------------------------------------------- -//function section(text,s,randomize){ -Survey.Section = function(text,s,randomize){ - //inheritence - this.inherit= Survey.listObject; - this.inherit("section"); - - var sectionUL = document.getElementById('sections'); - - this.text = text; - this.sId = "S"+(slength++); - this.id = s.toString(); - this.randomize = randomize; - this.questions = new Array(); - this.dd; - this.ddt; - this.addThyself = function(){ - if(this.dom != undefined){alert("dom already defined");return} - this.dom = document.createElement('li'); - this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects - this.updateHTML(); - // this.className = this.getType(); - - var holder = document.createElement('ul'); - holder.className = "questionList"; - holder.id = this.id + "QL"; - holder.innerHTML = "
      • "; - - - var pli = document.createElement('li');//parent li, containter to hold section li and question ul. - pli.id = this.id+"div"; - pli.className = this.getType(); - sectionUL.appendChild(pli); - pli.appendChild(this.dom); - pli.appendChild(holder); - - this.ddt = new YAHOO.util.DDTarget(this.id+"QL","questions"); - - this.dd = new WebGUI.DDList(this.id+"div","sections"); - this.dd.isTarget = false; - this.dd.addToGroup("trashcan"); - this.dd.setHandleElId(this.id); - - YAHOO.util.Event.addListener(this.id, "click", WebGUI.SectionHandler.clicked); - } - this.updateHTML = function(){ - this.dom.innerHTML="["+this.sId+"]"+ " " + this.text.substr(0,25) + " ..."; - } - this.updateLoc = function(loc){ - this.sId = "S"+loc; - this.updateHTML(); - } - this.removeQuestion = function(id){ - for(var i = 0; i <= this.questions.length; i++){ - if(this.questions[i] == id){ - this.questions.splice(i,1); - break; - } - } - } - this.addThyself(); - - this.noDrag = function(){ - this.dd.lock(); - }, - - this.removeThyself = function(){ - if(this.dom == undefined){ alert("dom is not defined"); return; } - YAHOO.util.Event.removeListener(this.id, "click"); - this.dd.setHandleElId(undefined); - this.dd.unreg(); - this.dd = undefined; - var p = this.dom.parentNode; - p.removeChild(this.dom.nextSibling); - p.removeChild(this.dom); - p.parentNode.removeChild(p); - this.dom = undefined; - } - - this.showThyself = function(){ - document.getElementById("sid").innerHTML = this.sId; - document.getElementById("sectioninputtext").value = this.text; - var menu = WebGUI.Menu.getsMenu(); - menu.getItem(0).cfg.setProperty("checked",this.randomize); - } - this.update = function(text,randomize){ - this.text = text; - this.randomize = randomize; - this.updateHTML(); - } - this.DESTROY = function(){ - for(var q in this.questions){ - objects[this.questions[q]].DESTROY(); - } - this.removeThyself(); - slength--; - objects[this.id] = undefined; - WebGUI.Menu.newS(); - } -} -//Notes, use previousSibling,nextSibling to get ids of siblings, and insertBefore or appendChild to add elements. -WebGUI.SectionHandler = function(){ - return{ - clicked: function() {//new section event button, prompts the new section menu - WebGUI.DM.showThis(this.id); - } - } -}(); - - - -//---------------------------------------------------------------- -// -// Answer definition -// -//---------------------------------------------------------------- -Survey.Answer = function(id,qid){ - //inheritence - this.inherit= Survey.listObject; - this.inherit("answer"); - this.avalues = [{'atext':"",'ameta':""}]; //array of associative arrays. Array maps to answer types. associate arrays map to all possible responses - this.qId = qid; - this.id = id; - this.aId = "A"+objects[this.qId].answers.length; - var answerUL = document.getElementById("answers"); - objects[this.qId].answers[objects[this.qId].answers.length] = this.id; - this.addThyself = function(){ - if(this.dom != undefined){alert("dom already defined");return} - this.dom = document.createElement('li'); - this.dom.id=this.id;//use slice to get just the number. Q used to protect namespace from A numbered objects - this.dom.className = this.getType(); - this.updateHTML(); - answerUL.appendChild(this.dom); - this.dd = new WebGUI.DDList(this.id.toString(),"answers"); - this.dd.addToGroup("trashcan"); - YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.AnswerHandler.clicked); - } - this.updateHTML = function(){ - this.dom.innerHTML="["+this.aId+"]"; - } - this.showThyself = function(){ - document.getElementById('asid').innerHTML = objects[this.sId].sId; - document.getElementById('aqid').innerHTML = objects[this.qId].qId; - document.getElementById('aid').innerHTML = this.aId; - } - this.hide = function(){ - } - this.show = function(){ - } - this.DESTROY = function(){ - if(this.dom == undefined){ alert("dom is not defined"); return; } - YAHOO.util.Event.removeListener(this.id, "click"); - this.dom.parentNode.removeChild(this.dom); - this.dom = undefined; - this.dd.unreg(); - objects[this.id] = undefined; - } -} -WebGUI.AnswerHandler = function(){ - return{ - clicked: function() {//new section event button, prompts the new section menu -alert('click'); -// WebGUI.DM.showThis(this.id); - } - } -}(); - - - - -//---------------------------------------------------------------- -// -// Question definition -// -//---------------------------------------------------------------- -//function question(qid,type,typeName,text,options,toptions,sid){ -Survey.Question = function(qid,type,typeName,text,options,toptions,sid){ - //inheritence - this.inherit= Survey.listObject; - this.inherit("question"); - this.type = type; //index to the qMenu YUI menu containing this question type - this.typeName = typeName; - this.text = text; //Question text - this.id = qid; - this.sId = sid; //Section parent node id attribute - objects[sid].questions[objects[sid].questions.length] = qid; - this.qId = "Q"+ objects[this.sId].questions.length //Nodes id attribute - this.options = options; //indexes to the oMenu YUI menu - this.textOptions = toptions; //strings indexed by the ids of the option input fields - this.answers = new Array(); - this.answersRef = new Array(); //2D array of [qid][aid] which point at this qid. Used for updating answers when this question is reordered/deleted - - var questionUL = document.getElementById(this.sId.toString()+"QL"); - - this.loc; - - this.addThyself = function(){ - this.dom = document.createElement('li'); //reference to this questions dom object - this.dom.className = this.getType(); - this.dom.id = this.id.toString(); - this.updateHTML(); - questionUL.appendChild(this.dom); - this.dd = new WebGUI.DDList(this.id.toString(),"questions"); - this.dd.addToGroup("trashcan"); - YAHOO.util.Event.addListener(this.id.toString(), "click", WebGUI.QuestionHandler.clicked); - } - this.updateHTML = function(){ - this.dom.innerHTML="["+this.qId+ " "+ this.typeName+"] " + this.text.substr(0,25) + " ..."; - } - this.addThyself(); - - this.index = function(){ - var t = this.qId.split("-"); - return (t[1].slice(1)-1); - } - - this.removeThyself = function(){ - if(this.dom == undefined){ alert("dom is not defined"); return; } - YAHOO.util.Event.removeListener(this.id.toString(), "click"); - this.dom.parentNode.removeChild(this.dom); - this.dom = undefined; - this.dd.unreg(); - objects[this.sId].removeQuestion(this.id); - } - this.showThyself = function(){ - document.getElementById("qid").innerHTML = this.qId; - document.getElementById("qsid").innerHTML = objects[this.sId].sId; - document.getElementById("questioninputtext").value = this.text; - WebGUI.Menu.clearMenus(); - var menu = WebGUI.Menu.getqMenu(); - menu.getItem(this.type).cfg.setProperty("checked",true); - //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); - WebGUI.Menu.loadOMenu(this.type); - var oMenu = WebGUI.Menu.getoMenu(); - for(var i in this.options){ - oMenu.getItem(this.options[i]).cfg.setProperty("checked",true); - } - try{ - document.getElementById('max').value = q['max']; - }catch(e){} - try{ - document.getElementById('min').value = q['min']; - }catch(e){} - try{ - document.getElementById('step').value = q['step']; - }catch(e){} - - } - this.update = function(type, typeName,text,options,toptions){ - this.type=type; - this.typeName = typeName; - this.text = text; - this.options = options; - this.textOptions = toptions; - this.updateHTML(); - } - this.updateLoc = function(sid,loc){ - this.sId = sid; - this.qId = "Q"+loc; - this.updateHTML(); - } - this.DESTROY = function(){ - //remove event handler, dom, answerRefs, question, and answers - for(var i in this.answers){ - this.answers[i].DESTROY(); - } - for(var i in this.answersRef){ - this.answersRef[i].unlink(); - } - this.removeThyself(); - objects[this.id] = undefined; - WebGUI.Menu.newQ(); - } -} -WebGUI.QuestionHandler = function(){ - return{ - clicked: function() {//new question event button, prompts the new question menu - WebGUI.DM.showThis(this.id); - } - } -}(); - - -//---------------------------------------------------------------- -// -// Display Manager -// -//---------------------------------------------------------------- -WebGUI.DM = function(){ - var lastObject;//Current Question - return{ - updateSectionDOMLists: function(){ - //Loop through sections ul then answer ul and make sure everything is in the right place. - var q = document.getElementById('sections'); - var loc = 1; - var tsections = new Array(); - var start = q.firstChild;//the li which contains the a ul which contains the current section li and - while(start){ - var section = start.firstChild.id; - start = start.nextSibling; - objects[section].updateLoc(loc++); - objects[section].questions = new Array(); - this.updateQuestionDOMList(section,section+"QL"); - } - - }, - updateQuestionDOMList: function(sid, parent){ - var q = document.getElementById(parent); - var start = q.firstChild; - var loc = 1; - while(start){ - var section = start.id; - if(! start.id){ - start = start.nextSibling; - continue; - } - start = start.nextSibling; - objects[section].updateLoc(sid,loc++); - objects[sid].questions[objects[sid].questions.length] = section; - } - }, - - updateAnswerDOMLists: function(){ - }, - showThis: function(Id) { - this.clearLast(); - lastObject = Id; - try{ - objects[lastObject].toggleOn(); - WebGUI.Menu.sselected(lastObject); - WebGUI.Menu.showEditSection(); - }catch(e){} - try{ - objects[objects[lastObject].sId].toggleOn(); - WebGUI.Menu.sselected(objects[objects[lastObject].sId].id); - WebGUI.Menu.qselected(lastObject); - WebGUI.Menu.showEditQuestion(); - }catch(e){} - try{ - objects[objects[objects[lastObject].qId].sId].toggleOn(); - WebGUI.Menu.sselected(objects[objects[objects[lastObject].qId].sId].id); - WebGUI.Menu.qselected(objects[objects[lastObject].qId].id); - WebGUI.Menu.aselected(lastObject); - WebGUI.Menu.showEditAnswer(); - }catch(e){} - objects[lastObject].showThyself(); - }, - clearLast: function(){ - try{ - objects[lastObject].toggleOff(); - }catch(e){} - try{ - objects[objects[lastObject].sId].toggleOff(); - }catch(e){} - try{ - objects[objects[objects[lastObject].qId].sId].toggleOff(); - }catch(e){} - lastObject = undefined; - WebGUI.Menu.sselected(undefined); - WebGUI.Menu.qselected(undefined); - WebGUI.Menu.aselected(undefined); - }, - getLastSection: function(){ - var q = document.getElementById('sections'); - try{ - return (parseInt(q.lastChild.firstChild.id))//the li which contains the a ul which contains the current section li and - }catch(e){} - } - } -}(); - -//---------------------------------------------------------------- -// -// Menu definition -// -//---------------------------------------------------------------- -WebGUI.Menu = function(){ - var qMenu = new YAHOO.widget.Menu("qmenu",{position: "static", hidedelay: 750, lazyload: true}); - var oMenu = new YAHOO.widget.Menu("omenu",{position: "static", hidedelay: 750, lazyload: true}); - var sMenu = new YAHOO.widget.Menu("smenu",{position: "static", hidedelay: 750, lazyload: true}); - var aMenu = new YAHOO.widget.Menu("amenu",{position: "static", hidedelay: 750, lazyload: true}); - - var last = -1;//Last qMenu option selected, keep track so we can unselect on next click - var qselected = 0;//Currently selected qMenu item. - var sselected = 'S1'; - - return{ - sselected: function(i){ sselected = i; }, - qselected: function(i){ qselected = i; }, - aselected: function(i){ aselected = i; }, - - init: function() { - document.getElementById("questiontext").innerHTML=""; - WebGUI.Menu.clearMenus(); - qMenu.subscribe("click", this.qTypeClick); - oMenu.subscribe("click", this.oTypeClick); - - sMenu.addItems([ "Randomly Ordered" ] ); - sMenu.render("sectionmenu"); - sMenu.subscribe("click", this.sTypeClick); - - document.getElementById("qsubmitbutton").style.display="none"; - WebGUI.Menu.showEditSection(); - new YAHOO.widget.Button({ type: "button", label: "Submit Question", container: "qsubmitbutton", - onclick: {fn: WebGUI.Menu.addQ} }); - new YAHOO.widget.Button({ type: "button", label: "Submit Section", container: "ssubmitbutton", - onclick: {fn: WebGUI.Menu.addS} }); - new YAHOO.widget.Button({ type: "button", label: "Submit Answer", container: "asubmitbutton", - onclick: {fn: WebGUI.Menu.addA} }); - - }, - - getsMenu: function(){ return sMenu; }, - getqMenu: function(){ return qMenu; }, - getoMenu: function(){ return oMenu; }, - getaMenu: function(){ return aMenu; }, - - addQ: function() { - // var id = document.getElementById("qid").innerHTML; - var text = document.getElementById('questioninputtext').value; - var options = new Array(); - - var qindex; - var qtype; - var temp = qMenu.getItems(); - for(var i in temp){ - if(temp[i].cfg.getProperty("checked")){ - qtype = temp[i].value; - qindex = temp[i].index; - } - } - temp = oMenu.getItems(); - for(var i in temp){ - if(temp[i].cfg.getProperty("checked")){ - options[options.length] = temp[i].index; - } - } - var toptions = new Array(); - var sid = sselected; - - try{toptions['max'] = document.getElementById('max').value;}catch(err){} - try{toptions['min'] = document.getElementById('min').value;}catch(err){} - try{toptions['step'] = document.getElementById('step').value;}catch(err){} - - if(qselected != undefined){ - objects[qselected].update(qindex,qtype,text,options,toptions); - }else{ - objects[objects.length] = new Survey.Question(objects.length,qindex,qtype,text,options,toptions,sselected); - } - WebGUI.Menu.newQ(); - }, - addS: function(){ - var id; - if(sselected){ - id = sselected; - }else{ - id = objects.length; - } - var text = document.getElementById('sectioninputtext').value; - var checked = sMenu.getItem(0).cfg.getProperty("checked"); - if(objects[id] != undefined){//editing an existing section which knows how to update itself - objects[id].update(text,checked); - }else{ - objects[id] = new Survey.Section(text,id,checked); - } - WebGUI.Menu.newS(); - }, - addA: function(){ - var qtype = objects[qselected].type; - var id; - if(aselected){ - id = sselected; - }else{ - id = objects.length; - } - if(objects[id] == undefined){//editing an existing answer which knows how to update itself - objects[id] = new Survey.Answer(id,qselected) - } - for(var q in objects[id].avalues[qtype]){ - objects[id].avalues[qtype][q] = document.getElementById(q).value; - } - objects[id].addThyself(); - WebGUI.Menu.newA(); - }, - - newS: function() {//new section event button, prompts the new section menu - sselected = undefined; - qselected = undefined; - aselected = undefined; - WebGUI.DM.clearLast(); - WebGUI.Menu.showEditSection(); - document.getElementById('sectioninputtext').value = ''; - document.getElementById('sid').innerHTML = "S"+(slength); - sMenu.getItem(0).cfg.setProperty("checked",false); - }, - - newA: function() { - aselected = undefined; - if(!sselected){ - sselected = WebGUI.DM.getLastSection(); - } - if(!qselected){ - qselected = objects[sselected].questions[objects[sselected].questions.length-1]; - } - if(!qselected){ - alert("At least one question must be selected to add an answer."); - return; - } - document.getElementById('asid').innerHTML = objects[sselected].sId; - document.getElementById('aqid').innerHTML = objects[qselected].qId; - document.getElementById('aid').innerHTML = "A"+(objects[qselected].answers.length + 1); - WebGUI.DM.showThis(qselected); - WebGUI.Menu.showEditAnswer(); - WebGUI.Menu.clearOMenus(); - var input = document.getElementById("answerinput"); - input.innerHTML=""; - var qtype = objects[qselected].type; - if(qtype == 0){//multiple choice - input.innerHTML = "Please enter the text:
        "+ - "Please enter the meta tag: "; - }else if(qtype == 1){//Text - alert("Answers can not be added to a text type"); - WebGUI.Menu.newQ(); - }else if(qtype == 2){//Slider - }else if(qtype == 3){//Date - }else if(qtype == 4){//True/False - } - }, - newQ: function() { - qselected = undefined; - aselected = undefined; - if(!sselected){ - sselected = WebGUI.DM.getLastSection(); - } - if(!sselected){ - alert("At least one section must be selected to add an answer."); - return; - } - WebGUI.DM.showThis(sselected); - WebGUI.Menu.showEditQuestion(); - WebGUI.Menu.clearMenus(); - document.getElementById('qsid').innerHTML = objects[sselected].sId; - var nextQ = objects[sselected].questions.length; - document.getElementById('qid').innerHTML = "Q"+ (nextQ + 1); - document.getElementById("questioninputtext").value = ""; - WebGUI.Menu.loadOMenu(0); - }, - clearOMenus: function(){ - aMenu.clearContent(); - }, - - clearMenus: function() { - qMenu.clearContent(); - qMenu.addItems([ - {text: "Multiple Choice",value: "Multiple Choice"}, - {text: "Text",value: "Text"}, - {text: "Slider",value: "Slider"}, - {text: "Date",value: "Date"}, - {text: "True/False",value: "True/False"}, - ] ); - qMenu.render("questionmenu"); - oMenu.clearContent(); - document.getElementById("qsubmitbutton").style.display="none"; - document.getElementById("qoptionmenu").style.display="none"; - }, - - - loadQ: function(e) { - WebGUI.Menu.clearMenus(); - var q = questions[ this.id.slice(1) - 1 ]; - document.getElementById('qid').innerHTML = "Q"+q['id']+":"; - document.getElementById('questioninputtext').value = q['text']; - qMenu.getItem(q['type']).cfg.setProperty("checked"); - //WebGUI.Menu.qTypeClick(null,[null,qMenu.getItem(q['type'])],null); - WebGUI.Menu.loadOMenu(qMenu.getItem(q['type']).index); - for(var i in q['moptions']){ - oMenu.getItem(q['moptions'][i]).cfg.setProperty("checked",true); - } - try{ - document.getElementById('max').value = q['max']; - }catch(e){} - try{ - document.getElementById('min').value = q['min']; - }catch(e){} - try{ - document.getElementById('step').value = q['step']; - }catch(e){} - }, - - showEditQuestion: function() { - document.getElementById("editquestion").style.display="inline"; - document.getElementById("editanswer").style.display="none"; - document.getElementById("editsection").style.display="none"; - }, - showEditAnswer: function() { - document.getElementById("editquestion").style.display="none"; - document.getElementById("editanswer").style.display="inline"; - document.getElementById("editsection").style.display="none"; - }, - showEditSection: function() { - document.getElementById("editquestion").style.display="none"; - document.getElementById("editanswer").style.display="none"; - document.getElementById("editsection").style.display="inline"; - }, - - sTypeClick: function(p_sType, p_aArgs, p_oValue) { - if(p_aArgs[1].cfg.getProperty("checked")){ - p_aArgs[1].cfg.setProperty("checked", false); - }else{ - p_aArgs[1].cfg.setProperty("checked", true); - } - - }, - - oTypeClick: function(p_sType, p_aArgs, p_oValue) { - var checked = p_aArgs[1].cfg.getProperty("checked"); - var index = p_aArgs[1].index; - if(qselected == 1 && index >= 0 && index < 4){ - for(var i=0; i<=3; i++){ - oMenu.getItem(i).cfg.setProperty("checked",false); - } - p_aArgs[1].cfg.setProperty("checked",checked); - } - else if(qselected == 4 && index >= 0 && index <= 1){ - for(var i=0; i<=1; i++){ - oMenu.getItem(i).cfg.setProperty("checked",false); - } - p_aArgs[1].cfg.setProperty("checked",checked); - } - - if(p_aArgs[1].cfg.getProperty("checked")){ - p_aArgs[1].cfg.setProperty("checked", false); - }else{ - p_aArgs[1].cfg.setProperty("checked", true); - } - if(qselected == 0 && index == 1 && p_aArgs[1].cfg.getProperty("checked") == false){ - document.getElementById('max').value = 1; - } - }, - - validateMultipleMax: function(){ - var v = this.value; - if (v != parseInt(v) || v < 1){ - this.value = 1; - } - }, - - qTypeClick: function(p_sType, p_aArgs, p_oValue) { - var index = p_aArgs[1].index; - - WebGUI.Menu.showEditQuestion(); - - WebGUI.Menu.loadOMenu(index); - }, - - loadOMenu: function(index) { - - if(last > -1){ - qMenu.getItem(last).cfg.setProperty("checked",false); - } - qMenu.getItem(index).cfg.setProperty("checked",true); - last = index; - - oMenu.clearContent(); - - document.getElementById("qsubmitbutton").style.display="inline"; - document.getElementById("qoptionmenu").style.display="inline"; - document.getElementById("textoptions").innerHTML=""; - - var temp = document.createElement("div"); - - if(index == 0){//Multipe choice options - try{ - YAHOO.util.Event.removeListener("max", "click"); - }catch(e){} - YAHOO.util.Event.addListener("max", "blur", WebGUI.Menu.validateMultipleMax); - temp.innerHTML = "Max Answers:
        "; - oMenu.addItems([ - "Randomize", - "Horizontal display", - "Multiple Answers", - "Comment Box", - ] ); - } - else if(index == 1){//Text options - temp.innerHTML = "Max length
        "; - oMenu.addItems([ - "Multi-Line", - "Numerical", - "Phone Number", - "Currency Amount", - ] ); - } - else if(index == 2){//Slider options - temp.innerHTML = "Start Value:
        End Value:
        Step Value:
        "; - } - else if(index == 3){//Date options - oMenu.addItems([ - "Range", - ] ); - } - else if(index == 4){//True/False options - oMenu.addItems([ - "Yes/No", - "Male/Female", - ] ); - } - document.getElementById("textoptions").appendChild(temp); - oMenu.addItems(["Optional"]); - oMenu.render("qoptionmenu"); - }, - - } -}(); - - - - -//---------------------------------------------------------------- -// -// Initialize survey -// -//---------------------------------------------------------------- -WebGUI.OnLoad = function() { - var e = YAHOO.util.Event; - return { - init: function() { - //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); - e.onDOMReady(this.initHandler); - }, - initHandler: function(){ - new YAHOO.widget.Button({ type: "button", label: "New Question", container: "addqbutton", - onclick: {fn: WebGUI.Menu.newQ} }); - new YAHOO.widget.Button({ type: "button", label: "New Answer", container: "addabutton", - onclick: {fn: WebGUI.Menu.newA} }); - new YAHOO.widget.Button({ type: "button", label: "New Section", container: "addsbutton", - onclick: {fn: WebGUI.Menu.newS} }); - - WebGUI.Menu.init(); - - document.getElementById("editanswer").style.display="none"; - objects[objects.length] = new Survey.Section("First Section",objects.length,false); - WebGUI.DM.showThis(objects.length-1); - WebGUI.Menu.newQ(); - }, - } -}(); - -WebGUI.OnLoad.init(); - - - -var Dom = YAHOO.util.Dom; -var Event = YAHOO.util.Event; -var DDM = YAHOO.util.DragDropMgr; - -////////////////////////////////////////////////////////////////////////////// -// example app -////////////////////////////////////////////////////////////////////////////// -//YAHOO.example.DDApp = { -WebGUI.DD = { - init: function() { - - new YAHOO.util.DDTarget("sections","sections"); - new YAHOO.util.DDTarget("answers","answers"); - new YAHOO.util.DDTarget("trashcan","trashcan"); - - Event.on("showButton", "click", this.showOrder); - Event.on("switchButton", "click", this.switchStyles); - }, - - showOrder: function() { - var parseList = function(ul, title) { - var items = ul.getElementsByTagName("li"); - var out = title + ": "; - for (i=0;i this.lastY) { - this.goingUp = false; - } - - this.lastY = y; - }, - - onDragOver: function(e, id) { - - var srcEl = this.getEl(); - var destEl = Dom.get(id); - - // We are only concerned with list items, we ignore the dragover - // notifications for the list. - document.getElementById('log1').innerHTML = srcEl.className; - document.getElementById('log2').innerHTML = destEl.className; - document.getElementById('log').innerHTML = destEl.nodeName; - - if ( destEl.nodeName.toLowerCase() == "li" ) - { - //destEl.className == "questionList" || destEl.className == "question" || destEl.className == "qselected") - var orig_p = srcEl.parentNode; - var p = destEl.parentNode; - - if (this.goingUp) { - p.insertBefore(srcEl, destEl); // insert above - } else { - p.insertBefore(srcEl, destEl.nextSibling); // insert below - } - - DDM.refreshCache(); - } - } -}); - -//Event.onDOMReady(YAHOO.example.DDApp.init, YAHOO.example.DDApp, true); -Event.onDOMReady(WebGUI.DD.init, WebGUI.DD, true); - -})(); - diff --git a/www/extras/wobject/Survey/editsurvey.js.backup.newer b/www/extras/wobject/Survey/editsurvey.js.backup.newer deleted file mode 100644 index 78fc93177..000000000 --- a/www/extras/wobject/Survey/editsurvey.js.backup.newer +++ /dev/null @@ -1,337 +0,0 @@ -if (typeof Survey == "undefined") { - var Survey = {}; -} - -Survey.Data = new function(){ - var lastDataSet = {}; - var focus; - - this.dragDrop = function(did){ - var type; - - if(did.className.match("section")){type = 'section';} - else if(did.className.match("question")){type = 'question';} - else{ type = 'answer';} - - var first = {id:did.id,type:type}; - var before = document.getElementById(did.id).previousSibling; - - while(1){ - if( before == undefined || (before.id != undefined && before.id != '') ){ - break; - } - var before = before.previousSibling; - } - - var data = {id:'',type:''}; - - if(before != undefined && before.id != undefined && before.id != ''){ - if(before.className.match("section")){type = 'section';} - else if(before.className.match("question")){type = 'question';} - else{ type = 'answer';} - data = {id:before.id,type:type}; - } - - Survey.Comm.dragDrop(first,data); - } - - - - this.clicked = function(){ - Survey.Comm.loadSurvey(this.id); - } - - - - this.loadData = function(d){ - focus = d.focus;//What is the current highlighted item. - var lastType = '';//What was the last type created. - var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. - var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down - document.getElementById('sections').innerHTML=''; - - for(var x in d.data){ - //Now check to see if this is where an add button goes. - //Add addAnswer when we go from answer to question or section or end - //Add addQuestion when we go from question to section or end - - if(lastType == 'answer' && (d.data[x].type == 'question' || d.data[x].type == 'section')){ - this.addAnswerButton(lastId['question']); - buttons['answer'] = 1; - } - else if(lastType == 'question' && d.data[x].type == 'section'){ - this.addQuestionButton(lastId['section']); - buttons['question'] = 1; - } - else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ - this.addQuestionButton(lastId['section']); - buttons['question'] = 1; - } - - var node = document.createElement('li'); - - if(d.data[x].id == focus){ - node.className = "s"+d.data[x].type; - }else{ - node.className = d.data[x].type; - } - - node.innerHTML = d.data[x].text; - node.id = d.data[x].id; - new Survey.DDList(node.id,"sections"); - document.getElementById('sections').appendChild(node); - YAHOO.util.Event.addListener(d.data[x].id, "click", this.clicked); - - lastType = d.data[x].type; - lastId[d.data[x].type] = d.data[x].id; - } - if(lastType == 'answer' && ! buttons['answer']){ - this.addAnswerButton(lastId['question']); - this.addQuestionButton(lastId['section']); - }else if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ - this.addQuestionButton(lastId['section']); - } - - this.addSectionButton(); - - this.loadObjectEdit(d.edit); - lastDataSet = d; - } - - - this.addSection = function(){ - Survey.Comm.newSection(); - } - - - this.addQuestion = function(e,sid){ - Survey.Comm.newQuestion(sid); - } - - - this.addSectionButton = function(){ - var node = document.createElement('li'); - node.innerHTML = ""; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); - button.on("click", this.addSection); - } - - - this.addQuestionButton = function(qid){ - var node = document.createElement('li'); - node.className = 'newQuestion'; - node.innerHTML = ""; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); - button.on("click", this.addQuestion,qid); - } - - - this.addAnswerButton = function(aid){ - var node = document.createElement('li'); - node.id = 'newAnswer'; - node.className = 'newAnswer'; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Answer", id:aid, container:"newAnswer" }); - button.on("click", this.addAnswer); - } - - - this.loadObjectEdit = function(edit){ - if(edit){ -console.log('was an edit'+edit.type); - if(edit.type == "loadSection"){ -console.log('loadsection'); - Survey.SectionTemplate.loadSection(edit.params); - } - else if(edit.type == "loadQuestion"){ -console.log('loadquestion'); - Survey.QuestionTemplate.loadQuestion(edit.params); - } - else if(edit.type == "loadAnswer"){ - Survey.AnswerTemplate.loadAnswer(edit.params); - } - } - } - - - this.loadLast = function(){ - this.loadData(lastDataSet); - } -}(); - - -//--------------------------------------------- - - -/*Survey.SectionTemplate = new function(){ - this.qpp; - this.randomizeQuestions; - this.questionsOnSectionPage; - - this.returnData = function(){ - var data = {}; - data['type'] = "section"; - data["sectionText"] = document.getElementById('text').value; - data['sectionName'] = document.getElementById('sectionName').value; - data['questionsPerPage'] = this.qpp.get('label'); - data['randomizeQuestions'] = this.randomizeQuestions.get('checkedButton').get('value'); - data['questionsOnSectionPage'] = this.questionsOnSectionPage.get('checkedButton').get('value'); - data['Survey_sectionId'] = document.getElementById('Survey_sectionId').value; - Survey.Comm.submitEdit(data); - return data; - } - this.qppClick = function(p_sType, p_aArgs, p_oItem) { - Survey.SectionTemplate.qpp.set("label", p_oItem.cfg.getProperty("text")); - } - this.loadSection = function(params){ - document.getElementById('edit').innerHTML = "\ -

        Section Number: "+params.sequenceNumber + "\ - \ -

        Section Name: \ -


        \ -

        Randomize Questions: \ -

        Question per Page: \ -

        Questions on Section Page: \ -


        \ -

        Section Text:

        \ -

        \ - "; - - this.randomizeQuestions = new YAHOO.widget.ButtonGroup({ - id: "randomizeQuestions", - name: "randomizeQuestions", - container: "randomQuestions" }); - - this.randomizeQuestions.addButtons([ - { label: "Yes", value: "1" }, - { label: "No", value: "0" } - ]); - - if(params['randomizeQuestions'] == 1){this.randomizeQuestions.check(0);} - else{this.randomizeQuestions.check(1);} - - var qppList = []; - - for(var i = 1; i <= 10; i++){ - qppList.push({ text: i.toString(), onclick: { fn: Survey.SectionTemplate.qppClick } }); - } - - this.qpp = new YAHOO.widget.Button({ - type: "menu", - label: "1", - name: "mymenubutton", - menu: qppList, - container: "questionsPerPage" }); - this.qpp.set("label", params['questionsPerPage']); - - - this.questionsOnSectionPage = new YAHOO.widget.ButtonGroup({ - id: "questionsOnSectionPage", - name: "questionsOnSectionpage", - container: "questionsOnSectionPage" }); - this.questionsOnSectionPage.addButtons([ - { label: "Yes", value: "1" }, - { label: "No", value: "0" } - ]); - if(params['questionsOnSectionPage'] == 1){this.questionsOnSectionPage.check(0);} - else{this.questionsOnSectionPage.check(1);} - } -}(); -*/ -/*Survey.QuestionTemplate = new function(){ - this.loadQuestion = function(params){ -for(var i in params){ - console.log(i+' '+params[i]); -} - document.getElementById('edit').innerHTML = "\ -

        Question Number: "+params.sequenceNumber + "\ - \ - \ - -

        Randomize Questions: \ -

        Question per Page: \ -

        Questions on Section Page: \ -


        \ -

        Section Text:

        \ -

        \ - "; - } -}(); -*/ -Survey.AnswerTemplate = new function(){ - this.loadAnswer = function(){ - } -}(); - - - -//---------------------------------------- - -Survey.Comm = new function(){ - - //p is a string that contains the id of the Survey that is of interest. To get Section 2 Question 3 Answer 4 pass '2-3-4'. - var request = function(sUrl,callback,postData){ - YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); - } - var callback = { - success:function(o){ - Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); - }, - failure: function(o){ - alert("Last request failed"); - Survey.Data.loadLast(); - }, - argument:["what","is","this","for"], - timeout: 1000 - }; - this.loadSurvey = function(p){ - var postData = "data="+p; - var sUrl = "?func=loadSurvey"; - request(sUrl,callback,postData); - } - this.dragDrop = function(target,before){ - var p = {}; - p['target'] = target; - p['before'] = before; - var postData = "data="+YAHOO.lang.JSON.stringify(p); - var sUrl = "?func=dragDrop"; - request(sUrl,callback,postData); - } - this.submitEdit = function(p){ - var postData = "data="+YAHOO.lang.JSON.stringify(p); - var sUrl = "?func=submitEdit"; - request(sUrl,callback,postData); - } - this.newSection = function(){ - var sUrl = "?func=newSection"; - request(sUrl,callback); - } - this.newQuestion = function(sid){ - var postData = "data="+sid; - var sUrl = "?func=newQuestion"; - request(sUrl,callback,postData); - } -}(); - -//---------------------------------------------------------------- -// -// Initialize survey -// -//---------------------------------------------------------------- -Survey.OnLoad = function() { - var e = YAHOO.util.Event; - return { - init: function() { - //e.onDOMReady(this.initHandler, "The onDOMReady event fired. The DOM is now safe to modify via script."); - e.onDOMReady(this.initHandler); - }, - initHandler: function(){ - new YAHOO.util.DDTarget("sections","sections"); - Survey.Comm.loadSurvey(); - }, - } -}(); - -Survey.OnLoad.init(); diff --git a/www/extras/wobject/Survey/template.html.backup b/www/extras/wobject/Survey/template.html.backup deleted file mode 100644 index 627a01672..000000000 --- a/www/extras/wobject/Survey/template.html.backup +++ /dev/null @@ -1,159 +0,0 @@ -WebGUI Survey Alpha I ROCK A LOT!!! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        - -

        Questions

        - -
        - -
        - -
        - -
          - -
          - - - -
          - -

          Answers

          - -
          - -
          - -
            - -
          - -
          - - - -
          - -
          TrashCan.img
          - -
          - -

          Edit Section

          - -

          - -

          Displayed Text:

          - - - -
          - -
          - -
          - -
          - -
          - -

          Edit Question

          - -

          - -

          - -

          Question Text:

          - -
          - -

          Question Type:

          - -
          - -
          - -

          Options:

          - -
          - -
          - -
          - -
          - -

          Edit Answer

          - -

          - -

          - -

          - -
          - -
          - -
          - -
          - -
          - - - -
          - -
          - -
          - -
          - -
          - - From 9ce9618bf97f42e848c1a41ffa953d822c59d7ee Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 22 Apr 2008 01:25:56 +0000 Subject: [PATCH 07/64] added many new features --- www/extras/wobject/Survey/administersurvey.js | 6 +++++- www/extras/wobject/Survey/editsurvey/question.js | 2 +- www/extras/wobject/Survey/editsurvey/section.js | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index f52f732d8..238f2efdc 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -86,7 +86,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', value: a.Survey_answerId, container: a.Survey_answerId+"container", checked: false }); - b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts]); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length]); b.hid = a.Survey_answerId; butts.push(b); } @@ -278,6 +278,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var qid = objs[1]; var maxA = objs[2]; var butts = objs[3]; + var qsize = objs[4]; max = parseInt(max); if(maxA == 1){ for(var i in butts){ @@ -302,6 +303,9 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById(qid+'max').innerHTML = parseInt(max+1); document.getElementById(b.hid).value = 1; } + if(qsize == 1){ + Survey.Form.formsubmit(); + } } }(); diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js index 49990a482..11edd7b84 100644 --- a/www/extras/wobject/Survey/editsurvey/question.js +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -27,7 +27,7 @@ Survey.QuestionTemplate = new function(){ else{ html = html + "\n"; } - html = html + "

          Question custom variable name:"; + html = html + "

          Question custom variable name:

          "; html = html + "

          Randomize answers:"; html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js index d95ce86a7..11d00b05b 100644 --- a/www/extras/wobject/Survey/editsurvey/section.js +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -29,6 +29,7 @@ Survey.SectionTemplate = new function(){ Yes\ No"; } + html = html + "

          Section custom variable name:

          "; html = html + "\

          Question per Page:\ "; span.style.display = 'block'; @@ -56,6 +60,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer }else{ document.getElementById('questions').style.display='inline'; } + lastSection = s.Survey_sectionId; }else{ document.getElementById('headertitle').style.display='block'; document.getElementById('headertext').style.display = 'block'; @@ -79,14 +84,28 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer html += "


          "; html += "
          Q"+q.sequenceNumber+": "+q.questionText+"
          "; - if(multipleChoice[q.questionType]){ - var butts = new Array(); + if(multipleChoice[q.questionType] || scale[q.questionType]){ + var butts = new Array(); + verb = 0; for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; - var b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', - value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); + var b; + if(scale[q.questionType]){ + b = new YAHOO.widget.Button({ type: "checkbox", label: a.recordedAnswer, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', + value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.label=a.recordedAnswer; + }else{ + b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', + value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + b.label=a.answerText; + } + b.setStyle('text-align','center'); b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length]); + if(a.verbatim == 1){ + verb = 1; + } b.hid = a.Survey_answerId; butts.push(b); } @@ -303,7 +322,8 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById(qid+'max').innerHTML = parseInt(max+1); document.getElementById(b.hid).value = 1; } - if(qsize == 1){ +//console.log('qsize '+qsize+' verb '+verb); + if(qsize == 1 && verb == 0){ Survey.Form.formsubmit(); } } diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js index 11edd7b84..097505aa8 100644 --- a/www/extras/wobject/Survey/editsurvey/question.js +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -33,11 +33,13 @@ Survey.QuestionTemplate = new function(){ html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); html = html + "

          Previous answers to display:"; html = html + "

          Question type:"; - - var questions = ['Multiple Choice','Gender','Yes/No','True/False','Agree/Disagree','Oppose/Support','Importance','Likelihood','Certainty','Satisfaction', - 'Confidence','Effectiveness','Concern','Risk','Threat','Security','Ideology','Race','Party','Education', - 'Text', 'Email', 'Phone Number', 'Text Date', 'Currency', - 'Slider','Dual Slider - Range','Multi Slider - Allocate', 'Date','Date Range', 'File Upload','Hidden']; + var questions = ['Agree/Disagree','Certainty','Concern','Confidence','Currency','Date','Date Range','Dual Slider - Range','Education','Effectiveness', + 'Email','File Upload','Gender','Hidden','Ideology','Importance','Likelihood','Multi Slider - Allocate','Multiple Choice','Oppose/Support', + 'Party','Phone Number','Race','Risk','Satisfaction','Security','Slider','Text','Text Date','Threat','True/False','Yes/No']; +// var questions = ['Multiple Choice','Gender','Yes/No','True/False','Agree/Disagree','Oppose/Support','Importance','Likelihood','Certainty','Satisfaction', +// 'Confidence','Effectiveness','Concern','Risk','Threat','Security','Ideology','Race','Party','Education', +// 'Text', 'Email', 'Phone Number', 'Text Date', 'Currency', +// 'Slider','Dual Slider - Range','Multi Slider - Allocate', 'Date','Date Range', 'File Upload','Hidden']; html = html + this.makeMenu('questionType',questions,questions,params.questionType); diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index bae7b65b3..913bf4383 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -31,4 +31,10 @@ div.slider-max-thumb { #questions { display: none; } - +.yui-button{ + text-align: center; +} +.yui-button button{ + text-align: center; + min-width: 50px; +} diff --git a/www/extras/wobject/Survey/templates/takeSurvey.html b/www/extras/wobject/Survey/templates/takeSurvey.html index c5ab9f306..fcc57391b 100644 --- a/www/extras/wobject/Survey/templates/takeSurvey.html +++ b/www/extras/wobject/Survey/templates/takeSurvey.html @@ -7,8 +7,6 @@ -'> -


          Q:
          @@ -36,6 +34,12 @@ + + + '> + + + @@ -49,6 +53,33 @@ + + + + + + + + + + + + + +
          + +
          + + + verbatim'> + +
          + + id=> + +
          + + @@ -140,6 +171,11 @@ + +

          Comment: comment'>

          +
          + +
          @@ -149,3 +185,5 @@ + + From d5416689e92a906e1e705c6b68008ea17b1b0615 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 23 Apr 2008 18:10:51 +0000 Subject: [PATCH 12/64] 4 scales moved back to MC --- www/extras/wobject/Survey/administersurvey.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 91a50d5bd..d19381e85 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -4,10 +4,9 @@ if (typeof Survey == "undefined") { Survey.Form = new function() { - var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1}; + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Ideology':1, 'Race':1,'Party':1,'Education':1}; var scale = {'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, - 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1,'Ideology':1, - 'Race':1,'Party':1,'Education':1}; + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1}; var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; var dateType = {'Date':1,'Date Range':1}; From 18b00e0a2ffaddc52d2acd22482c00f8b1a411e4 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 23 Apr 2008 18:11:07 +0000 Subject: [PATCH 13/64] 4 scales moved back to MC --- lib/WebGUI/Asset/Wobject/Survey.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 241dcfafd..5f2b6ba15 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -975,9 +975,9 @@ $self->session->errorHandler->warn("-------SurveyEnd $url"); #sends the processed template and questions structure to the client sub showQuestions{ my ($self,$section,$questions) = @_; - my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1); + my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1'Ideology',1, 'Race',1,'Party',1,'Education',1); my %scale = ('Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, - 'Effectiveness',1,'Concern',1,'Risk',1,'Threat',1,'Security',1,'Ideology',1, 'Race',1,'Party',1,'Education',1); + 'Effectiveness',1,'Concern',1,'Risk',1,'Threat',1,'Security',1); my %text = ('Text',1, 'Email',1, 'Phone Number',1, 'Text Date',1, 'Currency',1); my %slider = ('Slider',1, 'Dual Slider - Range',1, 'Multi Slider - Allocate',1); my %dateType = ('Date',1,'Date Range',1); From 1f8d1b3899e0d137b328b8c883b52d640d425514 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 24 Apr 2008 21:01:08 +0000 Subject: [PATCH 14/64] Allowed text box sizes to be set, fixed hidden sliders breaking, random text in question text bug fixed, single question button continue working, randomized weirdness on section random question resolved, answer text on multi-slider questions resolved, can have generic scale questions now, removed useless 'previous Text Answer Fill' dialog --- www/extras/wobject/Survey/administersurvey.js | 68 +++++++++++++++---- .../wobject/Survey/editsurvey/answer.js | 2 + .../wobject/Survey/editsurvey/question.js | 11 +-- .../wobject/Survey/templates/takeSurvey.html | 6 +- 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index d19381e85..a6c39025a 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -5,7 +5,7 @@ if (typeof Survey == "undefined") { Survey.Form = new function() { var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Ideology':1, 'Race':1,'Party':1,'Education':1}; - var scale = {'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + var scale = {'Scale':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1}; var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; @@ -17,8 +17,11 @@ Survey.Form = new function() { var verb = 0; var lastSection = 'first'; + var toValidate; + this.displayQuestions = function(params){ + toValidate = new Array();//clear array var qs = params.questions; var s = params.section; @@ -34,12 +37,10 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById('headertitle').style.display='block'; } if(lastSection != s.Survey_sectionId || s.everyPageText > 0){ - //if(qs[0].sequenceNumber == '1' || s.everyPageText > 0){ document.getElementById('headertext').style.display = 'block'; } - if((lastSection != s.Survey_sectionId && lastSection != 'first') || s.questionsOnSectionPage != '1'){ -// if(qs[0].sequenceNumber == '1' && s.questionsOnSectionPage != '1'){ + if(lastSection != s.Survey_sectionId && s.questionsOnSectionPage != '1'){ var span = document.createElement("div"); span.innerHTML = ""; span.style.display = 'block'; @@ -55,9 +56,11 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById('headertext').style.display = 'none'; } document.getElementById('questions').style.display='inline'; + Survey.Form.addWidgets(qs); }); }else{ document.getElementById('questions').style.display='inline'; + Survey.Form.addWidgets(qs); } lastSection = s.Survey_sectionId; }else{ @@ -65,10 +68,9 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById('headertext').style.display = 'block'; document.getElementById('questions').style.display='inline'; } - + } //Display questions - - var html; + this.addWidgets = function(qs){ hasFile = false; for(var i = 0; i < qs.length; i++){ var q = qs[i]; @@ -80,14 +82,21 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer } } - html += "
          "; - html += "
          Q"+q.sequenceNumber+": "+q.questionText+"
          "; + //Check if this question should be validated + if(q.required == 1){ + toValidate[q.Survey_questionId] = new Array(); + } + if(multipleChoice[q.questionType] || scale[q.questionType]){ var butts = new Array(); verb = 0; for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + if(toValidate[a.Survey_questionId]){ + toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + } var b; if(scale[q.questionType]){ b = new YAHOO.widget.Button({ type: "checkbox", label: a.recordedAnswer, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', @@ -101,7 +110,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer b.label=a.answerText; } b.setStyle('text-align','center'); - b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length]); + b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); if(a.verbatim == 1){ verb = 1; } @@ -149,7 +158,27 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer this.formsubmit = function(){ - Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); + var submit = 1;//boolean for if all was good or not + for(var i in toValidate){ + console.log(i); + var answered = 0; + for(var z in toValidate[i]){ + var v = document.getElementById(z).value; + if(v != '' && v != undefined){ + answered = 1; + break; + } + } + if(answered == 0){ + submit = 0; + document.getElementById(i+'required').innerHTML = "*"; + }else{ + document.getElementById(i+'required').innerHTML = ""; + } + } + if(submit == 1){ + Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); + } } @@ -242,8 +271,10 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer if(t > total){ t -= this.getValue(); t = Math.round(t); +console.log("setting value: "+scale+" "+step); this.setValue(total-t + scale*step); }else{ +console.log("setting value in else: "+this.getValue()); this.lastValue = this.getValue(); document.getElementById(this.input).value = this.getRealValue(); document.getElementById(this.input+'show').innerHTML = this.getRealValue(); @@ -270,10 +301,13 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer Event.on(document.getElementById(s.input), "blur", manualEntry); s.getRealValue = function() { - return Math.round(this.getValue() / scale); +console.log("getRealValue is getting the real value for the slider:"+this.getValue()+" "+this+" "+scale); + + return Math.round(parseInt(this.getValue()) / scale); } sliders.push(s); document.getElementById(s.input).value = s.getRealValue(); +console.log("Slider starting value = "+s.getValue()); } } @@ -291,12 +325,15 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer this.showCalendar = function(event,objs){ objs[0].show(); } + + this.buttonChanged = function(event,objs){ var b = objs[0]; var qid = objs[1]; var maxA = objs[2]; var butts = objs[3]; var qsize = objs[4]; + var aid = objs[5]; max = parseInt(max); if(maxA == 1){ for(var i in butts){ @@ -321,9 +358,10 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById(qid+'max').innerHTML = parseInt(max+1); document.getElementById(b.hid).value = 1; } -//console.log('qsize '+qsize+' verb '+verb); - if(qsize == 1 && verb == 0){ - Survey.Form.formsubmit(); + if(qsize == 1){ + if(! document.getElementById(aid+'verbatim')){ + Survey.Form.formsubmit(); + } } } }(); diff --git a/www/extras/wobject/Survey/editsurvey/answer.js b/www/extras/wobject/Survey/editsurvey/answer.js index 7db2d7910..857a73835 100644 --- a/www/extras/wobject/Survey/editsurvey/answer.js +++ b/www/extras/wobject/Survey/editsurvey/answer.js @@ -24,6 +24,8 @@ Survey.AnswerTemplate = new function(){ html = html + "

          Answer Text:\n\n"; html = html + "

          Recorded Answer\n\n"; html = html + "

          Jump to Question:"; + html = html + "

          Text Answer Cols: Rows: \ +

          "; html = html + "

          Is this the correct answer:\n" + this.makeRadio('isCorrect',[{text:'Yes',value:1},{text:'No',value:0}],params.isCorrect); html = html + "

          Min:"; diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js index 097505aa8..b03b6d7ae 100644 --- a/www/extras/wobject/Survey/editsurvey/question.js +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -31,11 +31,10 @@ Survey.QuestionTemplate = new function(){ html = html + "

          Randomize answers:"; html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); - html = html + "

          Previous answers to display:"; html = html + "

          Question type:"; var questions = ['Agree/Disagree','Certainty','Concern','Confidence','Currency','Date','Date Range','Dual Slider - Range','Education','Effectiveness', 'Email','File Upload','Gender','Hidden','Ideology','Importance','Likelihood','Multi Slider - Allocate','Multiple Choice','Oppose/Support', - 'Party','Phone Number','Race','Risk','Satisfaction','Security','Slider','Text','Text Date','Threat','True/False','Yes/No']; + 'Party','Phone Number','Race','Risk','Satisfaction','Scale','Security','Slider','Text','Text Date','Threat','True/False','Yes/No']; // var questions = ['Multiple Choice','Gender','Yes/No','True/False','Agree/Disagree','Oppose/Support','Importance','Likelihood','Certainty','Satisfaction', // 'Confidence','Effectiveness','Concern','Risk','Threat','Security','Ideology','Race','Party','Education', // 'Text', 'Email', 'Phone Number', 'Text Date', 'Currency', @@ -50,7 +49,9 @@ Survey.QuestionTemplate = new function(){ html = html+ this.makeRadio('verticalDisplay',[{text:'Yes',value:1},{text:'No',value:0}],params.verticalDisplay); html = html + "

          Allow comment:"; - html = html+ this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}],params.allowComment); + html = html + this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}]); + html = html + "

             Cols: Rows: \ +

          "; html = html + "

          Maximum number of answers:"; html = html + "

          Required:"; html = html+ this.makeRadio('required',[{text:'Yes',value:1},{text:'No',value:0}],params.required); @@ -97,9 +98,9 @@ Survey.QuestionTemplate = new function(){ var html = ''; for(var i in values){ if(checked == values[i]['value']){ - html = html+ "" + values[i]['text']; + html = html+ "" + values[i]['text']; }else{ - html = html+ "" + values[i]['text']; + html = html+ "" + values[i]['text']; } } html = html + "\n"; diff --git a/www/extras/wobject/Survey/templates/takeSurvey.html b/www/extras/wobject/Survey/templates/takeSurvey.html index fcc57391b..5eaa2b1a0 100644 --- a/www/extras/wobject/Survey/templates/takeSurvey.html +++ b/www/extras/wobject/Survey/templates/takeSurvey.html @@ -9,7 +9,7 @@


          -
          Q:
          +
          required>Q:
          @@ -65,8 +65,8 @@ - - + + verbatim'> From f565772e21926aa7d7699e61f376ae363ec72db1 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 24 Apr 2008 21:01:23 +0000 Subject: [PATCH 15/64] Allowed text box sizes to be set, fixed hidden sliders breaking, random text in question text bug fixed, single question button continue working, randomized weirdness on section random question resolved, answer text on multi-slider questions resolved, can have generic scale questions now, removed useless 'previous Text Answer Fill' dialog --- lib/WebGUI/Asset/Wobject/Survey.pm | 369 +++++++++++++++-------------- 1 file changed, 185 insertions(+), 184 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 5f2b6ba15..5e8fd5582 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -172,11 +172,11 @@ sub www_submitAnswerEdit{ if($ref->{'Survey_answerId'}){ $self->session->db->write(" update Survey_answer - set answerText = ?, gotoQuestion = ?, recordedAnswer = ?, isCorrect = ?, min = ?, max = ?, step = ?, verbatim = ? + set answerText = ?, gotoQuestion = ?, recordedAnswer = ?, isCorrect = ?, min = ?, max = ?, step = ?, verbatim = ?, textCols = ?, textRows = ? where Survey_answerId = ?", [ $$ref{'answerText'},$$ref{'gotoQuestion'},$$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'}, - $$ref{'max'},$$ref{'step'},$$ref{'verbatim'} + $$ref{'max'},$$ref{'step'},$$ref{'verbatim'},$$ref{'textCols'},$$ref{'textRows'} ,$$ref{'Survey_answerId'} ] ); @@ -184,9 +184,9 @@ sub www_submitAnswerEdit{ my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_answer where Survey_questionId = ?",[$ref->{'Survey_questionId'}]); $seqNum++; $ref->{'Survey_answerId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?)", + $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", [ $self->getId,$$ref{'Survey_sectionId'},$$ref{'Survey_questionId'},$$ref{'Survey_answerId'},$seqNum,$$ref{'gotoQuestion'},$$ref{'answerText'}, - $$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'},$$ref{'max'},$$ref{'step'},$$ref{'verbatim'} ] + $$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'},$$ref{'max'},$$ref{'step'},$$ref{'verbatim'},$$ref{'textCols'},$$ref{'textRows'} ] ); } return $self->www_loadSurvey($ref->{'Survey_sectionId'}."||||".$ref->{'Survey_questionId'}."||||".$$ref{'Survey_answerId'}); @@ -202,11 +202,12 @@ sub www_submitQuestionEdit{ $self->session->db->write(" update Survey_question set questionText = ?, allowComment = ?, randomizeAnswers = ?, questionType = ?, randomizedWords = ?, previousAnswerWords = ?, verticalDisplay = ?, - required = ?, maxAnswers = ?, questionVariable = ?, points = ? + required = ?, maxAnswers = ?, questionVariable = ?, points = ?, commentCols = ?, commentRows = ? where Survey_questionId = ?", [ $$ref{'questionText'},$$ref{'allowComment'},$$ref{'randomizeAnswers'},$$ref{'questionType'},$$ref{'randomizedWords'}, $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'questionVariable'}, $$ref{'points'}, + $$ref{'commentCols'},$$ref{'commentRows'}, $$ref{'Survey_questionId'} ] ); @@ -220,10 +221,10 @@ $self->session->errorHandler->warn("questionVariable was ".$$ref{'questionVariab my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$ref->{'Survey_sectionId'}]); $seqNum++; $ref->{'Survey_questionId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", - [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'randomizeAnswers'}, - $$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'},$$ref{'previousAnswerWords'},$$ref{'verticalDisplay'}, - $$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'} ] + $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'commentCols'},$$ref{'commentRows'}, + $$ref{'randomizeAnswers'},$$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'}, + $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'} ] ); $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); @@ -975,8 +976,8 @@ $self->session->errorHandler->warn("-------SurveyEnd $url"); #sends the processed template and questions structure to the client sub showQuestions{ my ($self,$section,$questions) = @_; - my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1'Ideology',1, 'Race',1,'Party',1,'Education',1); - my %scale = ('Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, + my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1,'Ideology',1, 'Race',1,'Party',1,'Education',1); + my %scale = ('Scale',1,'Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, 'Effectiveness',1,'Concern',1,'Risk',1,'Threat',1,'Security',1); my %text = ('Text',1, 'Email',1, 'Phone Number',1, 'Text Date',1, 'Currency',1); my %slider = ('Slider',1, 'Dual Slider - Range',1, 'Multi Slider - Allocate',1); @@ -1069,8 +1070,8 @@ sub fillQuestionTextVariables{ my $questions = shift; foreach my $q(@$questions){ - $q->{'questionText'} =~ s/(\[\[[^\%]*\]\])/$self->getPreviousAnswer($responseId,$1)/eg; - $q->{'questionText'} =~ s/(\[\[\%.*\]\])/$self->getRandomText($responseId,$1)/eg; + $q->{'questionText'} =~ s/(\[\[[^\%]*?\]\])/$self->getPreviousAnswer($responseId,$1)/eg; + $q->{'questionText'} =~ s/(\[\[\%.*?\]\])/$self->getRandomText($responseId,$1)/eg; $self->session->errorHandler->warn("Found $1 in ".$$q{'sequenceNumber'}); } return $questions; @@ -1352,245 +1353,245 @@ sub createDefaultAnswers{ my ($self,$sid,$qid,$type) = @_; $self->session->db->write("delete from Survey_answer where Survey_questionId = ?",[$qid]); if($type eq 'Gender'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Male', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Female', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Male', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Female', 0, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Yes/No'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Yes', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'No', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Yes', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'No', 0, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'True/False'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'True', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'False', 0, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'True', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'False', 0, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Agree/Disagree'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly disagree', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly disagree', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0,20,2]); $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, - undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly agree', 7, undef, undef,undef,undef,0]); + undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly agree', 7, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Oppose/Support'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly oppose', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly oppose', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0,20,2]); $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, - undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly support', 7, undef, undef,undef,undef,0]); + undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly support', 7, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Importance'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all important', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely important', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all important', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely important', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Likelihood'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all likely', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely likely', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all likely', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely likely', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Certainty'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all certain', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely certain', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all certain', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely certain', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Satisfaction'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all satisfied', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Completely satisfied', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all satisfied', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Completely satisfied', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Confidence'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all confident', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely confident', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all confident', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely confident', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Effectiveness'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all effective', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely effective', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all effective', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely effective', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Concern'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all concerned', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely concerned', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all concerned', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely concerned', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Risk'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No risk', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme risk', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No risk', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme risk', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Threat'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No threat', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme threat', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No threat', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme threat', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Security'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all secure', 0, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely secure', 10, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all secure', 0, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely secure', 10, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Ideology'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly liberal', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Liberal', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Somewhat liberal', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Middle of the road', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Slightly conservative', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Conservative', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly conservative', 7, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly liberal', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Liberal', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Somewhat liberal', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Middle of the road', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Slightly conservative', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Conservative', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly conservative', 7, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Race'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'American Indian', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Asian', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Black', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Hispanic', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'White non-Hispanic', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Something else (verbatim)', 6, undef, undef,undef,undef,0,]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'American Indian', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Asian', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Black', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Hispanic', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'White non-Hispanic', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Something else (verbatim)', 6, undef, undef,undef,undef,0,,20,2]); }elsif($type eq 'Party'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Democratic party', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Republican party (or GOP)', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Independant party', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Other party (verbatim)', 4, undef, undef,undef,undef,1,]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Democratic party', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Republican party (or GOP)', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Independant party', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Other party (verbatim)', 4, undef, undef,undef,undef,1,,20,2]); }elsif($type eq 'Education'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Elementary or some high school', 1, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'High school/GED', 2, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Some college/vocational school', 3, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'College graduate', 4, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Some graduate work', 5, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Master\'s degree', 6, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Doctorate (of any type)', 7, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, 'Other degree (verbatim)', 8, undef, undef,undef,undef,1,]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Elementary or some high school', 1, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'High school/GED', 2, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Some college/vocational school', 3, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'College graduate', 4, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Some graduate work', 5, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Master\'s degree', 6, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Doctorate (of any type)', 7, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, 'Other degree (verbatim)', 8, undef, undef,undef,undef,1,,20,2]); }elsif($type eq 'Text'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Email'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Email:', undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Email:', undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Phone Number'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Phone Number:', undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Phone Number:', undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Text Date'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Date:', undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Date:', undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Currency'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Currency Amount:', undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Currency Amount:', undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Slider'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); }elsif($type eq 'Dual Slider - Range'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0,20,2]); }elsif($type eq 'Multi Slider - Allocate'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0,20,2]); }elsif($type eq 'Date'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Date Range'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'File Upload'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); }elsif($type eq 'Hidden'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); } } sub AnswersInsert{ my ($self,$array) = @_; - $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?)",$array); + $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",$array); } 1; From 17ab81bc230c2f7124999cd3eca5e415e36e7b4b Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 25 Apr 2008 19:50:58 +0000 Subject: [PATCH 16/64] minor bug fixes --- lib/WebGUI/Asset/Wobject/Survey.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 5e8fd5582..a81e66bef 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -221,7 +221,7 @@ $self->session->errorHandler->warn("questionVariable was ".$$ref{'questionVariab my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$ref->{'Survey_sectionId'}]); $seqNum++; $ref->{'Survey_questionId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'commentCols'},$$ref{'commentRows'}, $$ref{'randomizeAnswers'},$$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'}, $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'} ] @@ -294,7 +294,7 @@ $self->session->errorHandler->warn("MAX SeqNumber was $id"); $edit->{'type'} = 'loadQuestion'; $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId','', 'questionText','', 'sequenceNumber', $id, 'allowComment',0, 'randomizeAnswers',0, 'questionType',1, 'required',0,'randomizedWords','','previousAnswerWords','','verticalDisplay',0,'maxAnswers','1', - 'questionVariable','' }; + 'questionVariable','','commentCols',20,'commentRows',1 }; return $self->www_loadSurvey($sid,$edit); } From 93bbf128cae943709ea36132537bade5d80135b6 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 25 Apr 2008 19:52:11 +0000 Subject: [PATCH 17/64] minor bug fixes --- www/extras/wobject/Survey/administersurvey.js | 15 ++++++++++----- www/extras/wobject/Survey/editsurvey/question.js | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index a6c39025a..c273f083f 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -67,6 +67,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer document.getElementById('headertitle').style.display='block'; document.getElementById('headertext').style.display = 'block'; document.getElementById('questions').style.display='inline'; + Survey.Form.addWidgets(qs); } } //Display questions @@ -121,6 +122,9 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer else if(dateType[q.questionType]){ for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; + if(toValidate[a.Survey_questionId]){ + toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + } var calid = a.Survey_answerId+'container'; var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); @@ -152,6 +156,12 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer else if(fileUpload[q.questionType]){ hasFile = true; } + else if(text[q.questionType]){ + var a = q.answers[x]; + if(toValidate[a.Survey_questionId]){ + toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + } + } } YAHOO.util.Event.addListener("submitbutton", "click", this.formsubmit); } @@ -160,7 +170,6 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer this.formsubmit = function(){ var submit = 1;//boolean for if all was good or not for(var i in toValidate){ - console.log(i); var answered = 0; for(var z in toValidate[i]){ var v = document.getElementById(z).value; @@ -271,10 +280,8 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer if(t > total){ t -= this.getValue(); t = Math.round(t); -console.log("setting value: "+scale+" "+step); this.setValue(total-t + scale*step); }else{ -console.log("setting value in else: "+this.getValue()); this.lastValue = this.getValue(); document.getElementById(this.input).value = this.getRealValue(); document.getElementById(this.input+'show').innerHTML = this.getRealValue(); @@ -301,13 +308,11 @@ console.log("setting value in else: "+this.getValue()); Event.on(document.getElementById(s.input), "blur", manualEntry); s.getRealValue = function() { -console.log("getRealValue is getting the real value for the slider:"+this.getValue()+" "+this+" "+scale); return Math.round(parseInt(this.getValue()) / scale); } sliders.push(s); document.getElementById(s.input).value = s.getRealValue(); -console.log("Slider starting value = "+s.getValue()); } } diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js index b03b6d7ae..e47a7d408 100644 --- a/www/extras/wobject/Survey/editsurvey/question.js +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -49,7 +49,7 @@ Survey.QuestionTemplate = new function(){ html = html+ this.makeRadio('verticalDisplay',[{text:'Yes',value:1},{text:'No',value:0}],params.verticalDisplay); html = html + "

          Allow comment:"; - html = html + this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}]); + html = html + this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}],params.allowComment); html = html + "

             Cols: Rows: \

          "; html = html + "

          Maximum number of answers:"; From bb891242a403633944482969a7494118648cddc8 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 30 Apr 2008 14:13:49 +0000 Subject: [PATCH 18/64] Last checkin before major changes to buttons --- www/extras/wobject/Survey/administersurvey.js | 17 +++++++++++------ .../wobject/Survey/administersurvey/comm.js | 12 ++++++++++-- www/extras/wobject/Survey/editsurvey/comm.js | 12 ++++++++++-- www/extras/wobject/Survey/survey.css | 2 +- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index c273f083f..e0ca610d9 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -105,12 +105,12 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer container: a.Survey_answerId+"container", checked: false }); b.label=a.recordedAnswer; }else{ + // b = new YAHOO.widget.Button({ type: "checkbox", id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', value: a.Survey_answerId, container: a.Survey_answerId+"container", checked: false }); - b.label=a.answerText; } - b.setStyle('text-align','center'); + //b.set('label',a.answerText); b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); if(a.verbatim == 1){ verb = 1; @@ -342,11 +342,16 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer max = parseInt(max); if(maxA == 1){ for(var i in butts){ - butts[i].set('checked',false); - document.getElementById(butts[i].hid).value = ''; + if(butts[i] != b){ + butts[i].set('checked',false); + document.getElementById(butts[i].hid).value = ''; + } + } + if(b.get('checked') == true){ + document.getElementById(b.hid).value = 1; + }else{ + document.getElementById(b.hid).value = ''; } - b.set('checked',true); - document.getElementById(b.hid).value = 1; } else if(b.get('checked')){ var max = parseInt(document.getElementById(qid+'max').innerHTML); diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js index 33dae620d..f4ceee030 100644 --- a/www/extras/wobject/Survey/administersurvey/comm.js +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -7,7 +7,7 @@ Survey.Comm= new function(){ this.url = ''; this.setUrl = function(u){this.url = u;} - + var callMade = 0; var request = function(sUrl,callback,postData,form, hasFile){ if(form != undefined){ if(hasFile){ @@ -19,15 +19,22 @@ Survey.Comm= new function(){ } //console.log('setForm was true'); } - YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + if(callMade == 1){ + alert("Waiting on previous request"); + }else{ + callMade = 1; + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } } this.callback = { upload:function(o){ + callMade = 0; Survey.Comm.callServer('','loadQuestions'); }, success:function(o){ + callMade = 0; var response = ''; response = YAHOO.lang.JSON.parse(o.responseText); if(response.type == 'displayquestions'){ @@ -40,6 +47,7 @@ Survey.Comm= new function(){ } }, failure: function(o){ + callMade = 0; if(o.status == -1){ alert("Last request timed out, please try again"); }else{ diff --git a/www/extras/wobject/Survey/editsurvey/comm.js b/www/extras/wobject/Survey/editsurvey/comm.js index 76f19cfcd..6a86c6d2a 100644 --- a/www/extras/wobject/Survey/editsurvey/comm.js +++ b/www/extras/wobject/Survey/editsurvey/comm.js @@ -3,19 +3,27 @@ if (typeof Survey == "undefined") { } Survey.Comm = new function(){ + var callMade = 0; var request = function(sUrl,callback,postData){ - YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + if(callMade == 1){ + alert("Waiting on previous call"); + }else{ + callMade = 1; + YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); + } } this.callback = { success:function(o){ + callMade = 0; Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); }, failure: function(o){ + callMade = 0; alert("Last request failed"); Survey.Data.loadLast(); }, - timeout: 1000 + timeout: 5000 }; this.loadSurvey = function(p){ var postData = "data="+p; diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index 913bf4383..9f326db1c 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -36,5 +36,5 @@ div.slider-max-thumb { } .yui-button button{ text-align: center; - min-width: 50px; + min-width: 100px; } From 77fc16d97fec7b47f9b8784d40e943588b4d966c Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 6 May 2008 14:56:29 +0000 Subject: [PATCH 19/64] Major updates to spec --- www/extras/wobject/Survey/administersurvey.js | 164 ++++++++++-------- www/extras/wobject/Survey/bg-fader-500.gif | Bin 0 -> 1197 bytes .../wobject/Survey/editsurvey/answer.js | 4 +- .../wobject/Survey/editsurvey/question.js | 6 +- .../wobject/Survey/editsurvey/section.js | 5 +- www/extras/wobject/Survey/survey.css | 40 ++++- 6 files changed, 137 insertions(+), 82 deletions(-) create mode 100644 www/extras/wobject/Survey/bg-fader-500.gif diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index e0ca610d9..44970bb72 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -4,9 +4,9 @@ if (typeof Survey == "undefined") { Survey.Form = new function() { - var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Ideology':1, 'Race':1,'Party':1,'Education':1}; - var scale = {'Scale':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, - 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1}; + var multipleChoice = {'Multiple Choice':1,'Gender':1,'Yes/No':1,'True/False':1,'Ideology':1, 'Race':1,'Party':1,'Education':1 + ,'Scale':1,'Agree/Disagree':1,'Oppose/Support':1,'Importance':1, + 'Likelihood':1,'Certainty':1,'Satisfaction':1,'Confidence':1,'Effectiveness':1,'Concern':1,'Risk':1,'Threat':1,'Security':1}; var text = {'Text':1, 'Email':1, 'Phone Number':1, 'Text Date':1, 'Currency':1}; var slider = {'Slider':1, 'Dual Slider - Range':1, 'Multi Slider - Allocate':1}; var dateType = {'Date':1,'Date Range':1}; @@ -19,18 +19,24 @@ Survey.Form = new function() { var toValidate; + var sliderWidth = 500; + + var sliders; + + this.displayQuestions = function(params){ toValidate = new Array();//clear array var qs = params.questions; var s = params.section; + sliders = new Array(); //What to show and where document.getElementById('survey').innerHTML = params.html; -var te = document.createElement('span'); -te.innerHTML = ""; -document.getElementById('survey').appendChild(te); -YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer('','loadQuestions');}); +//var te = document.createElement('span'); +//te.innerHTML = ""; +//document.getElementById('survey').appendChild(te); +//YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer('','loadQuestions');}); if(qs[0] != undefined){ if(lastSection != s.Survey_sectionId || s.everyPageTitle > 0){ @@ -86,35 +92,31 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer //Check if this question should be validated if(q.required == 1){ toValidate[q.Survey_questionId] = new Array(); + toValidate[q.Survey_questionId]['type'] = q.questionType; + toValidate[q.Survey_questionId]['answers'] = new Array(); } - if(multipleChoice[q.questionType] || scale[q.questionType]){ + if(multipleChoice[q.questionType]){ var butts = new Array(); verb = 0; for(var x = 0; x < q.answers.length; x++){ - var a = q.answers[x]; if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; } - var b; - if(scale[q.questionType]){ - b = new YAHOO.widget.Button({ type: "checkbox", label: a.recordedAnswer, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', - value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); - b.label=a.recordedAnswer; - }else{ - // b = new YAHOO.widget.Button({ type: "checkbox", id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', + var b = document.getElementById(a.Survey_answerId+'button'); + /* b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', - value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); - } - //b.set('label',a.answerText); - b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); + value: a.Survey_answerId, + container: a.Survey_answerId+"container", checked: false }); + */ +// b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); +// YAHOO.util.Event.addListener(a.Survey_answerId+'button', "click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); if(a.verbatim == 1){ verb = 1; } + YAHOO.util.Event.addListener(a.Survey_answerId+'button', "click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); b.hid = a.Survey_answerId; butts.push(b); } @@ -123,7 +125,7 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; } var calid = a.Survey_answerId+'container'; var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); @@ -142,24 +144,34 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer }else{ for(var s in q.answers){ var a = q.answers[s]; + YAHOO.util.Event.addListener(a.Survey_answerId, "blur", this.sliderTextSet); if(a.max - a.min > max){max = a.max - a.min;} } } if(q.questionType == 'Multi Slider - Allocate'){ //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); + for(var x = 0; x < q.answers.length; x++){ + var a = q.answers[x]; + if(toValidate[a.Survey_questionId]){ + toValidate[a.Survey_questionId]['total'] = a.max; + toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; + } + } new this.sliderManager(q,max); } else if(q.questionType == 'Slider'){ new this.sliders(q); } } + else if(fileUpload[q.questionType]){ hasFile = true; } + else if(text[q.questionType]){ var a = q.answers[x]; if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId][a.Survey_answerId] = 1; + toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; } } } @@ -171,11 +183,23 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var submit = 1;//boolean for if all was good or not for(var i in toValidate){ var answered = 0; - for(var z in toValidate[i]){ - var v = document.getElementById(z).value; - if(v != '' && v != undefined){ - answered = 1; - break; + if(toValidate[i]['type'] == 'Multi Slider - Allocate'){ + var total = 0; + for(var z in toValidate[i]['answers']){ + total += Math.round(document.getElementById(z).value); + } +console.log(total+" and "+ toValidate[i]['total']); + if(total == toValidate[i]['total']){answered = 1;} + }else{ + for(var z in toValidate[i]['answers']){ + var v = document.getElementById(z).value; + if(v != '' && v != undefined){ + answered = 1; + break; + } + else{ + console.log(z+' was not answered'); + } } } if(answered == 0){ @@ -194,11 +218,11 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer this.dualSliders = function(q){ - var total = 200; - var sliders = new Array(); + var total = sliderWidth; +// var sliders = new Array(); var a1 = q.answers[0]; var a2 = q.answers[1]; - var scale = 200/a1.max; + var scale = sliderWidth/a1.max; var id = q.Survey_questionId; var a1id = a1.Survey_answerId; @@ -210,7 +234,8 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var a2s = document.getElementById(a2id+'show'); var s = YAHOO.widget.Slider.getHorizDualSlider(id+'slider-bg', a1id+"slider-min-thumb", a2id+"slider-max-thumb", - 200, 1*scale, [1,200]); + sliderWidth, 1*scale, [1,sliderWidth]); + sliders[id] = s; s.minRange = 4; var updateUI = function () { @@ -228,40 +253,37 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer s.subscribe('change', updateUI); } this.sliders = function(q){ - var total = 200; + var total = sliderWidth; for(var i in q.answers){ var a = q.answers[i]; var step = q.answers[i].step; - var scale = 200/q.answers[i].max; + var scale = sliderWidth/q.answers[i].max; var Event = YAHOO.util.Event; var lang = YAHOO.lang; var id = a.Survey_answerId; var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', - 0, 200, (scale*step)); - // 0, 200, 1); + 0, sliderWidth, (scale*step)); + s.scale = scale; + sliders[id] = s; s.max = a.max*scale; s.input = a.Survey_answerId; s.scale = scale; document.getElementById(id).value = a.min; var check = function() { var t = document.getElementById(this.input); - var tshow = document.getElementById(this.input+'show'); t.value = this.getRealValue(); - tshow.innerHTML = this.getRealValue(); }; s.getRealValue = function() { return this.getValue() / this.scale; } s.subscribe("slideEnd", check); - s.subscribe("change", check); } } //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating this.sliderManager = function(q,t){ - var total = 200; + var total = sliderWidth; var step = q.answers[0].step; - var scale = 200/q.answers[0].max; - var sliders = new Array(); + var scale = sliderWidth/q.answers[0].max; for(var i in q.answers){ var a = q.answers[i]; @@ -269,9 +291,10 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var lang = YAHOO.lang; var id = a.Survey_answerId+'slider-bg'; var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', - 0, 200, scale*step); - s.input = a.Survey_answerId; - s.lastValue = 0; + 0, sliderWidth, scale*step); + sliders[a.Survey_answerId] = s; + s.input = a.Survey_answerId; + s.lastValue = 0; var check = function() { var t = 0; for(var x in sliders){ @@ -280,14 +303,12 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer if(t > total){ t -= this.getValue(); t = Math.round(t); - this.setValue(total-t + scale*step); + this.setValue(total-t);// + (scale*step)); }else{ this.lastValue = this.getValue(); document.getElementById(this.input).value = this.getRealValue(); - document.getElementById(this.input+'show').innerHTML = this.getRealValue(); } }; - s.subscribe("slideEnd", check); s.subscribe("change", check); var manualEntry = function(e){ // set the value when the 'return' key is detected @@ -304,14 +325,12 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer } } } - Event.on(document.getElementById(s.input), "keydown", manualEntry); Event.on(document.getElementById(s.input), "blur", manualEntry); s.getRealValue = function() { return Math.round(parseInt(this.getValue()) / scale); } - sliders.push(s); document.getElementById(s.input).value = s.getRealValue(); } } @@ -331,6 +350,11 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer objs[0].show(); } + this.sliderTextSet = function(event,objs){ + this.value = this.value * 1; + if(this.value == 'NaN'){this.value = 0;} + sliders[this.id].setValue(Math.round(this.value * sliders[this.id].scale)); + } this.buttonChanged = function(event,objs){ var b = objs[0]; @@ -341,32 +365,36 @@ YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer var aid = objs[5]; max = parseInt(max); if(maxA == 1){ + if(b.getAttribute('class') == 'mcbutton-selected'){ + document.getElementById(b.hid).value = 0; + b.setAttribute('class','mcbutton'); + }else{ + document.getElementById(b.hid).value = 1; + b.setAttribute('class','mcbutton-selected'); + } for(var i in butts){ if(butts[i] != b){ - butts[i].set('checked',false); + butts[i].setAttribute('class','mcbutton'); document.getElementById(butts[i].hid).value = ''; } } - if(b.get('checked') == true){ - document.getElementById(b.hid).value = 1; - }else{ - document.getElementById(b.hid).value = ''; - } } - else if(b.get('checked')){ + else if(b.getAttribute('class') == 'mcbutton'){ var max = parseInt(document.getElementById(qid+'max').innerHTML); - if(max == 0){ - b.set('checked',false); - //warn that options used up - } - else{ - document.getElementById(qid+'max').innerHTML = parseInt(max-1); - document.getElementById(b.hid).value = ''; - } + if(max == 0){ + b.setAttribute('class','mcbutton'); + //warn that options used up + } + else{ + b.setAttribute('class','mcbutton-selected'); + document.getElementById(qid+'max').innerHTML = parseInt(max-1); + document.getElementById(b.hid).value = 1; + } }else{ + b.setAttribute('class','mcbutton'); var max = parseInt(document.getElementById(qid+'max').innerHTML); document.getElementById(qid+'max').innerHTML = parseInt(max+1); - document.getElementById(b.hid).value = 1; + document.getElementById(b.hid).value = ''; } if(qsize == 1){ if(! document.getElementById(aid+'verbatim')){ diff --git a/www/extras/wobject/Survey/bg-fader-500.gif b/www/extras/wobject/Survey/bg-fader-500.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8072b855e8823c837de667cfd57c52b7705364d GIT binary patch literal 1197 zcmV;e1XBA)Nk%w1VFv<50OJS%>+9?F_4VQ5;mOI#r>CchiHWzjx7XL#|NsC0|NsC0 z|NsC0|NsC0|NsC0|NsC0A^8LW000O8EC2ui00#m^000F35Xniay*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcucki z&OdZIux9(t?wN)g#l|_r$;ddsAkM$c z&C)i|$F*Vdhz5UPjnY)LN zpo@Is47LzB5MZ=_u@oZYSMOTHip3me#5heN!x;V_K`LZ1kw(de9QB2Kv6AJ;6(=pk z6bVtA#$`3(rBr#7!_0y??e*ljliW)cEe{?|@pD2`r9my)bVpTZRa`?gJYBeyY1b25 zNhTE=6`4w#25^Ir;Wm~r6S(9%`Y>n%+uFAaN0E?JQ_u|!uhC={Y{DX00 z0FNR2SS-1RFbd537rpmn5HU7B_49IIi!#&H@%ZPT-9=eBX% zHRs=`ch`umJ93%h$dfBy&b+zv=g_AVm`=UA_3PNPYv0bjyZ7(l!;2qJzP$PK=+moT z&%V9;_wWl4m_H)E{rmXy>)+46zyJRL2L4Fhd<4`d;DHDxsNjMOHt67k^3fMiD->2} z;e{AxsNsejcIe@UAciR7h$NP1;)y7xsN#w&w&>!E7YZPNE-=<;-+s_3GOHtOi3kVY!$ zq?Dd%=m3aTs_CYjcIxS;poS`Hp@)i)i6elBLWd_bfO3PYpTOEGtFx*a!l|KfvIng) z;QA`By#fn^ub2ostg$W-n*m=a{tzZtRz}^0Qd(F^E0RZosg?6=^iD^<1c{&lWP-Cn?~Tj54)FHZY%MQ;c4&fBj{37gQc z!w38HuwD~`6R@`hbG5KM6~}w=KoM{7FT@|K(=oRhvxRNSg|&OHyZ#JJPrl;D8?sh6 z|CJ>Z)ya-+#jlIFxsjO!n1&3;r^@ ziJK)tZ?chQ9A?7NK->*pmk*b@<&|?jxni5o5W47{%K*78ZnTI_9mr9=i*# zM`!!(xaY3>?!5Qz`|rR9FZ}St7jOLW$S1G-^2|5y{PWO9Fa7k?S8x6G*k`Z(_S|>x L{rBLX5CH%?;B%7l literal 0 HcmV?d00001 diff --git a/www/extras/wobject/Survey/editsurvey/answer.js b/www/extras/wobject/Survey/editsurvey/answer.js index 857a73835..f9fdabac7 100644 --- a/www/extras/wobject/Survey/editsurvey/answer.js +++ b/www/extras/wobject/Survey/editsurvey/answer.js @@ -23,7 +23,7 @@ Survey.AnswerTemplate = new function(){ "; html = html + "

          Answer Text:\n\n"; html = html + "

          Recorded Answer\n\n"; - html = html + "

          Jump to Question:"; + html = html + "

          Jump to:"; html = html + "

          Text Answer Cols: Rows: \

          "; html = html + "

          Is this the correct answer:\n" + @@ -41,7 +41,7 @@ Survey.AnswerTemplate = new function(){ } var form = new YAHOO.widget.Dialog("answer", - { width : "300px", + { width : "500px", fixedcenter : true, visible : false, constraintoviewport : true, diff --git a/www/extras/wobject/Survey/editsurvey/question.js b/www/extras/wobject/Survey/editsurvey/question.js index e47a7d408..214c4b28b 100644 --- a/www/extras/wobject/Survey/editsurvey/question.js +++ b/www/extras/wobject/Survey/editsurvey/question.js @@ -27,7 +27,7 @@ Survey.QuestionTemplate = new function(){ else{ html = html + "\n"; } - html = html + "

          Question custom variable name:

          "; + html = html + "

          Question variable name:

          "; html = html + "

          Randomize answers:"; html = html+ this.makeRadio('randomizeAnswers',[{text:'Yes',value:1},{text:'No',value:0}],params.randomizeAnswers); @@ -48,6 +48,8 @@ Survey.QuestionTemplate = new function(){

          Vertical display:"; html = html+ this.makeRadio('verticalDisplay',[{text:'Yes',value:1},{text:'No',value:0}],params.verticalDisplay); + html = html + "

          Show text in button:"; + html = html + this.makeRadio('textInButton',[{text:'Yes',value:1},{text:'No',value:0}],params.textInButton); html = html + "

          Allow comment:"; html = html + this.makeRadio('allowComment',[{text:'Yes',value:1},{text:'No',value:0}],params.allowComment); html = html + "

             Cols: Rows: \ @@ -70,7 +72,7 @@ Survey.QuestionTemplate = new function(){ } var form = new YAHOO.widget.Dialog("question", - { width : "315px", + { width : "500px", fixedcenter : true, visible : false, constraintoviewport : true, diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js index 11d00b05b..e2dee5a8e 100644 --- a/www/extras/wobject/Survey/editsurvey/section.js +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -12,7 +12,7 @@ Survey.SectionTemplate = new function(){ var html = "\

          \ -
          Please enter section formation
          \ +
          Please enter section information
          \
          \
          \

          Section Number: "+params.sequenceNumber + "\ @@ -30,6 +30,7 @@ Survey.SectionTemplate = new function(){ No"; } html = html + "

          Section custom variable name:

          "; + html = html + "

          Section branch goto variable name:

          "; html = html + "\

          Question per Page:\ \ +

          Section Text:

          \ "; html = html + "

          Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); html = html + "

          Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index 9f326db1c..24f4927a1 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -3,14 +3,15 @@ div.dateanswer { } div.slider-bg { position: relative; - background:url(/extras/wobject/Survey/bg-fader.gif) 5px 0 no-repeat; - height:28px; - width:228px; + background:url(/extras/wobject/Survey/bg-fader-500.gif) 5px 0 no-repeat; + height:68px; + width:529px; } div.slider-thumb { cursor:default; position: absolute; - top: 4px; + top: 30px; + left: 4px; } div.slider-min-thumb { cursor:default; @@ -31,10 +32,33 @@ div.slider-max-thumb { #questions { display: none; } -.yui-button{ +input.mcbutton{ + font-size: 10px; + font-weight: bold; + text-decoration: none; + background-color: #CCCCCC; + background-repeat: repeat-x; text-align: center; + display: block; + margin: 0.5em; + padding: .8em; + width: 60px; + font-family: Verdana, Arial, Helvetica, sans-serif; + color: #000000; + background-image: url(/extras/wobject/Survey/gradient-glossy.png); } -.yui-button button{ - text-align: center; - min-width: 100px; +input.mcbutton:hover{ + background-color: #B6D2F1; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + color: #000000; +} +input.mcbutton-selected{ + background-color: #172D9D; + color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + font-weight: bold; + background-image: url(/extras/wobject/Survey/gradient-glossy.png); + background-position: 0px 0px; } From ecf9101ac8bfa9021412e7a74c16ad58d424016a Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 6 May 2008 14:56:44 +0000 Subject: [PATCH 20/64] Major updates to spec --- lib/WebGUI/Asset/Wobject/Survey.pm | 98 ++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 32 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index a81e66bef..c7dcb2e23 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -140,7 +140,7 @@ sub processPropertiesFromFormPost { $self->SUPER::processPropertiesFromFormPost; my $firstSection = $self->getFirstSection(); if(! $firstSection){ - $self->insertSection( [$self->getId,$self->session->id->generate(),'',"First Section",1,1,"Tis is the first page",0,0,1,0,0,''] ); + $self->insertSection( [$self->getId,$self->session->id->generate(),'',"First Section",1,1,"Tis is the first page",0,0,1,0,0,'',''] ); # $self->insertSection( [$self->getId,$self->session->id->generate(),"Last Section",9999,0,"This is the last page",0,0] ); } } @@ -202,17 +202,17 @@ sub www_submitQuestionEdit{ $self->session->db->write(" update Survey_question set questionText = ?, allowComment = ?, randomizeAnswers = ?, questionType = ?, randomizedWords = ?, previousAnswerWords = ?, verticalDisplay = ?, - required = ?, maxAnswers = ?, questionVariable = ?, points = ?, commentCols = ?, commentRows = ? + required = ?, maxAnswers = ?, questionVariable = ?, points = ?, commentCols = ?, commentRows = ?, textInButton = ? where Survey_questionId = ?", [ $$ref{'questionText'},$$ref{'allowComment'},$$ref{'randomizeAnswers'},$$ref{'questionType'},$$ref{'randomizedWords'}, $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'questionVariable'}, $$ref{'points'}, - $$ref{'commentCols'},$$ref{'commentRows'}, + $$ref{'commentCols'},$$ref{'commentRows'},$$ref{'textInButton'}, $$ref{'Survey_questionId'} ] ); -$self->session->errorHandler->warn("questionVariable was ".$$ref{'questionVariable'}); +$self->session->errorHandler->warn("textInButton was ".$$ref{'textInButton'}); if($type ne $ref->{'questionType'}){ $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); } @@ -221,10 +221,10 @@ $self->session->errorHandler->warn("questionVariable was ".$$ref{'questionVariab my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$ref->{'Survey_sectionId'}]); $seqNum++; $ref->{'Survey_questionId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'commentCols'},$$ref{'commentRows'}, $$ref{'randomizeAnswers'},$$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'}, - $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'} ] + $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'}, $$ref{'textInButton'} ] ); $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); @@ -243,17 +243,17 @@ sub www_submitSectionEdit{ my $id = $self->session->id->generate(); $self->insertSection([$self->getId, $id, $p->{'sectionVariable'},$p->{'sectionName'},$seqNum+1,$p->{'questionsPerPage'},$p->{'sectionText'},$p->{'randomizeQuestions'}, - $p->{'questionsOnSectionPage'}, $p->{'everyPageTitle'},$p->{'everyPageText'},$p->{'terminal'},$p->{'terminalURL'}]); + $p->{'questionsOnSectionPage'}, $p->{'everyPageTitle'},$p->{'everyPageText'},$p->{'terminal'},$p->{'terminalURL'},$p->{'goto'}]); $p->{'Survey_sectionId'} = $id; }else{ $self->session->db->write("update Survey_section set sectionName = ?, questionsPerPage = ?, sectionText = ?, randomizeQuestions = ?, questionsOnSectionPage = ?, - everyPageTitle = ?, everyPageText = ?,terminal = ?, terminalURL = ?,sectionVariable = ? + everyPageTitle = ?, everyPageText = ?,terminal = ?, terminalURL = ?,sectionVariable = ?, goto = ? where Survey_sectionId = ?", [ $p->{'sectionName'}, $p->{'questionsPerPage'}, $p->{'sectionText'}, $p->{'randomizeQuestions'}, $p->{'questionsOnSectionPage'},$p->{'everyPageTitle'}, - $p->{'everyPageText'}, $p->{'terminal'}, $p->{'terminalURL'}, $p->{'sectionVariable'}, + $p->{'everyPageText'}, $p->{'terminal'}, $p->{'terminalURL'}, $p->{'sectionVariable'},$p->{'goto'}, $p->{'Survey_sectionId'} ] ); @@ -289,12 +289,11 @@ sub www_newQuestion{ my $id = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$sid]); if(!$id){$id = 1;}else{$id++;} -$self->session->errorHandler->warn("MAX SeqNumber was $id"); my $edit; $edit->{'type'} = 'loadQuestion'; $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId','', 'questionText','', 'sequenceNumber', $id, 'allowComment',0, 'randomizeAnswers',0, 'questionType',1, 'required',0,'randomizedWords','','previousAnswerWords','','verticalDisplay',0,'maxAnswers','1', - 'questionVariable','','commentCols',20,'commentRows',1 }; + 'questionVariable','','commentCols',20,'commentRows',1, 'textInButton',0 }; return $self->www_loadSurvey($sid,$edit); } @@ -525,9 +524,15 @@ sub www_loadSurvey{ sub getSpecificSection{ my $self = shift; my $Id = shift; - return $self->session->db->quickHashRef( + my $responseId = shift; + my $section = $self->session->db->quickHashRef( "select * from Survey_section where Survey_sectionId = ?", [ $Id ]); + if($responseId){ + $section = $self->fillSectionTextVariables($responseId,$section); + } + + return $section; } #------------------------------------------------------------------- sub getSpecificQuestion{ @@ -842,7 +847,7 @@ $self->session->errorHandler->warn("Last Answer for jump was for section: ".$las if(exists $lastAfj->{'Survey_sectionId'} and $lastAfj->{'Survey_sectionId'} eq $currentSection){ my ($sectionId,$questionId) = $self->getJumpTo($lastAfj->{'Survey_answerId'}); if($sectionId){ - my $section = $self->getSpecificSection($sectionId); + my $section = $self->getSpecificSection($sectionId,$responseId); my $questions = $self->getQuestionsAndAnswers($responseId,$section,$questionId); $self->setCurrentSection($responseId,$sectionId); $self->session->errorHandler->warn("Jump"); @@ -858,7 +863,7 @@ $self->session->errorHandler->warn("No Jump"); $self->session->errorHandler->warn("Last Answer was for section: ".$lastA->{'Survey_sectionId'}); #if we're called from submit, see if there are anymore questions in section, show them, else go to next section. If not called, then show this section. - $section = $self->getSpecificSection($currentSection); + $section = $self->getSpecificSection($currentSection,$responseId); if(exists $lastA->{'Survey_sectionId'} and $lastA->{'Survey_sectionId'} eq $currentSection){ $questionId = $self->getNextQuestionId($lastA->{'Survey_questionId'}); } @@ -907,7 +912,7 @@ $self->session->errorHandler->warn("2-3"); } }else{ $self->session->errorHandler->warn("3"); - $section = $self->getSpecificSection($currentSection); + $section = $self->getSpecificSection($currentSection,$responseId); $questions = $self->getQuestionsAndAnswers($responseId,$section,$questionId); } }else{ @@ -927,7 +932,7 @@ $self->session->errorHandler->warn("5-1"); } $self->session->errorHandler->warn("5-2"); $currentSection = $self->getNextSection($currentSection); - $section = $self->getSpecificSection($currentSection); + $section = $self->getSpecificSection($currentSection,$responseId); $questions = $self->getQuestionsAndAnswers($responseId,$section); } } @@ -976,8 +981,8 @@ $self->session->errorHandler->warn("-------SurveyEnd $url"); #sends the processed template and questions structure to the client sub showQuestions{ my ($self,$section,$questions) = @_; - my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1,'Ideology',1, 'Race',1,'Party',1,'Education',1); - my %scale = ('Scale',1,'Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, + my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1,'Ideology',1, 'Race',1,'Party',1,'Education',1 + ,'Scale',1,'Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, 'Effectiveness',1,'Concern',1,'Risk',1,'Threat',1,'Security',1); my %text = ('Text',1, 'Email',1, 'Phone Number',1, 'Text Date',1, 'Currency',1); my %slider = ('Slider',1, 'Dual Slider - Range',1, 'Multi Slider - Allocate',1); @@ -996,12 +1001,6 @@ sub showQuestions{ $q->{'maxMoreOne'} = 1; } } - elsif($scale{$$q{'questionType'}}){ - $q->{'scale'} = 1; - if($$q{'maxAnswers'} > 1){ - $q->{'maxMoreOne'} = 1; - } - } elsif($dateType{$$q{'questionType'}}){ $q->{'dateType'} = 1; } @@ -1030,17 +1029,23 @@ $self->session->errorHandler->warn("Sending Back"); return encode_json({"type","displayquestions","section",$section,"questions",$questions,"html",$out}); } - +#Answer text for inserting into quesiton text sub getPreviousAnswer{ my ($self,$responseId,$var) = @_; $var =~ s/^\[\[//g; $var =~ s/\]\]$//g; - my $string = $self->session->db->quickScalar("select a.answerText from Survey_questionResponse qa, Survey_question q, Survey_answer a + my $ref = $self->session->db->buildArrayRefOfHashRefs("select a.answerText, qa.response from Survey_questionResponse qa, Survey_question q, Survey_answer a where q.questionVariable = ? and q.Survey_questionId = a.Survey_questionId and a.Survey_answerId = qa.Survey_answerId - and qa.Survey_responseId = ? limit 1",[$var,$responseId]); -$self->session->errorHandler->warn("getPreviousAnswer $responseId $var"); - if(!$string){ + and qa.Survey_responseId = ? and qa.response != '' and qa.response is not null limit 1",[$var,$responseId]); + my $string; + if(@$ref < 1){ $string = "PREVIOUS ANSWSER"; + }else{ + if($$ref[0]{'response'}){ + $string = $$ref[0]{'response'}; + }else{ + $string = $$ref[0]{'answerText'}; + } } return $string; } @@ -1064,6 +1069,15 @@ sub getRandomText{ } return $rands{$var}; } +sub fillSectionTextVariables{ + my $self = shift; + my $responseId = shift; + my $section = shift; + $section->{'sectionText'} =~ s/(\[\[[^\%]*?\]\])/$self->getPreviousAnswer($responseId,$1)/eg; + $section->{'sectionText'} =~ s/(\[\[\%.*?\]\])/$self->getRandomText($responseId,$1)/eg; +$self->session->errorHandler->warn("Found $1 in ".$$section{'sectionText'}); + return $section; +} sub fillQuestionTextVariables{ my $self = shift; my $responseId = shift; @@ -1165,10 +1179,24 @@ sub getNextRandomQuestions{ sub getNextSection{ my ($self,$sid) = @_; - return $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s, Survey_section s1 - where s.assetId = ? and s.Survey_sectionId = ? and s1.assetId = ? and s1.sequenceNumber = s.sequenceNumber + 1", - [$self->getId(), $sid, $self->getId()]); + my $section; + + my $var = $self->session->db->quickScalar("select goto from Survey_section + where s.Survey_sectionId = ?", [$sid]); + my @array = split/\s*\,\s*/,$var; + my $picked = int(rand(scalar @array)); + + $section = $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s1 + where s1.sectionVariable = ?",[$array[$picked]]); + + if(!$section){ + $section = $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s, Survey_section s1 + where s.assetId = ? and s.Survey_sectionId = ? and s1.assetId = ? and s1.sequenceNumber = s.sequenceNumber + 1", + [$self->getId(), $sid, $self->getId()]); + } + return $section; } + sub questionsAnsweredInSection{ my ($self,$sid,$rid) = @_; return $self->session->db->quickScalar("select count(distinct(Survey_questionId)) @@ -1595,3 +1623,9 @@ sub AnswersInsert{ } 1; + +package ktest; +use Class::InsideOut qw( public readonly private register id ); + public name => my %name; + sub new{register(shift)} +1; From afd395ebb694e9ee4cf1f3988b04e897d552652f Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 8 May 2008 13:48:52 +0000 Subject: [PATCH 21/64] Added randomize answers functionality (how was this missing?) --- lib/WebGUI/Asset/Wobject/Survey.pm | 61 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index c7dcb2e23..a9bf52383 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -604,7 +604,7 @@ sub getFirstSection{ sub insertSection{ my $self = shift; my $data = shift;#array ref - $self->session->db->write("insert into Survey_section values(?,?,?,?,?,?,?,?,?,?,?,?,?)",$data); + $self->session->db->write("insert into Survey_section values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)",$data); } @@ -782,7 +782,7 @@ $self->session->errorHandler->warn("goodReponses".Dumper @goodResponses); my $filename = $storage->addFileFromFormPost( $id->{'Survey_answerId'} ); $path = $storage->getPath($filename); } -$self->session->errorHandler->warn("Inserting a response ".$id->{'Survey_answerId'}); +$self->session->errorHandler->warn("Inserting a response ".$id->{'Survey_answerId'}." $responseId, $path, ".$$responses{$id->{'Survey_answerId'}}); $self->session->db->write("insert into Survey_questionResponse select ?, Survey_sectionId, Survey_questionId, Survey_answerId, ?, ?, ?, now(), ?, ? from Survey_answer where Survey_answerId = ?", [$self->getId(), $responseId, $$responses{ $id->{'Survey_answerId'} }, '', $path, ++$lastOrder, $id->{'Survey_answerId'}]); @@ -1034,19 +1034,23 @@ sub getPreviousAnswer{ my ($self,$responseId,$var) = @_; $var =~ s/^\[\[//g; $var =~ s/\]\]$//g; +$self->session->errorHandler->warn("getPreviousAnswer for $var"); my $ref = $self->session->db->buildArrayRefOfHashRefs("select a.answerText, qa.response from Survey_questionResponse qa, Survey_question q, Survey_answer a where q.questionVariable = ? and q.Survey_questionId = a.Survey_questionId and a.Survey_answerId = qa.Survey_answerId and qa.Survey_responseId = ? and qa.response != '' and qa.response is not null limit 1",[$var,$responseId]); my $string; +use Data::Dumper; +$self->session->errorHandler->warn("getPreviousAnswer ".Dumper $ref); if(@$ref < 1){ $string = "PREVIOUS ANSWSER"; }else{ - if($$ref[0]{'response'}){ - $string = $$ref[0]{'response'}; + if($$ref[0]->{'answerText'} ne ""){ + $string = $$ref[0]->{'answerText'}; }else{ - $string = $$ref[0]{'answerText'}; + $string = $$ref[0]->{'response'}; } } +$self->session->errorHandler->warn("getPreviousAnswer returning $string"); return $string; } sub getRandomText{ @@ -1120,31 +1124,35 @@ $self->session->errorHandler->warn(join(',',@params)); order by RAND() LIMIT ? ",\@params); - for(my $i=0; $i<=$#$questions; $i++){ - $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs(" - select a.* - from Survey_answer a - where a.Survey_questionId = ? - order by a.sequenceNumber ASC - ",[$$questions[$i]{'Survey_questionId'}]); - } + $questions = $self->getAnswersForQuestions($questions); -#use Data::Dumper; -#$self->session->errorHandler->warn(Dumper $questions); $questions = $self->fillQuestionTextVariables($responseId,$questions); + + return $questions; +} +sub getAnswersForQuestions{ + my ($self,$questions) = @_; + for(my $i=0; $i<=$#$questions; $i++){ + my $sql = "select a.* + from Survey_answer a + where a.Survey_questionId = ?"; + if($$questions[$i]{'randomizeAnswers'} eq '0'){ + $sql .= " order by a.sequenceNumber ASC"; + } + else{ + $sql .= " order by RAND()"; + } + $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs( $sql ,[$$questions[$i]{'Survey_questionId'}] ); + } return $questions; - - } - sub getQuestionsAndAnswers{ my ($self,$responseId,$section,$questionId) = @_; my $qNeeded = $section->{'questionsPerPage'}; my $ref; my $seqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$questionId]); if(!$seqNum){$seqNum = 1;} -$self->session->errorHandler->warn("getQuestionsAndAnwers seqnum: $seqNum\tsectionid: ".$section->{'Survey_sectionId'}); my $questions = $self->session->db->buildArrayRefOfHashRefs(" select q.* from Survey_question q @@ -1152,18 +1160,11 @@ $self->session->errorHandler->warn("getQuestionsAndAnwers seqnum: $seqNum\tsecti order by q.sequenceNumber ASC ",[$section->{'Survey_sectionId'},$seqNum,$seqNum+$section->{'questionsPerPage'}]); - for(my $i=0; $i<=$#$questions; $i++){ - $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs(" - select a.* - from Survey_answer a - where a.Survey_questionId = ? - order by a.sequenceNumber ASC - ",[$$questions[$i]{'Survey_questionId'}]); - } + $questions = $self->getAnswersForQuestions($questions); + $questions = $self->fillQuestionTextVariables($responseId,$questions); + return $questions; - - } sub getNextQuestionId{ @@ -1182,7 +1183,7 @@ sub getNextSection{ my $section; my $var = $self->session->db->quickScalar("select goto from Survey_section - where s.Survey_sectionId = ?", [$sid]); + where Survey_sectionId = ?", [$sid]); my @array = split/\s*\,\s*/,$var; my $picked = int(rand(scalar @array)); From d6cfcd4381f7ffaf01b91f82e1299f5f6cc62800 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 8 May 2008 14:21:03 +0000 Subject: [PATCH 22/64] Added IE7 compat in administersurvey.js for class changes. --- www/extras/wobject/Survey/administersurvey.js | 22 ++++++++----------- .../wobject/Survey/editsurvey/section.js | 4 ++-- www/extras/wobject/Survey/survey.css | 6 +++++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 44970bb72..94934afbb 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -25,7 +25,6 @@ Survey.Form = new function() { this.displayQuestions = function(params){ - toValidate = new Array();//clear array var qs = params.questions; var s = params.section; @@ -188,8 +187,8 @@ Survey.Form = new function() { for(var z in toValidate[i]['answers']){ total += Math.round(document.getElementById(z).value); } -console.log(total+" and "+ toValidate[i]['total']); if(total == toValidate[i]['total']){answered = 1;} + else{alert("Please enter amounts that sum to 100% to proceed.");} }else{ for(var z in toValidate[i]['answers']){ var v = document.getElementById(z).value; @@ -197,9 +196,6 @@ console.log(total+" and "+ toValidate[i]['total']); answered = 1; break; } - else{ - console.log(z+' was not answered'); - } } } if(answered == 0){ @@ -365,33 +361,33 @@ console.log(total+" and "+ toValidate[i]['total']); var aid = objs[5]; max = parseInt(max); if(maxA == 1){ - if(b.getAttribute('class') == 'mcbutton-selected'){ + if(b.className == 'mcbutton-selected'){ document.getElementById(b.hid).value = 0; - b.setAttribute('class','mcbutton'); + b.className='mcbutton'; }else{ document.getElementById(b.hid).value = 1; - b.setAttribute('class','mcbutton-selected'); + b.className='mcbutton-selected'; } for(var i in butts){ if(butts[i] != b){ - butts[i].setAttribute('class','mcbutton'); + butts[i].className='mcbutton'; document.getElementById(butts[i].hid).value = ''; } } } - else if(b.getAttribute('class') == 'mcbutton'){ + else if(b.className == 'mcbutton'){ var max = parseInt(document.getElementById(qid+'max').innerHTML); if(max == 0){ - b.setAttribute('class','mcbutton'); + b.className='mcbutton'; //warn that options used up } else{ - b.setAttribute('class','mcbutton-selected'); + b.className='mcbutton-selected'; document.getElementById(qid+'max').innerHTML = parseInt(max-1); document.getElementById(b.hid).value = 1; } }else{ - b.setAttribute('class','mcbutton'); + b.className='mcbutton'; var max = parseInt(document.getElementById(qid+'max').innerHTML); document.getElementById(qid+'max').innerHTML = parseInt(max+1); document.getElementById(b.hid).value = ''; diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js index e2dee5a8e..837758b02 100644 --- a/www/extras/wobject/Survey/editsurvey/section.js +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -54,7 +54,7 @@ Survey.SectionTemplate = new function(){ } html = html + "\


          \ -

          Section Text:

          \ +

          Section Text:

          \ "; html = html + "

          Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); html = html + "

          Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); @@ -68,7 +68,7 @@ Survey.SectionTemplate = new function(){ } var form = new YAHOO.widget.Dialog("section", - { width : "400px", + { width : "500px", fixedcenter : true, visible : false, constraintoviewport : true, diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index 24f4927a1..beaa6f0d7 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -55,9 +55,15 @@ input.mcbutton:hover{ } input.mcbutton-selected{ background-color: #172D9D; + background-repeat: repeat-x; color: #FFFFFF; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; + margin: 0.5em; + padding: .8em; + width: 60px; + text-align: center; + display: block; font-weight: bold; background-image: url(/extras/wobject/Survey/gradient-glossy.png); background-position: 0px 0px; From e3bef2b5d7831a81b3b7985ade37fc62f8ca696f Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 8 May 2008 20:06:13 +0000 Subject: [PATCH 23/64] IE problems apparently resolved, and slider and multi-slider allocate accuracy made bullet-proof. --- www/extras/wobject/Survey/administersurvey.js | 34 ++++++++++++------- www/extras/wobject/Survey/survey.css | 17 ++++++++++ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 94934afbb..90e38947a 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -253,15 +253,16 @@ Survey.Form = new function() { for(var i in q.answers){ var a = q.answers[i]; var step = q.answers[i].step; - var scale = sliderWidth/q.answers[i].max; - var Event = YAHOO.util.Event; + var min = parseInt(q.answers[i].min); + var distance = parseInt(q.answers[i].max) + (-1 * min); + var scale = sliderWidth/distance; var lang = YAHOO.lang; var id = a.Survey_answerId; var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', 0, sliderWidth, (scale*step)); + s.scale = scale; sliders[id] = s; - s.max = a.max*scale; s.input = a.Survey_answerId; s.scale = scale; document.getElementById(id).value = a.min; @@ -270,7 +271,7 @@ Survey.Form = new function() { t.value = this.getRealValue(); }; s.getRealValue = function() { - return this.getValue() / this.scale; + return parseInt(( (this.getValue() / total) * distance) + min ); } s.subscribe("slideEnd", check); } @@ -279,8 +280,9 @@ Survey.Form = new function() { this.sliderManager = function(q,t){ var total = sliderWidth; var step = q.answers[0].step; - var scale = sliderWidth/q.answers[0].max; - + var min = parseInt(q.answers[0].min); + var distance = parseInt(q.answers[0].max) + (-1 * min); + var scale = sliderWidth/distance; for(var i in q.answers){ var a = q.answers[i]; var Event = YAHOO.util.Event; @@ -324,8 +326,8 @@ Survey.Form = new function() { Event.on(document.getElementById(s.input), "blur", manualEntry); s.getRealValue = function() { - - return Math.round(parseInt(this.getValue()) / scale); + return parseInt(( (this.getValue() / total) * distance) + min ); + //return Math.round(parseInt(this.getValue()) / scale); } document.getElementById(s.input).value = s.getRealValue(); } @@ -376,20 +378,28 @@ Survey.Form = new function() { } } else if(b.className == 'mcbutton'){ - var max = parseInt(document.getElementById(qid+'max').innerHTML); + var bscount = 0;//button selected count + for(var i in butts){ + if(butts[i].className == 'mcbutton-selected'){bscount++;} + } + var max = maxA - bscount;//= parseInt(document.getElementById(qid+'max').innerHTML); if(max == 0){ b.className='mcbutton'; //warn that options used up } else{ b.className='mcbutton-selected'; - document.getElementById(qid+'max').innerHTML = parseInt(max-1); + //document.getElementById(qid+'max').innerHTML = parseInt(max-1); document.getElementById(b.hid).value = 1; } }else{ b.className='mcbutton'; - var max = parseInt(document.getElementById(qid+'max').innerHTML); - document.getElementById(qid+'max').innerHTML = parseInt(max+1); + var bscount = 0;//button selected count + for(var i in butts){ + if(butts[i].className == 'mcbutton-selected'){bscount++;} + } + var max = maxA - bscount;//= parseInt(document.getElementById(qid+'max').innerHTML); +// document.getElementById(qid+'max').innerHTML = parseInt(max+1); document.getElementById(b.hid).value = ''; } if(qsize == 1){ diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index beaa6f0d7..9b0ad2901 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -1,3 +1,20 @@ +body { + margin: 0; + background-image: url(http://casr.ou.edu/root/import/survey/spacer.gif); + background-repeat: repeat-y; + background-position: 0px 0px; +} +.header { + width: 80%; + height: 40px; + margin-left: 80px; +} +#survey { + margin-left: 80px; + width: 85%; +} + + div.dateanswer { min-height: 250px; } From 7864ec1b3577ea10f7e4f4085260bf661918f951 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 8 May 2008 20:06:57 +0000 Subject: [PATCH 24/64] template vars altered --- lib/WebGUI/Asset/Wobject/Survey.pm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index a9bf52383..c5fb209e4 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -1596,12 +1596,12 @@ sub createDefaultAnswers{ $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); }elsif($type eq 'Dual Slider - Range'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 0,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 0,10,1,0,20,2]); }elsif($type eq 'Multi Slider - Allocate'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 1,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 0,10,1,0,20,2]); + $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 0,10,1,0,20,2]); }elsif($type eq 'Date'){ $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); From 9bad426c49267099bf7698710a099ff55237612b Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 12 May 2008 13:58:52 +0000 Subject: [PATCH 25/64] Added 500ms delay during 1 button page clicks. --- www/extras/wobject/Survey/administersurvey.js | 44 ++++++++++-------- www/extras/wobject/Survey/gradient-glossy.png | Bin 0 -> 132 bytes www/extras/wobject/Survey/survey.css | 3 +- 3 files changed, 25 insertions(+), 22 deletions(-) create mode 100755 www/extras/wobject/Survey/gradient-glossy.png diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 90e38947a..6b4baf700 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -22,6 +22,8 @@ Survey.Form = new function() { var sliderWidth = 500; var sliders; + + this.submittimer; this.displayQuestions = function(params){ @@ -178,7 +180,7 @@ Survey.Form = new function() { } - this.formsubmit = function(){ + this.formsubmit = function(event){ var submit = 1;//boolean for if all was good or not for(var i in toValidate){ var answered = 0; @@ -252,10 +254,10 @@ Survey.Form = new function() { var total = sliderWidth; for(var i in q.answers){ var a = q.answers[i]; - var step = q.answers[i].step; - var min = parseInt(q.answers[i].min); - var distance = parseInt(q.answers[i].max) + (-1 * min); - var scale = sliderWidth/distance; + var step = Math.round(q.answers[i].step); + var min = Math.round(parseFloat(q.answers[i].min)); + var distance = Math.round(parseFloat(q.answers[i].max) + (-1 * min)); + var scale = Math.round(sliderWidth/distance); var lang = YAHOO.lang; var id = a.Survey_answerId; var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', @@ -271,18 +273,18 @@ Survey.Form = new function() { t.value = this.getRealValue(); }; s.getRealValue = function() { - return parseInt(( (this.getValue() / total) * distance) + min ); + return Math.round(parseFloat(( (this.getValue() / total) * distance) + min )); } - s.subscribe("slideEnd", check); + s.subscribe("change", check); } } //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating this.sliderManager = function(q,t){ var total = sliderWidth; - var step = q.answers[0].step; - var min = parseInt(q.answers[0].min); - var distance = parseInt(q.answers[0].max) + (-1 * min); - var scale = sliderWidth/distance; + var step = Math.round(parseFloat(q.answers[0].step)); + var min = Math.round(parseFloat(q.answers[0].min)); + var distance = Math.round(parseFloat(q.answers[0].max) + (-1 * min)); + var scale = Math.round(sliderWidth/distance); for(var i in q.answers){ var a = q.answers[i]; var Event = YAHOO.util.Event; @@ -326,8 +328,7 @@ Survey.Form = new function() { Event.on(document.getElementById(s.input), "blur", manualEntry); s.getRealValue = function() { - return parseInt(( (this.getValue() / total) * distance) + min ); - //return Math.round(parseInt(this.getValue()) / scale); + return Math.round(parseFloat(( (this.getValue() / total) * distance) + min )); } document.getElementById(s.input).value = s.getRealValue(); } @@ -361,7 +362,9 @@ Survey.Form = new function() { var butts = objs[3]; var qsize = objs[4]; var aid = objs[5]; - max = parseInt(max); + max = parseFloat(max); +console.log('clearing'); + clearTimeout(Survey.Form.submittimer); if(maxA == 1){ if(b.className == 'mcbutton-selected'){ document.getElementById(b.hid).value = 0; @@ -382,14 +385,14 @@ Survey.Form = new function() { for(var i in butts){ if(butts[i].className == 'mcbutton-selected'){bscount++;} } - var max = maxA - bscount;//= parseInt(document.getElementById(qid+'max').innerHTML); + var max = maxA - bscount;//= parseFloat(document.getElementById(qid+'max').innerHTML); if(max == 0){ b.className='mcbutton'; //warn that options used up } else{ b.className='mcbutton-selected'; - //document.getElementById(qid+'max').innerHTML = parseInt(max-1); + //document.getElementById(qid+'max').innerHTML = parseFloat(max-1); document.getElementById(b.hid).value = 1; } }else{ @@ -398,13 +401,14 @@ Survey.Form = new function() { for(var i in butts){ if(butts[i].className == 'mcbutton-selected'){bscount++;} } - var max = maxA - bscount;//= parseInt(document.getElementById(qid+'max').innerHTML); -// document.getElementById(qid+'max').innerHTML = parseInt(max+1); + var max = maxA - bscount;//= parseFloat(document.getElementById(qid+'max').innerHTML); +// document.getElementById(qid+'max').innerHTML = parseFloat(max+1); document.getElementById(b.hid).value = ''; } - if(qsize == 1){ + if(qsize == 1 && b.className == 'mcbutton-selected'){ +console.log("1 butt submit"); if(! document.getElementById(aid+'verbatim')){ - Survey.Form.formsubmit(); + Survey.Form.submittimer=setTimeout("Survey.Form.formsubmit()",500); } } } diff --git a/www/extras/wobject/Survey/gradient-glossy.png b/www/extras/wobject/Survey/gradient-glossy.png new file mode 100755 index 0000000000000000000000000000000000000000..cefdab036774b398b3c351f68c863874f242af50 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{G!3HF)&rH7sq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6{&f;IEGZ*O8W8t|9>|%Hnui Date: Wed, 14 May 2008 19:16:14 +0000 Subject: [PATCH 26/64] Slider write ins now more accurate --- www/extras/wobject/Survey/administersurvey.js | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 6b4baf700..68b307870 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -248,7 +248,8 @@ Survey.Form = new function() { // Subscribe to the dual thumb slider's change and ready events to // report the state. // s.subscribe('ready', updateUI); - s.subscribe('change', updateUI); + //s.subscribe('change', updateUI); + s.subscribe('slideEnd', updateUI); } this.sliders = function(q){ var total = sliderWidth; @@ -262,7 +263,6 @@ Survey.Form = new function() { var id = a.Survey_answerId; var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', 0, sliderWidth, (scale*step)); - s.scale = scale; sliders[id] = s; s.input = a.Survey_answerId; @@ -275,7 +275,7 @@ Survey.Form = new function() { s.getRealValue = function() { return Math.round(parseFloat(( (this.getValue() / total) * distance) + min )); } - s.subscribe("change", check); + s.subscribe("slideEnd", check); } } //an object which creates sliders for allocation type questions and then manages their events and keeps them from overallocating @@ -304,19 +304,22 @@ Survey.Form = new function() { t -= this.getValue(); t = Math.round(t); this.setValue(total-t);// + (scale*step)); + document.getElementById(this.input).value = Math.round(parseFloat(( ((total-t) / total) * distance) + min )); }else{ this.lastValue = this.getValue(); document.getElementById(this.input).value = this.getRealValue(); } }; - s.subscribe("change", check); + //s.subscribe("change", check); + s.subscribe("slideEnd", check); var manualEntry = function(e){ // set the value when the 'return' key is detected if (Event.getCharCode(e) === 13 || e.type == 'blur') { var v = parseFloat(this.value, 10); v = (lang.isNumber(v)) ? v : 0; - v *= scale; - +// v *= scale; +console.log('start was '+v+' ' + min+ ' '+(v-min)+' / '+distance+' * '+total +' = '+( ( ( (v-min) / distance))*total)); + v = ( ( (v-min) / distance))*total; // convert the real value into a pixel offset for(var sl in sliders){ if(sliders[sl].input == this.id){ @@ -326,6 +329,7 @@ Survey.Form = new function() { } } Event.on(document.getElementById(s.input), "blur", manualEntry); + Event.on(document.getElementById(s.input), "keypress", manualEntry); s.getRealValue = function() { return Math.round(parseFloat(( (this.getValue() / total) * distance) + min )); @@ -363,7 +367,7 @@ Survey.Form = new function() { var qsize = objs[4]; var aid = objs[5]; max = parseFloat(max); -console.log('clearing'); +//console.log('clearing'); clearTimeout(Survey.Form.submittimer); if(maxA == 1){ if(b.className == 'mcbutton-selected'){ @@ -406,7 +410,7 @@ console.log('clearing'); document.getElementById(b.hid).value = ''; } if(qsize == 1 && b.className == 'mcbutton-selected'){ -console.log("1 butt submit"); +//console.log("1 butt submit"); if(! document.getElementById(aid+'verbatim')){ Survey.Form.submittimer=setTimeout("Survey.Form.formsubmit()",500); } From 355decc7c3547aa9e87fcac4e4ef10ad49089564 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 16 May 2008 21:42:52 +0000 Subject: [PATCH 27/64] Added warning message on required slider allocates for how much left is required. Also removed slider animation as there appears to be a motion bug where the bug can slide further than asked for. --- www/extras/wobject/Survey/administersurvey.js | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 68b307870..598c16be9 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -190,7 +190,10 @@ Survey.Form = new function() { total += Math.round(document.getElementById(z).value); } if(total == toValidate[i]['total']){answered = 1;} - else{alert("Please enter amounts that sum to 100% to proceed.");} + else{ + var amountLeft = toValidate[i]['total']-total; + alert("Please allocate the remaining "+amountLeft+ "."); + } }else{ for(var z in toValidate[i]['answers']){ var v = document.getElementById(z).value; @@ -264,7 +267,8 @@ Survey.Form = new function() { var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', 0, sliderWidth, (scale*step)); s.scale = scale; - sliders[id] = s; + sliders[q.Survey_questionid] = new Array(); + sliders[q.Survey_questionid][id] = s; s.input = a.Survey_answerId; s.scale = scale; document.getElementById(id).value = a.min; @@ -292,13 +296,17 @@ Survey.Form = new function() { var id = a.Survey_answerId+'slider-bg'; var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', 0, sliderWidth, scale*step); - sliders[a.Survey_answerId] = s; + s.animate = false; + if(sliders[q.Survey_questionId] == undefined){ + sliders[q.Survey_questionId] = new Array(); + } + sliders[q.Survey_questionId][a.Survey_answerId] = s; s.input = a.Survey_answerId; s.lastValue = 0; var check = function() { var t = 0; - for(var x in sliders){ - t+= sliders[x].getValue(); + for(var x in sliders[q.Survey_questionId]){ + t+= sliders[q.Survey_questionId][x].getValue(); } if(t > total){ t -= this.getValue(); @@ -310,7 +318,7 @@ Survey.Form = new function() { document.getElementById(this.input).value = this.getRealValue(); } }; - //s.subscribe("change", check); + s.subscribe("change", check); s.subscribe("slideEnd", check); var manualEntry = function(e){ // set the value when the 'return' key is detected @@ -318,12 +326,11 @@ Survey.Form = new function() { var v = parseFloat(this.value, 10); v = (lang.isNumber(v)) ? v : 0; // v *= scale; -console.log('start was '+v+' ' + min+ ' '+(v-min)+' / '+distance+' * '+total +' = '+( ( ( (v-min) / distance))*total)); v = ( ( (v-min) / distance))*total; // convert the real value into a pixel offset - for(var sl in sliders){ - if(sliders[sl].input == this.id){ - sliders[sl].setValue(Math.round(v)); + for(var sl in sliders[q.Survey_questionId]){ + if(sliders[q.Survey_questionId][sl].input == this.id){ + sliders[q.Survey_questionId][sl].setValue(Math.round(v)); } } } @@ -367,7 +374,6 @@ console.log('start was '+v+' ' + min+ ' '+(v-min)+' / '+distance+' * '+total +' var qsize = objs[4]; var aid = objs[5]; max = parseFloat(max); -//console.log('clearing'); clearTimeout(Survey.Form.submittimer); if(maxA == 1){ if(b.className == 'mcbutton-selected'){ @@ -410,7 +416,6 @@ console.log('start was '+v+' ' + min+ ' '+(v-min)+' / '+distance+' * '+total +' document.getElementById(b.hid).value = ''; } if(qsize == 1 && b.className == 'mcbutton-selected'){ -//console.log("1 butt submit"); if(! document.getElementById(aid+'verbatim')){ Survey.Form.submittimer=setTimeout("Survey.Form.formsubmit()",500); } From d7f38c4e3709989f010aecfd75147cd863b6b884 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 21 May 2008 15:58:25 +0000 Subject: [PATCH 28/64] Removed auto-submit on 1 MC question per page. Added scroll to top of page on submit. --- www/extras/wobject/Survey/administersurvey.js | 6 ++++-- www/extras/wobject/Survey/administersurvey/comm.js | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index 598c16be9..f28f7f55e 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -23,7 +23,7 @@ Survey.Form = new function() { var sliders; - this.submittimer; +// this.submittimer; this.displayQuestions = function(params){ @@ -374,7 +374,7 @@ Survey.Form = new function() { var qsize = objs[4]; var aid = objs[5]; max = parseFloat(max); - clearTimeout(Survey.Form.submittimer); +// clearTimeout(Survey.Form.submittimer); if(maxA == 1){ if(b.className == 'mcbutton-selected'){ document.getElementById(b.hid).value = 0; @@ -415,11 +415,13 @@ Survey.Form = new function() { // document.getElementById(qid+'max').innerHTML = parseFloat(max+1); document.getElementById(b.hid).value = ''; } +/* if(qsize == 1 && b.className == 'mcbutton-selected'){ if(! document.getElementById(aid+'verbatim')){ Survey.Form.submittimer=setTimeout("Survey.Form.formsubmit()",500); } } +*/ } }(); diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js index f4ceee030..95facaabd 100644 --- a/www/extras/wobject/Survey/administersurvey/comm.js +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -29,6 +29,7 @@ Survey.Comm= new function(){ this.callback = { + window.scrollTo(0, 0); upload:function(o){ callMade = 0; Survey.Comm.callServer('','loadQuestions'); From 6832eacc7c98e4d7e175c744fbdb5abbf53f1cf0 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 21 May 2008 16:34:56 +0000 Subject: [PATCH 29/64] Whups, windows.scrollTo on wrong line. --- www/extras/wobject/Survey/administersurvey/comm.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js index 95facaabd..708233060 100644 --- a/www/extras/wobject/Survey/administersurvey/comm.js +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -29,12 +29,12 @@ Survey.Comm= new function(){ this.callback = { - window.scrollTo(0, 0); upload:function(o){ callMade = 0; Survey.Comm.callServer('','loadQuestions'); }, success:function(o){ + window.scrollTo(0,0); callMade = 0; var response = ''; response = YAHOO.lang.JSON.parse(o.responseText); @@ -55,7 +55,6 @@ Survey.Comm= new function(){ alert("Last request failed "+o.statusText); } }, - timeout: 15000 }; this.callServer = function(data,functionName,form,hasFile){ From c4f939f30662b1d8d45eda96efc516a02084afd3 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 24 Sep 2008 01:30:57 +0000 Subject: [PATCH 30/64] Hah, it ah, doesnt throw errors upon modperl start and ah, the editor, ah, kind of works, and err. ah, the JSON is 99% working, with objects instantiating themselves correctly then serializing themselves as appropriate. Definitely not a working version though. --- lib/WebGUI/Asset/Wobject/Survey.pm | 334 ++++++------------ lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm | 55 +++ .../Asset/Wobject/Survey/QuestionJSON.pm | 101 ++++++ .../Asset/Wobject/Survey/SectionJSON.pm | 126 +++++++ lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 79 +++++ www/extras/wobject/Survey/editsurvey/comm.js | 3 +- www/extras/wobject/Thingy/thingy.js | 2 +- www/extras/wobject/editsurvey.js | 26 +- www/extras/wobject/editsurvey/comm.js | 2 + 9 files changed, 482 insertions(+), 246 deletions(-) create mode 100644 lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm create mode 100644 lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm create mode 100644 lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm create mode 100644 lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index c5fb209e4..855173ec4 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -16,6 +16,9 @@ use JSON; use WebGUI::International; use WebGUI::Form::File; use base 'WebGUI::Asset::Wobject'; + +use Data::Dumper; + # #------------------------------------------------------------------- sub definition { @@ -80,21 +83,21 @@ sub definition { tab => 'display', fieldType => 'template', label => "Survey edit template id", - defaultValue => 'lWcFPcZOf6f84fNNKo3LGw', + defaultValue => 'GRUNFctldUgop-qRLuo_DA', namespace => 'Survey/Edit', }, surveyTakeTemplateId => { tab => 'display', fieldType => 'template', label => "Take survey template id", - defaultValue => 'TOCwx3VNHVmNr5eSPIAMNg', + defaultValue => 'd8jMMMRddSQ7twP4l1ZSIw', namespace => 'Survey/Take', }, surveyQuestionsId => { tab => 'display', fieldType => 'template', label => "Questions template id", - defaultValue => 'h0pJBF7LVqCCfWYr_g6YXQ', + defaultValue => 'CxMpE_UPauZA3p8jdrOABw', namespace => 'Survey/Take', }, ); @@ -137,221 +140,125 @@ This overloads the normal call to the super, to call the super call like normal #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; - $self->SUPER::processPropertiesFromFormPost; - my $firstSection = $self->getFirstSection(); - if(! $firstSection){ - $self->insertSection( [$self->getId,$self->session->id->generate(),'',"First Section",1,1,"Tis is the first page",0,0,1,0,0,'',''] ); -# $self->insertSection( [$self->getId,$self->session->id->generate(),"Last Section",9999,0,"This is the last page",0,0] ); + $self->SUPER::processPropertiesFromFormPost; + + $self->loadSurveyJSON(); + if($#{$self->{_data}->{sections}} < 0){ + $self->{_data}->update({ids=>['NEW'],object=>{}}); } + $self->saveSurveyJSON(); } +#------------------------------------------------------------------- + +=head2 loadSurveyJSON ( ) + +Loads the survey collateral into memory so that the survey objects can be created + +=cut + +sub loadSurveyJSON{ + my $self = shift; + + if(defined $self->{_data}){return;}#already loaded + + my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); +use Data::Dumper; +$self->session->errorHandler->error("LOADING".Dumper $jsonHash); + my $hashRef = {}; + $hashRef = decode_json($jsonHash) if defined $jsonHash; + + $self->{_data} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($hashRef);#,$self->session->errorHandler); +} + +#------------------------------------------------------------------- + +=head2 saveSurveyJSON ( ) + +Saves the survey collateral to the DB + +=cut + +sub saveSurveyJSON{ + my $self = shift; + $self->{_data}->{log} = $self->session->errorHandler; + my $data = $self->{_data}->freeze(); + +use Data::Dumper; +$self->session->errorHandler->error("SAVING".Dumper $data); + + $data = encode_json($data); + $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); +} #------------------------------------------------------------------- -=head2 prepareView ( ) +=head2 www_editSurvey ( ) -See WebGUI::Asset::prepareView() for details. +Loads the initial edit survey page. All other edit actions are JSON calls from this page. =cut sub www_editSurvey { my $self = shift; + my %var; -# my $out = $self->processStyle($self->processTemplate(\%var,$self->get("surveyEditTemplateId"))); my $out = $self->processTemplate(\%var,$self->get("surveyEditTemplateId")); return $out; } #------------------------------------------------------------------- -sub www_submitAnswerEdit{ - my $self = shift; - my $ref = $self->session->form->paramsHashRef(); - - if($ref->{'Survey_answerId'}){ - $self->session->db->write(" - update Survey_answer - set answerText = ?, gotoQuestion = ?, recordedAnswer = ?, isCorrect = ?, min = ?, max = ?, step = ?, verbatim = ?, textCols = ?, textRows = ? - where Survey_answerId = ?", - [ - $$ref{'answerText'},$$ref{'gotoQuestion'},$$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'}, - $$ref{'max'},$$ref{'step'},$$ref{'verbatim'},$$ref{'textCols'},$$ref{'textRows'} - ,$$ref{'Survey_answerId'} - ] - ); - }else{ - my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_answer where Survey_questionId = ?",[$ref->{'Survey_questionId'}]); - $seqNum++; - $ref->{'Survey_answerId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", - [ $self->getId,$$ref{'Survey_sectionId'},$$ref{'Survey_questionId'},$$ref{'Survey_answerId'},$seqNum,$$ref{'gotoQuestion'},$$ref{'answerText'}, - $$ref{'recordedAnswer'},$$ref{'isCorrect'},$$ref{'min'},$$ref{'max'},$$ref{'step'},$$ref{'verbatim'},$$ref{'textCols'},$$ref{'textRows'} ] - ); - } - return $self->www_loadSurvey($ref->{'Survey_sectionId'}."||||".$ref->{'Survey_questionId'}."||||".$$ref{'Survey_answerId'}); -} -#------------------------------------------------------------------- -sub www_submitQuestionEdit{ - my $self = shift; - my $ref = $self->session->form->paramsHashRef(); - - if($ref->{'Survey_questionId'}){ - my $type = $self->session->db->quickScalar("select questionType from Survey_question where Survey_questionId = ?",[$ref->{'Survey_questionId'}]); - - $self->session->db->write(" - update Survey_question - set questionText = ?, allowComment = ?, randomizeAnswers = ?, questionType = ?, randomizedWords = ?, previousAnswerWords = ?, verticalDisplay = ?, - required = ?, maxAnswers = ?, questionVariable = ?, points = ?, commentCols = ?, commentRows = ?, textInButton = ? - where Survey_questionId = ?", - [ - $$ref{'questionText'},$$ref{'allowComment'},$$ref{'randomizeAnswers'},$$ref{'questionType'},$$ref{'randomizedWords'}, - $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'questionVariable'}, $$ref{'points'}, - $$ref{'commentCols'},$$ref{'commentRows'},$$ref{'textInButton'}, - $$ref{'Survey_questionId'} - ] - ); - -$self->session->errorHandler->warn("textInButton was ".$$ref{'textInButton'}); - if($type ne $ref->{'questionType'}){ - $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); - } - - }else{ - my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$ref->{'Survey_sectionId'}]); - $seqNum++; - $ref->{'Survey_questionId'} = $self->session->id->generate(); - $self->session->db->write("insert into Survey_question values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", - [ $self->getId,$$ref{'Survey_questionId'},$$ref{'questionVariable'},$$ref{'questionText'},$seqNum,$$ref{'allowComment'},$$ref{'commentCols'},$$ref{'commentRows'}, - $$ref{'randomizeAnswers'},$$ref{'questionType'}, $$ref{'Survey_sectionId'},$$ref{'randomizedWords'}, - $$ref{'previousAnswerWords'},$$ref{'verticalDisplay'},$$ref{'required'},$$ref{'maxAnswers'}, $$ref{'points'}, $$ref{'textInButton'} ] - ); - - $self->createDefaultAnswers($ref->{'Survey_sectionId'},$ref->{'Survey_questionId'},$ref->{'questionType'}); - } - return $self->www_loadSurvey($ref->{'Survey_sectionId'}."||||".$ref->{'Survey_questionId'}); -} - - -#------------------------------------------------------------------- -sub www_submitSectionEdit{ +sub www_submitEditObject{ my $self = shift; - my $p = $self->session->form->paramsHashRef(); - if(!$p->{'Survey_sectionId'}){ - my $seqNum = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_section where assetId = ?",[$self->getId]); - my $id = $self->session->id->generate(); + my $ref = @{decode_json($self->session->form->process("data"))}; - $self->insertSection([$self->getId, $id, $p->{'sectionVariable'},$p->{'sectionName'},$seqNum+1,$p->{'questionsPerPage'},$p->{'sectionText'},$p->{'randomizeQuestions'}, - $p->{'questionsOnSectionPage'}, $p->{'everyPageTitle'},$p->{'everyPageText'},$p->{'terminal'},$p->{'terminalURL'},$p->{'goto'}]); + $self->loadSurveyJSON(); - $p->{'Survey_sectionId'} = $id; + my $message = $self->{_data}->update($ref);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. - }else{ + $self->saveSurveyJSON(); - $self->session->db->write("update Survey_section set sectionName = ?, questionsPerPage = ?, sectionText = ?, randomizeQuestions = ?, questionsOnSectionPage = ?, - everyPageTitle = ?, everyPageText = ?,terminal = ?, terminalURL = ?,sectionVariable = ?, goto = ? - where Survey_sectionId = ?", - [ $p->{'sectionName'}, $p->{'questionsPerPage'}, $p->{'sectionText'}, $p->{'randomizeQuestions'}, $p->{'questionsOnSectionPage'},$p->{'everyPageTitle'}, - $p->{'everyPageText'}, $p->{'terminal'}, $p->{'terminalURL'}, $p->{'sectionVariable'},$p->{'goto'}, - $p->{'Survey_sectionId'} ] - ); - -$self->session->errorHandler->warn("here"); - } - use Data::Dumper; - $self->session->errorHandler->warn(Dumper $p); - return $self->www_loadSurvey($p->{'Survey_sectionId'}); + return $self->www_loadSurvey({address => $ref->{ids},message=>$message}); } #------------------------------------------------------------------- -sub www_newAnswer{ +sub www_deleteObject{ my $self = shift; - my ($sid,$qid) = @{decode_json($self->session->form->process("data"))}; -$self->session->errorHandler->warn("NEW ANSWER ".$sid."\t\t".$qid); - my $id = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_answer where Survey_questionId = ?",[$qid]); - if(!$id){$id = 1;}else{$id++;} - my $edit; - $edit->{'type'} = 'loadAnswer'; - $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId',$qid, 'Survey_answerId','', 'sequenceNumber', $id, 'gotoQuestion','', - 'answerText','','recordedAnswer','','isCorrect',1,'min',1,'max',10,'step',1,'verbatim',0 }; - $sid .= "||||".$qid; - return $self->www_loadSurvey($sid,$edit); + my $ref = @{decode_json($self->session->form->process("data"))}; + + $self->loadSurveyJSON(); + + my $message = $self->{_data}->remove($ref);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + + $self->saveSurveyJSON(); + + #The last address in ideas is to a deleted object so that should not be returned. + pop(@{$ref->{ids}}); + + return $self->www_loadSurvey({address => $ref->{ids}, message=>$message}); } - - -#------------------------------------------------------------------- -sub www_newQuestion{ +sub www_newObject{ my $self = shift; - my $sid = $self->session->form->process("data"); - - my $id = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$sid]); - if(!$id){$id = 1;}else{$id++;} - my $edit; - $edit->{'type'} = 'loadQuestion'; - $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $sid, 'Survey_questionId','', 'questionText','', 'sequenceNumber', $id, - 'allowComment',0, 'randomizeAnswers',0, 'questionType',1, 'required',0,'randomizedWords','','previousAnswerWords','','verticalDisplay',0,'maxAnswers','1', - 'questionVariable','','commentCols',20,'commentRows',1, 'textInButton',0 }; - return $self->www_loadSurvey($sid,$edit); -} - - -#------------------------------------------------------------------- -sub www_newSection{ - my $self = shift; - my $last = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_section where assetId = ?",[$self->getId]); - my $focus = ''; - my $edit; - $edit->{'type'} = 'loadSection'; - $edit->{'params'} = {'assetId', $self->getId, 'Survey_sectionId', $focus, 'sectionName', 'New Section', 'sequenceNumber', ++$last, - 'questionsPerPage',1, 'sectionText', 'Text goes here', 'randomizeQuestions',0, 'questionsOnSectionPage', 0, 'everyPageTitle',1,'everyPageText',0,'terminal',0}; - return $self->www_loadSurvey('',$edit); -} - - - -#------------------------------------------------------------------- -sub www_deleteAnswer{ - my $self = shift; - my $id = $self->session->form->process("data"); - my $ref = $self->session->db->quickHashRef("select Survey_sectionId,Survey_questionId,sequenceNumber from Survey_answer where Survey_answerId = ?",[$id]); - $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber -1 where Survey_questionId = ? and sequenceNumber > ?", - [$$ref{'Survey_questionId'},$$ref{'sequenceNumber'}]); - $self->session->db->write("delete from Survey_answer where Survey_answerId = ?",[$id]); - return $self->www_loadSurvey($$ref{'Survey_sectionId'}."||||".$$ref{'Survey_questionId'}); -} -sub www_deleteQuestion{ - my $self = shift; - my $id = $self->session->form->process("data"); - my $ref = $self->session->db->quickHashRef("select Survey_sectionId,sequenceNumber from Survey_question where Survey_questionId = ?",[$id]); - - $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber -1 where Survey_sectionId = ? and sequenceNumber > ?", - [$$ref{'Survey_sectionId'},$$ref{'sequenceNumber'}]); - - $self->session->db->write("delete from Survey_question where Survey_questionId = ?",[$id]); - $self->session->db->write("delete from Survey_answer where Survey_questionId = ?",[$id]); - return $self->www_loadSurvey($$ref{'Survey_sectionId'}); -} -sub www_deleteSection{ - my $self = shift; - my $id = $self->session->form->process("data"); - - my $seq = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$id]); + my $ref; - $self->session->db->write("update Survey_section set sequenceNumber = sequenceNumber -1 where assetId= ? and sequenceNumber > ?", - [$self->getId(),$seq]); + $ref->{ids} = @{decode_json($self->session->form->process("data"))}; - $self->session->db->write("delete from Survey_answer where Survey_sectionId = ?",[$id]); - $self->session->db->write("delete from Survey_question where Survey_sectionId = ?",[$id]); - $self->session->db->write("delete from Survey_section where Survey_sectionId = ?",[$id]); - return $self->www_loadSurvey('undefined');#faking an empty JS entry + $self->loadSurveyJSON(); + + my $object = $self->{_data}->createTemp($ref); + + #The new temp object has an address of NEW, which means it is not a real final address. + push(@{$ref->{ids}},'NEW'); + + return $self->www_loadSurvey({address => $ref->{ids}, message => undef, object => $object}); } - - #------------------------------------------------------------------- sub www_dragDrop{ my $self = shift; @@ -463,60 +370,26 @@ sub www_dragDrop{ #------------------------------------------------------------------- sub www_loadSurvey{ - my $self = shift; - my $p = shift;#The id of the the object(s) in focus, can be empty. - my $edit = shift;#If edit data has already been generated and does not need to be grabbed for the focus id, usually is empty. - - if(!$p){ - $p = $self->session->form->process("data"); - } - - my $focus;#Survey object that has the focus - - if($p eq "undefined"){ - $focus = $self->getFirstSection(); - }else{$focus = $p;} - - my @dfocus = split(/\|\|\|\|/,$focus); + my ($self,$options) = @_; - my $sections = $self->getSections(); - my $questions = $self->getQuestions($dfocus[0]);#pass in the section - my $answers = $self->getAnswers($dfocus[1]);#pass in the question + $self->loadSurveyJSON(); +$self->session->errorHandler->error("The object isa ".Dumper $self->{_data}); + my $address = $options->{address} ? defined $options : [0]; + my $message = $options->{message} ? defined $options : ''; + my $object = $options->{object} ? defined $options : $self->{_data}->getObject($address); +$self->session->errorHandler->error("The object isa ".Dumper $object); + $object = $object->freeze();#just want the hashref + +$self->session->errorHandler->error(1); - if(! $edit){ - if($#dfocus == 0){ - $edit->{"type"} = "loadSection"; - $edit->{"params"} = $self->getSpecificSection($dfocus[0]); - #get specific data/edit template for section - }elsif($#dfocus == 1){ - $edit->{"type"} = "loadQuestion"; - $edit->{"params"} = $self->getSpecificQuestion($dfocus[1]); - #get specific data/edit template for question - }elsif($#dfocus == 2){ - $edit->{"type"} = "loadAnswer"; - $edit->{"params"} = $self->getSpecificAnswer($dfocus[2]); - #get specific data/edit template for answer - } - } - my @data; - foreach my $s(@$sections){ - push( @data, { "type","section","text",$s->{"sectionName"},"id",$s->{'Survey_sectionId'} } ); - if($#$questions >= 0 and $questions->[0]->{'Survey_sectionId'} eq $s->{'Survey_sectionId'}){ - foreach my $q(@$questions){ - push( @data, { "type","question","text",$q->{"text"},"id",$q->{'Survey_questionId'} } ); - if($#$answers >= 0 and $answers->[0]->{'Survey_questionId'} eq $q->{'Survey_questionId'}){ - foreach my $a(@$answers){ - push( @data, { "type","answer","text",$a->{"text"},"id",$a->{'Survey_answerId'}, "recorded", $a->{'recordedAnswer'} } ); - } - } - } - } - } + @data = $self->{_data}->getDragDropList($address,\@data); +$self->session->errorHandler->error(2); - my $return = {"focus",$focus,"data",\@data,"edit",$edit}; -# $self->session->errorHandler->warn(encode_json($return)); + my $return = {"address",$address,"data",\@data,"object",$object}; + $self->session->errorHandler->warn(encode_json($return)); +$self->session->errorHandler->error(3); return encode_json($return); } @@ -1623,10 +1496,5 @@ sub AnswersInsert{ $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",$array); } -1; -package ktest; -use Class::InsideOut qw( public readonly private register id ); - public name => my %name; - sub new{register(shift)} 1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm new file mode 100644 index 000000000..5f870388d --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm @@ -0,0 +1,55 @@ +package WebGUI::Asset::Wobject::Survey::AnswerJSON; + +use strict; +use Data::Structure::Util qw/unbless/; + +sub new{ + my $class = shift; + my $parent = shift; + my $self = shift || {}; + $self->{answers} = $self->{answers} || []; + $self->{text}; + $self->{index}; + $self->{parentIndex}; + $self->{parent} = $parent; + $self->{verbatim}; + $self->{textCols}; + $self->{textRows}; + $self->{gotoQuestion}; + $self->{recordedAnswer}; + $self->{isCorrect}; + $self->{min}; + $self->{max}; + $self->{step}; + $self->{value}; + $self->{terminal}; + $self->{terminalUrl}; + bless($self,$class); + return $self; +} +sub update{ + my ($self,$ref) = @_; + + while(my ($key,$value) = keys %{$ref->{object}}){ + $self->{$key} = $value; + } +} +sub remove{ + my $self = shift; + $self->{parent} = undef; +} +sub freeze{ + my $self = shift; + my %temp = %{$self}; + $temp{parent} = undef; +# unbless $self; + return \%temp; +} + +#address is the array of objects currently selected in the edit screen +#data is the array of hash items for displaying +sub getDragDropList{ + my ($self,$data,$address,$selected) = @_; + push(@$data, { "type","answer","text",$self->{"text"}, "recorded", $self->{'recordedAnswer'} }); +} +1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm new file mode 100644 index 000000000..9e73e170c --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm @@ -0,0 +1,101 @@ +package WebGUI::Asset::Wobject::Survey::QuestionJSON; + +use strict; +use Data::Structure::Util qw/unbless/; + +sub new{ + my $class = shift; + my $self = shift || {}; + my $parent = shift; + + if(defined $self->{answers}){ + foreach(@{$self->{answers}}){ + $_ = WebGUI::Asset::Wobject::Survey::AnswerJSON->new($_); + } + }else{ + $self->{answers} = []; + } + + $self->{variableName} = $self->{variableName} || ''; + $self->{text} = $self->{text} || ''; + $self->{parent} = $self->{parent} || $parent; + $self->{allowComment}; + $self->{commentCols}; + $self->{commentRows}; + $self->{randomizeAnswers}; + $self->{questionType}; + $self->{randomizedWords}; + $self->{verticalDisplay}; + $self->{required}; + $self->{maxAnswers}; + $self->{value}; + $self->{textInButton}; + $self->{terminal}; + $self->{terminalUrl}; + bless($self,$class); + return $self; +} + +sub update{ + my ($self,$ref) = @_; + #is a question + if(@{$$ref{ids}} == 1){ + while (my ($key,$value) = each %{$ref->{object}}){ + $self->{$key} = $value; + } + #is a new answer + }elsif($$ref{ids}->[2] eq 'NEW'){ + push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( $self,@{$self->{object}}) ); + #is updating a answer + }else{ + $self->{answers}->[$$ref{ids}->[2]]->update($ref); + } +} +sub getObject{ + my ($self,$address) = @_; + return $self->{answers}->[$address->[2]]; +} + +sub createTemp{ + my ($self,$ref) = @_; + return WebGUI::Asset::Wobject::Survey::AnswerJSON->new($self); +} + +sub remove{ + my ($self,$ref) = @_; + if(@$$ref{ids} <= 1){ + $self->{parent} = undef; + for my $answer(@{$self->{answers}}){ + $answer->remove(); + } + } + elsif(@$$ref{ids} == 2){ + $self->{answers}->[$$ref{ids}->[2]]->remove(); + splice(@{$self->{answers}},$$ref->{ids}->[2],1); + } +} + + +sub freeze{ + my $self = shift; + $self->{parent} = undef; + my %temp = %{$self}; + $temp{answers} = []; + foreach(@{$self->{answers}}){ + push(@{$temp{answers}},$_->freeze()); + } + return \%temp; +} +#address is the array of objects currently selected in the edit screen +#data is the array of hash items for displaying +sub getDragDropList{ + my ($self,$data,$address,$selected) = @_; + push(@$data, { "type","question","text",$self->{text} }); + if($selected){ + for (@{$self->{answers}}){ + $_->getDragDropList($data, $address); + } + } +} + +1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm new file mode 100644 index 000000000..af477298d --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm @@ -0,0 +1,126 @@ +package WebGUI::Asset::Wobject::Survey::SectionJSON; + +use strict; +use Data::Structure::Util qw/unbless/; +use WebGUI::Asset::Wobject::Survey::QuestionJSON; + +sub new{ + my $class = shift; + my $self = shift || {}; + my $parent = shift; + + if(defined $self->{questions}){ + foreach(@{$self->{questions}}){ + $_ = WebGUI::Asset::Wobject::Survey::QuestionJSON->new($_); + } + }else{ + $self->{questions} = []; + } + + $self->{text} = $self->{text} || ''; + $self->{title} = $self->{title} || ''; + $self->{parent} = $parent; + $self->{questionsPerPage} = $self->{questionsPerPage} || 5; + $self->{questionsOnSectionPage} = $self->{questionsOnSectionPage} || 1; + $self->{randomizeQuestions} = $self->{randomizeQuestions} || 0; + $self->{everyPageTitle} = $self->{everyPageTitle} || 1; + $self->{everyPageText} = $self->{everyPageText} || 1; + $self->{terminal} = $self->{terminal} || 0; + $self->{terminalUrl}; + $self->{goto}; + $self->{timeLimit}; + + bless($self,$class); + return $self; +} +sub getObject{ + my ($self,$address) = @_; + if(@$address == 1){ + return $self->{questions}->[$address->[1]]; + }else{ + return $self->{questions}->[$address->[1]]->getObject($address); + } +} +sub newQuestion{ + my $self = shift; + push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{questions}}) ); +} +sub remove{ + my ($self,$ref) = @_; + $self->{questions}->[$$ref{ids}->[1]]->remove($ref); + if(@$$ref{ids} == 0){ + for my $question(@{$self->{questions}}){ + $question->remove($ref); + } + $self->{parent} = undef; + } + if(@$$ref{ids} == 1){ + splice(@{$self->{questions}},$$ref->{ids}->[1],1); + } +} + +sub update{ + my ($self,$ref) = @_; + + #is a section + if(@{$$ref{ids}} == 0){ + while(my ($key,$value) = keys %{$ref->{object}}){ + $self->{$key} = $value; + } + #is a new question + }elsif($$ref{ids}->[1] eq 'NEW'){ + push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{object}}) ); + + #is updating a question or answer + }else{ + $self->{questions}->[$$ref{ids}->[1]]->update($ref); + } +} + +sub loadQuestion{ + my ($self,$questionHash) = @_; + push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{questions}},$questionHash) ); +} + +sub deleteQuestion{ + my $self = shift; + my $index = shift; + splice(@{$self->{questions}},$index,1) if defined $index; +} +#address is the array of objects currently selected in the edit screen +#data is the array of hash items for displaying +sub getDragDropList{ + my ($self,$data,$address,$selected) = @_; + push(@$data,{ "type","section","text",$self->{"title"} }); + if($selected){ + for(my $i=0; $i<=$#{$self->{questions}}; $i++){ + $self->{questions}->[$i]->getDragDropList($data, $address, $i == $address->[1]); + } + } +} +sub getQuestion{ + my $self = shift; + my $index = shift; + return $self->{questions}->[$index] if defined $index; +} + +sub freeze{ + my $self = shift; + $self->{parent} = undef; + my %temp = %{$self}; + $temp{questions} = []; + foreach(@{$self->{questions}}){ + push(@{$temp{questions}}, $_->freeze()); + } + return \%temp; +} + +sub createTemp{ + my ($self,$ref) = @_; + if(@{$$ref{ids}} > 1){ + return $self->{questions}->[$$ref{ids}->[1]]->createTemp($ref); + }else{ + return WebGUI::Asset::Wobject::Survey::QuestionJSON->new($self); + } +} +1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm new file mode 100644 index 000000000..34951e0c1 --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -0,0 +1,79 @@ +package WebGUI::Asset::Wobject::Survey::SurveyJSON; + +use strict; +use Data::Structure::Util qw/unbless/; +use WebGUI::Asset::Wobject::Survey::SectionJSON; + +sub new{ + my $class = shift; + my $self = shift || {}; + my $log = shift; + if(defined $self->{sections}){ + foreach(@{$self->{sections}}){ + $_ = WebGUI::Asset::Wobject::Survey::SectionJSON->new($_); + } + }else{ + $self->{sections} = []; + } + $self->{log} = $log; + bless($self,$class); + return $self; +} +#address is the array of objects currently selected in the edit screen +#data is the array of hash items for displaying +sub getDragDropList{ + my ($self,$address,$data) = @_; + for(my $i=0; $i<=$#{$self->{sections}}; $i++){ + $self->{sections}->[$i]->getDragDropList($data, $address, $i == $address->[0]); + } +} + +sub getObject{ + my ($self,$address) = @_; + if(@$address == 1){ + return $self->{sections}->[$address->[0]]; + }else{ + return $self->{sections}->[$address->[0]]->getObject($address); + } +} + +sub update{ + my ($self,$ref) = @_; + if(ref $$ref{ids} eq 'ARRAY' and $$ref{ids}->[0] ne 'NEW'){ + $self->{sections}->[$$ref{ids}->[0]]->update($ref); + }else{ + push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new($self,$ref->{object})); + } +} +#determine what to add and add it. +# ref should contain all the information for the new + +sub remove{ + my ($self,$ref) = @_; + $self->{sections}->[$$ref{ids}->[0]]->remove($ref); + if(@$$ref{ids} == 0){ + splice(@{$self->{sections}},$$ref->{ids}->[0],1); + } +} + +sub createTemp{ + my ($self,$ref) = @_;#ref{ids} contains the parent of the temp object which should be created and returned. + + if(ref $$ref{ids} eq 'ARRAY'){ + return $self->{sections}->[$$ref{ids}->[0]]->createTemp($ref); + }else{ + return WebGUI::Asset::Wobject::Survey::SectionJSON->new($self); + } +} + +sub freeze{ + my $self = shift; + my %temp = %{$self}; + $temp{sections} = []; + $temp{log} = undef; + foreach (@{$self->{sections}}){ + push(@{$temp{sections}},$_->freeze($self->{log})); + } + return \%temp; +} +1; diff --git a/www/extras/wobject/Survey/editsurvey/comm.js b/www/extras/wobject/Survey/editsurvey/comm.js index 6a86c6d2a..02d9849ff 100644 --- a/www/extras/wobject/Survey/editsurvey/comm.js +++ b/www/extras/wobject/Survey/editsurvey/comm.js @@ -7,7 +7,7 @@ Survey.Comm = new function(){ var request = function(sUrl,callback,postData){ if(callMade == 1){ - alert("Waiting on previous call"); + alert("Waiting on previous request"); }else{ callMade = 1; YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); @@ -16,6 +16,7 @@ Survey.Comm = new function(){ this.callback = { success:function(o){ callMade = 0; +console.log(o.responseText); Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); }, failure: function(o){ diff --git a/www/extras/wobject/Thingy/thingy.js b/www/extras/wobject/Thingy/thingy.js index 94b58ace7..bac67e925 100644 --- a/www/extras/wobject/Thingy/thingy.js +++ b/www/extras/wobject/Thingy/thingy.js @@ -531,4 +531,4 @@ YAHOO.extend(YAHOO.draglist.DDList, YAHOO.util.DDProxy, { Event.onDOMReady(YAHOO.draglist.DDApp.init, YAHOO.draglist.DDApp, true); -})(); \ No newline at end of file +})(); diff --git a/www/extras/wobject/editsurvey.js b/www/extras/wobject/editsurvey.js index 788ef12e5..16e8aafc3 100644 --- a/www/extras/wobject/editsurvey.js +++ b/www/extras/wobject/editsurvey.js @@ -4,7 +4,7 @@ if (typeof Survey == "undefined") { Survey.Data = new function(){ var lastDataSet = {}; - var focus; + var address; this.dragDrop = function(did){ @@ -45,7 +45,7 @@ Survey.Data = new function(){ this.loadData = function(d){ - focus = d.focus;//What is the current highlighted item. + address = d.address;//What is the current highlighted item. var lastType = '';//What was the last type created. var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down @@ -81,13 +81,13 @@ Survey.Data = new function(){ acount = 1; qcount = 1; } - else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ + else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == address){ this.addQuestionButton(lastId['section']); buttons['question'] = 1; acount = 1; qcount = 1; } - else if(d.data[x].type != 'answer' && lastType == 'question' && lastId['section'] + '||||'+ lastId['question'] == focus){ + else if(d.data[x].type != 'answer' && lastType == 'question' && lastId['section'] + '||||'+ lastId['question'] == address){ this.addAnswerButton(lastId['section'],lastId['question']); buttons['answer']=1; acount = 1; @@ -95,12 +95,12 @@ Survey.Data = new function(){ } var node = document.createElement('li'); - if(focus != undefined && focus.indexOf(d.data[x].id) > -1){ + if(address != undefined && address.indexOf(d.data[x].id) > -1){ node.className = "s"+d.data[x].type; }else{ node.className = d.data[x].type; } - if(d.data[x].text == undefined){//== 'null'){ + if(d.data[x].text == undefined){ d.data[x].text = ''; } var id = ''; @@ -108,17 +108,20 @@ Survey.Data = new function(){ var pre; if(d.data[x].type == 'section'){ pre = 'S'+ scount++ +':'; - id = d.data[x].id; + //id = d.data[x].id; + id = scount-1; } else if(d.data[x].type == 'question'){ - pre = 'Q'+ qcount++ +':'; - id = lastId['section'] + delim + d.data[x].id; + pre = 'Q'+ qcount++ + ':'; + id = scount-1 +"-"+qcount-1; + //id = lastId['section'] + delim + d.data[x].id; } else if(d.data[x].type == 'answer'){ if(d.data[x].recordedAnswers != null){ } pre = 'A'+ acount++ +':'; - id = lastId['section'] + delim + lastId['question'] + delim + d.data[x].id; + id = scount-1 +"-"+qcount-1+"-"+acount-1; + //id = lastId['section'] + delim + lastId['question'] + delim + d.data[x].id; } node.innerHTML = pre + ' ' + d.data[x].text; node.id = id; @@ -127,7 +130,8 @@ Survey.Data = new function(){ YAHOO.util.Event.addListener(id, "click", this.clicked); lastType = d.data[x].type; - lastId[d.data[x].type] = d.data[x].id; + //lastId[d.data[x].type] = d.data[x].id; + lastId[d.data[x].type] = id; } if(lastType == 'answer' && ! buttons['answer']){ this.addAnswerButton(lastId['section'],lastId['question']); diff --git a/www/extras/wobject/editsurvey/comm.js b/www/extras/wobject/editsurvey/comm.js index 76f19cfcd..9f6aa9ecf 100644 --- a/www/extras/wobject/editsurvey/comm.js +++ b/www/extras/wobject/editsurvey/comm.js @@ -9,6 +9,8 @@ Survey.Comm = new function(){ } this.callback = { success:function(o){ +alert('here'); +this.logger('hi'); Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); }, failure: function(o){ From e81accaa1554d70edc115cd981ce1a17c636ce8f Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Wed, 24 Sep 2008 15:29:51 +0000 Subject: [PATCH 31/64] Really dont use this copy --- lib/WebGUI/Asset/Wobject/Survey.pm | 26 ++++++++++++------- .../Asset/Wobject/Survey/SectionJSON.pm | 5 ++-- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 19 +++++++++++--- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 855173ec4..b982d0d45 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -164,7 +164,7 @@ sub loadSurveyJSON{ my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); use Data::Dumper; -$self->session->errorHandler->error("LOADING".Dumper $jsonHash); +$self->session->errorHandler->error("LOADING\n".Dumper $jsonHash."\n\n"); my $hashRef = {}; $hashRef = decode_json($jsonHash) if defined $jsonHash; @@ -181,13 +181,21 @@ Saves the survey collateral to the DB sub saveSurveyJSON{ my $self = shift; - $self->{_data}->{log} = $self->session->errorHandler; +# $self->{_data}->{log} = $self->session->errorHandler; + my $data = $self->{_data}->freeze(); use Data::Dumper; -$self->session->errorHandler->error("SAVING".Dumper $data); - - $data = encode_json($data); +$self->session->errorHandler->error(Dumper $data); +$self->session->errorHandler->error("Log defined:".defined $data->{log}); + + eval{ +$self->session->errorHandler->error(join(',',keys %{$data})); + $data = encode_json($data); + }; + if($@){ + $self->session->errorHandler->error("Could not encode Survey object".$@); + } $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -373,19 +381,19 @@ sub www_loadSurvey{ my ($self,$options) = @_; $self->loadSurveyJSON(); -$self->session->errorHandler->error("The object isa ".Dumper $self->{_data}); +$self->session->errorHandler->error("The object isa\n".Dumper $self->{_data}); my $address = $options->{address} ? defined $options : [0]; my $message = $options->{message} ? defined $options : ''; my $object = $options->{object} ? defined $options : $self->{_data}->getObject($address); -$self->session->errorHandler->error("The object isa ".Dumper $object); +$self->session->errorHandler->error("The object isa\n".Dumper $object); $object = $object->freeze();#just want the hashref $self->session->errorHandler->error(1); my @data; - @data = $self->{_data}->getDragDropList($address,\@data); -$self->session->errorHandler->error(2); + $self->{_data}->getDragDropList($address,\@data,$self->session->errorHandler); +$self->session->errorHandler->error("In Survey".Dumper @data); my $return = {"address",$address,"data",\@data,"object",$object}; $self->session->errorHandler->warn(encode_json($return)); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm index af477298d..ab9125553 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm @@ -18,7 +18,7 @@ sub new{ } $self->{text} = $self->{text} || ''; - $self->{title} = $self->{title} || ''; + $self->{title} = $self->{title} || 'New Section'; $self->{parent} = $parent; $self->{questionsPerPage} = $self->{questionsPerPage} || 5; $self->{questionsOnSectionPage} = $self->{questionsOnSectionPage} || 1; @@ -106,8 +106,9 @@ sub getQuestion{ sub freeze{ my $self = shift; - $self->{parent} = undef; + my %temp = %{$self}; + $temp{parent} = undef; $temp{questions} = []; foreach(@{$self->{questions}}){ push(@{$temp{questions}}, $_->freeze()); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 34951e0c1..06baa382c 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -3,6 +3,7 @@ package WebGUI::Asset::Wobject::Survey::SurveyJSON; use strict; use Data::Structure::Util qw/unbless/; use WebGUI::Asset::Wobject::Survey::SectionJSON; +use Data::Dumper; sub new{ my $class = shift; @@ -19,12 +20,23 @@ sub new{ bless($self,$class); return $self; } +sub log{ + my ($self,$message) = @_; + if(defined $self->{log}){ + $self->{log}->error($message); + } +} #address is the array of objects currently selected in the edit screen #data is the array of hash items for displaying sub getDragDropList{ - my ($self,$address,$data) = @_; + my $self = shift; + my $address = shift; + my $data = shift; + $self->{log} = shift; for(my $i=0; $i<=$#{$self->{sections}}; $i++){ + $self->log("Survey passing ".Dumper $data);#,$address,$i, $$address[0]"); $self->{sections}->[$i]->getDragDropList($data, $address, $i == $address->[0]); + $self->log("Survey passing ".Dumper $data);#,$address,$i, $$address[0]"); } } @@ -70,9 +82,10 @@ sub freeze{ my $self = shift; my %temp = %{$self}; $temp{sections} = []; - $temp{log} = undef; + $temp{PPPPPPPOOOOOOOOOOOOOOOOPPPPPPPPPPPP} = 1; + delete $temp{log}; foreach (@{$self->{sections}}){ - push(@{$temp{sections}},$_->freeze($self->{log})); +# push(@{$temp{sections}},$_->freeze()); } return \%temp; } From 38c7ee33c4c93faf9899c9d696c90809b2531d63 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 25 Sep 2008 02:09:22 +0000 Subject: [PATCH 32/64] Moving edit screens to be template based for i18n (almost done with editor. --- lib/WebGUI/Asset/Wobject/Survey.pm | 105 ++++++++++- lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm | 5 +- .../Asset/Wobject/Survey/QuestionJSON.pm | 5 +- .../Asset/Wobject/Survey/SectionJSON.pm | 3 +- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 9 +- www/extras/wobject/Survey/editsurvey.js | 165 ++++-------------- www/extras/wobject/Survey/editsurvey/comm.js | 1 - .../wobject/Survey/editsurvey/section.js | 2 +- 8 files changed, 142 insertions(+), 153 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index b982d0d45..14d6f4f92 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -169,6 +169,7 @@ $self->session->errorHandler->error("LOADING\n".Dumper $jsonHash."\n\n"); $hashRef = decode_json($jsonHash) if defined $jsonHash; $self->{_data} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($hashRef);#,$self->session->errorHandler); + } #------------------------------------------------------------------- @@ -181,13 +182,20 @@ Saves the survey collateral to the DB sub saveSurveyJSON{ my $self = shift; -# $self->{_data}->{log} = $self->session->errorHandler; - - my $data = $self->{_data}->freeze(); + $self->{_data}->{log} = $self->session->errorHandler; + my $data; +$self->session->errorHandler->error("Calling Freeze"); +$self->session->errorHandler->error("data type = ".ref $self->{_data}); +eval{ + $data = $self->{_data}->freeze(); +}; +$self->session->errorHandler->error("Freeze error".$@); +$self->session->errorHandler->error("data type = ".ref $data); + use Data::Dumper; -$self->session->errorHandler->error(Dumper $data); $self->session->errorHandler->error("Log defined:".defined $data->{log}); +#$self->session->errorHandler->error(Dumper $data); eval{ $self->session->errorHandler->error(join(',',keys %{$data})); @@ -392,11 +400,94 @@ $self->session->errorHandler->error("The object isa\n".Dumper $object); $self->session->errorHandler->error(1); my @data; + my %buttons; $self->{_data}->getDragDropList($address,\@data,$self->session->errorHandler); -$self->session->errorHandler->error("In Survey".Dumper @data); + my $html; + my ($scount,$qcount,$acount) = (0,0,0); + my $lastType; + my %lastId; + my @ids; + my ($s,$q,$a) = (0,0,0);#bools on if a button has already been created - my $return = {"address",$address,"data",\@data,"object",$object}; - $self->session->errorHandler->warn(encode_json($return)); + foreach (@data){ + if($_->{type} eq 'section'){ + if($lastType eq 'answer'){ + $html .= "
          "; + $buttons{answer} = "$lastId{section}-$lastId{question}"; + $a = 1; + } + elsif($lastType eq 'question'){ + $html .= "
          "; + $buttons{'question'} = "$lastId{section}-$lastId{question}"; + $q = 1; + } + $html .= "

        • S". ($scount + 1). ": $_->{text}<\/li>
          \n"; + push(@ids,$scount); + $lastId{section} = $scount++; + $lastType = 'section'; + } + elsif($_->{type} eq 'question'){ + if($lastType eq 'answer'){ + $html .= "
          "; + $buttons{answer} = "$lastId{section}-$lastId{question}"; + $a = 1; + } + $html .= "
        • Q". ($qcount + 1). ": $_->{text}<\/li>
          \n"; + push(@ids,$qcount); + $lastId{question} = $qcount++; + $lastType = 'question'; + } + elsif($_->{type} eq 'answer'){ + $html .= "
        • A". ($acount + 1). ": $_->{text}<\/li>
          \n"; + push(@ids,$acount); + $lastId{answer} = $acount++; + $lastType = 'answer'; + } + } + if($lastType eq 'answer'){ + if(!$a){ + $html .= "
          "; + $buttons{'answer'} = "$lastId{section}-$lastId{question}"; + } + if(!$b){ + $html .= "
          "; + $buttons{'question'} = "$lastId{section}-$lastId{question}"; + } + if(!$s){ + $html .= "
          "; + $buttons{'section'} = "$lastId{section}"; + } + } + elsif($lastType eq 'question'){ + if(!$b){ + $html .= "
          "; + $buttons{'question'} = "$lastId{section}-$lastId{question}"; + } + if(!$s){ + $html .= "
          "; + $buttons{'section'} = "$lastId{section}"; + } + } + elsif($lastType eq 'section'){ + if(!$b){ + $html .= "
          "; + $buttons{'question'} = "$lastId{section}-$lastId{question}"; + } + if(!$s){ + $html .= "
          "; + $buttons{'section'} = "$lastId{section}"; + } + } + #my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate}); +$self->session->errorHandler->error($html); + + #address is the address of the focused object + #buttons are the data to create the Add buttons + #object is the data to create the edited object + #ddhtml is the html to create the draggable html divs + #ids is a list of all ids passed in which are draggable (for adding events) + my $return = {"address",$address,"buttons",\%buttons,"object",$object,"ddhtml",$html,"ids",\@ids}; + $self->session->errorHandler->error(encode_json($return)); $self->session->errorHandler->error(3); return encode_json($return); } diff --git a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm index 5f870388d..5f00b4b0f 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm @@ -5,8 +5,8 @@ use Data::Structure::Util qw/unbless/; sub new{ my $class = shift; - my $parent = shift; my $self = shift || {}; + my $parent = shift; $self->{answers} = $self->{answers} || []; $self->{text}; $self->{index}; @@ -24,6 +24,7 @@ sub new{ $self->{value}; $self->{terminal}; $self->{terminalUrl}; + $self->{type} = 'answer'; bless($self,$class); return $self; } @@ -50,6 +51,6 @@ sub freeze{ #data is the array of hash items for displaying sub getDragDropList{ my ($self,$data,$address,$selected) = @_; - push(@$data, { "type","answer","text",$self->{"text"}, "recorded", $self->{'recordedAnswer'} }); + push(@$data, { "type",$self->{type},"text",$self->{"text"}, "recorded", $self->{'recordedAnswer'} }); } 1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm index 9e73e170c..c3e8ddb8a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm @@ -32,6 +32,7 @@ sub new{ $self->{textInButton}; $self->{terminal}; $self->{terminalUrl}; + $self->{type} = 'question'; bless($self,$class); return $self; } @@ -45,7 +46,7 @@ sub update{ } #is a new answer }elsif($$ref{ids}->[2] eq 'NEW'){ - push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( $self,@{$self->{object}}) ); + push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( @{$self->{object}}) ); #is updating a answer }else{ $self->{answers}->[$$ref{ids}->[2]]->update($ref); @@ -90,7 +91,7 @@ sub freeze{ #data is the array of hash items for displaying sub getDragDropList{ my ($self,$data,$address,$selected) = @_; - push(@$data, { "type","question","text",$self->{text} }); + push(@$data, { "type",$self->{type},"text",$self->{text} }); if($selected){ for (@{$self->{answers}}){ $_->getDragDropList($data, $address); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm index ab9125553..8fa4d4a4a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm @@ -29,6 +29,7 @@ sub new{ $self->{terminalUrl}; $self->{goto}; $self->{timeLimit}; + $self->{type} = 'section'; bless($self,$class); return $self; @@ -91,7 +92,7 @@ sub deleteQuestion{ #data is the array of hash items for displaying sub getDragDropList{ my ($self,$data,$address,$selected) = @_; - push(@$data,{ "type","section","text",$self->{"title"} }); + push(@$data,{ "type",$self->{type},"text",$self->{"title"} }); if($selected){ for(my $i=0; $i<=$#{$self->{questions}}; $i++){ $self->{questions}->[$i]->getDragDropList($data, $address, $i == $address->[1]); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 06baa382c..37091d45e 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -54,7 +54,7 @@ sub update{ if(ref $$ref{ids} eq 'ARRAY' and $$ref{ids}->[0] ne 'NEW'){ $self->{sections}->[$$ref{ids}->[0]]->update($ref); }else{ - push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new($self,$ref->{object})); + push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new($ref->{object})); } } #determine what to add and add it. @@ -77,16 +77,15 @@ sub createTemp{ return WebGUI::Asset::Wobject::Survey::SectionJSON->new($self); } } - sub freeze{ - my $self = shift; + my ($self) = @_; my %temp = %{$self}; $temp{sections} = []; - $temp{PPPPPPPOOOOOOOOOOOOOOOOPPPPPPPPPPPP} = 1; delete $temp{log}; foreach (@{$self->{sections}}){ -# push(@{$temp{sections}},$_->freeze()); + push(@{$temp{sections}},$_->freeze()); } +$self->{log}->error(Dumper %temp); return \%temp; } 1; diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js index 788ef12e5..f306176a2 100644 --- a/www/extras/wobject/Survey/editsurvey.js +++ b/www/extras/wobject/Survey/editsurvey.js @@ -45,108 +45,32 @@ Survey.Data = new function(){ this.loadData = function(d){ - focus = d.focus;//What is the current highlighted item. - var lastType = '';//What was the last type created. - var lastId = {'section': '', 'question': '', 'answer': ''};//what is the last id of each type placed, so we know a child's parent. - var buttons = {'question':0,'answer':0,'section':0}; //array of bools on if buttons put down - document.getElementById('sections').innerHTML=''; - var scount = 1; - var qcount = 1; - var acount = 1; - for(var x in d.data){ - //Now check to see if this is where an add button goes. - //Add addAnswer when we go from answer to question or section or end - //Add addQuestion when we go from question to section or end - - if(lastType == 'answer' && d.data[x].type == 'question'){ - this.addAnswerButton(lastId['section'],lastId['question']); - buttons['answer'] = 1; - acount = 1; - } - else if(lastType == 'answer' && d.data[x].type == 'section'){ - this.addAnswerButton(lastId['section'],lastId['question']); - buttons['answer'] = 1; - this.addQuestionButton(lastId['section']); - buttons['question'] = 1; - acount = 1; - qcount = 1; - } - else if(lastType == 'question' && d.data[x].type == 'section'){ - if(!buttons['answer']){ - this.addAnswerButton(lastId['section'],lastId['question']); - buttons['answer']=1; - } - this.addQuestionButton(lastId['section']); - buttons['question'] = 1; - acount = 1; - qcount = 1; - } - else if(d.data[x].type == 'section' && lastType == 'section' && lastId['section'] == focus){ - this.addQuestionButton(lastId['section']); - buttons['question'] = 1; - acount = 1; - qcount = 1; - } - else if(d.data[x].type != 'answer' && lastType == 'question' && lastId['section'] + '||||'+ lastId['question'] == focus){ - this.addAnswerButton(lastId['section'],lastId['question']); - buttons['answer']=1; - acount = 1; - qcount = 1; - } - - var node = document.createElement('li'); - if(focus != undefined && focus.indexOf(d.data[x].id) > -1){ - node.className = "s"+d.data[x].type; - }else{ - node.className = d.data[x].type; - } - if(d.data[x].text == undefined){//== 'null'){ - d.data[x].text = ''; - } - var id = ''; - var delim = "||||"; - var pre; - if(d.data[x].type == 'section'){ - pre = 'S'+ scount++ +':'; - id = d.data[x].id; - } - else if(d.data[x].type == 'question'){ - pre = 'Q'+ qcount++ +':'; - id = lastId['section'] + delim + d.data[x].id; - } - else if(d.data[x].type == 'answer'){ - if(d.data[x].recordedAnswers != null){ - } - pre = 'A'+ acount++ +':'; - id = lastId['section'] + delim + lastId['question'] + delim + d.data[x].id; - } - node.innerHTML = pre + ' ' + d.data[x].text; - node.id = id; - new Survey.DDList(node.id,"sections"); - document.getElementById('sections').appendChild(node); - YAHOO.util.Event.addListener(id, "click", this.clicked); - - lastType = d.data[x].type; - lastId[d.data[x].type] = d.data[x].id; - } - if(lastType == 'answer' && ! buttons['answer']){ - this.addAnswerButton(lastId['section'],lastId['question']); - this.addQuestionButton(lastId['section']); - } - if(lastType == 'question' && ! buttons['question']){ - this.addAnswerButton(lastId['section'],lastId['question']); - } - if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ - this.addQuestionButton(lastId['section']); - } - - this.addSectionButton(); + focus = d.address;//What is the current highlighted item. + document.getElementById('sections').innerHTML=d.ddhtml; - this.loadObjectEdit(d.edit); + //add event handlers for if a tag is clicked + for(var x in d.ids){ + YAHOO.util.Event.addListener(d.ids[x], "click", this.clicked); + } + + //add the add object buttons + if(d.buttons['section']){ + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); + button.on("click", this.addSection); + } + if(d.buttons['question']){ + var button = new YAHOO.widget.Button({ label:"Add Question", id:"addquestion", container:"newQuestion" }); + button.on("click", this.addQuestion,d.buttons['question']); + } + if(d.buttons['answer']){ + var button = new YAHOO.widget.Button({ label:"Add Answer", id:"addanswer", container:"newAnswer" }); + button.on("click", this.addQuestion,d.buttons['answer']); + } + + this.loadObjectEdit(d.object); lastDataSet = d; } - this.addSection = function(){ Survey.Comm.newSection(); } @@ -160,46 +84,19 @@ Survey.Data = new function(){ Survey.Comm.newAnswer(ids[0],ids[1]); } - - this.addSectionButton = function(){ - var node = document.createElement('li'); - node.innerHTML = ""; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); - button.on("click", this.addSection); - } - - - this.addQuestionButton = function(sid){ - var node = document.createElement('li'); - node.className = 'newQuestion'; - node.innerHTML = ""; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Question", id:'addquestion', container:"newQuestion"});//, onclick:{fn:this.addQuestion} }); - button.on("click", this.addQuestion,sid); - } - - - this.addAnswerButton = function(sid,qid){ - var node = document.createElement('li'); - node.id = 'newAnswer'; - node.className = 'newAnswer'; - document.getElementById('sections').appendChild(node); - var button = new YAHOO.widget.Button({ label:"Add Answer", id:'addanswer', container:"newAnswer" }); - button.on("click", this.addAnswer,[sid,qid]); - } - - this.loadObjectEdit = function(edit){ if(edit){ - if(edit.type == "loadSection"){ - Survey.SectionTemplate.loadSection(edit.params); + if(edit.type == "section"){ +console.log('made it here section'); + Survey.SectionTemplate.loadSection(edit); } - else if(edit.type == "loadQuestion"){ - Survey.QuestionTemplate.loadQuestion(edit.params); + else if(edit.type == "question"){ +console.log('made it here question'); + Survey.QuestionTemplate.loadQuestion(edit); } - else if(edit.type == "loadAnswer"){ - Survey.AnswerTemplate.loadAnswer(edit.params); + else if(edit.type == "answer"){ +console.log('made it here answer'); + Survey.AnswerTemplate.loadAnswer(edit); } } } diff --git a/www/extras/wobject/Survey/editsurvey/comm.js b/www/extras/wobject/Survey/editsurvey/comm.js index 02d9849ff..5fd5c677b 100644 --- a/www/extras/wobject/Survey/editsurvey/comm.js +++ b/www/extras/wobject/Survey/editsurvey/comm.js @@ -16,7 +16,6 @@ Survey.Comm = new function(){ this.callback = { success:function(o){ callMade = 0; -console.log(o.responseText); Survey.Data.loadData(YAHOO.lang.JSON.parse(o.responseText)); }, failure: function(o){ diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js index 837758b02..4736976cb 100644 --- a/www/extras/wobject/Survey/editsurvey/section.js +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -58,7 +58,7 @@ Survey.SectionTemplate = new function(){ "; html = html + "

          Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); html = html + "

          Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); - html = html + "

          Terminal section: " + this.makeRadio('terminal',[{text:'Yes',value:1},{text:'No',value:0}],params.terminal); + html = html + "

          Terminal section: " + this.makeRadio('terminal',[{text:'Yes',value:1},{text:'No',value:0}],params.terminal); html = html + "

          Terminal section URL: "; document.getElementById('edit').innerHTML = html; From 5174824b5f4c2252831aae98c89fad88702a8108 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 26 Sep 2008 02:06:21 +0000 Subject: [PATCH 33/64] Finishing up editor --- lib/WebGUI/Asset/Wobject/Survey.pm | 105 ++++++++++-------- lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm | 42 +++---- .../Asset/Wobject/Survey/QuestionJSON.pm | 53 +++++---- .../Asset/Wobject/Survey/SectionJSON.pm | 87 ++++++++++----- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 37 +++--- www/extras/wobject/Survey/editsurvey.js | 17 +-- .../wobject/Survey/editsurvey/section.js | 75 +------------ 7 files changed, 196 insertions(+), 220 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 14d6f4f92..b90ebe829 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -100,6 +100,13 @@ sub definition { defaultValue => 'CxMpE_UPauZA3p8jdrOABw', namespace => 'Survey/Take', }, + sectionEditTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Section Edit Tempalte", + defaultValue => '1oBRscNIcFOI-pETrCOspA', + namespace => 'Survey/Edit', + }, ); push(@{$definition}, { @@ -144,7 +151,10 @@ sub processPropertiesFromFormPost { $self->loadSurveyJSON(); if($#{$self->{_data}->{sections}} < 0){ - $self->{_data}->update({ids=>['NEW'],object=>{}}); +$self->session->errorHandler->error("In Processing from Post\n"); + $self->{_data}->update(['NEW'],undef,$self->session->errorHandler); + +$self->session->errorHandler->error("Processing from creation\n".Dumper $self->{_data}); } $self->saveSurveyJSON(); } @@ -163,12 +173,11 @@ sub loadSurveyJSON{ if(defined $self->{_data}){return;}#already loaded my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); -use Data::Dumper; -$self->session->errorHandler->error("LOADING\n".Dumper $jsonHash."\n\n"); +#$self->session->errorHandler->error("LOADING\n".Dumper $jsonHash."\n\n"); my $hashRef = {}; $hashRef = decode_json($jsonHash) if defined $jsonHash; - $self->{_data} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($hashRef);#,$self->session->errorHandler); + $self->{_data} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($hashRef,$self->session->errorHandler); } @@ -184,26 +193,10 @@ sub saveSurveyJSON{ my $self = shift; $self->{_data}->{log} = $self->session->errorHandler; my $data; -$self->session->errorHandler->error("Calling Freeze"); -$self->session->errorHandler->error("data type = ".ref $self->{_data}); -eval{ $data = $self->{_data}->freeze(); -}; -$self->session->errorHandler->error("Freeze error".$@); -$self->session->errorHandler->error("data type = ".ref $data); - - -use Data::Dumper; -$self->session->errorHandler->error("Log defined:".defined $data->{log}); -#$self->session->errorHandler->error(Dumper $data); - - eval{ -$self->session->errorHandler->error(join(',',keys %{$data})); - $data = encode_json($data); - }; - if($@){ - $self->session->errorHandler->error("Could not encode Survey object".$@); - } +$self->session->errorHandler->error("----------------SAving THIS DATA".Dumper $data); + $data = encode_json($data); + $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -225,39 +218,51 @@ sub www_editSurvey { return $out; } + #------------------------------------------------------------------- -sub www_submitEditObject{ +sub www_submitObjectEdit{ my $self = shift; +$self->session->errorHandler->error("Submit Edit Object"); - my $ref = @{decode_json($self->session->form->process("data"))}; - +# my $ref = @{decode_json($self->session->form->process("data"))}; + my $responses = $self->session->form->paramsHashRef(); + my @address = split/-/,$responses->{id}; +#$self->session->errorHandler->error("Submit Edit Object".Dumper $responses); $self->loadSurveyJSON(); + if($responses->{delete}){ +$self->session->errorHandler->error("Deleting ".join(',',@address)); + return $self->deleteObject(\@address); + } +$self->session->errorHandler->error("Updating ".join(',',@address)."Which has $$responses{terminalUrl} as the tu"); + #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + my $message = $self->{_data}->update(\@address,$responses,$self->session->errorHandler); - my $message = $self->{_data}->update($ref);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. +# $self->saveSurveyJSON(); +# return $self->www_loadSurvey({address => $ref->{ids},message=>$message}); $self->saveSurveyJSON(); - - return $self->www_loadSurvey({address => $ref->{ids},message=>$message}); + return $self->www_loadSurvey(); } #------------------------------------------------------------------- -sub www_deleteObject{ - my $self = shift; - - my $ref = @{decode_json($self->session->form->process("data"))}; +sub deleteObject{ + my ($self,$address) = @_; $self->loadSurveyJSON(); - my $message = $self->{_data}->remove($ref);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + my $message = $self->{_data}->remove($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. $self->saveSurveyJSON(); #The last address in ideas is to a deleted object so that should not be returned. - pop(@{$ref->{ids}}); + pop(@{$address}); - return $self->www_loadSurvey({address => $ref->{ids}, message=>$message}); + return $self->www_loadSurvey({address => $address, message=>$message}); } + + +#------------------------------------------------------------------- sub www_newObject{ my $self = shift; my $ref; @@ -388,16 +393,24 @@ sub www_dragDrop{ sub www_loadSurvey{ my ($self,$options) = @_; +$self->session->errorHandler->error("Entering loadSurvey"); $self->loadSurveyJSON(); -$self->session->errorHandler->error("The object isa\n".Dumper $self->{_data}); +$self->session->errorHandler->error("Loaded JSON"); my $address = $options->{address} ? defined $options : [0]; my $message = $options->{message} ? defined $options : ''; - my $object = $options->{object} ? defined $options : $self->{_data}->getObject($address); -$self->session->errorHandler->error("The object isa\n".Dumper $object); - $object = $object->freeze();#just want the hashref + my $var = $options->{var} ? defined $options : $self->{_data}->getEditVars($address); +$self->session->errorHandler->error("Loaded beginning params"); + my $editHtml; + if($var->{type} eq 'section'){ + $var->{id} = join('-',@$address); + $var->{displayed_id} = $address->[$#$address]; + if($var->{displayed_id} ne 'NEW'){$var->{displayed_id}++;} -$self->session->errorHandler->error(1); + $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); + } + +$self->session->errorHandler->error(Dumper $var); my @data; my %buttons; @@ -478,17 +491,17 @@ $self->session->errorHandler->error(1); $buttons{'section'} = "$lastId{section}"; } } - #my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate}); -$self->session->errorHandler->error($html); +#$self->session->errorHandler->error($html); #address is the address of the focused object #buttons are the data to create the Add buttons - #object is the data to create the edited object + #edithtml is the html edit the object #ddhtml is the html to create the draggable html divs #ids is a list of all ids passed in which are draggable (for adding events) - my $return = {"address",$address,"buttons",\%buttons,"object",$object,"ddhtml",$html,"ids",\@ids}; + #type is the object type + my $return = {"address",$address,"buttons",\%buttons,"edithtml",$editHtml,"ddhtml",$html,"ids",\@ids,"type",$var->{type}}; $self->session->errorHandler->error(encode_json($return)); -$self->session->errorHandler->error(3); +$self->session->errorHandler->error("Returning from loadSurvey"); return encode_json($return); } diff --git a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm index 5f00b4b0f..4029c1e12 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm @@ -6,25 +6,30 @@ use Data::Structure::Util qw/unbless/; sub new{ my $class = shift; my $self = shift || {}; - my $parent = shift; + my $posts = shift; $self->{answers} = $self->{answers} || []; - $self->{text}; - $self->{index}; - $self->{parentIndex}; - $self->{parent} = $parent; - $self->{verbatim}; - $self->{textCols}; - $self->{textRows}; - $self->{gotoQuestion}; - $self->{recordedAnswer}; - $self->{isCorrect}; - $self->{min}; - $self->{max}; - $self->{step}; - $self->{value}; - $self->{terminal}; - $self->{terminalUrl}; + $self->{text} = $self->{text} || ''; + $self->{verbatim} = $self->{verbatim} || ''; + $self->{textCols} = $self->{textCols} || 10; + $self->{textRows} = $self->{textRows} || 5; + $self->{gotoQuestion} = $self->{gotoQuestion} || ''; + $self->{recordedAnswer} = $self->{recordedAnswer} || ''; + $self->{isCorrect} = $self->{isCorrect} || 1; + $self->{min} = $self->{min} || 1; + $self->{max} = $self->{max} || 10; + $self->{step} = $self->{step} || 1; + $self->{value} = $self->{value} || 1; + $self->{terminal} = $self->{terminal} || 0; + $self->{terminalUrl} = $self->{terminalUrl} || ''; $self->{type} = 'answer'; + + if(defined $posts and ref $posts eq 'HASH'){ + while(my ($key,$value) = each %$posts){ + if(defined $self->{$key}){ + $self->{$key} = $value; + } + } + } bless($self,$class); return $self; } @@ -37,12 +42,11 @@ sub update{ } sub remove{ my $self = shift; - $self->{parent} = undef; } sub freeze{ my $self = shift; my %temp = %{$self}; - $temp{parent} = undef; +# $temp{parent} = undef; # unbless $self; return \%temp; } diff --git a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm index c3e8ddb8a..949ffcc56 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm @@ -6,7 +6,7 @@ use Data::Structure::Util qw/unbless/; sub new{ my $class = shift; my $self = shift || {}; - my $parent = shift; + my $posts = shift; if(defined $self->{answers}){ foreach(@{$self->{answers}}){ @@ -18,21 +18,29 @@ sub new{ $self->{variableName} = $self->{variableName} || ''; $self->{text} = $self->{text} || ''; - $self->{parent} = $self->{parent} || $parent; - $self->{allowComment}; - $self->{commentCols}; - $self->{commentRows}; - $self->{randomizeAnswers}; - $self->{questionType}; - $self->{randomizedWords}; - $self->{verticalDisplay}; - $self->{required}; - $self->{maxAnswers}; - $self->{value}; - $self->{textInButton}; - $self->{terminal}; - $self->{terminalUrl}; + $self->{allowComment} = $self->{allowComment} || 0; + $self->{commentCols} = $self->{commentCols} || 10; + $self->{commentRows} = $self->{commentRows} || 5; + $self->{randomizeAnswers} = $self->{randomizeAnswers} || 0; + $self->{questionType} = $self->{questionType} || ''; + $self->{randomizedWords} = $self->{randomizedWords} || ''; + $self->{verticalDisplay} = $self->{verticalDisplay} || 0; + $self->{required} = $self->{required} || 0; + $self->{maxAnswers} = $self->{maxAnswers} || 1; + $self->{value} = $self->{value} || 1; + $self->{textInButton} = $self->{textInButton} || 0; + $self->{terminal} = $self->{terminal} || 0; + $self->{terminalUrl} = $self->{terminalUrl} || ''; $self->{type} = 'question'; + + if(defined $posts and ref $posts eq 'HASH'){ + while(my ($key,$value) = each %$posts){ + if(defined $self->{$key}){ + $self->{$key} = $value; + } + } + } + bless($self,$class); return $self; } @@ -46,7 +54,7 @@ sub update{ } #is a new answer }elsif($$ref{ids}->[2] eq 'NEW'){ - push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( @{$self->{object}}) ); + push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( {},$ref) ); #is updating a answer }else{ $self->{answers}->[$$ref{ids}->[2]]->update($ref); @@ -63,17 +71,8 @@ sub createTemp{ } sub remove{ - my ($self,$ref) = @_; - if(@$$ref{ids} <= 1){ - $self->{parent} = undef; - for my $answer(@{$self->{answers}}){ - $answer->remove(); - } - } - elsif(@$$ref{ids} == 2){ - $self->{answers}->[$$ref{ids}->[2]]->remove(); - splice(@{$self->{answers}},$$ref->{ids}->[2],1); - } + my ($self,$address) = @_; + splice(@{$self->{answers}},$$address[2],1); } diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm index 8fa4d4a4a..fcb6c72fb 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm @@ -4,11 +4,13 @@ use strict; use Data::Structure::Util qw/unbless/; use WebGUI::Asset::Wobject::Survey::QuestionJSON; +use Data::Dumper; + sub new{ my $class = shift; my $self = shift || {}; - my $parent = shift; - + my $postInfo = shift; + my $log = shift; if(defined $self->{questions}){ foreach(@{$self->{questions}}){ $_ = WebGUI::Asset::Wobject::Survey::QuestionJSON->new($_); @@ -16,65 +18,88 @@ sub new{ }else{ $self->{questions} = []; } - + $self->{log} = $log if defined $log; $self->{text} = $self->{text} || ''; $self->{title} = $self->{title} || 'New Section'; - $self->{parent} = $parent; + $self->{variable} = $self->{variable} || ''; $self->{questionsPerPage} = $self->{questionsPerPage} || 5; - $self->{questionsOnSectionPage} = $self->{questionsOnSectionPage} || 1; + $self->{questionsOnSectionPage} = defined $self->{questionsOnSectionPage} ? $self->{questionsOnSectionPage} : 1; $self->{randomizeQuestions} = $self->{randomizeQuestions} || 0; - $self->{everyPageTitle} = $self->{everyPageTitle} || 1; - $self->{everyPageText} = $self->{everyPageText} || 1; + $self->{everyPageTitle} = defined $self->{everyPageTitle} ? $self->{everyPageTitle} : 1; + $self->{everyPageText} = defined $self->{everyPageText} ? $self->{everyPageText} : 1; $self->{terminal} = $self->{terminal} || 0; - $self->{terminalUrl}; - $self->{goto}; - $self->{timeLimit}; + $self->{terminalUrl} = $self->{terminalUrl} || ''; + $self->{goto} = $self->{goto} || ''; + $self->{timeLimit} = $self->{timeLimit} || 0; $self->{type} = 'section'; + + if(defined $postInfo and ref $postInfo eq 'HASH'){ + while(my ($key,$value) = each %$postInfo){ + if(defined $self->{$key}){ + $self->{$key} = $value; + } + } + } bless($self,$class); return $self; } sub getObject{ my ($self,$address) = @_; - if(@$address == 1){ + if(@$address == 2){ return $self->{questions}->[$address->[1]]; }else{ return $self->{questions}->[$address->[1]]->getObject($address); } } +sub getEditVars{ + my ($self,$address) = @_; + if(@$address > 1){ + return $self->{questions}->[$address->[1]]->getEditVars($address); + } + #Fill in a template var hash and return it + my %var; + while (my ($key,$value) = each %{$self}){ + if($key ne 'questions' and $key ne 'questionsPerPage' and $key ne 'log'){ + $var{$key} = $value; + } + } + for(1 .. 10){ + if($_ == $self->{questionsPerPage}){ + push(@{$var{questionsPerPage}},{'index',$_,'selected',1}); + }else{ + push(@{$var{questionsPerPage}},{'index',$_,'selected',0}); + } + } + return \%var; + +} sub newQuestion{ my $self = shift; push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{questions}}) ); } sub remove{ - my ($self,$ref) = @_; - $self->{questions}->[$$ref{ids}->[1]]->remove($ref); - if(@$$ref{ids} == 0){ - for my $question(@{$self->{questions}}){ - $question->remove($ref); - } - $self->{parent} = undef; - } - if(@$$ref{ids} == 1){ - splice(@{$self->{questions}},$$ref->{ids}->[1],1); + my ($self,$address) = @_; + if(@$address == 2){ + splice(@{$self->{questions}},$$address[1],1); + }else{ + $self->{questions}->[$$address[1]]->remove($address); } } sub update{ - my ($self,$ref) = @_; - - #is a section - if(@{$$ref{ids}} == 0){ - while(my ($key,$value) = keys %{$ref->{object}}){ - $self->{$key} = $value; + my ($self,$address,$ref,$log) = @_; + if(@{$address} == 1){ + while(my ($key,$value) = each %{$ref}){ + $self->{$key} = $value if defined $self->{$key}; } #is a new question }elsif($$ref{ids}->[1] eq 'NEW'){ - push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{object}}) ); + push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new({},$ref) ); #is updating a question or answer }else{ - $self->{questions}->[$$ref{ids}->[1]]->update($ref); + $self->{questions}->[$$ref{ids}->[1]]->update($address,$ref); } } @@ -109,11 +134,13 @@ sub freeze{ my $self = shift; my %temp = %{$self}; - $temp{parent} = undef; + $temp{questions} = []; foreach(@{$self->{questions}}){ push(@{$temp{questions}}, $_->freeze()); } + $temp{log} = undef; + delete $temp{log}; return \%temp; } diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 37091d45e..7ed3fc57a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -11,7 +11,7 @@ sub new{ my $log = shift; if(defined $self->{sections}){ foreach(@{$self->{sections}}){ - $_ = WebGUI::Asset::Wobject::Survey::SectionJSON->new($_); + $_ = WebGUI::Asset::Wobject::Survey::SectionJSON->new($_,undef,$log); } }else{ $self->{sections} = []; @@ -34,9 +34,7 @@ sub getDragDropList{ my $data = shift; $self->{log} = shift; for(my $i=0; $i<=$#{$self->{sections}}; $i++){ - $self->log("Survey passing ".Dumper $data);#,$address,$i, $$address[0]"); $self->{sections}->[$i]->getDragDropList($data, $address, $i == $address->[0]); - $self->log("Survey passing ".Dumper $data);#,$address,$i, $$address[0]"); } } @@ -49,22 +47,30 @@ sub getObject{ } } +sub getEditVars{ + my ($self,$address) = @_; + return $self->{sections}->[$address->[0]]->getEditVars($address); +} + sub update{ - my ($self,$ref) = @_; - if(ref $$ref{ids} eq 'ARRAY' and $$ref{ids}->[0] ne 'NEW'){ - $self->{sections}->[$$ref{ids}->[0]]->update($ref); + my ($self,$address,$ref,$log) = @_; + if(ref $address eq 'ARRAY' and $$address[0] ne 'NEW'){ +$log->error('Address an array and sectionid not equal to NEW') if(defined $log); + $self->{sections}->[$$ref{ids}->[0]]->update($address,$ref,$log); }else{ - push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new($ref->{object})); +$log->error('Either address not an array or sectionid equal to NEW') if(defined $log); + push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new({},$ref)); } } #determine what to add and add it. # ref should contain all the information for the new sub remove{ - my ($self,$ref) = @_; - $self->{sections}->[$$ref{ids}->[0]]->remove($ref); - if(@$$ref{ids} == 0){ - splice(@{$self->{sections}},$$ref->{ids}->[0],1); + my ($self,$address) = @_; + if(@$address == 1){ + splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0);#can't delete the first section + }else{ + $self->{sections}->[$address->[0]]->remove($address); } } @@ -81,11 +87,16 @@ sub freeze{ my ($self) = @_; my %temp = %{$self}; $temp{sections} = []; - delete $temp{log}; foreach (@{$self->{sections}}){ push(@{$temp{sections}},$_->freeze()); } -$self->{log}->error(Dumper %temp); +foreach my $key (keys %temp){ + if($key ne 'log'){ + $self->{log}->error("$key $temp{$key}"); + } +} + $temp{log} = undef; + delete $temp{log}; return \%temp; } 1; diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js index f306176a2..61f885e82 100644 --- a/www/extras/wobject/Survey/editsurvey.js +++ b/www/extras/wobject/Survey/editsurvey.js @@ -67,7 +67,7 @@ Survey.Data = new function(){ button.on("click", this.addQuestion,d.buttons['answer']); } - this.loadObjectEdit(d.object); + this.loadObjectEdit(d.edithtml,d.type); lastDataSet = d; } @@ -84,20 +84,9 @@ Survey.Data = new function(){ Survey.Comm.newAnswer(ids[0],ids[1]); } - this.loadObjectEdit = function(edit){ + this.loadObjectEdit = function(edit,type){ if(edit){ - if(edit.type == "section"){ -console.log('made it here section'); - Survey.SectionTemplate.loadSection(edit); - } - else if(edit.type == "question"){ -console.log('made it here question'); - Survey.QuestionTemplate.loadQuestion(edit); - } - else if(edit.type == "answer"){ -console.log('made it here answer'); - Survey.AnswerTemplate.loadAnswer(edit); - } + Survey.ObjectTemplate.loadObject(edit,type); } } diff --git a/www/extras/wobject/Survey/editsurvey/section.js b/www/extras/wobject/Survey/editsurvey/section.js index 4736976cb..91d21a00a 100644 --- a/www/extras/wobject/Survey/editsurvey/section.js +++ b/www/extras/wobject/Survey/editsurvey/section.js @@ -4,68 +4,13 @@ if (typeof Survey == "undefined") { Survey.SectionTemplate = new function(){ - this.loadSection = function(params){ + this.loadSection = function(html){ - for(var p in params){ - if(params[p] == undefined){params[p] = '';} - } - - var html = "\ -

          \ -
          Please enter section information
          \ -
          \ - \ -

          Section Number: "+params.sequenceNumber + "\ - \ -

          Section Name: \ -


          \ -

          Randomize Questions:"; - if(params.randomizeQuestions == 1){ - html = html+ "\ - Yes\ - No"; - }else{ - html = html+ "\ - Yes\ - No"; - } - html = html + "

          Section custom variable name:

          "; - html = html + "

          Section branch goto variable name:

          "; - html = html + "\ -

          Question per Page:\ - \ -

          Questions on Section Page: "; - if(params.questionsOnSectionPage == 1){ - html = html+ "\ - Yes\ - No"; - }else{ - html = html+ "\ - Yes\ - No"; - } - html = html + "\ -


          \ -

          Section Text:

          \ - "; - html = html + "

          Title on every page: " + this.makeRadio('everyPageTitle',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageTitle); - html = html + "

          Text on every page: " + this.makeRadio('everyPageText',[{text:'Yes',value:1},{text:'No',value:0}],params.everyPageText); - html = html + "

          Terminal section: " + this.makeRadio('terminal',[{text:'Yes',value:1},{text:'No',value:0}],params.terminal); - html = html + "

          Terminal section URL: "; document.getElementById('edit').innerHTML = html; - var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}} ]; - if(params.Survey_sectionId != ''){ - butts[2] = {text:"Delete", handler:function(){Survey.Comm.deleteSection(params.Survey_sectionId);}}; - } + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}}, + {text:"Delete", handler:function(){document.getElementById('delete').setValue(1); this.submit();}} + ]; var form = new YAHOO.widget.Dialog("section", { width : "500px", @@ -79,17 +24,5 @@ Survey.SectionTemplate = new function(){ form.render(); form.show(); } - this.makeRadio = function(name,values,checked){ - var html = ''; - for(var i in values){ - if(checked == values[i]['value']){ - html = html+ "" + values[i]['text']; - }else{ - html = html+ "" + values[i]['text']; - } - } - html = html + "\n"; - return html; - } }(); From 92c87ca9b818b3cc8c1fc3d01cd2d08e7f4ce5bb Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 26 Sep 2008 02:06:41 +0000 Subject: [PATCH 34/64] added object.js --- .../wobject/Survey/editsurvey/object.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 www/extras/wobject/Survey/editsurvey/object.js diff --git a/www/extras/wobject/Survey/editsurvey/object.js b/www/extras/wobject/Survey/editsurvey/object.js new file mode 100644 index 000000000..c9eb2d38f --- /dev/null +++ b/www/extras/wobject/Survey/editsurvey/object.js @@ -0,0 +1,28 @@ +if (typeof Survey == "undefined") { + var Survey = {}; +} + +Survey.ObjectTemplate = new function(){ + + this.loadObject = function(html,type){ + + document.getElementById('edit').innerHTML = html; + + var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}}, + {text:"Delete", handler:function(){document.getElementById('delete').value = 1; this.submit();}} + ]; + + var form = new YAHOO.widget.Dialog(type, + { width : "500px", + fixedcenter : true, + visible : false, + constraintoviewport : true, + buttons : butts + } ); + + form.callback = Survey.Comm.callback; + form.render(); + form.show(); + } +}(); + From ac14d55b18c6fbbc44a035bd7644493bcc74d764 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Fri, 26 Sep 2008 14:18:36 +0000 Subject: [PATCH 35/64] minor changes --- lib/WebGUI/Asset/Wobject/Survey.pm | 9 +++++++-- lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm | 2 +- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 7 +------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index b90ebe829..fa7dae96e 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -256,7 +256,10 @@ sub deleteObject{ $self->saveSurveyJSON(); #The last address in ideas is to a deleted object so that should not be returned. - pop(@{$address}); + pop(@{$address}); + if(@$address < 1){ + $$address[0] = 0; + } return $self->www_loadSurvey({address => $address, message=>$message}); } @@ -399,8 +402,10 @@ $self->session->errorHandler->error("Loaded JSON"); my $address = $options->{address} ? defined $options : [0]; my $message = $options->{message} ? defined $options : ''; +$self->session->errorHandler->error("Getting edit vars"); my $var = $options->{var} ? defined $options : $self->{_data}->getEditVars($address); -$self->session->errorHandler->error("Loaded beginning params"); +$self->session->errorHandler->error("Got edit vars"); +$self->session->errorHandler->error("Loaded beginning params ".@$address); my $editHtml; if($var->{type} eq 'section'){ $var->{id} = join('-',@$address); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm index fcb6c72fb..87c4edfd9 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm @@ -54,6 +54,7 @@ sub getObject{ } sub getEditVars{ my ($self,$address) = @_; +$self->{log}->error("section geteditvars"); if(@$address > 1){ return $self->{questions}->[$address->[1]]->getEditVars($address); } @@ -139,7 +140,6 @@ sub freeze{ foreach(@{$self->{questions}}){ push(@{$temp{questions}}, $_->freeze()); } - $temp{log} = undef; delete $temp{log}; return \%temp; } diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 7ed3fc57a..a43124815 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -49,6 +49,7 @@ sub getObject{ sub getEditVars{ my ($self,$address) = @_; +$self->{log}->error("SurveyJSON geteditvars for: ".@$address); return $self->{sections}->[$address->[0]]->getEditVars($address); } @@ -90,12 +91,6 @@ sub freeze{ foreach (@{$self->{sections}}){ push(@{$temp{sections}},$_->freeze()); } -foreach my $key (keys %temp){ - if($key ne 'log'){ - $self->{log}->error("$key $temp{$key}"); - } -} - $temp{log} = undef; delete $temp{log}; return \%temp; } From c81270553713a7f11c4d8feaceea4493d66a06f2 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 29 Sep 2008 17:55:21 +0000 Subject: [PATCH 36/64] Editor is 98% finished. (still wrapping up final bits on drag and drop) --- lib/WebGUI/Asset/Wobject/Survey.pm | 284 +++++++-------- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 334 ++++++++++++++---- www/extras/wobject/Survey/editsurvey.js | 16 +- www/extras/wobject/Survey/editsurvey/comm.js | 14 +- .../wobject/Survey/editsurvey/object.js | 3 +- www/extras/wobject/editsurvey.js | 10 +- 6 files changed, 400 insertions(+), 261 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index fa7dae96e..8aa5b01bc 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -107,6 +107,13 @@ sub definition { defaultValue => '1oBRscNIcFOI-pETrCOspA', namespace => 'Survey/Edit', }, + questionEditTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Section Edit Tempalte", + defaultValue => 'wAc4azJViVTpo-2NYOXWvg', + namespace => 'Survey/Edit', + }, ); push(@{$definition}, { @@ -145,19 +152,20 @@ This overloads the normal call to the super, to call the super call like normal #------------------------------------------------------------------- -sub processPropertiesFromFormPost { - my $self = shift; - $self->SUPER::processPropertiesFromFormPost; +#sub processPropertiesFromFormPost { +# my $self = shift; +# $self->SUPER::processPropertiesFromFormPost; - $self->loadSurveyJSON(); - if($#{$self->{_data}->{sections}} < 0){ -$self->session->errorHandler->error("In Processing from Post\n"); - $self->{_data}->update(['NEW'],undef,$self->session->errorHandler); +# $self->loadSurveyJSON(); +# if($#{$self->{_data}->{sections}} < 0){ +#$self->session->errorHandler->error("In Processing from Post\n"); +# my $section = $self->{_data}->newSection(); +# $self->{_data}->addSection($section); -$self->session->errorHandler->error("Processing from creation\n".Dumper $self->{_data}); - } - $self->saveSurveyJSON(); -} +#$self->session->errorHandler->error("Processing from creation\n".Dumper $self->{_data}); +# } +# $self->saveSurveyJSON(); +#} #------------------------------------------------------------------- @@ -170,15 +178,15 @@ Loads the survey collateral into memory so that the survey objects can be create sub loadSurveyJSON{ my $self = shift; - if(defined $self->{_data}){return;}#already loaded + if(defined $self->helper){return;}#already loaded my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); -#$self->session->errorHandler->error("LOADING\n".Dumper $jsonHash."\n\n"); - my $hashRef = {}; - $hashRef = decode_json($jsonHash) if defined $jsonHash; - - $self->{_data} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($hashRef,$self->session->errorHandler); + +$self->session->errorHandler->error("LOADING JSON"); + + $self->{jsonHelper} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); +$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->helper->freeze); } #------------------------------------------------------------------- @@ -188,14 +196,17 @@ sub loadSurveyJSON{ Saves the survey collateral to the DB =cut +sub helper{ return shift->{jsonHelper}; } +sub littleBuddy{ return shift->{jsonHelper}; } +sub allyourbases{ return shift->{jsonHelper}; } +sub helpmehelpme{ return shift->{jsonHelper}; } sub saveSurveyJSON{ my $self = shift; - $self->{_data}->{log} = $self->session->errorHandler; - my $data; - $data = $self->{_data}->freeze(); -$self->session->errorHandler->error("----------------SAving THIS DATA".Dumper $data); - $data = encode_json($data); + + my $data = $self->helper->freeze(); + +$self->session->errorHandler->error("Saving THIS DATA\n\n".$data); $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -226,22 +237,21 @@ $self->session->errorHandler->error("Submit Edit Object"); # my $ref = @{decode_json($self->session->form->process("data"))}; my $responses = $self->session->form->paramsHashRef(); + my @address = split/-/,$responses->{id}; -#$self->session->errorHandler->error("Submit Edit Object".Dumper $responses); + $self->loadSurveyJSON(); if($responses->{delete}){ $self->session->errorHandler->error("Deleting ".join(',',@address)); return $self->deleteObject(\@address); } -$self->session->errorHandler->error("Updating ".join(',',@address)."Which has $$responses{terminalUrl} as the tu"); +$self->session->errorHandler->error("Updating ".join(',',@address)); #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. - my $message = $self->{_data}->update(\@address,$responses,$self->session->errorHandler); + my $message = $self->helper->update(\@address,$responses); -# $self->saveSurveyJSON(); - -# return $self->www_loadSurvey({address => $ref->{ids},message=>$message}); $self->saveSurveyJSON(); - return $self->www_loadSurvey(); + + return $self->www_loadSurvey({address => \@address}); } @@ -251,15 +261,11 @@ sub deleteObject{ $self->loadSurveyJSON(); - my $message = $self->{_data}->remove($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + my $message = $self->helper->remove($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. $self->saveSurveyJSON(); - - #The last address in ideas is to a deleted object so that should not be returned. - pop(@{$address}); - if(@$address < 1){ - $$address[0] = 0; - } + #The parent address of the deleted object is returned. + pop(@{$address}) unless @$address == 1 and $$address[0] == 0; return $self->www_loadSurvey({address => $address, message=>$message}); } @@ -270,16 +276,23 @@ sub www_newObject{ my $self = shift; my $ref; - $ref->{ids} = @{decode_json($self->session->form->process("data"))}; +$self->session->errorHandler->error("Entering newObject"); + my $ids = $self->session->form->process("data"); + + my @inAddress = split/-/,$ids; +$self->session->errorHandler->error("Address is:".join(',', @inAddress)); $self->loadSurveyJSON(); - my $object = $self->{_data}->createTemp($ref); + #Don't save after this as the new object should not stay in the survey + my $address = $self->helper->newObject(\@inAddress); + +$self->session->errorHandler->error("New objects address is:".join(',', @$address)); #The new temp object has an address of NEW, which means it is not a real final address. - push(@{$ref->{ids}},'NEW'); - return $self->www_loadSurvey({address => $ref->{ids}, message => undef, object => $object}); + return $self->www_loadSurvey({address => $address, message => undef}); + } @@ -288,107 +301,39 @@ sub www_dragDrop{ my $self = shift; my $p = decode_json($self->session->form->process("data")); - my $target = $p->{'target'};#The item moved - my $before = $p->{'before'};#The item directly in front of it, empty for first in list +$self->session->errorHandler->error("In Drag Drop ".Dumper $p); - if($target->{'type'} eq 'section'){ - my $pid; + my @tid = split/-/,$p->{target}->{id}; + my @bid = split/-/,$p->{before}->{id}; - my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$target->{'id'}]); - - if($before->{'id'} eq ''){#before doens't exist, object was moved to the front - $self->session->db->write("update Survey_section set sequenceNumber = sequenceNumber +1 where sequenceNumber < ? and assetId = ?",[$tseqNum,$self->getId]); - $self->session->db->write("update Survey_section set sequenceNumber = 1 where Survey_sectionId = ?",[$target->{'id'}]); - }else{#before exists - $pid = $before->{'id'}; - if($before->{'type'} eq 'question'){ - $pid = my $section = $self->session->db->quickScalar("select Survey_sectionId from Survey_question where Survey_questionId = ?",[$before->{'id'}]); - } - elsif($before->{'type'} eq 'answer'){ - $pid = my $section = $self->session->db->quickScalar(" - select sq.Survey_sectionId - from Survey_answer sa, Survey_question sq - where sa.Survey_answerId = ? and sa.Survey_questionId = sq.Survey_questionId", - [$before->{'id'}]); - } - my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_section where Survey_sectionId = ?",[$pid]); - if($tseqNum > $bseqNum){ - $self->session->db->write(" - update Survey_section - set sequenceNumber = sequenceNumber+1 - where sequenceNumber > ? and sequenceNumber < ? and assetId = ?",[$bseqNum, $tseqNum,$self->getId]); - $self->session->db->write("update Survey_section set sequenceNumber = ? where Survey_sectionId = ?",[$bseqNum+1,$target->{'id'}]); - }elsif($bseqNum > $tseqNum){ - $self->session->db->write(" - update Survey_section - set sequenceNumber = sequenceNumber-1 - where sequenceNumber > ? and sequenceNumber <= ? and assetId = ?",[$tseqNum, $bseqNum,$self->getId]); - $self->session->db->write("update Survey_section set sequenceNumber = ? where Survey_sectionId = ?",[$bseqNum,$target->{'id'}]); - } - } - - - } - - elsif($target->{'type'} eq 'question'){ - if($before->{'id'} ne ''){ - my @tids = split(/\|\|\|\|/,$target->{'id'}); - my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$tids[1]]); - if($before->{'type'} eq 'section' and $before->{'id'} eq $tids[0]){#moved to front of section question belongs to - $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber +1 where sequenceNumber < ? and Survey_sectionId = ?", - [$tseqNum,$tids[0]]); - $self->session->db->write("update Survey_question set sequenceNumber = 1 where Survey_questionId = ?",[$tids[1]]); - } - elsif($before->{'type'} eq 'section' and $before->{'id'} ne $tids[0]){#question moved to new section - #move down 1 seqnumber all questions higher up in section - $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber - 1 where sequenceNumber > ? and Survey_sectionId = ?", - [$tseqNum,$tids[0]]); - #append question to last question in new section - my $lastSeq = $self->session->db->quickScalar("select max(sequenceNumber) from Survey_question where Survey_sectionId = ?",[$$before{'id'}]); - $self->session->db->write("update Survey_question set Survey_sectionId = ?, sequenceNumber = ? where Survey_questionId = ?", - [ $$before{'id'}, $lastSeq + 1, $tids[1] ]); - $target->{'id'} = $before->{'id'}."||||".$tids[1]; - } - elsif($before->{'type'} eq 'question'){#will always have the same sectionid. - my @bids = split(/\|\|\|\|/,$before->{'id'}); - my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$bids[1]]); - if($bseqNum > $tseqNum){#target was in front of before so before + all in between moved up - $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber - 1 where sequenceNumber > ? and - sequenceNumber <= ? and Survey_sectionId = ?",[$tseqNum,$bseqNum,$tids[0]]); - $self->session->db->write("update Survey_question set sequenceNumber = ? where Survey_questionId = ?",[$bseqNum,$tids[1]]); - }else{ - $self->session->db->write("update Survey_question set sequenceNumber = sequenceNumber + 1 where sequenceNumber > ? and - sequenceNumber < ? and Survey_sectionId = ?",[$bseqNum,$tseqNum,$tids[0]]); - $self->session->db->write("update Survey_question set sequenceNumber = ? where Survey_questionId = ?",[$bseqNum+1,$tids[1]]); - } - - } - } - } - - else{#is an answer - - my @tids = split(/\|\|\|\|/,$target->{'id'}); - my @bids = split(/\|\|\|\|/,$before->{'id'}); - my $tseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_answer where Survey_answerId = ?",[$tids[2]]); - if($before->{'type'} eq 'question' and $bids[1] eq $tids[1]){#answer has been moved to the front - $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber + 1 where Survey_questionId = ? and sequenceNumber < ?",[$tids[1],$tseqNum]); - $self->session->db->write("update Survey_answer set sequenceNumber = 1 where Survey_answerId = ?",[$tids[2]]); - }elsif($before->{'type'} eq 'answer'){#will always be in the same quesiton - my $bseqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_answer where Survey_answerId = ?",[$bids[2]]); - if($tseqNum > $bseqNum){ - $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber + 1 where Survey_questionId = ? - and sequenceNumber > ? and sequenceNumber < ?",[$tids[1],$bseqNum,$tseqNum]); - $self->session->db->write("update Survey_answer set sequenceNumber = ? + 1 where Survey_answerId = ?",[$bseqNum,$tids[2]]); + $self->loadSurveyJSON(); + my $target = $self->helper->getObject(\@tid); + $self->helper->remove(\@tid,1); + my $address = [0]; + if(@tid == 1){ + $#bid = 0;#sections can only be inserted after another section so chop off the question and answer portion of + $bid[0] = -1 if(! defined $bid[0]); + $self->helper->insertObject($target, [$bid[0]]); + }elsif(@tid == 2){#questions can be moved to any section, but a pushed to the end of a new section. + if(@bid == 1){#moved to a new section or head of current section + if($bid[0] == $tid[0]){#moved to top of current section + $bid[1] = -1; }else{ - $self->session->db->write("update Survey_answer set sequenceNumber = sequenceNumber - 1 where Survey_questionId = ? - and sequenceNumber <= ? and sequenceNumber > ?",[$tids[1],$bseqNum,$tseqNum]); - $self->session->db->write("update Survey_answer set sequenceNumber = ? where Survey_answerId = ?",[$bseqNum,$tids[2]]); + $bid[1] = $#{$self->helper->questions([$bid[0]])}; } } + $self->helper->insertObject($target, [$bid[0],$bid[1]]); + }elsif(@tid == 3){#answers can only be rearranged in the same question + if(@$bid == 2 and $bid[1] == $tid[1]){ + $bid[2] = -1; + $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); + }elsif(@$bid == 3){ + $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); + }else{ + $self->helper->insertObject($target, \@tid);#else put it back where it was } - - return $self->www_loadSurvey($target->{'id'}); + + return $self->www_loadSurvey({address => $address}); } @@ -398,37 +343,43 @@ sub www_loadSurvey{ $self->session->errorHandler->error("Entering loadSurvey"); $self->loadSurveyJSON(); -$self->session->errorHandler->error("Loaded JSON"); - my $address = $options->{address} ? defined $options : [0]; - my $message = $options->{message} ? defined $options : ''; -$self->session->errorHandler->error("Getting edit vars"); - my $var = $options->{var} ? defined $options : $self->{_data}->getEditVars($address); -$self->session->errorHandler->error("Got edit vars"); -$self->session->errorHandler->error("Loaded beginning params ".@$address); - my $editHtml; - if($var->{type} eq 'section'){ - $var->{id} = join('-',@$address); - $var->{displayed_id} = $address->[$#$address]; - if($var->{displayed_id} ne 'NEW'){$var->{displayed_id}++;} - - $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); + my $address = defined $options->{address} ? $options->{address} : undef; + if(! defined $address){ + if(my $inAddress = $self->session->form->process("data")){ + $address = [split/-/,$inAddress]; + }else{ + $address = [0]; + } } + my $message = defined $options->{message} ? $options->{message} : ''; +$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); + my $var = defined $options->{var} ? $options->{var} : $self->helper->getEditVars($address); -$self->session->errorHandler->error(Dumper $var); +$self->session->errorHandler->error("Got edit vars"); +$self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); + my $editHtml; +$self->session->errorHandler->error("The edit vars:".Dumper $var); + if($var->{type} eq 'section'){ + $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); + }elsif($var->{type} eq 'question'){ + $editHtml = $self->processTemplate($var,$self->get("questionEditTemplateId")); + } +#$self->session->errorHandler->error("The HTML :$editHtml"); - my @data; my %buttons; - $self->{_data}->getDragDropList($address,\@data,$self->session->errorHandler); + my $data = $self->helper->getDragDropList($address); +$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; - my ($scount,$qcount,$acount) = (0,0,0); + my ($scount,$qcount,$acount) = (-1,-1,-1); my $lastType; my %lastId; my @ids; my ($s,$q,$a) = (0,0,0);#bools on if a button has already been created - foreach (@data){ + foreach (@$data){ if($_->{type} eq 'section'){ + $lastId{section} = ++$scount; if($lastType eq 'answer'){ $html .= "
          "; $buttons{answer} = "$lastId{section}-$lastId{question}"; @@ -441,24 +392,26 @@ $self->session->errorHandler->error(Dumper $var); } $html .= "

        • S". ($scount + 1). ": $_->{text}<\/li>
          \n"; push(@ids,$scount); - $lastId{section} = $scount++; $lastType = 'section'; + $qcount = -1; + $acount = -1; } elsif($_->{type} eq 'question'){ + $lastId{question} = ++$qcount; if($lastType eq 'answer'){ $html .= "
          "; $buttons{answer} = "$lastId{section}-$lastId{question}"; $a = 1; } $html .= "
        • Q". ($qcount + 1). ": $_->{text}<\/li>
          \n"; - push(@ids,$qcount); - $lastId{question} = $qcount++; + push(@ids,"$scount-$qcount"); $lastType = 'question'; + $acount = -1; } elsif($_->{type} eq 'answer'){ + $lastId{answer} = ++$acount; $html .= "
        • A". ($acount + 1). ": $_->{text}<\/li>
          \n"; - push(@ids,$acount); - $lastId{answer} = $acount++; + push(@ids,"$scount-$qcount-$acount"); $lastType = 'answer'; } } @@ -469,7 +422,7 @@ $self->session->errorHandler->error(Dumper $var); } if(!$b){ $html .= "
          "; - $buttons{'question'} = "$lastId{section}-$lastId{question}"; + $buttons{'question'} = "$lastId{section}"; } if(!$s){ $html .= "
          "; @@ -479,7 +432,7 @@ $self->session->errorHandler->error(Dumper $var); elsif($lastType eq 'question'){ if(!$b){ $html .= "
          "; - $buttons{'question'} = "$lastId{section}-$lastId{question}"; + $buttons{'question'} = "$lastId{section}"; } if(!$s){ $html .= "
          "; @@ -489,14 +442,14 @@ $self->session->errorHandler->error(Dumper $var); elsif($lastType eq 'section'){ if(!$b){ $html .= "
          "; - $buttons{'question'} = "$lastId{section}-$lastId{question}"; + $buttons{'question'} = "$lastId{section}"; } if(!$s){ $html .= "
          "; $buttons{'section'} = "$lastId{section}"; } } -#$self->session->errorHandler->error($html); +$self->session->errorHandler->error($html); #address is the address of the focused object #buttons are the data to create the Add buttons @@ -505,7 +458,12 @@ $self->session->errorHandler->error(Dumper $var); #ids is a list of all ids passed in which are draggable (for adding events) #type is the object type my $return = {"address",$address,"buttons",\%buttons,"edithtml",$editHtml,"ddhtml",$html,"ids",\@ids,"type",$var->{type}}; +$self->session->errorHandler->error(Dumper $return); +eval{ $self->session->errorHandler->error(encode_json($return)); +}; +$self->session->errorHandler->error($@); + $self->session->errorHandler->error("Returning from loadSurvey"); return encode_json($return); } diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index a43124815..a46bad487 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -1,97 +1,275 @@ package WebGUI::Asset::Wobject::Survey::SurveyJSON; use strict; -use Data::Structure::Util qw/unbless/; -use WebGUI::Asset::Wobject::Survey::SectionJSON; +use JSON; use Data::Dumper; sub new{ my $class = shift; - my $self = shift || {}; + my $json = shift; my $log = shift; - if(defined $self->{sections}){ - foreach(@{$self->{sections}}){ - $_ = WebGUI::Asset::Wobject::Survey::SectionJSON->new($_,undef,$log); - } - }else{ - $self->{sections} = []; - } + my $self = {}; $self->{log} = $log; + my $temp = decode_json($json) if defined $json; + $self->{sections} = defined $temp->{sections} ? $temp->{sections} : []; + $self->{survey} = defined $temp->{survey} ? $temp->{survey} : {}; + $self->{gotoMap} = defined $temp->{gotoMap} ? $temp->{gotoMap} : {}; bless($self,$class); + if(@{$self->sections} == 0){ + $self->newObject([]); + } return $self; } +sub freeze{ + my $self = shift; + my %temp; + $temp{sections} = $self->{sections}; + $temp{survey} = $self->{survey}; + $temp{gotoMap} = $self->{gotoMap}; + return encode_json(\%temp); +} +sub newObject{ + my $self = shift; + my $address = shift; + if(@$address == 0){ + push(@{$self->sections}, $self->newSection()); + return [$#{$self->sections}]; + }elsif(@$address == 1){ + push( @{$self->questions($address)}, $self->newQuestion($address)); + $$address[1] = $#{$self->questions($address)}; + return $address; + }elsif(@$address == 2){ + push(@{$self->answers($address)}, $self->newAnswer($address)); + $$address[2] = $#{$self->answers($$address)}; + return $address; + } +} + +#address is the array of objects currently selected in the edit screen +#data is the array of hash items for displaying +sub getDragDropList{ + my $self = shift; + my $address = shift; + my @data; +$self->log("dd'ing sections".$#{$self->sections}); +eval{ + for(my $i = 0; $i <= $#{$self->sections}; $i++){ + push(@data,{text=>$self->section([$i])->{title}, type=>'section'}); + if($address->[0] == $i){ + + for(my $x = 0; $x <= $#{$self->questions($address)}; $x++){ +$self->log("dd'ing questions".$#{$self->questions}); + push(@data,{text=>$self->question([$i,$x])->{text}, type=>'question'}); + if($address->[1] == $x){ + for(my $y = 0; $y <= $#{$self->answers($address)}; $y++){ +$self->log("dd'ing answers".$#{$self->answers}); + push(@data,{text=>$self->answer([$i,$x,$y])->{text}, type=>'answer'}); + } + } + } + } + } +}; +$self->log($@); +$self->log('finished dding'); + return \@data; +} + +sub getObject{ + my ($self,$address) = @_; + if(@$address == 1){ + return $self->{sections}->[$address->[0]]; + }elsif(@$address == 2){ + return $self->{sections}->[$address->[0]]->{questions}->[$address->[1]]; + }else{ + return $self->{sections}->[$address->[0]]->{questions}->[$address->[1]]->{answers}->[$address->[2]]; + } +} + +sub getEditVars{ + my ($self,$address) = @_; + + if(@$address == 1){ + return $self->getSectionEditVars($address); + }elsif(@$address == 2){ + return $self->getQuestionEditVars($address); + }elsif(@$address == 3){ + return $self->getAnswerEditVars($address); + } +} +sub getSectionEditVars{ + my $self = shift; + my $address = shift; + my $object = $self->section($address); + my %var = %{$object}; + $var{id} = $address->[0]; + $var{displayed_id} = $address->[0]+1; + delete $var{questions}; + delete $var{questionsPerPage}; + for(1 .. 10){ +# if($_ == $self->section($address)->{questionsPerPage}){ + if($_ == $object->{questionsPerPage}){ + push(@{$var{questionsPerPage}},{'index',$_,'selected',1}); + }else{ + push(@{$var{questionsPerPage}},{'index',$_,'selected',0}); + } + } + return \%var; +} +sub getQuestionEditVars{ + my $self = shift; + my $address = shift; + my $object = $self->question($address); + my %var = %{$object}; + $var{id} = $address->[0]."-".$address->[1]; + $var{displayed_id} = $address->[1]+1; + delete $var{answers}; + delete $var{questionType}; + my @types = ('Agree/Disagree','Certainty','Concern','Confidence','Currency','Date','Date Range','Dual Slider - Range','Education','Effectiveness', + 'Email','File Upload','Gender','Hidden','Ideology','Importance','Likelihood','Multi Slider - Allocate','Multiple Choice','Oppose/Support', + 'Party','Phone Number','Race','Risk','Satisfaction','Scale','Security','Slider','Text','Text Date','Threat','True/False','Yes/No'); + for(@types){ + if($_ eq $object->{questionType}){ + push(@{$var{questionType}},{'text',$_,'selected',1}); + }else{ + push(@{$var{questionType}},{'text',$_,'selected',0}); + } + } + return \%var; +} +sub getAnswerEditVars{ +} + +sub update{ + my ($self,$address,$ref) = @_; + my $object; + if(@$address == 1){ + $object = $self->section($address); + if(! defined $object){ + $object = $self->newSection(); + push(@{$self->sections},$object); + } + }elsif(@$address == 2){ + $object = $self->question($address); + if(! defined $object){ +$self->log("$object didn't exist"); + $object = $self->newQuestion(); + push(@{$self->questions($address)},$object); + } + }elsif(@$address == 3){ + } + for my $key(keys %$object){ + $object->{$key} = $ref->{$key} if(defined $$ref{$key}); + } +} +#determine what to add and add it. +# ref should contain all the information for the new +sub insertObject{ + my ($self,$object,$address) = @_; + + if(@$address == 1){ + splice(@{$self->sections($address)},$$address[0] + 1, 0, $object); + }elsif(@$address == 2) + splice(@{$self->questions($address)},$$address[1] + 1, 0, $object); + }elsif(@$address == 3) + splice(@{$self->answers($address)},$$address[2] + 1, 0, $object); + } + +} +sub remove{ + my ($self,$address,$movingOverride) = @_; + if(@$address == 1){ + splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0 and ! defined $movingOverride);#can't delete the first section + }elsif(@$address == 2){ +$self->log('removing here'); + splice(@{$self->questions($address)},$$address[1],1); + + }elsif(@$address == 3){ + } +} + +sub newSection{ + my %members = ( + 'text', '', + 'title', 'NEW SECTION', + 'variable', '', + 'questionsPerPage', 5, + 'questionsOnSectionPage', 1, + 'randomizeQuestions', 0, + 'everyPageTitle', 1, + 'everyPageText', 1, + 'terminal', 0, + 'terminalUrl', '', + 'goto', '', + 'timeLimit', 0, + 'type','section' + ); + $members{questions} = []; + return \%members; +} +sub newQuestion{ + my %members = ( + 'text', '', + 'variable','', + 'allowComment',0, + 'commentCols',10, + 'commentRows',5, + 'randomizeAnswers',0, + 'questionType','Multiple Choice', + 'randomWords','', + 'verticalDisplay',0, + 'required',0, + 'maxAnswers',1, + 'value',1, + 'textInButton',0, + 'terminal',0, + 'terminalUrl','', + 'type','question' + ); + $members{answers} = []; + return \%members; +} +sub newAnswer{ +} + + + +#------------------------------ +#accessors and helpers +#------------------------------ +sub sections{ + my $self = shift; + return $self->{sections}; +} +sub section{ + my $self = shift; + my $address = shift; + return $self->{sections}->[$$address[0]]; +} +sub questions{ + my $self = shift; + my $address = shift; + return $self->{sections}->[$$address[0]]->{questions}; +} +sub question{ + my $self = shift; + my $address = shift; + return $self->{sections}->[$$address[0]]->{questions}->[$$address[1]]; +} +sub answers{ + my $self = shift; + my $address = shift; + return $self->{sections}->[$$address[0]]->{questions}->[$$address[1]]->{answers}; +} +sub answer{ + my $self = shift; + my $address = shift; + return $self->{sections}->[$$address[0]]->{questions}->[$$address[1]]->{answers}->[$$address[2]]; +} sub log{ my ($self,$message) = @_; if(defined $self->{log}){ $self->{log}->error($message); } } -#address is the array of objects currently selected in the edit screen -#data is the array of hash items for displaying -sub getDragDropList{ - my $self = shift; - my $address = shift; - my $data = shift; - $self->{log} = shift; - for(my $i=0; $i<=$#{$self->{sections}}; $i++){ - $self->{sections}->[$i]->getDragDropList($data, $address, $i == $address->[0]); - } -} - -sub getObject{ - my ($self,$address) = @_; - if(@$address == 1){ - return $self->{sections}->[$address->[0]]; - }else{ - return $self->{sections}->[$address->[0]]->getObject($address); - } -} - -sub getEditVars{ - my ($self,$address) = @_; -$self->{log}->error("SurveyJSON geteditvars for: ".@$address); - return $self->{sections}->[$address->[0]]->getEditVars($address); -} - -sub update{ - my ($self,$address,$ref,$log) = @_; - if(ref $address eq 'ARRAY' and $$address[0] ne 'NEW'){ -$log->error('Address an array and sectionid not equal to NEW') if(defined $log); - $self->{sections}->[$$ref{ids}->[0]]->update($address,$ref,$log); - }else{ -$log->error('Either address not an array or sectionid equal to NEW') if(defined $log); - push(@{$self->{sections}}, WebGUI::Asset::Wobject::Survey::SectionJSON->new({},$ref)); - } -} -#determine what to add and add it. -# ref should contain all the information for the new - -sub remove{ - my ($self,$address) = @_; - if(@$address == 1){ - splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0);#can't delete the first section - }else{ - $self->{sections}->[$address->[0]]->remove($address); - } -} - -sub createTemp{ - my ($self,$ref) = @_;#ref{ids} contains the parent of the temp object which should be created and returned. - - if(ref $$ref{ids} eq 'ARRAY'){ - return $self->{sections}->[$$ref{ids}->[0]]->createTemp($ref); - }else{ - return WebGUI::Asset::Wobject::Survey::SectionJSON->new($self); - } -} -sub freeze{ - my ($self) = @_; - my %temp = %{$self}; - $temp{sections} = []; - foreach (@{$self->{sections}}){ - push(@{$temp{sections}},$_->freeze()); - } - delete $temp{log}; - return \%temp; -} 1; diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js index 61f885e82..1315acecc 100644 --- a/www/extras/wobject/Survey/editsurvey.js +++ b/www/extras/wobject/Survey/editsurvey.js @@ -9,7 +9,7 @@ Survey.Data = new function(){ this.dragDrop = function(did){ var type; - +console.log('In drag drop'); if(did.className.match("section")){type = 'section';} else if(did.className.match("question")){type = 'question';} else{ type = 'answer';} @@ -32,7 +32,7 @@ Survey.Data = new function(){ else{ type = 'answer';} data = {id:before.id,type:type}; } - +console.log(first.id+' '+data.id); Survey.Comm.dragDrop(first,data); } @@ -50,7 +50,9 @@ Survey.Data = new function(){ //add event handlers for if a tag is clicked for(var x in d.ids){ +console.log('adding handler for '+ d.ids[x]); YAHOO.util.Event.addListener(d.ids[x], "click", this.clicked); + new Survey.DDList(d.ids[x],"sections"); } //add the add object buttons @@ -64,7 +66,7 @@ Survey.Data = new function(){ } if(d.buttons['answer']){ var button = new YAHOO.widget.Button({ label:"Add Answer", id:"addanswer", container:"newAnswer" }); - button.on("click", this.addQuestion,d.buttons['answer']); + button.on("click", this.addAnswer,d.buttons['answer']); } this.loadObjectEdit(d.edithtml,d.type); @@ -76,12 +78,12 @@ Survey.Data = new function(){ } - this.addQuestion = function(e,sid){ - Survey.Comm.newQuestion(sid); + this.addQuestion = function(e,id){ + Survey.Comm.newQuestion(id); } - this.addAnswer = function(e,ids){ - Survey.Comm.newAnswer(ids[0],ids[1]); + this.addAnswer = function(e,id){ + Survey.Comm.newAnswer(id); } this.loadObjectEdit = function(edit,type){ diff --git a/www/extras/wobject/Survey/editsurvey/comm.js b/www/extras/wobject/Survey/editsurvey/comm.js index 5fd5c677b..a4c4b760d 100644 --- a/www/extras/wobject/Survey/editsurvey/comm.js +++ b/www/extras/wobject/Survey/editsurvey/comm.js @@ -44,17 +44,17 @@ Survey.Comm = new function(){ request(sUrl,this.callback,postData); } this.newSection = function(){ - var sUrl = "?func=newSection"; + var sUrl = "?func=newObject"; request(sUrl,this.callback); } - this.newQuestion = function(sid){ - var postData = "data="+sid; - var sUrl = "?func=newQuestion"; + this.newQuestion = function(id){ + var postData = "data="+id; + var sUrl = "?func=newObject"; request(sUrl,this.callback,postData); } - this.newAnswer = function(sid,qid){ - var postData = "data="+YAHOO.lang.JSON.stringify([sid,qid]); - var sUrl = "?func=newAnswer"; + this.newAnswer = function(id){ + var postData = "data="+id; + var sUrl = "?func=newObject"; request(sUrl,this.callback,postData); } this.deleteAnswer = function(id){ diff --git a/www/extras/wobject/Survey/editsurvey/object.js b/www/extras/wobject/Survey/editsurvey/object.js index c9eb2d38f..7c7090178 100644 --- a/www/extras/wobject/Survey/editsurvey/object.js +++ b/www/extras/wobject/Survey/editsurvey/object.js @@ -13,7 +13,8 @@ Survey.ObjectTemplate = new function(){ ]; var form = new YAHOO.widget.Dialog(type, - { width : "500px", + { + width : "500px", fixedcenter : true, visible : false, constraintoviewport : true, diff --git a/www/extras/wobject/editsurvey.js b/www/extras/wobject/editsurvey.js index 16e8aafc3..a449d914e 100644 --- a/www/extras/wobject/editsurvey.js +++ b/www/extras/wobject/editsurvey.js @@ -66,7 +66,7 @@ Survey.Data = new function(){ else if(lastType == 'answer' && d.data[x].type == 'section'){ this.addAnswerButton(lastId['section'],lastId['question']); buttons['answer'] = 1; - this.addQuestionButton(lastId['section']); +// this.addQuestionButton(lastId['section']); buttons['question'] = 1; acount = 1; qcount = 1; @@ -135,16 +135,16 @@ Survey.Data = new function(){ } if(lastType == 'answer' && ! buttons['answer']){ this.addAnswerButton(lastId['section'],lastId['question']); - this.addQuestionButton(lastId['section']); +// this.addQuestionButton(lastId['section']); } if(lastType == 'question' && ! buttons['question']){ this.addAnswerButton(lastId['section'],lastId['question']); } if(lastType == 'question' || lastType == 'section' && ! buttons['question']){ - this.addQuestionButton(lastId['section']); +// this.addQuestionButton(lastId['section']); } - this.addSectionButton(); +// this.addSectionButton(); this.loadObjectEdit(d.edit); lastDataSet = d; @@ -157,7 +157,7 @@ Survey.Data = new function(){ this.addQuestion = function(e,sid){ - Survey.Comm.newQuestion(sid); +// Survey.Comm.newQuestion(sid); } this.addAnswer = function(e,ids){ From 9c5082f450c6f1b53acb55a02022718d63ab5986 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 30 Sep 2008 16:26:33 +0000 Subject: [PATCH 37/64] minor changes to drag and drop --- lib/WebGUI/Asset/Wobject/Survey.pm | 29 ++++++++++++------- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 22 ++++++++------ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 8aa5b01bc..843943fda 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -316,22 +316,29 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); $self->helper->insertObject($target, [$bid[0]]); }elsif(@tid == 2){#questions can be moved to any section, but a pushed to the end of a new section. if(@bid == 1){#moved to a new section or head of current section - if($bid[0] == $tid[0]){#moved to top of current section + if($bid[0] == $tid[0]){ + #moved to top of current section $bid[1] = -1; }else{ + #else move to the end of the selected section $bid[1] = $#{$self->helper->questions([$bid[0]])}; } } $self->helper->insertObject($target, [$bid[0],$bid[1]]); }elsif(@tid == 3){#answers can only be rearranged in the same question - if(@$bid == 2 and $bid[1] == $tid[1]){ + if(@bid == 2 and $bid[1] == $tid[1]){ $bid[2] = -1; $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); - }elsif(@$bid == 3){ + }elsif(@bid == 3){ $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); }else{ - $self->helper->insertObject($target, \@tid);#else put it back where it was + #else put it back where it was + $self->helper->insertObject($target, \@tid); + } } + + $self->saveSurveyJSON(); +$self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->helper->freeze()); return $self->www_loadSurvey({address => $address}); } @@ -353,13 +360,13 @@ $self->session->errorHandler->error("Entering loadSurvey"); } } my $message = defined $options->{message} ? $options->{message} : ''; -$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); +#$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); my $var = defined $options->{var} ? $options->{var} : $self->helper->getEditVars($address); $self->session->errorHandler->error("Got edit vars"); $self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); my $editHtml; -$self->session->errorHandler->error("The edit vars:".Dumper $var); +#$self->session->errorHandler->error("The edit vars:".Dumper $var); if($var->{type} eq 'section'){ $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); }elsif($var->{type} eq 'question'){ @@ -369,7 +376,7 @@ $self->session->errorHandler->error("The edit vars:".Dumper $var); my %buttons; my $data = $self->helper->getDragDropList($address); -$self->session->errorHandler->error("The DD data :".Dumper $data); +#$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; my ($scount,$qcount,$acount) = (-1,-1,-1); my $lastType; @@ -449,7 +456,7 @@ $self->session->errorHandler->error("The DD data :".Dumper $data); $buttons{'section'} = "$lastId{section}"; } } -$self->session->errorHandler->error($html); +#$self->session->errorHandler->error($html); #address is the address of the focused object #buttons are the data to create the Add buttons @@ -458,11 +465,11 @@ $self->session->errorHandler->error($html); #ids is a list of all ids passed in which are draggable (for adding events) #type is the object type my $return = {"address",$address,"buttons",\%buttons,"edithtml",$editHtml,"ddhtml",$html,"ids",\@ids,"type",$var->{type}}; -$self->session->errorHandler->error(Dumper $return); +#$self->session->errorHandler->error(Dumper $return); eval{ - $self->session->errorHandler->error(encode_json($return)); +# $self->session->errorHandler->error(encode_json($return)); }; -$self->session->errorHandler->error($@); +#$self->session->errorHandler->error($@); $self->session->errorHandler->error("Returning from loadSurvey"); return encode_json($return); diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index a46bad487..9b5a1c848 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -58,11 +58,11 @@ eval{ if($address->[0] == $i){ for(my $x = 0; $x <= $#{$self->questions($address)}; $x++){ -$self->log("dd'ing questions".$#{$self->questions}); +#$self->log("dd'ing questions".$#{$self->questions}); push(@data,{text=>$self->question([$i,$x])->{text}, type=>'question'}); if($address->[1] == $x){ for(my $y = 0; $y <= $#{$self->answers($address)}; $y++){ -$self->log("dd'ing answers".$#{$self->answers}); +#$self->log("dd'ing answers".$#{$self->answers}); push(@data,{text=>$self->answer([$i,$x,$y])->{text}, type=>'answer'}); } } @@ -71,7 +71,7 @@ $self->log("dd'ing answers".$#{$self->answers}); } }; $self->log($@); -$self->log('finished dding'); +#$self->log('finished dding'); return \@data; } @@ -166,25 +166,29 @@ $self->log("$object didn't exist"); # ref should contain all the information for the new sub insertObject{ my ($self,$object,$address) = @_; - +$self->log("Inserting ".join(',',@$address)); if(@$address == 1){ splice(@{$self->sections($address)},$$address[0] + 1, 0, $object); - }elsif(@$address == 2) + }elsif(@$address == 2){ splice(@{$self->questions($address)},$$address[1] + 1, 0, $object); - }elsif(@$address == 3) + }elsif(@$address == 3){ splice(@{$self->answers($address)},$$address[2] + 1, 0, $object); } +$self->log("Finished inserting "); } sub remove{ my ($self,$address,$movingOverride) = @_; if(@$address == 1){ - splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0 and ! defined $movingOverride);#can't delete the first section +$self->log("removing here $$address[0] :".$#{$self->sections}) if($$address[0] != 0 or defined $movingOverride);; + splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0 or defined $movingOverride);#can't delete the first section +$self->log("removing here $$address[0] :".$#{$self->sections}); }elsif(@$address == 2){ -$self->log('removing here'); +$self->log("removing here $$address[0] $$address[1]"); splice(@{$self->questions($address)},$$address[1],1); - }elsif(@$address == 3){ +$self->log("removing here $$address[0] $$address[1] $$address[2]"); + splice(@{$self->answers($address)},$$address[2],1); } } From 2de1d83d65df88a1416cb07343b41e5dcc016947 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 30 Sep 2008 19:25:38 +0000 Subject: [PATCH 38/64] Editor is done except for prettifying it, but you can now build a survey with the new data layer --- lib/WebGUI/Asset/Wobject/Survey.pm | 82 +++++++------------ lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 34 +++++++- www/extras/wobject/Survey/editsurvey.js | 17 ++-- www/extras/wobject/Survey/surveyedit.css | 2 +- 4 files changed, 73 insertions(+), 62 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 843943fda..99c2f3c7c 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -110,10 +110,17 @@ sub definition { questionEditTemplateId => { tab => 'display', fieldType => 'template', - label => "Section Edit Tempalte", + label => "Question Edit Tempalte", defaultValue => 'wAc4azJViVTpo-2NYOXWvg', namespace => 'Survey/Edit', }, + answerEditTemplateId => { + tab => 'display', + fieldType => 'template', + label => "Answer Edit Tempalte", + defaultValue => 'AjhlNO3wZvN5k4i4qioWcg', + namespace => 'Survey/Edit', + } ); push(@{$definition}, { @@ -183,10 +190,12 @@ sub loadSurveyJSON{ my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); $self->session->errorHandler->error("LOADING JSON"); - +eval{ $self->{jsonHelper} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); +}; +$self->session->errorHandler->error("Loaded JSON".$@); -$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->helper->freeze); +#$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->helper->freeze); } #------------------------------------------------------------------- @@ -206,7 +215,7 @@ sub saveSurveyJSON{ my $data = $self->helper->freeze(); -$self->session->errorHandler->error("Saving THIS DATA\n\n".$data); +$self->session->errorHandler->error("Saving THIS DATA");#\n\n".$data); $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -315,7 +324,14 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); $bid[0] = -1 if(! defined $bid[0]); $self->helper->insertObject($target, [$bid[0]]); }elsif(@tid == 2){#questions can be moved to any section, but a pushed to the end of a new section. - if(@bid == 1){#moved to a new section or head of current section + if($bid[0] !~ /\d/){ + $bid[0] = $tid[0]; + $bid[1] = $tid[1]; + }elsif(@bid == 1){#moved to a new section or head of current section + if($bid[0] !~ /\d/){ + $bid[0] = $tid[0]; + $bid[1] = $tid[1]; + } if($bid[0] == $tid[0]){ #moved to top of current section $bid[1] = -1; @@ -363,18 +379,25 @@ $self->session->errorHandler->error("Entering loadSurvey"); #$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); my $var = defined $options->{var} ? $options->{var} : $self->helper->getEditVars($address); -$self->session->errorHandler->error("Got edit vars"); +$self->session->errorHandler->error("Got edit vars".Dumper $self->helper->freeze); $self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); my $editHtml; -#$self->session->errorHandler->error("The edit vars:".Dumper $var); +$self->session->errorHandler->error("The edit vars:".Dumper $var); if($var->{type} eq 'section'){ $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); }elsif($var->{type} eq 'question'){ $editHtml = $self->processTemplate($var,$self->get("questionEditTemplateId")); + }elsif($var->{type} eq 'answer'){ + $editHtml = $self->processTemplate($var,$self->get("answerEditTemplateId")); } -#$self->session->errorHandler->error("The HTML :$editHtml"); +$self->session->errorHandler->error("The HTML :$editHtml"); my %buttons; + $buttons{question} = $$address[0]; + if(@$address == 2 or @$address == 3){ + $buttons{answer} = "$$address[0]-$$address[1]"; + } + my $data = $self->helper->getDragDropList($address); #$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; @@ -388,26 +411,17 @@ $self->session->errorHandler->error("Loaded beginning params ".join(',',@$addres if($_->{type} eq 'section'){ $lastId{section} = ++$scount; if($lastType eq 'answer'){ - $html .= "
          "; - $buttons{answer} = "$lastId{section}-$lastId{question}"; $a = 1; } elsif($lastType eq 'question'){ - $html .= "
          "; - $buttons{'question'} = "$lastId{section}-$lastId{question}"; $q = 1; } $html .= "
        • S". ($scount + 1). ": $_->{text}<\/li>
          \n"; push(@ids,$scount); - $lastType = 'section'; - $qcount = -1; - $acount = -1; } elsif($_->{type} eq 'question'){ $lastId{question} = ++$qcount; if($lastType eq 'answer'){ - $html .= "
          "; - $buttons{answer} = "$lastId{section}-$lastId{question}"; $a = 1; } $html .= "
        • Q". ($qcount + 1). ": $_->{text}<\/li>
          \n"; @@ -422,40 +436,6 @@ $self->session->errorHandler->error("Loaded beginning params ".join(',',@$addres $lastType = 'answer'; } } - if($lastType eq 'answer'){ - if(!$a){ - $html .= "
          "; - $buttons{'answer'} = "$lastId{section}-$lastId{question}"; - } - if(!$b){ - $html .= "
          "; - $buttons{'question'} = "$lastId{section}"; - } - if(!$s){ - $html .= "
          "; - $buttons{'section'} = "$lastId{section}"; - } - } - elsif($lastType eq 'question'){ - if(!$b){ - $html .= "
          "; - $buttons{'question'} = "$lastId{section}"; - } - if(!$s){ - $html .= "
          "; - $buttons{'section'} = "$lastId{section}"; - } - } - elsif($lastType eq 'section'){ - if(!$b){ - $html .= "
          "; - $buttons{'question'} = "$lastId{section}"; - } - if(!$s){ - $html .= "
          "; - $buttons{'section'} = "$lastId{section}"; - } - } #$self->session->errorHandler->error($html); #address is the address of the focused object diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 9b5a1c848..64f39bff2 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -13,7 +13,6 @@ sub new{ my $temp = decode_json($json) if defined $json; $self->{sections} = defined $temp->{sections} ? $temp->{sections} : []; $self->{survey} = defined $temp->{survey} ? $temp->{survey} : {}; - $self->{gotoMap} = defined $temp->{gotoMap} ? $temp->{gotoMap} : {}; bless($self,$class); if(@{$self->sections} == 0){ $self->newObject([]); @@ -25,7 +24,6 @@ sub freeze{ my %temp; $temp{sections} = $self->{sections}; $temp{survey} = $self->{survey}; - $temp{gotoMap} = $self->{gotoMap}; return encode_json(\%temp); } sub newObject{ @@ -40,7 +38,7 @@ sub newObject{ return $address; }elsif(@$address == 2){ push(@{$self->answers($address)}, $self->newAnswer($address)); - $$address[2] = $#{$self->answers($$address)}; + $$address[2] = $#{$self->answers($address)}; return $address; } } @@ -138,6 +136,13 @@ sub getQuestionEditVars{ return \%var; } sub getAnswerEditVars{ + my $self = shift; + my $address = shift; + my $object = $self->answer($address); + my %var = %{$object}; + $var{id} = $address->[0]."-".$address->[1]."-".$address->[2]; + $var{displayed_id} = $address->[2]+1; + return \%var; } sub update{ @@ -157,6 +162,12 @@ $self->log("$object didn't exist"); push(@{$self->questions($address)},$object); } }elsif(@$address == 3){ + $object = $self->answer($address); + if(! defined $object){ +$self->log("$object didn't exist"); + $object = $self->newAnswer(); + push(@{$self->answers($address)},$object); + } } for my $key(keys %$object){ $object->{$key} = $ref->{$key} if(defined $$ref{$key}); @@ -234,6 +245,23 @@ sub newQuestion{ return \%members; } sub newAnswer{ + my %members = ( + 'text', '', + 'verbatim',0, + 'textCols',10, + 'textRows',5, + 'goto','', + 'recordedAnswer','', + 'isCorrect',1, + 'min',1, + 'max',10, + 'step',1, + 'value',1, + 'terminal',0, + 'terminalUrl','', + 'type','answer' + ); + return \%members; } diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js index 1315acecc..79cf25f0f 100644 --- a/www/extras/wobject/Survey/editsurvey.js +++ b/www/extras/wobject/Survey/editsurvey.js @@ -56,16 +56,19 @@ console.log('adding handler for '+ d.ids[x]); } //add the add object buttons - if(d.buttons['section']){ - var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"newSection" }); +// if(d.buttons['section']){ + document.getElementById('addSection').innerHTML = ''; + document.getElementById('addQuestion').innerHTML = ''; + document.getElementById('addAnswer').innerHTML = ''; + var button = new YAHOO.widget.Button({ label:"Add Section", id:"addsection", container:"addSection" }); button.on("click", this.addSection); - } - if(d.buttons['question']){ - var button = new YAHOO.widget.Button({ label:"Add Question", id:"addquestion", container:"newQuestion" }); +// } +// if(d.buttons['question']){ + var button = new YAHOO.widget.Button({ label:"Add Question", id:"addquestion", container:"addQuestion" }); button.on("click", this.addQuestion,d.buttons['question']); - } +// } if(d.buttons['answer']){ - var button = new YAHOO.widget.Button({ label:"Add Answer", id:"addanswer", container:"newAnswer" }); + var button = new YAHOO.widget.Button({ label:"Add Answer", id:"addanswer", container:"addAnswer" }); button.on("click", this.addAnswer,d.buttons['answer']); } diff --git a/www/extras/wobject/Survey/surveyedit.css b/www/extras/wobject/Survey/surveyedit.css index 1d6d48e21..0050e6c20 100644 --- a/www/extras/wobject/Survey/surveyedit.css +++ b/www/extras/wobject/Survey/surveyedit.css @@ -46,7 +46,7 @@ div.entry { ul.draglist { position: relative; - width: 300px; + width: 340px; background: #f7f7f7; border: 1px solid gray; list-style: none; From c2fc74ae85606b761a4a01414fe40cb8667640ce Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 14 Oct 2008 03:07:53 +0000 Subject: [PATCH 39/64] Need to finish the template packages, reports, fix up a small branching issue, copying, and an upgrade path. --- lib/WebGUI/Asset/Wobject/Survey.pm | 978 +++--------------- lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm | 60 -- .../Asset/Wobject/Survey/QuestionJSON.pm | 101 -- .../Asset/Wobject/Survey/SectionJSON.pm | 155 --- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 118 ++- www/extras/wobject/Survey/administersurvey.js | 90 +- .../wobject/Survey/administersurvey/comm.js | 1 + www/extras/wobject/Survey/survey.css | 1 - 8 files changed, 329 insertions(+), 1175 deletions(-) delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 99c2f3c7c..7b81ad953 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -184,18 +184,18 @@ Loads the survey collateral into memory so that the survey objects can be create sub loadSurveyJSON{ my $self = shift; + my $jsonHash = shift; + if(defined $self->survey){return;}#already loaded - if(defined $self->helper){return;}#already loaded - - my $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]); + $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]) if(! defined $jsonHash); $self->session->errorHandler->error("LOADING JSON"); eval{ - $self->{jsonHelper} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); + $self->{survey} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); }; $self->session->errorHandler->error("Loaded JSON".$@); -#$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->helper->freeze); +#$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->survey->freeze); } #------------------------------------------------------------------- @@ -205,15 +205,15 @@ $self->session->errorHandler->error("Loaded JSON".$@); Saves the survey collateral to the DB =cut -sub helper{ return shift->{jsonHelper}; } -sub littleBuddy{ return shift->{jsonHelper}; } -sub allyourbases{ return shift->{jsonHelper}; } -sub helpmehelpme{ return shift->{jsonHelper}; } +sub survey{ return shift->{survey}; } +sub littleBuddy{ return shift->{survey}; } +sub allyourbases{ return shift->{survey}; } +sub helpmehelpme{ return shift->{survey}; } sub saveSurveyJSON{ my $self = shift; - my $data = $self->helper->freeze(); + my $data = $self->survey->freeze(); $self->session->errorHandler->error("Saving THIS DATA");#\n\n".$data); @@ -256,7 +256,7 @@ $self->session->errorHandler->error("Deleting ".join(',',@address)); } $self->session->errorHandler->error("Updating ".join(',',@address)); #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. - my $message = $self->helper->update(\@address,$responses); + my $message = $self->survey->update(\@address,$responses); $self->saveSurveyJSON(); @@ -270,7 +270,7 @@ sub deleteObject{ $self->loadSurveyJSON(); - my $message = $self->helper->remove($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + my $message = $self->survey->remove($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. $self->saveSurveyJSON(); #The parent address of the deleted object is returned. @@ -294,7 +294,7 @@ $self->session->errorHandler->error("Address is:".join(',', @inAddress)); $self->loadSurveyJSON(); #Don't save after this as the new object should not stay in the survey - my $address = $self->helper->newObject(\@inAddress); + my $address = $self->survey->newObject(\@inAddress); $self->session->errorHandler->error("New objects address is:".join(',', @$address)); @@ -316,13 +316,13 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); my @bid = split/-/,$p->{before}->{id}; $self->loadSurveyJSON(); - my $target = $self->helper->getObject(\@tid); - $self->helper->remove(\@tid,1); + my $target = $self->survey->getObject(\@tid); + $self->survey->remove(\@tid,1); my $address = [0]; if(@tid == 1){ $#bid = 0;#sections can only be inserted after another section so chop off the question and answer portion of $bid[0] = -1 if(! defined $bid[0]); - $self->helper->insertObject($target, [$bid[0]]); + $self->survey->insertObject($target, [$bid[0]]); }elsif(@tid == 2){#questions can be moved to any section, but a pushed to the end of a new section. if($bid[0] !~ /\d/){ $bid[0] = $tid[0]; @@ -337,24 +337,24 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); $bid[1] = -1; }else{ #else move to the end of the selected section - $bid[1] = $#{$self->helper->questions([$bid[0]])}; + $bid[1] = $#{$self->survey->questions([$bid[0]])}; } } - $self->helper->insertObject($target, [$bid[0],$bid[1]]); + $self->survey->insertObject($target, [$bid[0],$bid[1]]); }elsif(@tid == 3){#answers can only be rearranged in the same question if(@bid == 2 and $bid[1] == $tid[1]){ $bid[2] = -1; - $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); + $self->survey->insertObject($target, [$bid[0],$bid[1],$bid[2]]); }elsif(@bid == 3){ - $self->helper->insertObject($target, [$bid[0],$bid[1],$bid[2]]); + $self->survey->insertObject($target, [$bid[0],$bid[1],$bid[2]]); }else{ #else put it back where it was - $self->helper->insertObject($target, \@tid); + $self->survey->insertObject($target, \@tid); } } $self->saveSurveyJSON(); -$self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->helper->freeze()); +$self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->survey->freeze()); return $self->www_loadSurvey({address => $address}); } @@ -377,12 +377,12 @@ $self->session->errorHandler->error("Entering loadSurvey"); } my $message = defined $options->{message} ? $options->{message} : ''; #$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); - my $var = defined $options->{var} ? $options->{var} : $self->helper->getEditVars($address); + my $var = defined $options->{var} ? $options->{var} : $self->survey->getEditVars($address); -$self->session->errorHandler->error("Got edit vars".Dumper $self->helper->freeze); -$self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); +#$self->session->errorHandler->error("Got edit vars".Dumper $self->survey->freeze); +#$self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); my $editHtml; -$self->session->errorHandler->error("The edit vars:".Dumper $var); +#$self->session->errorHandler->error("The edit vars:".Dumper $var); if($var->{type} eq 'section'){ $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); }elsif($var->{type} eq 'question'){ @@ -390,7 +390,7 @@ $self->session->errorHandler->error("The edit vars:".Dumper $var); }elsif($var->{type} eq 'answer'){ $editHtml = $self->processTemplate($var,$self->get("answerEditTemplateId")); } -$self->session->errorHandler->error("The HTML :$editHtml"); +#$self->session->errorHandler->error("The HTML :$editHtml"); my %buttons; $buttons{question} = $$address[0]; @@ -398,7 +398,7 @@ $self->session->errorHandler->error("The HTML :$editHtml"); $buttons{answer} = "$$address[0]-$$address[1]"; } - my $data = $self->helper->getDragDropList($address); + my $data = $self->survey->getDragDropList($address); #$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; my ($scount,$qcount,$acount) = (-1,-1,-1); @@ -455,94 +455,6 @@ $self->session->errorHandler->error("Returning from loadSurvey"); return encode_json($return); } -#------------------------------------------------------------------- -sub getSpecificSection{ - my $self = shift; - my $Id = shift; - my $responseId = shift; - my $section = $self->session->db->quickHashRef( - "select * from Survey_section where Survey_sectionId = ?", - [ $Id ]); - if($responseId){ - $section = $self->fillSectionTextVariables($responseId,$section); - } - - return $section; -} -#------------------------------------------------------------------- -sub getSpecificQuestion{ - my $self = shift; - my $Id = shift; - return $self->session->db->quickHashRef( - "select * from Survey_question where Survey_questionId = ?", - [ $Id ]); -} -#------------------------------------------------------------------- -sub getSpecificAnswer{ - my $self = shift; - my $Id = shift; - return $self->session->db->quickHashRef( - "select * from Survey_answer where Survey_answerId = ?", - [ $Id ]); -} - -#------------------------------------------------------------------- -sub getAnswers{ - my $self = shift; - my $qId = shift; - if(! $qId){ return;} - return $self->session->db->buildArrayRefOfHashRefs( - "select substr(answerText,1,40) as text, Survey_answerId, Survey_questionId - from Survey_answer - where Survey_questionId = ? - order by sequenceNumber ASC" - ,[ $qId ]); -} - -#------------------------------------------------------------------- -sub getQuestions{ - my $self = shift; - my $sId = shift; - if(! $sId){ return;} - return $self->session->db->buildArrayRefOfHashRefs( - "select substr(questionText,1,40) as text, Survey_questionId, Survey_sectionId - from Survey_question - where Survey_sectionId = ? - order by sequenceNumber ASC" - ,[ $sId ]); -} - - - - -#------------------------------------------------------------------- -sub getSections{ - my $self = shift; - return $self->session->db->buildArrayRefOfHashRefs( - "select Survey_sectionId, sectionName - from Survey_section - where assetId = ? - order by sequenceNumber ASC" - ,[ $self->getId() ]); -} - -#------------------------------------------------------------------- -sub getFirstSection{ - my $self = shift; - $self->session->errorHandler->warn("In get first section with assid as ".$self->getId()); - return $self->session->db->quickScalar( - "select Survey_sectionId from Survey_section where assetId = ? order by sequenceNumber asc", - [ $self->getId() ]); -} - -#------------------------------------------------------------------- -sub insertSection{ - my $self = shift; - my $data = shift;#array ref - $self->session->db->write("insert into Survey_section values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)",$data); -} - - #------------------------------------------------------------------- =head2 prepareView ( ) @@ -567,9 +479,6 @@ sub prepareView { sub purge { my $self = shift; - $self->session->db->write("delete from Survey_answer where assetId = ?",[$self->getId()]); - $self->session->db->write("delete from Survey_question where assetId = ?",[$self->getId()]); - $self->session->db->write("delete from Survey_section where assetId = ?",[$self->getId()]); $self->session->db->write("delete from Survey_response where assetId = ?",[$self->getId()]); $self->session->db->write("delete from Survey_questionResponse where assetId = ?",[$self->getId()]); return $self->SUPER::purge; @@ -638,11 +547,18 @@ sub www_view { sub www_takeSurvey{ my $self = shift; my %var; -$self->session->errorHandler->warn("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); -# my $out = $self->processStyle($self->processTemplate(\%var,$self->get("surveyEditTemplateId"))); + my $out = $self->processTemplate(\%var,$self->get("surveyTakeTemplateId")); - my $responseId = $self->getResponseId(); -# if(!$responseId){return $self->surveyEnd();} + + eval{ + my $responseId = $self->getResponseId(); + if(!$responseId){ +$self->session->errorHandler->error("\n\nIn takeSurvey with no reponseId $responseId"); + return $self->surveyEnd(); + } + }; + + $self->session->errorHandler->error($@) if defined $@; return $out; } @@ -663,65 +579,46 @@ sub www_submitQuestions{ my $responseId = $self->getResponseId(); if(!$responseId){return $self->surveyEnd();} - $self->session->errorHandler->warn("\n\nIn submitQuestions with reponseId $responseId"); + $self->session->errorHandler->error("\n\nIn submitQuestions with reponseId $responseId"); my $responses = $self->session->form->paramsHashRef(); - +$self->session->errorHandler->error(Dumper $responses); delete $$responses{'func'}; -########### - -# GO THROUGH ALL RESPONSES LOOKING FOR VERBATIMS AND ADD THEM ACCORDINGLY - -####### - my @goodResponses = keys %$responses;#load everything. if(@goodResponses == 0){##nothing to load - return $self->www_loadQuestions($responseId); + return $self->www_loadQuestions(); } - my $sql = "select max(answerOrder) from Survey_questionResponse where Survey_responseId = ?"; - my $lastOrder = $self->session->db->quickScalar($sql, [$responseId]); + $self->loadBothJSON(); + my $termInfo = $self->response->recordResponses($responses); - #handle comments - foreach my $r(@goodResponses){ - if($r =~ /(.*?)comment$/){ - my $t = $1; -$self->session->errorHandler->warn("Inserting a comment: key is $r regex key is $t responseid is $responseId and value is ".$$responses{$r}); - $self->session->db->write("insert into Survey_questionResponseComment values(?,?,?,?)",[$self->getId(),$responseId,$t,$$responses{$r}]); - } + $self->saveResponseJSON(); + + if($termInfo->[0]){ + return $self->surveyEnd($termInfo->[1]); } - if(!$lastOrder){$lastOrder = 0;} + return $self->www_loadQuestions(); - #get order of responses ##Comments will be ignored in this query as they use an id of the questionId concatted with 'comment' which will never match a Survey_answerId - my $orderOf = $self->session->db->buildArrayRefOfHashRefs("select distinct(a.Survey_answerId), q.questionType - from Survey_answer a, Survey_question q where a.Survey_answerId in (". - (join (',',map("?",@goodResponses))). - ") and a.Survey_questionId = q.Survey_questionId order by q.sequenceNumber ASC", - \@goodResponses); -use Data::Dumper; -$self->session->errorHandler->warn("OrderOf".Dumper $orderOf); -$self->session->errorHandler->warn("goodReponses".Dumper @goodResponses); - my $files = 0; - for my $id(@$orderOf){ +# for my $id(@$orderOf){ #if a file upload, write to disk - my $path; - if($id->{'questionType'} eq 'File Upload'){ - $files = 1; - my $storage = WebGUI::Storage->create($self->session); - my $filename = $storage->addFileFromFormPost( $id->{'Survey_answerId'} ); - $path = $storage->getPath($filename); - } -$self->session->errorHandler->warn("Inserting a response ".$id->{'Survey_answerId'}." $responseId, $path, ".$$responses{$id->{'Survey_answerId'}}); - $self->session->db->write("insert into Survey_questionResponse - select ?, Survey_sectionId, Survey_questionId, Survey_answerId, ?, ?, ?, now(), ?, ? from Survey_answer where Survey_answerId = ?", - [$self->getId(), $responseId, $$responses{ $id->{'Survey_answerId'} }, '', $path, ++$lastOrder, $id->{'Survey_answerId'}]); - } +# my $path; +# if($id->{'questionType'} eq 'File Upload'){ +# $files = 1; +# my $storage = WebGUI::Storage->create($self->session); +# my $filename = $storage->addFileFromFormPost( $id->{'Survey_answerId'} ); +# $path = $storage->getPath($filename); +# } +#$self->session->errorHandler->error("Inserting a response ".$id->{'Survey_answerId'}." $responseId, $path, ".$$responses{$id->{'Survey_answerId'}}); +# $self->session->db->write("insert into Survey_questionResponse +# select ?, Survey_sectionId, Survey_questionId, Survey_answerId, ?, ?, ?, now(), ?, ? from Survey_answer where Survey_answerId = ?", +# [$self->getId(), $responseId, $$responses{ $id->{'Survey_answerId'} }, '', $path, ++$lastOrder, $id->{'Survey_answerId'}]); +# } if($files){ ##special case, need to check for more questions in section, if not, more current up one my $lastA = $self->getLastAnswerInfo($responseId); @@ -747,152 +644,44 @@ $self->session->errorHandler->warn("Inserting a response ".$id->{'Survey_answerI #------------------------------------------------------------------- sub www_loadQuestions{ my $self=shift; - my $responseId = shift; - $self->session->errorHandler->warn("\n\n\n\n\t\t\t\t\t\t\t\t\t---In loadQuestions with responseId $responseId"); + $self->session->errorHandler->error("\n\n\n\n\t\t\t\t\t\t\t\t\t---In loadQuestions"); if(!$self->canTakeSurvey()){ return $self->surveyEnd(); -# return encode_json({"type","FAIL LOGIN"}); } - - my $fromSubmit = 0; - - if($responseId){ -$self->session->errorHandler->warn("Setting fromSubmit to true"); - $fromSubmit = 1; - }else{ - $responseId = $self->getResponseId(); - if(!$responseId){ + +$self->session->errorHandler->error("Can take survey"); + + my $responseId = $self->getResponseId();#also loads the survey and response + if(!$responseId){ return $self->surveyEnd(); - } } - my $currentSection = $self->getCurrentSection($responseId); - if(!$currentSection){ - $currentSection = $self->getFirstSection(); + my $questions = $self->response->nextQuestions(); +$self->session->errorHandler->error("Load Questions had ".@$questions." questions"); + + if(@$questions < 1){ + return $self->surveyEnd(); } -$self->session->errorHandler->warn("Current Section is $currentSection"); - - my $lastAfj = $self->getLastAnswerInfoForJump($responseId); - -$self->session->errorHandler->warn("Last Answer for jump was for section: ".$lastAfj->{'Survey_sectionId'}); - - if(exists $lastAfj->{'Survey_sectionId'} and $lastAfj->{'Survey_sectionId'} eq $currentSection){ - my ($sectionId,$questionId) = $self->getJumpTo($lastAfj->{'Survey_answerId'}); - if($sectionId){ - my $section = $self->getSpecificSection($sectionId,$responseId); - my $questions = $self->getQuestionsAndAnswers($responseId,$section,$questionId); - $self->setCurrentSection($responseId,$sectionId); -$self->session->errorHandler->warn("Jump"); - return $self->showQuestions($section,$questions); - } -$self->session->errorHandler->warn("No Jump"); - } - - - my ($section,$questions,$questionId); - - my $lastA = $self->getLastAnswerInfo($responseId); -$self->session->errorHandler->warn("Last Answer was for section: ".$lastA->{'Survey_sectionId'}); - - #if we're called from submit, see if there are anymore questions in section, show them, else go to next section. If not called, then show this section. - $section = $self->getSpecificSection($currentSection,$responseId); - if(exists $lastA->{'Survey_sectionId'} and $lastA->{'Survey_sectionId'} eq $currentSection){ - $questionId = $self->getNextQuestionId($lastA->{'Survey_questionId'}); - } - - if($section->{'randomizeQuestions'} and $self->sectionHasQuestions($section->{'Survey_sectionId'})){#check to see if any questions are left in section to ask -$self->session->errorHandler->warn("Random Questions Section ".$section->{'sequenceNumber'}); - my $questionsAnsweredInSection = $self->questionsAnsweredInSection($section->{'Survey_sectionId'},$responseId); - my $questionsInSection = $self->questionsInSection($section->{'Survey_sectionId'}); - if($questionsInSection == $questionsAnsweredInSection){ -$self->session->errorHandler->warn("1"); - if($section->{'terminal'}){ -$self->session->errorHandler->warn("1-1"); - return $self->surveyEnd($responseId,$section->{'terminalURL'}); - } - my $nextSection = $self->getNextSection($section->{'Survey_sectionId'}); - if(! $nextSection){ -$self->session->errorHandler->warn("1-2"); - return $self->surveyEnd($responseId,$section->{'terminalURL'}); - }else{ -$self->session->errorHandler->warn("1-3"); - $self->setCurrentSection($responseId,$nextSection); - return $self->www_loadQuestions();#We don't pass in the responseId so that it we think it is refresh and are not looking for previous questions in this section - } - } -$self->session->errorHandler->warn("2"); - $questions = $self->getRandomQuestionsAndAnswers($section,$responseId); - } - elsif($fromSubmit){ -$self->session->errorHandler->warn("Not Random"); - if(!$questionId and $section->{'terminal'}){ -$self->session->errorHandler->warn("1"); - return $self->surveyEnd($responseId,$section->{'terminalURL'}); - }elsif(!$questionId){ -$self->session->errorHandler->warn("2"); - $currentSection = $self->getNextSection($currentSection); - if(!$currentSection){ -$self->session->errorHandler->warn("2-2 with $responseId"); - return $self->surveyEnd($responseId,$section->{'terminalURL'}); - }else{ -$self->session->errorHandler->warn("2-3"); - $self->setCurrentSection($responseId,$currentSection); -# return $self->www_loadQuestions($responseId); - return $self->www_loadQuestions(); -# $section = $self->getSpecificSection($currentSection); -# $questions = $self->getQuestionsAndAnswers($responseId,$section); - } - }else{ -$self->session->errorHandler->warn("3"); - $section = $self->getSpecificSection($currentSection,$responseId); - $questions = $self->getQuestionsAndAnswers($responseId,$section,$questionId); - } - }else{ -$self->session->errorHandler->warn("4"); - if($questionId){ -$self->session->errorHandler->warn("4-5"); - $questions = $self->getQuestionsAndAnswers($responseId,$section,$questionId); - }else{ -$self->session->errorHandler->warn("4-6"); - $questions = $self->getQuestionsAndAnswers($responseId,$section); - } - if($self->sectionHasQuestions($currentSection) and @$questions == 0){ -$self->session->errorHandler->warn("5"); - if($section->{'terminal'}){ -$self->session->errorHandler->warn("5-1"); - return $self->surveyEnd($responseId,$section->{'terminalURL'}); - } -$self->session->errorHandler->warn("5-2"); - $currentSection = $self->getNextSection($currentSection); - $section = $self->getSpecificSection($currentSection,$responseId); - $questions = $self->getQuestionsAndAnswers($responseId,$section); - } - } - -$self->session->errorHandler->warn("6"); - $self->setCurrentSection($responseId,$currentSection); - return $self->showQuestions($section,$questions); - -} - - - - -sub sectionHasQuestions{ - my $self=shift; - my $sectionId = shift; - return $self->session->db->quickScalar("select '1' from Survey_question where Survey_sectionId = ? limit 1",[$sectionId]); + my $section = $self->response->nextSection(); +#$self->session->errorHandler->error(Dumper $section); + + #return $self->prepareShowSurveyTemplate($section,$questions); + $section->{id} = $self->response->nextSectionId(); + my $text = $self->prepareShowSurveyTemplate($section,$questions); +$self->session->errorHandler->error("Load Questions returning"); + return $text; } +#------------------------------------------------------------------- #called when the survey is over. sub surveyEnd{ my $self = shift; - my $responseId = shift; my $url = shift; -$self->session->errorHandler->warn("--SurveyEnd There wasn't a responseId $responseId"); +$self->session->errorHandler->error("-------SurveyEnd $url"); + my $responseId = $self->getResponseId();#also loads the survey and response # $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]); $self->session->db->setRow("Survey_response","Survey_responseId",{ Survey_responseId=>$responseId, @@ -907,14 +696,15 @@ $self->session->errorHandler->warn("--SurveyEnd There wasn't a responseId $respo $url = "/"; } } -$self->session->errorHandler->warn("-------SurveyEnd $url"); +$self->session->errorHandler->error("-------SurveyEnd $url"); return encode_json({"type","forward","url",$url}); } +#------------------------------------------------------------------- #sends the processed template and questions structure to the client -sub showQuestions{ +sub prepareShowSurveyTemplate{ my ($self,$section,$questions) = @_; my %multipleChoice = ('Multiple Choice',1,'Gender',1,'Yes/No',1,'True/False',1,'Ideology',1, 'Race',1,'Party',1,'Education',1 ,'Scale',1,'Agree/Disagree',1,'Oppose/Support',1,'Importance',1, 'Likelihood',1,'Certainty',1,'Satisfaction',1,'Confidence',1, @@ -925,10 +715,11 @@ sub showQuestions{ my %fileUpload = ('File Upload',1); my %hidden = ('Hidden',1); +$self->session->errorHandler->error("Preparing to insert question for $#$questions questions"); foreach my $q(@$questions){ - +$self->session->errorHandler->error("Question Text is: ".$q->{text}); if($fileUpload{$$q{'questionType'}}){ $q->{'fileLoader'} = 1; } - elsif($text{$$q{'questionType'}}){ $q->{'text'} = 1; } + elsif($text{$$q{'questionType'}}){ $q->{'textType'} = 1; } elsif($hidden{$$q{'questionType'}}){ $q->{'hidden'} = 1; } elsif($multipleChoice{$$q{'questionType'}}){ $q->{'multipleChoice'} = 1; @@ -950,316 +741,109 @@ sub showQuestions{ if($$q{'verticalDisplay'}){ $$q{'verts'} = "

          "; $$q{'verte'} = "

          "; } } - $section->{'questions'} = $questions; - my $survey = $self->get('surveyQuestionsId'); - -#$self->session->errorHandler->warn(Dumper $section); -#$self->session->errorHandler->warn(Dumper $survey); + +#$self->session->errorHandler->error(Dumper $section); my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); -use Data::Dumper; -$self->session->errorHandler->warn("Sending Back"); -#$self->session->errorHandler->warn("$out"); - return encode_json({"type","displayquestions","section",$section,"questions",$questions,"html",$out}); } -#Answer text for inserting into quesiton text -sub getPreviousAnswer{ - my ($self,$responseId,$var) = @_; - $var =~ s/^\[\[//g; - $var =~ s/\]\]$//g; -$self->session->errorHandler->warn("getPreviousAnswer for $var"); - my $ref = $self->session->db->buildArrayRefOfHashRefs("select a.answerText, qa.response from Survey_questionResponse qa, Survey_question q, Survey_answer a - where q.questionVariable = ? and q.Survey_questionId = a.Survey_questionId and a.Survey_answerId = qa.Survey_answerId - and qa.Survey_responseId = ? and qa.response != '' and qa.response is not null limit 1",[$var,$responseId]); - my $string; -use Data::Dumper; -$self->session->errorHandler->warn("getPreviousAnswer ".Dumper $ref); - if(@$ref < 1){ - $string = "PREVIOUS ANSWSER"; - }else{ - if($$ref[0]->{'answerText'} ne ""){ - $string = $$ref[0]->{'answerText'}; - }else{ - $string = $$ref[0]->{'response'}; - } - } -$self->session->errorHandler->warn("getPreviousAnswer returning $string"); - return $string; -} -sub getRandomText{ - my ($self,$responseId,$var) = @_; - $var =~ s/^\[\[\%//g; - $var =~ s/\]\]$//g; - my $response = $self->getResponse($responseId); - my %rands; - my $rstring = $response->{'randomWords'}; - if($rstring){ - %rands = %{decode_json($response->{'randomWords'})}; - } - if(! exists($rands{$var})){ - my $string = $self->session->db->quickScalar("select randomizedWords from Survey_question where questionVariable = ?",[$var]); - my @data = split/\n/,$string; - my $picked = int(rand(scalar @data)); - $rands{$var} = $data[$picked]; - my $temp = encode_json(\%rands); - $self->session->db->write("update Survey_response set randomWords = ? where Survey_responseId = ?",[$temp,$responseId]); - } - return $rands{$var}; -} -sub fillSectionTextVariables{ + + +#------------------------------------------------------------------- + +sub loadBothJSON{ my $self = shift; - my $responseId = shift; - my $section = shift; - $section->{'sectionText'} =~ s/(\[\[[^\%]*?\]\])/$self->getPreviousAnswer($responseId,$1)/eg; - $section->{'sectionText'} =~ s/(\[\[\%.*?\]\])/$self->getRandomText($responseId,$1)/eg; -$self->session->errorHandler->warn("Found $1 in ".$$section{'sectionText'}); - return $section; -} -sub fillQuestionTextVariables{ - my $self = shift; - my $responseId = shift; - my $questions = shift; - - foreach my $q(@$questions){ - $q->{'questionText'} =~ s/(\[\[[^\%]*?\]\])/$self->getPreviousAnswer($responseId,$1)/eg; - $q->{'questionText'} =~ s/(\[\[\%.*?\]\])/$self->getRandomText($responseId,$1)/eg; -$self->session->errorHandler->warn("Found $1 in ".$$q{'sequenceNumber'}); - } - return $questions; -} - -sub getRandomQuestionsAndAnswers{ - my ($self,$section,$responseId) = @_; - my @completed = $self->session->db->buildArray("select Survey_questionId from Survey_questionResponse where Survey_sectionId = ? and Survey_responseId = ?", - [$section->{'Survey_sectionId'},$responseId]); - my $placeHolders; -$self->session->errorHandler->warn('In get random questions'); - my @params; - if(@completed > 0){ - map($placeHolders .= "?,",@completed); - chop($placeHolders);#get rid of trailing comma - }else{ - $placeHolders = "?"; - push(@completed,''); - } -$self->session->errorHandler->warn($placeHolders); - -$self->session->errorHandler->warn('Random build survey section'.$section->{'Survey_sectionId'}); - push(@params,$section->{'Survey_sectionId'}); - push(@params, @completed); - push(@params,$section->{'questionsPerPage'}); -$self->session->errorHandler->warn(join(',',@params)); - - my $questions = $self->session->db->buildArrayRefOfHashRefs(" - select q.* - from Survey_question q - where q.Survey_sectionId = ? and q.Survey_questionId not in ($placeHolders) - order by RAND() - LIMIT ? - ",\@params); - - $questions = $self->getAnswersForQuestions($questions); - - $questions = $self->fillQuestionTextVariables($responseId,$questions); - - return $questions; -} -sub getAnswersForQuestions{ - my ($self,$questions) = @_; - for(my $i=0; $i<=$#$questions; $i++){ - my $sql = "select a.* - from Survey_answer a - where a.Survey_questionId = ?"; - if($$questions[$i]{'randomizeAnswers'} eq '0'){ - $sql .= " order by a.sequenceNumber ASC"; - } - else{ - $sql .= " order by RAND()"; - } - $$questions[$i]{'answers'} = $self->session->db->buildArrayRefOfHashRefs( $sql ,[$$questions[$i]{'Survey_questionId'}] ); - } - return $questions; -} -sub getQuestionsAndAnswers{ - my ($self,$responseId,$section,$questionId) = @_; - my $qNeeded = $section->{'questionsPerPage'}; - my $ref; - my $seqNum = $self->session->db->quickScalar("select sequenceNumber from Survey_question where Survey_questionId = ?",[$questionId]); - if(!$seqNum){$seqNum = 1;} - my $questions = $self->session->db->buildArrayRefOfHashRefs(" - select q.* - from Survey_question q - where q.Survey_sectionId = ? and q.sequenceNumber >= ? and q.sequenceNumber < ? - order by q.sequenceNumber ASC - ",[$section->{'Survey_sectionId'},$seqNum,$seqNum+$section->{'questionsPerPage'}]); - - $questions = $self->getAnswersForQuestions($questions); - - $questions = $self->fillQuestionTextVariables($responseId,$questions); - - return $questions; -} - -sub getNextQuestionId{ - my ($self,$qid) = @_; - return $self->session->db->quickScalar("select q1.Survey_questionId from Survey_question q, Survey_question q1 - where q.Survey_questionId = ? and q.assetId = q1.assetId and q.Survey_sectionId = q1.Survey_sectionId and q.sequenceNumber + 1 = q1.sequenceNumber", - [$qid]); -} - -sub getNextRandomQuestions{ - my ($self,$section,$questions) = @_; -} - -sub getNextSection{ - my ($self,$sid) = @_; - my $section; - - my $var = $self->session->db->quickScalar("select goto from Survey_section - where Survey_sectionId = ?", [$sid]); - my @array = split/\s*\,\s*/,$var; - my $picked = int(rand(scalar @array)); - - $section = $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s1 - where s1.sectionVariable = ?",[$array[$picked]]); - - if(!$section){ - $section = $self->session->db->quickScalar("select s1.Survey_sectionId from Survey_section s, Survey_section s1 - where s.assetId = ? and s.Survey_sectionId = ? and s1.assetId = ? and s1.sequenceNumber = s.sequenceNumber + 1", - [$self->getId(), $sid, $self->getId()]); - } - return $section; -} - -sub questionsAnsweredInSection{ - my ($self,$sid,$rid) = @_; - return $self->session->db->quickScalar("select count(distinct(Survey_questionId)) - from Survey_questionResponse where Survey_responseId = ? and Survey_sectionId = ?",[$rid,$sid]); -} - -sub questionsInSection{ - my ($self,$sid) = @_; - return $self->session->db->quickScalar("select count(*) from Survey_question where Survey_sectionId = ?",[$sid]); -} - -#last answer not skipped -sub getLastAnswerInfoForJump{ - my ($self,$rId) = @_; - return $self->session->db->quickHashRef(" - select r.Survey_sectionId, r.Survey_questionId, r.Survey_answerId,q.sequenceNumber - from Survey_section s, Survey_question q, Survey_answer a, Survey_questionResponse r - where r.Survey_responseId = ? and r.Survey_answerId = a.Survey_answerId and a.Survey_questionId = q.Survey_questionId and r.response != '' and - q.Survey_sectionId = s.Survey_sectionId and r.answerOrder = (select max(r1.answerOrder) from Survey_questionResponse r1 where r1.Survey_responseId = ? - and r1.response != '') LIMIT 1", - [$rId,$rId]); -} -#last answer, skipped or not -sub getLastAnswerInfo{ - my ($self,$rId) = @_; - return $self->session->db->quickHashRef(" - select r.Survey_sectionId, r.Survey_questionId, r.Survey_answerId,q.sequenceNumber - from Survey_section s, Survey_question q, Survey_answer a, Survey_questionResponse r - where r.Survey_responseId = ? and r.Survey_answerId = a.Survey_answerId and a.Survey_questionId = q.Survey_questionId and - q.Survey_sectionId = s.Survey_sectionId and r.answerOrder = (select max(r1.answerOrder) from Survey_questionResponse r1 where r1.Survey_responseId = ?) LIMIT 1", - [$rId,$rId]); -} - -sub getJumpTo{ - my ($self,$aId) = @_; - my $string = $self->session->db->quickScalar("select gotoQuestion from Survey_answer where Survey_answerId = ?",[$aId]); - if($string !~ /\w/ or $string eq "undefined"){ -$self->session->errorHandler->warn("No string or undefined $string"); - return; - } - my @array = split/\s*\,\s*/,$string; - - my $picked = int(rand(scalar @array)); - -$self->session->errorHandler->warn("Jupm was ".$array[$picked]." and picked was $picked"); + my $rId = shift; + if(defined $self->survey and defined $self->response){return;} my $ref = $self->session->db->buildArrayRefOfHashRefs(" - select Survey_sectionId, Survey_questionId - from Survey_question - where questionVariable = ? - ",[$array[$picked]]); - if(@$ref == 0){ - $ref = $self->session->db->buildArrayRefOfHashRefs(" - select Survey_sectionId - from Survey_section - where sectionVariable = ? - ",[$array[$picked]]); - } - if(@$ref > 0){ -$self->session->errorHandler->warn("JUMPING To ".$array[$picked]); - return ($ref->[0]->{'Survey_sectionId'},$ref->[0]->{'Survey_questionId'}); - } -$self->session->errorHandler->warn("Jump ended"); - return; + select s.surveyJSON,r.responseJSON + from Survey s, Survey_response r + where s.assetId = ? and r.Survey_responseId = ?", + [$self->getId,$rId]); + $self->loadSurveyJSON($ref->[0]->{surveyJSON}); + $self->loadResponseJSON($ref->[0]->{responseJSON}, $rId); } -sub getCurrentSection{ +#------------------------------------------------------------------- +sub loadResponseJSON{ my $self = shift; - my $responseId = shift; - return $self->session->db->quickScalar("select currentSection from Survey_response where Survey_responseId = ?",[$responseId]); + my $jsonHash = shift; + my $rId = shift; + + if(defined $self->response){return;} + + $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]) if(! defined $jsonHash); + + $self->{response} = WebGUI::Asset::Wobject::Survey::ResponseJSON->new($jsonHash,$self->session->errorHandler, $rId, $self->survey); } -sub setCurrentSection{ +#------------------------------------------------------------------- +sub saveResponseJSON{ my $self = shift; - my $responseId = shift; - my $newSectionId = shift; - $self->session->db->write('update Survey_response set currentSection = ? where Survey_responseId = ?',[$newSectionId, $responseId]); + + my $data = $self->response->freeze(); + +$self->session->errorHandler->error("Saving RESPONSE to ".$self->{responseId}." for $data"); + + $self->session->db->write("update Survey_response set responseJSON = ? where Survey_responseId = ?",[$data,$self->{responseId}]); } -sub getResponse{ - my ($self,$responseId) = @_; - my $ref = $self->session->db->buildArrayRefOfHashRefs("select * from Survey_response where Survey_responseId = ?",[$responseId]); - return $ref->[0]; + + + + +#------------------------------------------------------------------- +sub response{ + my $self = shift; + return $self->{response}; } + +#------------------------------------------------------------------- + sub getResponseId{ my $self = shift; + return $self->{responseId} if(defined $self->{responseId}); + my $ip = $self->session->env->getIp; my $id = $self->session->user->userId(); - my $anonId = $self->session->form->process("id"); - + my $anonId = $self->session->form->process("userid") || $self->session->http->getCookies->{"Survey2AnonId"} || undef; + $self->session->http->setCookie("Survey2AnonId",$anonId) if($anonId); my $responseId; my $string; + + #if there is an anonid or id is for a WG user if($anonId or $id != 1){ -$self->session->errorHandler->warn("Response - 1"); $string = 'userId'; if($anonId){ -$self->session->errorHandler->warn("Response - 1-1"); $string = 'anonId'; $id = $anonId; } $responseId = $self->session->db->quickScalar("select Survey_responseId from Survey_response where $string = ? and assetId = ? and isComplete = 0", [$id,$self->getId()]); + }elsif($id == 1){ -$self->session->errorHandler->warn("Response - 2"); $responseId = $self->session->db->quickScalar("select Survey_responseId from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete = 0", [$id,$ip,$self->getId()]); } if(! $responseId){ -$self->session->errorHandler->warn("Response - 3"); my $allowedTakes = $self->session->db->quickScalar("select maxResponsesPerUser from Survey where assetId = ? order by revisionDate desc limit 1",[$self->getId()]); my $haveTaken; - if($id ==1 ){ -$self->session->errorHandler->warn("Response - 4"); + + if($id == 1 ){ $haveTaken = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ?", [$id,$ip,$self->getId()]); }else{ -$self->session->errorHandler->warn("Response - 5"); $haveTaken = $self->session->db->quickScalar("select count(*) from Survey_response where $string = ? and assetId = ?", [$id,$self->getId()]); } if($haveTaken < $allowedTakes){ -$self->session->errorHandler->warn("Response - 6"); $responseId = $self->session->db->setRow("Survey_response","Survey_responseId",{ Survey_responseId=>"new", userId=>$id, @@ -1270,19 +854,31 @@ $self->session->errorHandler->warn("Response - 6"); assetId=>$self->getId(), anonId=>$anonId }); +$self->session->errorHandler->error("Creating a new response and survey order"); + $self->loadBothJSON($responseId); + $self->response->createSurveyOrder(); + $self->{responseId} = $responseId; + $self->saveResponseJSON(); }else{ -$self->session->errorHandler->warn("No responses left max=$allowedTakes used up=$haveTaken"); -} +$self->session->errorHandler->error("No responses left max=$allowedTakes used up=$haveTaken"); + } } - $self->session->errorHandler->warn("Survey Response was ".$responseId); + $self->{responseId} = $responseId; + $self->loadBothJSON($responseId); + $self->session->errorHandler->error("Survey Response was ".$responseId); return $responseId; } +#------------------------------------------------------------------- sub canTakeSurvey{ my $self = shift; - + + return $self->{canTake} if(defined $self->{canTake}); + +$self->session->errorHandler->error("Can take was NOT already defined"); + if(!$self->session->user->isInGroup($self->get("groupToTakeSurvey"))){ return 0; } @@ -1301,262 +897,20 @@ sub canTakeSurvey{ $takenCount = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",[$id,$self->getId(),1]); } - $self->session->errorHandler->warn("userid is ".$id."\t and ip is ".$ip); - $self->session->errorHandler->warn("max ".$maxTakes." taken ".$takenCount); + $self->session->errorHandler->error("userid is ".$id."\t and ip is ".$ip); + $self->session->errorHandler->error("max ".$maxTakes." taken ".$takenCount); if($takenCount >= $maxTakes){ - return 0; + $self->{canTake} = 0; + }else{ + $self->{canTake} = 1; } + $self->session->errorHandler->error("Can take survey returning ".$self->{canTake}); + return $self->{canTake}; - return 1; } -#------------------------------------------------------------------- -sub createDefaultAnswers{ - my ($self,$sid,$qid,$type) = @_; - $self->session->db->write("delete from Survey_answer where Survey_questionId = ?",[$qid]); - if($type eq 'Gender'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Male', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Female', 0, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Yes/No'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Yes', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'No', 0, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'True/False'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'True', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'False', 0, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Agree/Disagree'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly disagree', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, - undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly agree', 7, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Oppose/Support'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly oppose', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 4, - undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly support', 7, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Importance'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all important', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely important', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Likelihood'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all likely', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely likely', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Certainty'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all certain', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely certain', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Satisfaction'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all satisfied', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Completely satisfied', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Confidence'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all confident', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely confident', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Effectiveness'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all effective', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely effective', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Concern'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all concerned', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely concerned', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Risk'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No risk', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme risk', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Threat'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'No threat', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extreme threat', 10, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Security'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Not at all secure', 0, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, '', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, '', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, '', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, '', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, '', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, '', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, '', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 9, undef, '', 8, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 10, undef, '', 9, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 11, undef, 'Extremely secure', 10, undef, undef,undef,undef,0,20,2]); - - - }elsif($type eq 'Ideology'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Strongly liberal', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Liberal', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Somewhat liberal', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Middle of the road', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Slightly conservative', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Conservative', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Strongly conservative', 7, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Race'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'American Indian', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Asian', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Black', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Hispanic', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'White non-Hispanic', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Something else (verbatim)', 6, undef, undef,undef,undef,0,,20,2]); - - }elsif($type eq 'Party'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Democratic party', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'Republican party (or GOP)', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Independant party', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'Other party (verbatim)', 4, undef, undef,undef,undef,1,,20,2]); - - }elsif($type eq 'Education'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Elementary or some high school', 1, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, 'High school/GED', 2, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 3, undef, 'Some college/vocational school', 3, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 4, undef, 'College graduate', 4, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 5, undef, 'Some graduate work', 5, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 6, undef, 'Master\'s degree', 6, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 7, undef, 'Doctorate (of any type)', 7, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 8, undef, 'Other degree (verbatim)', 8, undef, undef,undef,undef,1,,20,2]); - - }elsif($type eq 'Text'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Email'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Email:', undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Phone Number'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Phone Number:', undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Text Date'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Date:', undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Currency'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, 'Currency Amount:', undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Slider'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 1,10,1,0,20,2]); - - }elsif($type eq 'Dual Slider - Range'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 0,10,1,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 0,10,1,0,20,2]); - - }elsif($type eq 'Multi Slider - Allocate'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, 0,10,1,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, 0,10,1,0,20,2]); - - }elsif($type eq 'Date'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Date Range'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 2, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'File Upload'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - - }elsif($type eq 'Hidden'){ - $self->AnswersInsert([$self->getId(),$sid,$qid,$self->session->id->generate(), 1, undef, undef, undef, undef, undef,undef,undef,0,20,2]); - } - -} -sub AnswersInsert{ - my ($self,$array) = @_; - $self->session->db->write("insert into Survey_answer values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",$array); -} 1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm deleted file mode 100644 index 4029c1e12..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/AnswerJSON.pm +++ /dev/null @@ -1,60 +0,0 @@ -package WebGUI::Asset::Wobject::Survey::AnswerJSON; - -use strict; -use Data::Structure::Util qw/unbless/; - -sub new{ - my $class = shift; - my $self = shift || {}; - my $posts = shift; - $self->{answers} = $self->{answers} || []; - $self->{text} = $self->{text} || ''; - $self->{verbatim} = $self->{verbatim} || ''; - $self->{textCols} = $self->{textCols} || 10; - $self->{textRows} = $self->{textRows} || 5; - $self->{gotoQuestion} = $self->{gotoQuestion} || ''; - $self->{recordedAnswer} = $self->{recordedAnswer} || ''; - $self->{isCorrect} = $self->{isCorrect} || 1; - $self->{min} = $self->{min} || 1; - $self->{max} = $self->{max} || 10; - $self->{step} = $self->{step} || 1; - $self->{value} = $self->{value} || 1; - $self->{terminal} = $self->{terminal} || 0; - $self->{terminalUrl} = $self->{terminalUrl} || ''; - $self->{type} = 'answer'; - - if(defined $posts and ref $posts eq 'HASH'){ - while(my ($key,$value) = each %$posts){ - if(defined $self->{$key}){ - $self->{$key} = $value; - } - } - } - bless($self,$class); - return $self; -} -sub update{ - my ($self,$ref) = @_; - - while(my ($key,$value) = keys %{$ref->{object}}){ - $self->{$key} = $value; - } -} -sub remove{ - my $self = shift; -} -sub freeze{ - my $self = shift; - my %temp = %{$self}; -# $temp{parent} = undef; -# unbless $self; - return \%temp; -} - -#address is the array of objects currently selected in the edit screen -#data is the array of hash items for displaying -sub getDragDropList{ - my ($self,$data,$address,$selected) = @_; - push(@$data, { "type",$self->{type},"text",$self->{"text"}, "recorded", $self->{'recordedAnswer'} }); -} -1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm deleted file mode 100644 index 949ffcc56..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/QuestionJSON.pm +++ /dev/null @@ -1,101 +0,0 @@ -package WebGUI::Asset::Wobject::Survey::QuestionJSON; - -use strict; -use Data::Structure::Util qw/unbless/; - -sub new{ - my $class = shift; - my $self = shift || {}; - my $posts = shift; - - if(defined $self->{answers}){ - foreach(@{$self->{answers}}){ - $_ = WebGUI::Asset::Wobject::Survey::AnswerJSON->new($_); - } - }else{ - $self->{answers} = []; - } - - $self->{variableName} = $self->{variableName} || ''; - $self->{text} = $self->{text} || ''; - $self->{allowComment} = $self->{allowComment} || 0; - $self->{commentCols} = $self->{commentCols} || 10; - $self->{commentRows} = $self->{commentRows} || 5; - $self->{randomizeAnswers} = $self->{randomizeAnswers} || 0; - $self->{questionType} = $self->{questionType} || ''; - $self->{randomizedWords} = $self->{randomizedWords} || ''; - $self->{verticalDisplay} = $self->{verticalDisplay} || 0; - $self->{required} = $self->{required} || 0; - $self->{maxAnswers} = $self->{maxAnswers} || 1; - $self->{value} = $self->{value} || 1; - $self->{textInButton} = $self->{textInButton} || 0; - $self->{terminal} = $self->{terminal} || 0; - $self->{terminalUrl} = $self->{terminalUrl} || ''; - $self->{type} = 'question'; - - if(defined $posts and ref $posts eq 'HASH'){ - while(my ($key,$value) = each %$posts){ - if(defined $self->{$key}){ - $self->{$key} = $value; - } - } - } - - bless($self,$class); - return $self; -} - -sub update{ - my ($self,$ref) = @_; - #is a question - if(@{$$ref{ids}} == 1){ - while (my ($key,$value) = each %{$ref->{object}}){ - $self->{$key} = $value; - } - #is a new answer - }elsif($$ref{ids}->[2] eq 'NEW'){ - push(@{$self->{answers}}, WebGUI::Assest::Wobject::Survey::AnswerJSON->new( {},$ref) ); - #is updating a answer - }else{ - $self->{answers}->[$$ref{ids}->[2]]->update($ref); - } -} -sub getObject{ - my ($self,$address) = @_; - return $self->{answers}->[$address->[2]]; -} - -sub createTemp{ - my ($self,$ref) = @_; - return WebGUI::Asset::Wobject::Survey::AnswerJSON->new($self); -} - -sub remove{ - my ($self,$address) = @_; - splice(@{$self->{answers}},$$address[2],1); -} - - -sub freeze{ - my $self = shift; - $self->{parent} = undef; - my %temp = %{$self}; - $temp{answers} = []; - foreach(@{$self->{answers}}){ - push(@{$temp{answers}},$_->freeze()); - } - return \%temp; -} -#address is the array of objects currently selected in the edit screen -#data is the array of hash items for displaying -sub getDragDropList{ - my ($self,$data,$address,$selected) = @_; - push(@$data, { "type",$self->{type},"text",$self->{text} }); - if($selected){ - for (@{$self->{answers}}){ - $_->getDragDropList($data, $address); - } - } -} - -1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm deleted file mode 100644 index 87c4edfd9..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/SectionJSON.pm +++ /dev/null @@ -1,155 +0,0 @@ -package WebGUI::Asset::Wobject::Survey::SectionJSON; - -use strict; -use Data::Structure::Util qw/unbless/; -use WebGUI::Asset::Wobject::Survey::QuestionJSON; - -use Data::Dumper; - -sub new{ - my $class = shift; - my $self = shift || {}; - my $postInfo = shift; - my $log = shift; - if(defined $self->{questions}){ - foreach(@{$self->{questions}}){ - $_ = WebGUI::Asset::Wobject::Survey::QuestionJSON->new($_); - } - }else{ - $self->{questions} = []; - } - $self->{log} = $log if defined $log; - $self->{text} = $self->{text} || ''; - $self->{title} = $self->{title} || 'New Section'; - $self->{variable} = $self->{variable} || ''; - $self->{questionsPerPage} = $self->{questionsPerPage} || 5; - $self->{questionsOnSectionPage} = defined $self->{questionsOnSectionPage} ? $self->{questionsOnSectionPage} : 1; - $self->{randomizeQuestions} = $self->{randomizeQuestions} || 0; - $self->{everyPageTitle} = defined $self->{everyPageTitle} ? $self->{everyPageTitle} : 1; - $self->{everyPageText} = defined $self->{everyPageText} ? $self->{everyPageText} : 1; - $self->{terminal} = $self->{terminal} || 0; - $self->{terminalUrl} = $self->{terminalUrl} || ''; - $self->{goto} = $self->{goto} || ''; - $self->{timeLimit} = $self->{timeLimit} || 0; - $self->{type} = 'section'; - - if(defined $postInfo and ref $postInfo eq 'HASH'){ - while(my ($key,$value) = each %$postInfo){ - if(defined $self->{$key}){ - $self->{$key} = $value; - } - } - } - - bless($self,$class); - return $self; -} -sub getObject{ - my ($self,$address) = @_; - if(@$address == 2){ - return $self->{questions}->[$address->[1]]; - }else{ - return $self->{questions}->[$address->[1]]->getObject($address); - } -} -sub getEditVars{ - my ($self,$address) = @_; -$self->{log}->error("section geteditvars"); - if(@$address > 1){ - return $self->{questions}->[$address->[1]]->getEditVars($address); - } - #Fill in a template var hash and return it - my %var; - while (my ($key,$value) = each %{$self}){ - if($key ne 'questions' and $key ne 'questionsPerPage' and $key ne 'log'){ - $var{$key} = $value; - } - } - for(1 .. 10){ - if($_ == $self->{questionsPerPage}){ - push(@{$var{questionsPerPage}},{'index',$_,'selected',1}); - }else{ - push(@{$var{questionsPerPage}},{'index',$_,'selected',0}); - } - } - return \%var; - -} -sub newQuestion{ - my $self = shift; - push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{questions}}) ); -} -sub remove{ - my ($self,$address) = @_; - if(@$address == 2){ - splice(@{$self->{questions}},$$address[1],1); - }else{ - $self->{questions}->[$$address[1]]->remove($address); - } -} - -sub update{ - my ($self,$address,$ref,$log) = @_; - if(@{$address} == 1){ - while(my ($key,$value) = each %{$ref}){ - $self->{$key} = $value if defined $self->{$key}; - } - #is a new question - }elsif($$ref{ids}->[1] eq 'NEW'){ - push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new({},$ref) ); - - #is updating a question or answer - }else{ - $self->{questions}->[$$ref{ids}->[1]]->update($address,$ref); - } -} - -sub loadQuestion{ - my ($self,$questionHash) = @_; - push(@{$self->{questions}}, WebGUI::Assest::Wobject::Survey::QuestionJSON->new( $self,@{$self->{questions}},$questionHash) ); -} - -sub deleteQuestion{ - my $self = shift; - my $index = shift; - splice(@{$self->{questions}},$index,1) if defined $index; -} -#address is the array of objects currently selected in the edit screen -#data is the array of hash items for displaying -sub getDragDropList{ - my ($self,$data,$address,$selected) = @_; - push(@$data,{ "type",$self->{type},"text",$self->{"title"} }); - if($selected){ - for(my $i=0; $i<=$#{$self->{questions}}; $i++){ - $self->{questions}->[$i]->getDragDropList($data, $address, $i == $address->[1]); - } - } -} -sub getQuestion{ - my $self = shift; - my $index = shift; - return $self->{questions}->[$index] if defined $index; -} - -sub freeze{ - my $self = shift; - - my %temp = %{$self}; - - $temp{questions} = []; - foreach(@{$self->{questions}}){ - push(@{$temp{questions}}, $_->freeze()); - } - delete $temp{log}; - return \%temp; -} - -sub createTemp{ - my ($self,$ref) = @_; - if(@{$$ref{ids}} > 1){ - return $self->{questions}->[$$ref{ids}->[1]]->createTemp($ref); - }else{ - return WebGUI::Asset::Wobject::Survey::QuestionJSON->new($self); - } -} -1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 64f39bff2..c7d56673c 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -148,6 +148,7 @@ sub getAnswerEditVars{ sub update{ my ($self,$address,$ref) = @_; my $object; + my $newQuestion = 0; if(@$address == 1){ $object = $self->section($address); if(! defined $object){ @@ -157,18 +158,22 @@ sub update{ }elsif(@$address == 2){ $object = $self->question($address); if(! defined $object){ -$self->log("$object didn't exist"); + my $newQuestion = 1; $object = $self->newQuestion(); push(@{$self->questions($address)},$object); } }elsif(@$address == 3){ $object = $self->answer($address); if(! defined $object){ -$self->log("$object didn't exist"); $object = $self->newAnswer(); push(@{$self->answers($address)},$object); } } + if(@$address == 2 and ! $newQuestion){ + if($ref->{questionType} ne $self->question($address)->{questionType}){ + $self->updateQuestionAnswers($address,$ref->{questionType}); + } + } for my $key(keys %$object){ $object->{$key} = $ref->{$key} if(defined $$ref{$key}); } @@ -264,6 +269,115 @@ sub newAnswer{ return \%members; } +sub updateQuestionAnswers{ + my $self = shift; + my $address = shift; + my $type = shift; + +$self->log("In updateQuestion"); + + my @addy = @{$address}; + my $question = $self->question($address); + $question->{answers} = []; + + if($type eq 'Date Range' or $type eq 'Multi Slider - Allocate' or $type eq 'Dual Slider - Range'){ + push(@{$question->{answers}},$self->newAnswer()); + push(@{$question->{answers}},$self->newAnswer()); + }elsif($type eq 'Currency'){ + push(@{$question->{answers}},$self->newAnswer()); + $addy[2] = 0; + $self->update(\@addy,{'text','Currency Amount'}); + }elsif($type eq 'Text Date'){ + push(@{$question->{answers}},$self->newAnswer()); + $addy[2] = 0; + $self->update(\@addy,{'text','Date:'}); + }elsif($type eq 'Phone Number'){ + push(@{$question->{answers}},$self->newAnswer()); + $addy[2] = 0; + $self->update(\@addy,{'text','Phone Number:'}); + }elsif($type eq 'Email'){ + push(@{$question->{answers}},$self->newAnswer()); + $addy[2] = 0; + $self->update(\@addy,{'text','Email:'}); + }elsif($type eq 'Education'){ + my @ans = ('Elementary or some high school','High school/GED','Some college/vocational school','College graduate', + 'Some graduate work','Master\'s degree','Doctorate (of any type)','Other degree (verbatim)'); + $self->addAnswersToQuestion(\@addy,\@ans,{7,1}); + }elsif($type eq 'Party'){ + my @ans = ('Democratic party','Republican party (or GOP)','Independant party','Other party (verbatim)'); + $self->addAnswersToQuestion(\@addy,\@ans,{3,1}); + }elsif($type eq 'Race'){ + my @ans = ('American Indian','Asian','Black','Hispanic','White non-Hispanic','Something else (verbatim)'); + $self->addAnswersToQuestion(\@addy,\@ans,{5,1}); + }elsif($type eq 'Ideology'){ + my @ans = ('Strongly liberal','Liberal','Somewhat liberal','Middle of the road','Slightly conservative','Conservative','Strongly conservative'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Security'){ + my @ans = ('Not at all secure','','','','','','','','','','Extremely secure'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Threat'){ + my @ans = ('No threat','','','','','','','','','','Extreme threat'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Risk'){ + my @ans = ('No risk','','','','','','','','','','Extreme risk'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Concern'){ + my @ans = ('Not at all concerned','','','','','','','','','','Extremely concerned'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Effectiveness'){ + my @ans = ('Not at all effective','','','','','','','','','','Extremely effective'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Confidence'){ + my @ans = ('Not at all confident','','','','','','','','','','Extremely confident'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Satisfaction'){ + my @ans = ('Not at all satisfied','','','','','','','','','','Extremely satisfied'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Certainty'){ + my @ans = ('Not at all certain','','','','','','','','','','Extremely certain'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Likelihood'){ + my @ans = ('Not at all likely','','','','','','','','','','Extremely likely'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Importance'){ + my @ans = ('Not at all important','','','','','','','','','','Extremely important'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Oppose/Support'){ + my @ans = ('Strongly oppose','','','','','','Strongly Support'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Agree/Disagree'){ + my @ans = ('Strongly disagree','','','','','','Strongly agree'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'True/False'){ + my @ans = ('True','False'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Yes/No'){ + my @ans = ('Yes','No'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }elsif($type eq 'Gender'){ + my @ans = ('Male','Female'); + $self->addAnswersToQuestion(\@addy,\@ans,{}); + }else{ + push(@{$question->{answers}},$self->newAnswer()); + } +} +sub addAnswersToQuestion{ + my $self = shift; + my $addy = shift; + my $ans = shift; + my $verbs = shift; +$self->log(Dumper $verbs); + for(0 .. $#$ans){ + push(@{$self->question($addy)->{answers}},$self->newAnswer()); + $$addy[2] = $_; +$self->log("$_:".defined $$verbs{$_}." ".$$verbs{$_}); + if(defined $$verbs{$_} and $_ == $$verbs{$_}){ + $self->update($addy,{'text',$$ans[$_],'recordedAnswer',$_+1,'verbatim',1}); + }else{ + $self->update($addy,{'text',$$ans[$_],'recordedAnswer',$_+1}); + } + } +} #------------------------------ diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index f28f7f55e..cfcad3012 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -40,14 +40,14 @@ Survey.Form = new function() { //YAHOO.util.Event.addListener("testB", "click", function(){Survey.Comm.callServer('','loadQuestions');}); if(qs[0] != undefined){ - if(lastSection != s.Survey_sectionId || s.everyPageTitle > 0){ + if(lastSection != s.id|| s.everyPageTitle > 0){ document.getElementById('headertitle').style.display='block'; } - if(lastSection != s.Survey_sectionId || s.everyPageText > 0){ + if(lastSection != s.id|| s.everyPageText > 0){ document.getElementById('headertext').style.display = 'block'; } - if(lastSection != s.Survey_sectionId && s.questionsOnSectionPage != '1'){ + if(lastSection != s.id && s.questionsOnSectionPage != '1'){ var span = document.createElement("div"); span.innerHTML = ""; span.style.display = 'block'; @@ -69,7 +69,7 @@ Survey.Form = new function() { document.getElementById('questions').style.display='inline'; Survey.Form.addWidgets(qs); } - lastSection = s.Survey_sectionId; + lastSection = s.id; }else{ document.getElementById('headertitle').style.display='block'; document.getElementById('headertext').style.display = 'block'; @@ -92,9 +92,9 @@ Survey.Form = new function() { //Check if this question should be validated if(q.required == 1){ - toValidate[q.Survey_questionId] = new Array(); - toValidate[q.Survey_questionId]['type'] = q.questionType; - toValidate[q.Survey_questionId]['answers'] = new Array(); + toValidate[q.id] = new Array(); + toValidate[q.id]['type'] = q.questionType; + toValidate[q.id]['answers'] = new Array(); } @@ -103,37 +103,37 @@ Survey.Form = new function() { verb = 0; for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; - if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; + if(toValidate[q.id]){ + toValidate[q.id]['answers'][a.id] = 1; } - var b = document.getElementById(a.Survey_answerId+'button'); + var b = document.getElementById(a.id+'button'); /* - b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.Survey_answerId+'button', name: a.Survey_answerId+'button', - value: a.Survey_answerId, - container: a.Survey_answerId+"container", checked: false }); + b = new YAHOO.widget.Button({ type: "checkbox", label: a.answerText, id: a.id+'button', name: a.id+'button', + value: a.id, + container: a.id+"container", checked: false }); */ -// b.on("click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); -// YAHOO.util.Event.addListener(a.Survey_answerId+'button', "click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); +// b.on("click", this.buttonChanged,[b,a.id,q.maxAnswers,butts,qs.length,a.id]); +// YAHOO.util.Event.addListener(a.id+'button', "click", this.buttonChanged,[b,a.id,q.maxAnswers,butts,qs.length,a.id]); if(a.verbatim == 1){ verb = 1; } - YAHOO.util.Event.addListener(a.Survey_answerId+'button', "click", this.buttonChanged,[b,a.Survey_questionId,q.maxAnswers,butts,qs.length,a.Survey_answerId]); - b.hid = a.Survey_answerId; + YAHOO.util.Event.addListener(a.id+'button', "click", this.buttonChanged,[b,a.id,q.maxAnswers,butts,qs.length,a.id]); + b.hid = a.id; butts.push(b); } } else if(dateType[q.questionType]){ for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; - if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; + if(toValidate[q.id]){ + toValidate[q.id]['answers'][a.id] = 1; } - var calid = a.Survey_answerId+'container'; + var calid = a.id+'container'; var c = new YAHOO.widget.Calendar(calid,{title:'Choose a date:', close:true}); - c.selectEvent.subscribe(this.selectCalendar,[c,a.Survey_answerId],true); + c.selectEvent.subscribe(this.selectCalendar,[c,a.id],true); c.render(); c.hide(); - var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.Survey_answerId, container:a.Survey_answerId+'button' }); + var b = new YAHOO.widget.Button({ label:"Select Date", id:"pushbutton"+a.id, container:a.id+'button' }); b.on("click", this.showCalendar,[c]); } } @@ -145,7 +145,7 @@ Survey.Form = new function() { }else{ for(var s in q.answers){ var a = q.answers[s]; - YAHOO.util.Event.addListener(a.Survey_answerId, "blur", this.sliderTextSet); + YAHOO.util.Event.addListener(a.id, "blur", this.sliderTextSet); if(a.max - a.min > max){max = a.max - a.min;} } } @@ -153,9 +153,9 @@ Survey.Form = new function() { //sliderManagers[sliderManagers.length] = new this.sliderManager(q,max); for(var x = 0; x < q.answers.length; x++){ var a = q.answers[x]; - if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId]['total'] = a.max; - toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; + if(toValidate[q.id]){ + toValidate[q.id]['total'] = a.max; + toValidate[q.id]['answers'][a.id] = 1; } } new this.sliderManager(q,max); @@ -171,8 +171,8 @@ Survey.Form = new function() { else if(text[q.questionType]){ var a = q.answers[x]; - if(toValidate[a.Survey_questionId]){ - toValidate[a.Survey_questionId]['answers'][a.Survey_answerId] = 1; + if(toValidate[q.id]){ + toValidate[q.id]['answers'][a.id] = 1; } } } @@ -211,6 +211,7 @@ Survey.Form = new function() { } } if(submit == 1){ +console.log("Submitting"); Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); } } @@ -225,9 +226,9 @@ Survey.Form = new function() { var a2 = q.answers[1]; var scale = sliderWidth/a1.max; - var id = q.Survey_questionId; - var a1id = a1.Survey_answerId; - var a2id = a2.Survey_answerId; + var id = q.id; + var a1id = a1.id; + var a2id = a2.id; var a1h = document.getElementById(a1id); var a2h = document.getElementById(a2id); @@ -237,6 +238,7 @@ Survey.Form = new function() { a1id+"slider-min-thumb", a2id+"slider-max-thumb", sliderWidth, 1*scale, [1,sliderWidth]); sliders[id] = s; +//console.log(1); s.minRange = 4; var updateUI = function () { @@ -263,13 +265,13 @@ Survey.Form = new function() { var distance = Math.round(parseFloat(q.answers[i].max) + (-1 * min)); var scale = Math.round(sliderWidth/distance); var lang = YAHOO.lang; - var id = a.Survey_answerId; + var id = a.id; var s = YAHOO.widget.Slider.getHorizSlider(id+'slider-bg', id+'slider-thumb', 0, sliderWidth, (scale*step)); s.scale = scale; sliders[q.Survey_questionid] = new Array(); sliders[q.Survey_questionid][id] = s; - s.input = a.Survey_answerId; + s.input = a.id; s.scale = scale; document.getElementById(id).value = a.min; var check = function() { @@ -293,20 +295,20 @@ Survey.Form = new function() { var a = q.answers[i]; var Event = YAHOO.util.Event; var lang = YAHOO.lang; - var id = a.Survey_answerId+'slider-bg'; - var s = YAHOO.widget.Slider.getHorizSlider(id, a.Survey_answerId+'slider-thumb', + var id = a.id+'slider-bg'; + var s = YAHOO.widget.Slider.getHorizSlider(id, a.id+'slider-thumb', 0, sliderWidth, scale*step); s.animate = false; - if(sliders[q.Survey_questionId] == undefined){ - sliders[q.Survey_questionId] = new Array(); + if(sliders[q.id] == undefined){ + sliders[q.id] = new Array(); } - sliders[q.Survey_questionId][a.Survey_answerId] = s; - s.input = a.Survey_answerId; + sliders[q.id][a.id] = s; + s.input = a.id; s.lastValue = 0; var check = function() { var t = 0; - for(var x in sliders[q.Survey_questionId]){ - t+= sliders[q.Survey_questionId][x].getValue(); + for(var x in sliders[q.id]){ + t+= sliders[q.id][x].getValue(); } if(t > total){ t -= this.getValue(); @@ -328,9 +330,9 @@ Survey.Form = new function() { // v *= scale; v = ( ( (v-min) / distance))*total; // convert the real value into a pixel offset - for(var sl in sliders[q.Survey_questionId]){ - if(sliders[q.Survey_questionId][sl].input == this.id){ - sliders[q.Survey_questionId][sl].setValue(Math.round(v)); + for(var sl in sliders[q.id]){ + if(sliders[q.id][sl].input == this.id){ + sliders[q.id][sl].setValue(Math.round(v)); } } } diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js index 708233060..c8d0cbe48 100644 --- a/www/extras/wobject/Survey/administersurvey/comm.js +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -23,6 +23,7 @@ Survey.Comm= new function(){ alert("Waiting on previous request"); }else{ callMade = 1; +console.log(sUrl); YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); } } diff --git a/www/extras/wobject/Survey/survey.css b/www/extras/wobject/Survey/survey.css index 2c3cae00d..6baeb76f0 100644 --- a/www/extras/wobject/Survey/survey.css +++ b/www/extras/wobject/Survey/survey.css @@ -1,6 +1,5 @@ body { margin: 0; - background-image: url(http://casr.ou.edu/root/import/survey/spacer.gif); background-repeat: repeat-y; background-position: 0px 0px; } From 32e4208a0c165c2150ee1cb448cbc6e0de7f6772 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 14 Oct 2008 21:17:34 +0000 Subject: [PATCH 40/64] minor changes --- lib/WebGUI/Asset/Wobject/Survey.pm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 7b81ad953..f091d7998 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -658,12 +658,11 @@ $self->session->errorHandler->error("Can take survey"); return $self->surveyEnd(); } + return $self->surveyEnd() if($seslf->response->surveyEnd()); + my $questions = $self->response->nextQuestions(); $self->session->errorHandler->error("Load Questions had ".@$questions." questions"); - if(@$questions < 1){ - return $self->surveyEnd(); - } my $section = $self->response->nextSection(); #$self->session->errorHandler->error(Dumper $section); From ccd1deaef8e3c39de69e9168fe6e162ee95138c9 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 14 Oct 2008 21:20:05 +0000 Subject: [PATCH 41/64] minor changes --- .../Asset/Wobject/Survey/ResponseJSON.pm | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm diff --git a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm new file mode 100644 index 000000000..b2c44673b --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm @@ -0,0 +1,282 @@ +package WebGUI::Asset::Wobject::Survey::ResponseJSON; + +use strict; +use JSON; +use Data::Dumper; + +sub new{ + my $class = shift; + my $json = shift; + my $log = shift; + my $rId = shift; + my $survey = shift; + my $self = {}; + $self->{survey} = $survey; + $self->{log} = $log; + $self->{responseId} = $rId; + my $temp = decode_json($json) if defined $json; + $self->{goto} = defined $temp->{goto} ? $temp->{goto} : []; + $self->{surveyOrder} = defined $temp->{surveyOrder} ? $temp->{surveyOrder} : [];#an array of question addresses, with the third member being an array of answers + $self->{responses} = defined $temp->{responses} ? $temp->{responses} : {}; + $self->{lastResponse} = defined $temp->{lastResponse} ? $temp->{lastResponse} : -1; + bless($self,$class); + return $self; +} + +#---------------------------------------------------------------------------- + +=head2 createSurveyOrder ( SurveyJSON, [address,address] ) + +This creates the order for the survey which will change after every fork. +The survey order is to precreate random questions and answers, which also leaves a record or what the user was presented with. +Forks are passed in to show where to branch the new order. + +=cut + +sub createSurveyOrder{ + my $self = shift; +# my $fork = shift || []; + my $order; + my $qstarting = 0; +eval{ + for(my $s = 0; $s <= $#{$self->survey->sections()}; $s++){ + #create question order for section + my @qorder; + if($self->survey->section([$s])->{randomizeQuestions}){ + @qorder = shuffle(($qstarting .. $#{$self->survey->questions([$s])})); + }else{ + @qorder = (($qstarting .. $#{$self->survey->questions([$s])})); + } + + #if this is an empty section, make sure it is still on the list to be seen + if(@qorder == 0){ + push(@$order,[$s]); + } + $qstarting = 0; + #create answer order for question + for (@qorder){ + my @aorder; + if($self->survey->question([$s,$_])->{randomizeAnswers}){ + @aorder = shuffle(($qstarting .. $#{$self->survey->question([$s,$_])->{answers}})); + }else{ + @aorder = (($qstarting .. $#{$self->survey->question([$s,$_])->{answers}})); + } + push(@$order,[$s,$_,\@aorder]); +# if(@$fork == 2){ +# if($$fork[0][0] == $s and $$fork[0][1] == $_){ +# $s = $$fork[1][0]-1; +# $qstarting = $$fork[1][1]; +# last; +# } +# } + } + } +}; +$self->log($@) if($@); + $self->{surveyOrder} = $order; +} +sub shuffle { + my @a = splice @_; + for my $i (0 .. $#a) { + my $j = int rand @a; + @a[$i, $j] = @a[$j, $i]; + } + return @a; +} + +sub freeze{ + my $self = shift; + my %temp = %{$self}; + delete $temp{log}; + delete $temp{survey}; + return encode_json(\%temp); +} +#the index of the last surveyOrder entry shown +sub lastResponse{ + my $self = shift; + my $res = shift; + if(defined $res){ + $self->{lastResponse} = $res; + }else{ + return $self->{lastResponse}; + } +} +#array of addresses in which the survey should be presented +sub surveyOrder{ + my $self = shift; + return $self->{surveyOrder}; +} + + +sub nextSectionId{ + my $self = shift; + return $self->surveyOrder->[$self->lastResponse + 1]->[0]; +} + + +sub nextSection{ + my $self = shift; + return $self->survey->section([$self->surveyOrder->[$self->lastResponse + 1]->[0]]); +} + + +sub recordResponses{ + my $self = shift; + my $responses = shift; + my $session = shift; + + my %mcTypes = ('Agree/Disagree',1,'Certainty',1,'Concern',1,'Confidence',1,'Education',1,'Effectiveness',1,'Gender',1,'Ideology',1,'Importance',1, + 'Likelihood',1,'Party',1,'Multiple Choice',1,'Oppose/Support',1,'Race',1,'Risk',1,'Satisfaction',1,'Scale',1,'Security',1, + 'Threat',1,'True/False',1,'Yes/No',1); + my %sliderTypes = ('Dual Slider - Range',1,'Multi Slider - Allocate',1,'Slider',1); + my %textTypes = ('Currency','Email',1,'Phone Number',1,'Text',1,'Text Date',1); + my %fileTypes = ('File Upload',1); + my %dateTypes = ('Date','Date Range',1); + my %hiddenTypes = ('Hidden',1); + + #These were just submitted from the user, so we need to see what and how they were (un)answered. + my $questions = $self->nextQuestions(); + my $qAnswered = 1; + my $terminal = 0; + my $terminalUrl; + my $goto; + my $section = $self->survey->section([$questions->[0]->{sid}]); + if($section->{terminal}){ + $terminal = 1; + $terminalUrl = $section->{terminalUrl}; + } + for my $question(@$questions){ + my $aAnswered = 0; + if($question->{terminal}){ + $terminal = 1; + $terminalUrl = $question->{terminalUrl}; + } + for my $answer(@{$question->{answers}}){ + + if(defined($responses->{$answer->{id}}) and $responses->{$answer->{id}} =~ /\S/){ + + $aAnswered = 1; + if($mcTypes{$question->{questionType}}){ + $self->responses->{$answer->{id}}->{value} = $answer->{recordedAnswer}; + } + else{ + $self->responses->{$answer->{id}}->{value} = $responses->{$answer->{id}}; + } + + $self->responses->{$answer->{id}}->{comment} = $responses->{$answer->{id}."comment"}; + + if($answer->{terminal}){ + $terminal = 1; + $terminalUrl = $answer->{terminalUrl}; + } + elsif($answer->{goto} =~ /\S/){ + $goto = $answer->{goto}; + } + } + } + $qAnswered = 0 if(!$aAnswered and $question->{required}); + } + + #if all responses completed, move the lastResponse index to the last question shown + if($qAnswered){ + $self->lastResponse($self->lastResponse + @$questions); + $self->goto($goto); + }else{ + $terminal = 0; + } + return [$terminal,$terminalUrl]; +} +sub goto{ + my $self = shift; + my $goto = shift; + + +} +sub getPreviousAnswer{ + my $self = shift; + my $questionParam = shift; + for my $q (@{$self->surveyOrder}){ + my $question = $self->survey->question([$$q[0],$$q[1]]); + if($question->{variable} eq $questionParam){ + for (0 .. @{$self->survey->answers([$$q[0],$$q[1]])}){ + if(exists $self->responses->{$$q[0]."-".$$q[1]."-".$_}){ + return $self->responses->{$$q[0]."-".$$q[1]."-".$_}->{value}; + } + } + } + } +} + +sub nextQuestions{ + my $self = shift; +$self->log("In nextQuestions"); + + if($self->lastResponse >= $#{$self->surveyOrder}){ + return []; + } + + my $nextSectionId = $self->nextSectionId; + +$self->log("next sectionid is $nextSectionId"); + + my $qPerPage = $self->survey->section([$self->nextSectionId])->{questionsPerPage}; + + + #load Previous answer text + my $section = $self->nextSection(); +$self->log("Section text is ".$section->{text}); + $section->{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; +# $section->{'text'} =~ s/(\[\[\%.*?\]\])/$self->getRandomText($responseId,$1)/eg; + +$self->log("qperpage $qPerPage"); + + my $questions; + for(my $i = 1; $i <= $qPerPage; $i++){ + my $qAddy= $self->surveyOrder->[$self->lastResponse + $i]; + +$self->log("qAddy was $$qAddy[0]-$$qAddy[1]"); + + if($$qAddy[0] != $nextSectionId){ + last; + } + my %question = %{$self->survey->question([$$qAddy[0],$$qAddy[1]])}; + $question->{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; + delete $question{answers}; + $question{id} = "$$qAddy[0]-$$qAddy[1]"; + $question{sid} = "$$qAddy[0]"; + for (@{$$qAddy[2]}){ + my $ans = $self->survey->answer([$$qAddy[0],$$qAddy[1],$_]); + $ans->{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; + $ans->{id} = "$$qAddy[0]-$$qAddy[1]-$_"; + push(@{$question{answers}},$ans); + } + push(@$questions,\%question); + } + return $questions +} +sub surveyEnd{ + my $self = shift; + return 1 if($self->lastResponse > $#{$self->surveyOrder}); + return 0; +} + + +#the actual responses to the survey. A response is for a question and is accessed by the exact same address as a survey member. +#Questions only contain the comment and an array of answer Responses. +#Answers only contain, entered text, entered verbatim, their index in the Survey Question Answer array, and the assetId to the uploaded file. +sub responses{ + my $self = shift; + return $self->{responses}; +} + +sub survey{ + my $self = shift; + return $self->{survey}; +} +sub log{ + my ($self,$message) = @_; + if(defined $self->{log}){ + $self->{log}->error($message); + } +} +1; From 8c5e74e85605185bc334b27be36e98fbcf4b8543 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 14 Oct 2008 21:28:47 +0000 Subject: [PATCH 42/64] added all the templates --- .../Asset/Wobject/Survey/survey_templates.tar | Bin 0 -> 20480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar diff --git a/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar b/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar new file mode 100644 index 0000000000000000000000000000000000000000..3a5a97f37b7df72fac7c393c57d2aa89a2813c08 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 From 2a9bbc7490f784e4dc613d3559404aab97a1d28f Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Tue, 14 Oct 2008 21:42:37 +0000 Subject: [PATCH 43/64] Added sql for survey --- lib/WebGUI/Asset/Wobject/Survey/Survey.sql | 20 +++++++++++++++++++ .../Asset/Wobject/Survey/Survey_response.sql | 13 ++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey.sql create mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey.sql new file mode 100644 index 000000000..afefabbeb --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/Survey.sql @@ -0,0 +1,20 @@ +CREATE TABLE `Survey` ( + `groupToTakeSurvey` varchar(22) character set utf8 collate utf8_bin NOT NULL default '2', + `groupToViewReports` varchar(22) character set utf8 collate utf8_bin NOT NULL default '3', + `responseTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `overviewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `maxResponsesPerUser` int(11) NOT NULL default '1', + `gradebookTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `revisionDate` bigint(20) NOT NULL default '0', + `surveyEditTemplateId` varchar(22) NOT NULL, + `answerEditTemplateId` varchar(22) NOT NULL, + `questionEditTemplateId` varchar(22) NOT NULL, + `sectionEditTemplateId` varchar(22) NOT NULL, + `surveyTakeTemplateId` varchar(22) NOT NULL, + `surveyQuestionsId` varchar(22) NOT NULL, + `exitURL` varchar(512) default NULL, + `surveyJSON` longblob, + PRIMARY KEY (`assetId`,`revisionDate`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql new file mode 100644 index 000000000..008af27bf --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql @@ -0,0 +1,13 @@ +CREATE TABLE `Survey_response` ( + `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL, + `Survey_responseId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', + `userId` varchar(22) default NULL, + `username` varchar(255) default NULL, + `ipAddress` varchar(15) default NULL, + `startDate` bigint(20) NOT NULL default '0', + `endDate` bigint(20) NOT NULL default '0', + `isComplete` int(11) NOT NULL default '0', + `anonId` varchar(255) default NULL, + `responseJSON` longblob, + PRIMARY KEY (`Survey_responseId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 From afde10109f106bf21aea57e789603a51d73f0f43 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Wed, 15 Oct 2008 01:03:13 +0000 Subject: [PATCH 44/64] Minor fixes (typo and unnecessary hash dereference) --- lib/WebGUI/Asset/Wobject/Survey.pm | 2 +- lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index f091d7998..d513e3714 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -658,7 +658,7 @@ $self->session->errorHandler->error("Can take survey"); return $self->surveyEnd(); } - return $self->surveyEnd() if($seslf->response->surveyEnd()); + return $self->surveyEnd() if($self->response->surveyEnd()); my $questions = $self->response->nextQuestions(); $self->session->errorHandler->error("Load Questions had ".@$questions." questions"); diff --git a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm index b2c44673b..39d013e4b 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm @@ -240,7 +240,7 @@ $self->log("qAddy was $$qAddy[0]-$$qAddy[1]"); last; } my %question = %{$self->survey->question([$$qAddy[0],$$qAddy[1]])}; - $question->{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; + $question{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; delete $question{answers}; $question{id} = "$$qAddy[0]-$$qAddy[1]"; $question{sid} = "$$qAddy[0]"; From 8a06612c825324edf54735816810e97739140ded Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Wed, 15 Oct 2008 01:38:13 +0000 Subject: [PATCH 45/64] Added quick-start instructions and combined templates package for ease of deployment --- SURVEY2_README.txt | 10 ++++++++++ survey_templates.wgpkg | Bin 0 -> 7065 bytes 2 files changed, 10 insertions(+) create mode 100644 SURVEY2_README.txt create mode 100644 survey_templates.wgpkg diff --git a/SURVEY2_README.txt b/SURVEY2_README.txt new file mode 100644 index 000000000..fee846d20 --- /dev/null +++ b/SURVEY2_README.txt @@ -0,0 +1,10 @@ +Survey2 Quick-start +=================== + +To get Survey2 working for a test site running off this branch: + +* update your site db schema: + +> mysql -u -p -e "drop table if exists Survey; drop table if exists Survey_response; source /data/WebGUI/lib/WebGUI/Asset/Wobject/Survey/Survey.sql; source /data/WebGUI/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql;" + +* import survey_templates.wgpkg into your site via the package manager diff --git a/survey_templates.wgpkg b/survey_templates.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..d6a776e96c093c3087ce7fa09a033773b4979cfd GIT binary patch literal 7065 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 D&&Bx~ literal 0 HcmV?d00001 From a4afde5786332fa49650d2bcb91611e4c77f8549 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Thu, 16 Oct 2008 02:52:22 +0000 Subject: [PATCH 46/64] Changed console.log() calls to YAHOO.log() --- www/extras/wobject/Survey/administersurvey.js | 4 ++-- www/extras/wobject/Survey/administersurvey/comm.js | 12 ++++++------ www/extras/wobject/Survey/editsurvey.js | 6 +++--- www/extras/wobject/administersurvey/comm.js | 10 +++++----- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/www/extras/wobject/Survey/administersurvey.js b/www/extras/wobject/Survey/administersurvey.js index cfcad3012..27c073c0b 100644 --- a/www/extras/wobject/Survey/administersurvey.js +++ b/www/extras/wobject/Survey/administersurvey.js @@ -211,7 +211,7 @@ Survey.Form = new function() { } } if(submit == 1){ -console.log("Submitting"); +YAHOO.log("Submitting"); Survey.Comm.callServer('','submitQuestions','surveyForm',hasFile); } } @@ -238,7 +238,7 @@ console.log("Submitting"); a1id+"slider-min-thumb", a2id+"slider-max-thumb", sliderWidth, 1*scale, [1,sliderWidth]); sliders[id] = s; -//console.log(1); +//YAHOO.log(1); s.minRange = 4; var updateUI = function () { diff --git a/www/extras/wobject/Survey/administersurvey/comm.js b/www/extras/wobject/Survey/administersurvey/comm.js index c8d0cbe48..9947facb4 100644 --- a/www/extras/wobject/Survey/administersurvey/comm.js +++ b/www/extras/wobject/Survey/administersurvey/comm.js @@ -12,18 +12,18 @@ Survey.Comm= new function(){ if(form != undefined){ if(hasFile){ YAHOO.util.Connect.setForm(form,true); - //console.log('set file was true'); + //YAHOO.log('set file was true'); }else{ - //console.log('set file was false'); + //YAHOO.log('set file was false'); YAHOO.util.Connect.setForm(form); } - //console.log('setForm was true'); + //YAHOO.log('setForm was true'); } if(callMade == 1){ alert("Waiting on previous request"); }else{ callMade = 1; -console.log(sUrl); +YAHOO.log(sUrl); YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); } } @@ -42,7 +42,7 @@ console.log(sUrl); if(response.type == 'displayquestions'){ Survey.Form.displayQuestions(response); }else if(response.type == 'forward'){ -//console.log("going to "+response.url); +//YAHOO.log("going to "+response.url); location.href=response.url; }else{ alert("bad response"); @@ -62,7 +62,7 @@ console.log(sUrl); var postData; if(form == undefined){ postData = "data="+YAHOO.lang.JSON.stringify(data,data); - //console.log(postData); + //YAHOO.log(postData); } var sUrl = this.url + "?func="+functionName; request(sUrl,this.callback,postData,form,hasFile); diff --git a/www/extras/wobject/Survey/editsurvey.js b/www/extras/wobject/Survey/editsurvey.js index 79cf25f0f..5989a5376 100644 --- a/www/extras/wobject/Survey/editsurvey.js +++ b/www/extras/wobject/Survey/editsurvey.js @@ -9,7 +9,7 @@ Survey.Data = new function(){ this.dragDrop = function(did){ var type; -console.log('In drag drop'); +YAHOO.log('In drag drop'); if(did.className.match("section")){type = 'section';} else if(did.className.match("question")){type = 'question';} else{ type = 'answer';} @@ -32,7 +32,7 @@ console.log('In drag drop'); else{ type = 'answer';} data = {id:before.id,type:type}; } -console.log(first.id+' '+data.id); +YAHOO.log(first.id+' '+data.id); Survey.Comm.dragDrop(first,data); } @@ -50,7 +50,7 @@ console.log(first.id+' '+data.id); //add event handlers for if a tag is clicked for(var x in d.ids){ -console.log('adding handler for '+ d.ids[x]); +YAHOO.log('adding handler for '+ d.ids[x]); YAHOO.util.Event.addListener(d.ids[x], "click", this.clicked); new Survey.DDList(d.ids[x],"sections"); } diff --git a/www/extras/wobject/administersurvey/comm.js b/www/extras/wobject/administersurvey/comm.js index 33dae620d..3a61ea4a8 100644 --- a/www/extras/wobject/administersurvey/comm.js +++ b/www/extras/wobject/administersurvey/comm.js @@ -12,12 +12,12 @@ Survey.Comm= new function(){ if(form != undefined){ if(hasFile){ YAHOO.util.Connect.setForm(form,true); - //console.log('set file was true'); + //YAHOO.log('set file was true'); }else{ - //console.log('set file was false'); + //YAHOO.log('set file was false'); YAHOO.util.Connect.setForm(form); } - //console.log('setForm was true'); + //YAHOO.log('setForm was true'); } YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData); } @@ -33,7 +33,7 @@ Survey.Comm= new function(){ if(response.type == 'displayquestions'){ Survey.Form.displayQuestions(response); }else if(response.type == 'forward'){ -//console.log("going to "+response.url); +//YAHOO.log("going to "+response.url); location.href=response.url; }else{ alert("bad response"); @@ -53,7 +53,7 @@ Survey.Comm= new function(){ var postData; if(form == undefined){ postData = "data="+YAHOO.lang.JSON.stringify(data,data); - //console.log(postData); + //YAHOO.log(postData); } var sUrl = this.url + "?func="+functionName; request(sUrl,this.callback,postData,form,hasFile); From ff2ecaa8fc8b6165a75dd0b88d7a025112f19ca9 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 20 Oct 2008 03:35:40 +0000 Subject: [PATCH 47/64] Branching now works, but now it isn't recognizing the end of the survey properly. Will be easy fix tomorrow. --- lib/WebGUI/Asset/Wobject/Survey.pm | 13 ++--- .../Asset/Wobject/Survey/ResponseJSON.pm | 47 +++++++++++++++---- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index d513e3714..a92a6d392 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -587,10 +587,6 @@ $self->session->errorHandler->error(Dumper $responses); my @goodResponses = keys %$responses;#load everything. - if(@goodResponses == 0){##nothing to load - return $self->www_loadQuestions(); - } - $self->loadBothJSON(); my $termInfo = $self->response->recordResponses($responses); @@ -660,8 +656,13 @@ $self->session->errorHandler->error("Can take survey"); return $self->surveyEnd() if($self->response->surveyEnd()); - my $questions = $self->response->nextQuestions(); -$self->session->errorHandler->error("Load Questions had ".@$questions." questions"); + my $questions; +eval{ + $questions = $self->response->nextQuestions(); +}; +$self->session->errorHandler->error($@) if($@); + +$self->session->errorHandler->error("Load Questions had ".@$questions." questions") if(ref $questions eq 'ARRAY'); my $section = $self->response->nextSection(); diff --git a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm index 39d013e4b..c3a58275f 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm @@ -15,7 +15,6 @@ sub new{ $self->{log} = $log; $self->{responseId} = $rId; my $temp = decode_json($json) if defined $json; - $self->{goto} = defined $temp->{goto} ? $temp->{goto} : []; $self->{surveyOrder} = defined $temp->{surveyOrder} ? $temp->{surveyOrder} : [];#an array of question addresses, with the third member being an array of answers $self->{responses} = defined $temp->{responses} ? $temp->{responses} : {}; $self->{lastResponse} = defined $temp->{lastResponse} ? $temp->{lastResponse} : -1; @@ -118,7 +117,10 @@ sub nextSection{ my $self = shift; return $self->survey->section([$self->surveyOrder->[$self->lastResponse + 1]->[0]]); } - +sub currentSection{ + my $self = shift; + return $self->survey->section([$self->surveyOrder->[$self->lastResponse]->[0]]); +} sub recordResponses{ my $self = shift; @@ -133,18 +135,27 @@ sub recordResponses{ my %fileTypes = ('File Upload',1); my %dateTypes = ('Date','Date Range',1); my %hiddenTypes = ('Hidden',1); - #These were just submitted from the user, so we need to see what and how they were (un)answered. my $questions = $self->nextQuestions(); my $qAnswered = 1; my $terminal = 0; my $terminalUrl; my $goto; - my $section = $self->survey->section([$questions->[0]->{sid}]); + #my $section = $self->survey->section([$questions->[0]->{sid}]); + my $section = $self->currentSection(); if($section->{terminal}){ $terminal = 1; $terminalUrl = $section->{terminalUrl}; } + + #There were no questions in the section just displayed, so increment the lastResponse by one + if(ref $questions ne 'ARRAY'){ + $self->lastResponse($self->lastResponse + 1); + $self->log("Incrementing last response by one"); + return [$terminal,$terminalUrl]; + } +$self->log("There are questions to be submitted in this section"); + for my $question(@$questions){ my $aAnswered = 0; if($question->{terminal}){ @@ -189,8 +200,21 @@ sub recordResponses{ sub goto{ my $self = shift; my $goto = shift; - - +$self->log("In goto for $goto"); + for(my $i = 0; $i <= $#{$self->surveyOrder()}; $i++){ + my $section = $self->survey->section($self->surveyOrder()->[$i]); + my $question = $self->survey->question($self->surveyOrder()->[$i]); + if(ref $section eq 'HASH' and $section->{variable} eq $goto){ +$self->log("setting lastResponse to section ".($i-1)); + $self->lastResponse($i - 1); + last; + } + if(ref $question eq 'HASH' and $question->{variable} eq $goto){ +$self->log("setting lastResponse to question ".($i-1)); + $self->lastResponse($i - 1); + last; + } + } } sub getPreviousAnswer{ my $self = shift; @@ -232,13 +256,15 @@ $self->log("qperpage $qPerPage"); my $questions; for(my $i = 1; $i <= $qPerPage; $i++){ - my $qAddy= $self->surveyOrder->[$self->lastResponse + $i]; - + my $qAddy = $self->surveyOrder->[$self->lastResponse + $i]; $self->log("qAddy was $$qAddy[0]-$$qAddy[1]"); + next if(! exists $$qAddy[1]);#skip this if it doesn't have a question (for sections with no questions) if($$qAddy[0] != $nextSectionId){ +$self->log("Next question section did not match current section"); last; } +$self->log("wtf"); my %question = %{$self->survey->question([$$qAddy[0],$$qAddy[1]])}; $question{'text'} =~ s/\[\[([^\%]*?)\]\]/$self->getPreviousAnswer($1)/eg; delete $question{answers}; @@ -252,11 +278,14 @@ $self->log("qAddy was $$qAddy[0]-$$qAddy[1]"); } push(@$questions,\%question); } +$self->log("Next Questions returning with "); return $questions } + sub surveyEnd{ my $self = shift; - return 1 if($self->lastResponse > $#{$self->surveyOrder}); +$self->log("LR is ".$self->lastResponse." and order is ".$#{$self->surveyOrder}); + return 1 if($self->lastResponse >= $#{$self->surveyOrder}); return 0; } From 5b8a1df90ef6762947b71f5f1de6406df09414d0 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 20 Oct 2008 03:49:17 +0000 Subject: [PATCH 48/64] Fixed end of survey bug. Now previous answer fill in workds [[gotparam]], branching, and all question types but uploaded files all work. Need to finish reports, upgrade script from V1.0, copy and paste, add point values to answers and questions in the edit templates, and figure out what all methods a proper core wobject should allow. --- lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm index c3a58275f..606875c60 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm @@ -180,7 +180,7 @@ $self->log("There are questions to be submitted in this section"); $terminal = 1; $terminalUrl = $answer->{terminalUrl}; } - elsif($answer->{goto} =~ /\S/){ + elsif($answer->{goto} =~ /\w/){ $goto = $answer->{goto}; } } @@ -191,7 +191,7 @@ $self->log("There are questions to be submitted in this section"); #if all responses completed, move the lastResponse index to the last question shown if($qAnswered){ $self->lastResponse($self->lastResponse + @$questions); - $self->goto($goto); + $self->goto($goto) if(defined $goto); }else{ $terminal = 0; } @@ -200,7 +200,7 @@ $self->log("There are questions to be submitted in this section"); sub goto{ my $self = shift; my $goto = shift; -$self->log("In goto for $goto"); +$self->log("In goto for '$goto'"); for(my $i = 0; $i <= $#{$self->surveyOrder()}; $i++){ my $section = $self->survey->section($self->surveyOrder()->[$i]); my $question = $self->survey->question($self->surveyOrder()->[$i]); @@ -285,6 +285,7 @@ $self->log("Next Questions returning with "); sub surveyEnd{ my $self = shift; $self->log("LR is ".$self->lastResponse." and order is ".$#{$self->surveyOrder}); +$self->log("ENDING THE SURVEY\n\n\n") if($self->lastResponse > $#{$self->surveyOrder}); return 1 if($self->lastResponse >= $#{$self->surveyOrder}); return 0; } From 5afae6de8513ff9f7a7e7a9a7528e1effa47df4c Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 20 Oct 2008 16:17:25 +0000 Subject: [PATCH 49/64] You can now copy sections and questions. And if I correctly understand how to bundle asset packages, all the new template changes are included. --- lib/WebGUI/Asset/Wobject/Survey.pm | 25 +++++++++++++++++- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 21 +++++++++++++++ survey_templates.wgpkg | Bin 7065 -> 8835 bytes .../wobject/Survey/editsurvey/object.js | 7 +++-- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index a92a6d392..152ea5fa2 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -254,6 +254,11 @@ $self->session->errorHandler->error("Submit Edit Object"); $self->session->errorHandler->error("Deleting ".join(',',@address)); return $self->deleteObject(\@address); } + elsif($responses->{copy}){ +$self->session->errorHandler->error("Copying ".join(',',@address)); + return $self->copyObject(\@address); + } + $self->session->errorHandler->error("Updating ".join(',',@address)); #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. my $message = $self->survey->update(\@address,$responses); @@ -263,6 +268,19 @@ $self->session->errorHandler->error("Updating ".join(',',@address)); return $self->www_loadSurvey({address => \@address}); } +#------------------------------------------------------------------- +sub copyObject{ + my ($self,$address) = @_; + + $self->loadSurveyJSON(); + + $address = $self->survey->copy($address);#each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. + + $self->saveSurveyJSON(); + #The parent address of the deleted object is returned. + + return $self->www_loadSurvey({address => $address}); +} #------------------------------------------------------------------- sub deleteObject{ @@ -274,7 +292,12 @@ sub deleteObject{ $self->saveSurveyJSON(); #The parent address of the deleted object is returned. - pop(@{$address}) unless @$address == 1 and $$address[0] == 0; + if(@$address == 1){ + $$address[0] = 0; + }else{ + pop(@{$address});# unless @$address == 1 and $$address[0] == 0; + } +$self->session->errorHandler->error("returning ".join(',',@$address)); return $self->www_loadSurvey({address => $address, message=>$message}); } diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index c7d56673c..5d3ee40b9 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -178,6 +178,8 @@ sub update{ $object->{$key} = $ref->{$key} if(defined $$ref{$key}); } } + + #determine what to add and add it. # ref should contain all the information for the new sub insertObject{ @@ -193,6 +195,25 @@ $self->log("Inserting ".join(',',@$address)); $self->log("Finished inserting "); } + +sub copy{ + my ($self,$address) = @_; + if(@$address == 1){ + my %newSection = %{$self->section($address)}; + push(@{$self->sections}, \%newSection); + return [$#{$self->sections}]; +$self->log("copying here $$address[0] :".$#{$self->sections}); + }elsif(@$address == 2){ +$self->log("copying question $$address[0] $$address[1]"); + my %newQuestion = %{$self->question($address)}; + push( @{$self->questions($address)}, \%newQuestion); + $$address[1] = $#{$self->questions($address)}; +$self->log("to $$address[0] $$address[1]"); + return $address; + } +} + + sub remove{ my ($self,$address,$movingOverride) = @_; if(@$address == 1){ diff --git a/survey_templates.wgpkg b/survey_templates.wgpkg index d6a776e96c093c3087ce7fa09a033773b4979cfd..ee9fbb6aebe3195f6e99723ed8fcdcc5ba9316c5 100644 GIT binary patch literal 8835 zcmV-}B7EH+iwFP!000001MNNgbK5r3`MG}u&o@2Y&77>aWjnTR9H(j0CU)vLP211k zcqoyU7*nJ|QhwyV{_o#D@Zw9BELmwLb|w-<0K33qvDjTKfXycl|5vZqyPeLHC-}Vu z->okHS?aI;q|vB%yNzbIRo{AIHR_E{_lX5rAO3F|Cw2r?yLS7-sds;T&^Y*`M$-5F zA+5C})w-cSyW8}NYa{-)eVSPb{G3!~Z>0|8G8g)mMSx zzu&q(Mv3Rf_?EI^&OzkbiR(PO#kU)+4a$rOz8xn& z+)Tm*%t9d;P%+obZ}})^$RB8-$bC%YzHA12=jf zyU{BrTM_priR_oI?VQ@fd_g;o-9!{}wm-gk^X9~H-u==|uHUx(#vkuqU2E*q$S2@Y z7$!AujBTsM)9A{*tvT+6J@u0+|EwnVrK`(%@k`Hf+<*!<%=d4jFbR{}2~)yo=r9VW zlUL3Uj+bz$rY@GaNeZ+ZrXwr0RZ}dRO~r8;4<#xIt1q1-NG$)_{LPLIR|y zjgqnd)EbQJ2pYaWO)je2XB$21EIJGJ5-;)H-Uqk;;OUX7D57v&rQ zJ$v-zd%>j@xjw*;lUv_~o^%sHi>;D42XPE3I&F2^O;VgI8$NNUWDVz}ku6YJ%9j#=n$)hbq^A3C?zfAI zKb3F#_TUo7UEowBcLHK<7x)^#tG7jYCSmL)UWgzjH~612{fW@%V-v@S8)=N!o|BAr zt?l~v3f#!`h9kh!l*M(;s=j*xDcdrIVE&!ui-yUq$mT^T5?hC{QSoY(2~s0+(KA+e zucn7H5orLzJBFbOL$rzmrV8T)gaqYvyemtl#}j+tMv$^M>Fw3+QB#s7!66Dq%g<;hR$5rjC*VNOhQ8+OFIxywdc)@&CV9K! z1_*I0r0a@-15E-DJut+PJmN7!8k#qkVqHaf-3J*QQa;^#bfD^9!;e)19>|$MKFna! zrCSmE9*EN#f0ZD*Cz8x0V>_UQcyZ!JEN-D^#^cq{?hZ@^NU%w=S@L_&6v8~sfPDK$ z(2plt1QS>w zCr4r8U3dc<#Rs7=lzWtfr>JV*jUOpAC97q_o`4BoHiV$YjFly<3bb~>3J4xP3 zz(%zadnoL`t5)ls*BO2K`R8$?@#)Zey*)lS8Jcx_cMDQsOlS-U)G$dF(*_0>Aq%*O zNyu={P@~z{*=lSVrXKVns57E^oqlliIdPA=*R7-A=biD3_HW+da09LLKfn8P6~;fn zC>dx?kWB0H|7>lw^8TN8^U?paqAs2Z=3DmvynTjq8I1t-VU9-W{}Ilf^I-%AUOx;k z&%sUvXOJl=9?;`6YWDP`%YGTK;F>+q6TpRI*j$@nbK%T&LbZz_!ye67*1+|B6qsHx z1l6F4P9k_Su^orsG|<#SXAY$H!wA%_-8cmG%Zfe!3QXDt8oOW*0=x*(CVPnkekOz& zK#?}3ohA4lMIYOukN{Kn_X61+=m{#8XZQ>Y@QX^ZaocKr{}g>%RonN5!R`P=r5imp z%y_6$814T3MIHZPjrYJ+#$G5*LGHUv)tQ^9$6#Ki*yM8fcHi~Ep0weA0)8-{z#3`@ zlYevt-C0^em0`{Gb6np|+)dl}HzSyc!ytC!d?gEW71k7pD!UyXk%O4YnARdyvIerA zWQ*mQ!KL|n(+=Wm(Ejs{$fOrk|3T{WY3jzPNtV}0=U7*rW^}cnlFqTNI)R}^ZaKHK z=X8!-og`xkmb1_?Cd4W7U$EDYtXj|FFBY~W-J~~+I2DvzTZ%^IC!>^?$0b$iy9A_Y zc<*~?F3Nt{YUUN$P%XF2S$SfE&zWq(O?Y$!sVE z6E`PlgM?Eso`!DEvi>m!dp%5^mSl!Zufe~uIh~w_&3f;S>;X)%1Q#9W!oQFj8d~o$ z&A@^s!MhE5!}eL)p#M>-XBI0!x|(aW>dPy!h-u&Ier=|Gqut$VH`@(kML2ER8}@U& zplPpYs(W-U`+m{~4GKLFO1p;#!;j#_4{F~xn(fw3XKQCmS9|^T{Y>Mp-2UHQpZ(vc zx7*!Z{71L`X#d~UcdJPMmhJyW`0OMe9K9O6IDS=~{BRl_9>kui14I3&^r56& z8Q8Am9ySVz-wA3P3*?&5ecM7-R(&beolFqS7OygpG8_4AyHSe>Y7Z3&7R zttl!Ds~Z)zQY9eyi5Lp!8jh6HEdPgB*me?UYK{D3>;`_oea7W~k@rGpI6T|n2h#Y9dLDhcJ~`~P4PTONgzEzI{BN+f|m|LA_}U|2jUGz)(}F!R#OjzB zsqQ)avOg`bU@TPV6=Uqh;K3OrV)RJUD1Pfkm`#rwZGMn-m(8dei}~L=Ob&<|!|Q>24uuX{Y#FH|sS;aI zQOPAl9pD`w1F94?!1ZJBrLCf_ zE2|@fB9h!N>#E%@vL6j0C#w(LLyM@`ZxHnp-CC0rPs<*oH0&hGJ!k9Fg_h`{Vn9pv zOfksD{5?_(pgvzu0M%jonV;z9Ts3=i=xRZkm5|(kvm%Nc5bs5Bqx=H&jvyYz_NCsY z#kOQ|SoWYCb27Kgz66c4AeJI;7T5xm%@&=TsFrmqh$hKuy+3)av@wcaMm>w?M2Y5o zMu^v7+!g-ftTY zPArN}O96p8-q7Jy9HzEGmUhh<9;l^Vb8?=g_;zI`t9A-Y@sJ?Efo_|1lOYr2kLG z|HycYwTAzIGVvGywDA}KlnEHX__IyPkZMtWO#w=Up*^`Us={0{xFJZHSaa_lE4sdMD&B-jqVM9djHaX6(B z{{!-u;(#as=&t>0FjKe@1U}L?MR4r>4K^bNxJE*r(IgxWefPO{^-ox^dFA{IcJ`qs zA3UP}bi%m0uXM93~DvpeF!dCxd~6j#iV@6GExX)Kl_Hg zE4dqN-ad8)M23n$SDCWu#V5Fofq^ZQLq(q!$7gZCW_0fuEe;V>l9ob&ii1EG3CLOy zLU|At140@RdAYWlxH=hFO*F-e4@I055}5zNGM%E(2==N%pzR2DcMAf`ZeX{vSx9Fv zhmeetH9D4Y%lIpa)Qsg4wUe?W9k4Y|0U59bquGqr75oEHtKsz_Z195drD}~0gF2{a z;lD%Fau^JJZ*U2tnFsAZDkwt(6aa*EsxXC8(j!T)I*CJvjPA+5rcf^wRFbrG2x8 z=Wc1=?6KHp@Fk-rOY5+Rhqlu&_7#2=9$FbR+19L)_Rua7G$~1{LC@u-eT=@v3UOE&r5T~6d``s+3NVHJZWKleCRgMp z(Bwir=m(>%m%ONs5L_|RM&T8Mhfunei1Cb5;4WY_EY?X+X!;OI! z9~U*dIS^d{Ey?s7ygcCTjf}Zuf=fyRSn$4oi0n zX6I~V>2OA2Po;C|oT$BXMo?0dxF8#KCwqJtRw^b2A>p5Sv`GakCxc%z#5vpW955g% zMGS%_AxC;vI`ss3u1nPyV?G#fr_RK%3V9bO z#DFcyyt$gFZqyy8DxcvJq<5BKO>3=`GpH5mCW~NgMX&|9zznTS$9$Ld9LHbhC=-i`>p;lfPF||GUYorVh!C z5`XsFtPe|Up0x6`K?0Tt8zQbj);q`sQbg|)%2o(}<9euMGgO@JfX79Uv9tn$oHd)H z=BP!ASG9DxlcskxPd3@4eM-cY>AR{5Ld(iXYw8A-XC5ZGqZ!CEa z#AYI^scSwdZF2J$lgxK;7LndiQtw^Q!afq6?p+k88hFQ6_gf(-a51Q~TrHbx zsbyXtCvRbaW-R(kDPB1`-|d5=fDw{yLKNi24EL>8Manyiu$A=>#@$qU^^yr7+Y;Fa z_zh_&o8Z5E$hC9so|>bIS*gRW+7b`qEcT(=7Kuzr={lVg{ggk;8#ha^iZi(TLy&%U zpEh&vSE>#8g{KcqmOh~2F42J)=d4=#2FCst`H7O&Ej<`e5QWSt50pdJ~A+%Q!{%dzVC-=r1&hQmAx zd^sR~c)4HrOjvnF8_o-+c-p5nuJ+)vuxL!|&Isg`L%+nBJ=?f|d)oMVA~jQChNAyE zTx022Ok+dw(y^Go$TOUD{nofiz5x3I@t51Jwh_npRm5M4`zW@JFw1oOr4eVl=nnaN z+()tV%ge2|;r2myYq~x9(Yg91{5-xf&ZB$y9rAD=Mbo^U<8g=l!$;tKSqvrdpF8V| z|FpU-xEwfr|1aGC+IfusTnA@-%kiJr2ZOf#`KMpKUr#4twR!aW@oyiljQf8Ui2wW& z2Y|}RN>(1tsK?w1pfcXWNN~`a}Bvytp{zlIud>vpg6zZ&5(t$y}_A@N?@uI@{p;|<>Gh7Ol;zLCb zM5w8VkSRJ+RAgDnfub37WygsYqf8$rnk7Fjsi@W$pP-puely%ha{OTi)whJ8?8HoB zh*<|_Y8%st@D*&7IW045kP%{aQl{oK)!B}94Z)JJZY{#qk%N2~><7$Z;7+|Q&hNHDd9Xl1vv`U% z+5q?(wTr_-~K+{TgT8@a1SS5T)*Agk zt#+%P^Z&FS{Xffe>)d6(W&cm%`HzOnU;2OK`H#F;)s%HF>6&!9AKEAf@;QPl8c?gt zUL7rFOA@?r-S$SqxBv}qnuc3X5-tO0*O12o7xwfTCEWo23WDs#9d1jQyu@ z)sG#;Zn8g3E~?uQ<1Y>?!SLhKgc;vdU zLpP7Z8b$5} zW|&%`7%MJa zIiNd0(ldK-X~AWz@4UoiuZ@f+H-f0nHXsJ#5`!KDu)Wk?W~IK6vu5h^nMvYcJ&?od z6m=)Ehd!K9PojD1t8$=X(OyG7ok4EalQkB_S+>MN^Aac5fj%X!Gcy-u)rMn8mN7_W z>AdusN>vf_x?b?4c2^i{lq%dFIZo0>73Y4!p6O|K!P1T><6z$vIifOah->#oW$-WH zl4@?(4X5$fvWAI1sV$=$SLKtcp$ArT+FXvQ>$ZJz^sMvx^YM=R;*X|(^x+^nUF#Yq z#My&;N>}^Ktzj1Xe;RcV!C_!J3YK^V99!-7lPB=q-ReAf((3Xbica|Jw7U8D@Al*R z-x3s`zv#E@|2gpGcV41b4Z``scu&91>v?5~7 z{;4i70?V;jY2+d%nqiCTcS+3RtJq3L9)7ssD2;%~iMS4F&d@@2X_5^7Ga}kmS|;*u zq2NLVL?Xz99;@^Wl5}_>5*7yD8*sszVUk449B+WfRI&y<7KC3yq~|>CBfz9|6n zE^#Mwz=)Q&D`s+Oa5;#($!YpdgcK4taAu)U$vFg=ayNKq8o>=EuzJUB&9*=# zgRwA8+}LbEHcfyq+Ng5CT1gnd4$>KEqBQayF}x%=bs?PnSFdS81^GTLo+zL$3+<*T21qsO>S4l6-eUh6UL3TL?8 zj%-y52>;NaBqcW)X0ISKzM`H>Eq2L_>9Hu^if^$ZmTxkUVIEo;a!tx@v(=LP23D$Q z2{8&Ib9WtKqS+YVg1o?~23P^Y-5= zEk8D4?pXh8wqa2)WB=9bkMZAsN&C;-@Ri;7Hh^H6#C4wCQi8F0$hYIxn+aR38ULIU{4dJZsVWZV6 zCtDF%Er@K?rcUi)zM$A$M}<25;OKMW9(AurG zeCHgF>|j{fvk*FL55+b|lqH}N%g?T{1!?B2`+=jrc6VQdKIplcfE0vI?SD6ouH0Ll zGGoex7_iAvn0Oa(W(-;}RNiPThJn(4#X`UfOsCE5)Sl1R;owq|sFZ?)b7!Z!v(xD| zjY>r>_IwzCfx*OVz}b|Y#!jncs4k^5pWHb*qr1({m}{E*`0~Y1{hyvUhM%vzA3px{ zGW;+;9L^CW6T>K{Jp>S;iKq7XEDf@4m6X~r#Do{KkU)))2xZWhWJ`)b;_`H}6H>0< zx6f!i6F;gCGjb~OAoLwjy-RL=cfJvW66??J{#=V>enj#}fkz5FQs7}J@c&9l>k^lyXUDVwlU^Zf~&x?G}GPF)6>(_)6-gi@%W#5z25C~Uc9K+8{JO* z#fw&#eGK`jzi2d|OtamtH(M`^M!nVSzA&K5 zXtfoI+J^k!Xg1mP`uE89mP86b+-SE8`@hv`ZlwCZ)#*b212-T4^H}}A{`jOX1H-@n z27_=div7?W*=xqO@jw6j-*hVo{lE@m$BytW6~mIl&^BY++PlNMYppdZj1OEhiVtoB zKZK{dRL7gTu6zumEGGDC!F1p{(b%?BUC+Mx?0A-cLqO~5L3HQ&LF8n?`8S>&evIt! z&`J|x-^QW&#x|{UbCj)UMv)!!N+)~qBydUI<-d)F!afaM0&dxt=G2WZqG@<-->K(L z^v1C)+oM8SJtsN|{n(H10@h-!L8H*028Y&x<;1L3Q-O)=IZdwz^JNBp$D&bzxS4f7w z7l*zZ0hoYF^lC(abD0HdIT6r&ckaZlt)PvY8n~FA^=fdF=qUkaN5jwwVxUsNl5My0 zo(4v(0P4(b&k`j#VjAPnzT8oqv7y_z6kLFC^o>4tq;W=aflL=1Lzw!X?1U+Z?8VUZ z&dn>ERm&m25PuA{lK2r$3cnI4#~a(B6Mqcd*P%Z-F+v%RF`D;w`%l~pN zP!NYO%A+HYOA_AC_TaaVhuhn`IHtC@&xQOZ2mSuo^hS9ag9L*Byg_RS!(}~`}ZNb9SBhEX*sL?_C zmb0EcYc|{UR;#t86$?3k+x5m)r@g6j`otVw2^rC9M`Qoy(0lEN6UHa) z5vne*riP3`OwbiX+Z%>=L3|=$YMm3CBcajH_M+FF@4=s^zqLPfFRm|6ZsW#C0dbWHQ!x) z9Ct4M-23{f9yCX5ICcK#Z~s}w%)A;Ha-M#Yt-AFM%w<{Xgu40D-nQS z+5T(zd#BOx=y3S@_^=uroQM0zQLw89ys-a5-;Zm~1Z~?IvjJ<|B& zOw9q*M5~4D4=l?}&Qs9IB87J##IvLpEwxP@{ZdBUVg`?GQykHs|XjDTR$?mRj`W&lbT$}C` z9w;DCRclRNW#pn|yLM~~K;jnzR?nptW;URe!6OU3LUv3J1m23Ob79GGKU!9<-#_vZv%n5Z5+NZ&Sfl$B=;F}9$(wq8n|Hy)ymf7F6pwdW z9U}rB?lkI(<5{r~K>D0@;y0@c>lVJ|;WoG+VF1hy|?YLJ~9(RH8kDU-YK| zYjFb&CMg)b2t;=n^C9p<2+oNeVlgH9)DT)kxxOD5>4H)Yu^fJSJ}tnqoP!0reG4SZ zwG1P`w))~?r=bawHWH~~uf_l;5c2X!nY`btF?juNG0FlIvC^tTa3wN)&k$Wi+ySXE zqy+I*t7`MH#|vXwiI7@dIJ6|g5|!2P;zMZmfm05!&W8aJMGdgsXi2m#jYdN>nhjZ^ zHL4p7fU)$lG5hP?<^cX$EPNLE?_EfUc19~VQ(1Us=A7o?p9?1t# zpRFf=>oEPy&UAgQDjyw+EU2>-mTPd9#BmMcLJZgH&%y5yJZz>bj4!3Og@}V?MkQtx zZc+RJJWhjn5PQ?W=HP6)>dZ_vjC0O3!B*qr={sqSk!gr_7Ml|V8gPGQCo}CKHxt=B zQ`1aVWq{!5*+$C%CO^0YKLGd65;kRmH0zxWV+gL(oleIH{hMf~tvf=YD%ckS0(HD* zh)a`PTSqL%fv5Q}9@~M(ZF*b-sAjCvjh9Qn9L~H}v!QtzpVXVDIkk$tdD{L#p*L@H zOZ5fpO)SNmS4(#BOfJ0x=iu{);fIkQb$)xjSKT`M+WAq{*4vNl(&N5Oof|);OK&c} zQP%&rOwS)91#pz@|28`t-L(I&(QZEP|IXEs3l^T&|EF*GrS}|uroG_;|GwPXD)tR( z8aV=w;c;m3{h-~meO(XFy?2azHLy>=Z^G*9+?m+^l zk9P-Kt=rv=v%_k8)A{t~&D1+;+^F6un(lGb?7G3&9N01J;kqu1HA%Pi;d^|1M|4vY zi-bXNvPT=eG)2mPdg0LVXuWVY+qh~p8h^PB!tDG{cQ%)41pvgd`M=xU$i#nbH0#gv z|AJHcT-D~C|9_@A-rD^B{{8z?%R2kejc-ocZsY6Op{AgU=XkaMN1;De49w9L+uU<| zde$!7{)1gO2uq6Nplbh^I@b^bwh!T2u+djNhn+Eq3&ZFw_z4ft(NG)56Za)}2{9}s z-kHXi)y;2f%tzj18&oWchsWL+qSV0wu}I!o7IIOt~7f zs`zeu7CwnyR_2(9{=Hg7A_l&7XZ&02JWR}R;I78#X+j?Q&P zS=F^K;mM|WLNNb}MH?uX`DGD`z}8{dsCu=^eT>8|x<+y#6jKgoViF4+__hW^w2A|! z3gZQo1eH~R1u)<-qAP?a7%mFlQ02U&qQbL1dyFFs_e}KTck|k0w?TzO;SlspR)gG` zW8bgBo_Q7aAH2Ah`VF=V5?Nz#s2#|n-lFKHvExGD+fhwkEgOXe;nx;KT-U?}X~reD zL+Xf{yt)|rp}p+JkOC%syW|FNb<4Hul7RzHJmx({_VCLTYt-KIqOv48ulgW`1IN;X z#1&6&)bQW30mE91%>?42L`WapipX_9oz~b_0ip$wq$U{(hIb&AG-T=)dS)_N4)5;4 zl!FADB$_3@d%6;4(+udhe|m!`P%4;21`E=`0M-)Hf+Erj3y6<^tYhN=HDt)K_$mZN zcGQU(kNF;&3hMytxG(1v1T27w?_LdOm%e5fFK0VT^Fx%ng@mI^5up1~vc4$gElS3t z8yIA-fRuQS9w#V0g?}#pQe9g}{2ZHE-Hz&tLU-1jq3N|`56|S?dfk|89gjNIo8jiy zcW=YNrhon8-Rk1g`DT{RjfC&2z<-^IPcQKQv_Lhj>il1)-EF4#e>UoH4D|W@-(0So zg$n=5{-53NWB2H|b@TQ5sB_hJ+CLos^H3YYGx&c@FS@bACkX#$hl&5 z!QVK0_m&X+jd0K^fVJW-G0AwcKyMbNErPrCux~xkJ4^66xURNS5kD35s#Wr%dUhc$ zNUb&@uG@yym1SE7W572&j0v?>_)sO}C0GF+Z1M>Y8%iU1JDmhZ?2A}v6#$iqhR+W- zZYyeGZST>!0;KT749!Udd={V@O!Tb~0D%HlIe;66@*uj4`I7&lca%`9+oiacVY0^#MN+QtS ziS}7F6^AF|q2;rOgw;zR0zoR8UOrDDNe0nVBZB^W@ObHMAzo%=1AMT8e{d-R;bmU{ z81r@(FeXNa(^!LuxEwHNu^r3+2Nq(10EE{$kUrVr0M4;YX6!TwG^XN$rP`SY@hHVj zIO;rmXs&=Ez^8glJWioVc32Pm;o*ctRW0e%m1goTXAPw-3m$n5#dSwATx^AFs9gMW ztf3m+uD<2_l*fCu9dLam%ffK@X7(({d%?KY1nLO`0^9Ls@ME(&99#tlm($OIeQR|;ZvEG6HS5p&|4$_jzw-KT|Mq=waPjfP zoPOPH1)JZk@OXD`zWslBm`hivkGK0T{kzf&EX*{r`1oV?kZs}jU^i6xY}raEV%r=? zaFn&uhfP9dXCM^(kjEJoN*ofH;M$6Z0YO_5RtWOcg1SPI1b~WU5L>F!Gi`Or{M4`M zfH53J{j(ji?)G&;TaiFg%#aMqSlH-W4{PT<=6W8WF(p2<{2&D-~|6?g3M zV%Tp8ReX@4{GcVC4>s6#ad~sV4A+;GoF?;@nMAn0qu%4d2XBwyl==nE{5*Z3{h zKn%yFveAmq0aW2$^eJ?V%N!7R$8L?F6^EL?i)VYCOpll%_*(kD~ID<5I7r zU+ZGQ;z~pwmC2C(rr97P$raSOtN@VAv`)5ATJ7X?f=&!xvrfqz`cD@Vzn4P){cM&~ zhmb~rKmD!K!=ngD17~@I3@lJK#9WQ7_pptQ?v@dziy0bD_rSw8rPLpH`7KG1oOBY~MKpyF`LBi*2+&A?{K(lYmxc`pN`6lDz%*@hZq3d-Xm zbTSV0g!v&W(WAmK(<=bUcq^bX!=h-u7N}UAaW09;G9qUuV=eYaxkiEp7K1HoJ&{z% zwxzdy0gcV%YECV!OY@UyW=46TWD)B%BXwaqbLEM5I?ubROII52sx&R(T~v)xWwxx= zSoR2ts$eCSVc-nvh-fa;YYPp`{EmgYXtqgFNS2a1QCy@3l?6FGSGpWQge7ZkCMwh* z)W0wV*YIDVONC{5f-*&#i~w>ESMF>kLu-X&LvSk7@l5=R=e%4802w8EHn(1l;K=^c z(Ud!8xM5kite9tn5vD#@mSRn#A_0mUsqBw}@uK7}J6)$Og?s!3$Qscb3M}4{cav>q zVZX@`7yfS>g-v@{1MVM~msvt9FX74P*R@6Tj_gU%J%LQ7tMD!1S zLn~RDIeC$3CrRimJv9S~>G8u{wan?9L0l$2M0TFa6r8S8ocK%jzqoN_ij~LU4@RK< z%mL*A+^JL>@C#1~?o{|Fv{%+3C6nlDjv zhJpEDEjTa2JS9i>GNVq1tY7!$Qf_5Efl$>(uZ|<{`u>u63xe|Duj2u6ki%WSuU~7X zKwiW0#%*dx2cZEb;U?X~|pE82TukbIq2^c(WP z=J;|z{jlwR?lWP=Gp^wrZ)yV`wYbuPBN+lQ<5=0pKZs1vstqfQrp&=UM=a$gynaNH{d1g0+ti{mpYlA~yXo1F;|=>m=l6rF zckX5D^X?z*FCP@QR}xFv(Yf)<#Zo?14BtcW7Q}xxR~P?jY}Dc9kjeKyVoJN`^M4QN z*IDcS%JHAM@BeEnl_}2u@t3_^gz!!)h`rO!f-m7kFAeQum^ z6RxboOXcuAX{R>6rY4eW19*=hPsF55T^4k?jtBU`-R1j`7{WZ47XzbZtdN~G{4ZS%aAuycZ0$o#&7*9&;g zs)5c!h-Qk{ac^Xum4v+E1I!yPwu8Z35(U6}1u>?XXK=8|UT4o#P*hJx0$Di9P{_v_ z1o-5B@YXb>w*(cmKt2Xn+cdT#y#?uK9E8?JSpuSveb36T&7bkw!h)9!my0p^Y7Z3` zfQ51Oq+6A{B8;K0({pfgsLd91l}5hCkwsR=L2Ga)X8k}W~V61*|(AKYUuS9b#b zx)Yt^D|+5RW)V3WHKGKa+)s-kL@W*}_5(m6Vz&tG8%iw&cPWt*AZFQ~nwac~1xIUu z^DdS6F((#hEDQ#6dZ*xaJEB!NuoNiSQoakAQy6cNs>*d!C&yx{y5LKu$t*7DUS4Tq zQs`~H)q?#RRw5Jv(vlb%Gjdujpn@PF7mK`7S;63|@I0ZA)QHy4A{C{81Vq&Uj$V#T zq&|lmqN4mx`f6n7i`JBKA=%R!Hh93ch=nfI94%@ho+StI3@8#72U%p(y`oFuv^?$e9$)5jgY&@_3S0S9g^7{X`(~n25hp}sY9Qi@@ z$LYJNfALCtAB|Z5m%aa$<$tyl?>kz8S3o`rk23aEg;&Fv zIV97BvS?~%u9nzWNygy?kffB6W#!O5CudS1QL}Ns{)0ua5Oh&yk) zL)iF-?y=s~WoM>&VhvCQ(tnHj++A=1lXjTGh6}HkbeD->T|qIg&U6dg%#kMwz@9o| z2|Q5Why-`~;}1MUr0DrBWxPu~l@T+FF5#LZn$&X{Zi5mhcq1RP!jF^pS@YsNvit6g zta{@hVb!nDgO`hc4kuo-yQMMf=ZLe}&_b-1=EO_(@JtT8uJ`rJ?R2wx>$-;rhxWG0TKe2{kyMV`xzgyS zVF`4pbh_zcDU`{yy6OJJbFs4Zy~uVk0W>=zE5=Cj3^m&}r$c{w0qO1}1b%=6A=^(R z5EUN#0)hVwpKb9xZng!&f?+|(Cbd7$#fSlwh!(YKl?rAnl_buLLtffC44f|M$iLYR~z zT-I<|I)fvo28~O|mCY7tGx7i{$>c;_S~Ldek5k0V)p{LHLDTgjDO82+-o^7OaA1TE ztjyTr#2J@ti}lATGUjTr4yT~SdXW^WWQ(bnz%vK_dK~zF(?Ytj0IC20 D&&Bx~ diff --git a/www/extras/wobject/Survey/editsurvey/object.js b/www/extras/wobject/Survey/editsurvey/object.js index 7c7090178..cf67d07d1 100644 --- a/www/extras/wobject/Survey/editsurvey/object.js +++ b/www/extras/wobject/Survey/editsurvey/object.js @@ -8,8 +8,11 @@ Survey.ObjectTemplate = new function(){ document.getElementById('edit').innerHTML = html; - var butts = [ { text:"Submit", handler:function(){this.submit();}, isDefault:true }, { text:"Cancel", handler:function(){this.cancel();}}, - {text:"Delete", handler:function(){document.getElementById('delete').value = 1; this.submit();}} + var butts = [ + { text:"Submit", handler:function(){this.submit();}, isDefault:true }, + { text:"Copy", handler:function(){document.getElementById('copy').value = 1; this.submit();}}, + { text:"Cancel", handler:function(){this.cancel();}}, + { text:"Delete", handler:function(){document.getElementById('delete').value = 1; this.submit();}} ]; var form = new YAHOO.widget.Dialog(type, From 887aaf6930a25867d0d8a7cd7929d059b76c4d43 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 20 Oct 2008 16:56:02 +0000 Subject: [PATCH 50/64] Added scoring --- survey_templates.wgpkg | Bin 8835 -> 8873 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/survey_templates.wgpkg b/survey_templates.wgpkg index ee9fbb6aebe3195f6e99723ed8fcdcc5ba9316c5..20abb57899bba5e1b8a2b7b16af40f03e3c70c2a 100644 GIT binary patch literal 8873 zcmV;aB39iWiwFP!000001MNL)Q`<_i`FwtbmQ!cFTeW__fPl9MNlwT~fB;E$bGb#y zmar9MNs(j>Ih+4}yL+B`85(_-P1FwJbCy}tyb%{+fSb0cL%gj$?+OR>qH~lQqOw!^rPch{*-{$R6%s>`9b7l!TD3q4&O(1cwnUo zv2Wtgd}W)~nK{fpXhxA8^M|a>&u`zpJ+Z9Qcinh;+;Z!mP7kIE`y_M;ck zs?j98wr{JJeQ8eIxXgZ*WAn;Z&pFX6$FgjX9%72Mky+p%ek;y5VVUnb7=?)k>P@5Qzkm(Kw1`GzrIKcOH7R#Zpv*nMgY zMrH^N-<`yl<<0Yro^c+YdpofcyLRuR-T(dlfpJPLGxpqIWbRa15!RxbBj9I`u3X2v zGD6!0_)&c8+R&4B3}~@c0_Px#;La$tFX2v=IwY#zPMm6g;<#4z5-5z=-}2b;Dy({S zW$?$gH>pxbN7d-c@!+pHuHxO5qv}uM*!Qx?*!`8G!@e~g5dADhS+shjrfYkanTL~? zBv39VB~!ou*&f7ICXIZ!W#N#_#fNUY)>?oY?UZL~w)usnR!uMt>?eM(j{woH|xK+BP<8ze#W- z+Zm1kPeVMeC@Z`6C6sK65`y_F(=Q4pYel*)LJ`>73>!UOE;EKyiCuJ!SExB_Np603YhfmiW|VyE!VCq z1`a&&K=r^7NA~c`6l-YSTuO8$=T#r1a0vZ$@6my#dlmnz8t_2O1ma?bkS^Vd$aO%S zR@qkpqI)7qO){nhR)`bDcF5E%^vrm?8s6Q3DF+EQNi<7*@90XHO*5e1{_6FkK&fDo zO04Kupfg!ZNDB%bjTOX4K-RJCI9@Q}%6LQuEP^6C>e!4&#VB&kHinB{kS+e8=?2k-unCn4+VZ)t}4dsy5$T<~mse(mw(xEwKrZlr*x3~Au zyx-nF6DG6tKggaX)A~6x-G#l2lazwW?eGtd&3uurDsm#U&dt8dFlu%^Oqs!*6h%}b|PTMbK$$x8;w@2 z4z=2fZYMehGfZ^5&eV}VJ@8)o;h3>QEApV%$rK^X%)+Q9`_c9W;cXBf3&0v#u{q@a z-*vNj>a<5+{`g~DuYcKh-fWKdPKG*dr?;RL#)L+LKn)XY(S2YL5%PfZgoGUD6gL|6 ztxmn8xq8rxV9s#z+I{cvYiu8Or_Dp}kFD{`*1w$n;Rbr=-+uYF3g;hS6b!TmXr^_= ze>$CJHvZFWJ;r}l)WtKw{LJy6<7YUR(Fl-#^wB8dKRnoTF$}@M>-+xI1^9^&4AM2l z14evCjh>oxSzHD@xJD1`1PI}1K34^NE}Xeeh`ISMkr6u{K|8%K5rdV-42Gx!V^;O9g!=eF7W?J35z%BJfKz3l<0N;`b2x$!`fA8!Bp zvWEYV;vEQ;u_%<{AnUt|?92+Q%5%tn5PH5$>%qG2SdVBDHQHOe>{mAs;GASo6lu}qP5P%S1D4jV-k zjGR>jp`>Yq!zR9Uabv(5MZg9S+Kg8Q4Hkn?;p*@N1Bq#_?*|Y+WevH&U%*6d&=%-o z(eSJe7A43MwD^>r`2fHwH4u{Yp?mw(SokMx%~T} z4;B%@3LY!bAL} zh@mdAwN+(AltxymckJ3`WEAQ_A0iH#?P56*WW3zk)`g=zp)F68*!o0?)8|+vzB*A-))G9bwI=UjSluWwFI4~% zzt~boO;KC)_`nZt#l!46^QhKPU?wz^!D5`Ha83^KEX-44E929SR5%fS{+&y9Ac>vz2;-k&TN3%4h2R+m4n+ zS>q@t9%L3pccW$Xdc8v*F$?UFo*;y40Qr6X7^EX~$azDyZ}Tn~n>UczGK@#N%{GL( zzS_I>n&Nm?q6Cm0XPx-Xo`onKq(tP9&~))-^%W1~EOjQ)Pe?2zhE=(&Wbp$LA)2kwdWV$cL@0?rYr0=rM88L!?Fj}m{Yh# z^(A3G605)ZUG-~Y*t*Py{+eYY5qurJk;KWBUXvrZ^$7?pc z%)?YZ$kL%XEdsT4Xim(tl;1Ahq&0@+@(EZVB-dG66hicSqnlaPQqev@qo+pJ2X8&NBPI71jdsQLPb_Bb-IfF$vu&}cJkgA{$A(17kbu7az@~;F^ zJ(r79Cv-_NVQZcTM8Xz~W<6Jz%MWC&`qO>b;05DLQjHA*8f3QcuaLFudjr=QT)}8& zgZ6JFP$l@3TAdJ#gq6m>Q@Sw;DXMYwr-5>+A4#D}OnQJb%PTbz3SL8hNs%w4J!G4{ zW)P_LAvIP@-)^SLq!4j%Nh!h}fbdp^3A{2}1XH5Hn#dMu^t-BOh!0}=rys1R#GuYV zQ2H8Mf|WISl*$^(yrVybh^e+nPUGTnUYD{S*L#$WodjCGLVvz78-Zjy!(TjZbGR)a zC)my4%p)+Q_`gj27_us*%yMZ~9jVn48X_&S{I}M>B4IGylZ-?9Uz{8Wxp*3q1o$9@ zm7P2CCIP%kc{txt52Uz?gHaWx@+KcDZ4%oK)PV%+{8Hh=rDL;N=EB)@IA98 z3u#y+Lffuu`wD-E2(3t(Y$?%5MrfBvniMQmpy!IxKITl`FOK%3K2;F^?XEBW+i2G7 z+5Mk*{@dgEUk@);KXd$d|K@G*;^O_WIr+5L3^qSo;nChRZAD7Ne`n->3WG6HYIYsT zpXVF$6bO+XL%9~*@??c9hY$l0%En_^hY`!XJcL}hQV-m8wUUfb@I%HG13J9fMaZ*Z>LoBU~%Cyu{c231hN-%}}Zj?p}E>~#Blh89RO$bTQ)>Bwi zr$?p1m`+|(S!FiW$6={%!Ro9Uc{;2j_otGz zR86$rSw%2X<0z*ZbtjAXFj$G47=(l${b-XC5+{;hQ_MNva4c{jN_hf;E+NbGEVXMT z*cm9=&QJgnCNi1Z!l{uB=|c+kINKH?l%y^}FXntOyzLrehLJ0~z##_M5W<_GM0TU< zI7xg;N|4`afz`dWLdl?3B%92WwI#zAkODomGMV#T)N?HVI>RB@4~QGvEhhRUJvIEk z&BBhsGZ&LRnQk1HaM}1-3}0NpGh9HT&;{oGBe1bvfijhUbiR>!n1mlfU!Wdmlu~k1 zPC24Jfy5<5kH=8Dc%)ng2iDq$GO7iViocPl9uJ|U2w&Zx(sckLO^&IIz~FQshtzi+ zQKByyE7gQCb8boORF3ext{kaILc}2tCm6ZU+3t%18IsXKQfEcdE#!_i0H?ZClrfpK z3_8sLM1`H_0HVXskLb38n_ME20C>oVX;2xW zWqE@PEKoMYT#c=Funn|`+9#AI2!G>xs1P$WobG_f9znrU1_(;lY>AqKiiE5x?Q$ni z?`WQAvd;U2iYu~rB?;WhN@;8A23cnwA-SU)q!eWh5ZMM=0?APsJe10U#i{Z;#>^}& z#2!^9>0KI)$;RkzW~2J(`*0w}^ttnq4kMq@%Att$c>f>WZy#W&Y141XS^+yDU0hWeJ=ohpfO zZtG_UX1HNl=vE~C=h-tbVe0WF(N0i^6QuUDe0T2#IWKx6U#wHo%#Qs{8eFL=*2HvA z>5yPnO~9AEoSNNAW<3c{R@Af+SENM-Q$gH_i$;3yw?vQ=VvuDSDjRE|GHZ`hv@pjq z=KUoNuMD5>j=@pF2)Y zv~%vBnuEl&)?uOAf(YU)@gZvSRHoo`jn0XF%KjENZkA%@XK?q2p#97~ZRXxBmFw^e zPc_~x@lnVfXIXoRPM(7r*a2CNM{ssTDT!C!&!V5jM`t{w*A0}!`$|$rcN40zR~b5& zMbk@GhKq*sJk2w2@|!2_ufKV6mtk_;Kx4AB%sp0eECN0j_;}0=!&$wkSy0*M$n?b9 zdJ*fi+;B^}KWDjy>G2G6wpg#wvFV%xopZP5)E~%d(Zb=ZKlUF!^tD-zZ0;f*I&+R= zr_Mj+Fw;%rwg`2;vdx(5%XP9&nSPxHrI*QOvWq-zm#EIqnwd}YC7zsPU@ol%7e$z- zz##^+pL~IsA{2C$B}n^cg;M9VD|9W@qjoa945U?Tx+I4Uc>UnZE8ga zAps_IddUXD-#RE>rg`bfJEAT_C4(S(GOx1uL}fx6^!8Z_F&>V@*Gcjtb$sEH=WdqR z2J*Dk4`47N&BSdXvMkaxz>gL$MKa>Ka7TaKjTf1OwK8xHfxiRFO$VaxqI zX2OhT^x+(Df~S2d=V}LD78Z_4+!+Ef<y6@9{p0t#_|F z$NuJCw=>xs{cc^q^S_R7wDag5euq4~kD{T!o#Szb{KIG9eP0X(`JY?s%l|aG?M5rR z|Nrs*uWJ#EpE>_?x;JQp|VH~>^+Rx;yJ&w9+9 z04l1k{|HcS#|qQp`yKYlg8kxvPxO7obvkOR+p4L9M%fXc_;BH2pR%QAU@>b)cO}ht z?h;E!8GmEs5x({?847LIH0!{jUi%rA>UdEe{E#go>a>tTDgRK>J)UaHGi36P6y;S` za-e7mUD0u(`6!cziKf|)ODeMU`6p;5m*2GTkr;niLG~>nC^|8d1Y*{Knaao1GJLrh zrB2ICJ7k1do|LI1O?I|rOd(k^QmsX}Dszw>2Ky1KXt)!1b0zr$PcSq19&`zRwk%;N zP0LGDr`Sn{I#pvCNlJkd$Wnros+B^Rlp}2@pTg>dfxHAgY%sTXP9ESxGOsN=mh|Ej zG2oofe^R6lr=aP2l@zMNcJJYyYlt<_cIY`s3;yk}W1N zmTNz}xyNQ`jv=uZg17oYjDfKgaS*Xutz{?q^5$xB84e5|5-0!aw+xKvBp90>QrK<$ zoZ>?02qXoaZb9@5_dCe&Il&HkZ_OKLJb^R9>HKcP7Y7UEG>c8KT6-YICv-3mH>*3G zOsOYUXMxu#{c{(}!h;1BMxe+@&QXRRF%m^3-@*;{;C~{;a=t*mVI3(l&c)<^* zh6AZdBs$uPeukNJLv$SbA)<6z-6aQ`PnpnZJYaR4TZJf&8$r= zF!=v86jl)bX|6H;(`+?snfOnm`?&vi9RZ-9IsTJ-{-YN17x5o){v+F~s^-lH-Ra9u ziN=LJwMI#A06%~vd%j02zYJ_O7C}JQLpn+Dl1_XVRt3Tc6?)_Sk*Awj3JEU3g=lCh zBZA@-+A^O6%00Q{QTxRQRw6x_HA4l=W@m)~m5MSMBC+yH1HKP43w7?cQ^f>P+`bjZ z2Pw|j@MfC}CIuIG-kj0Hsg1u$p1mHHEsi2g{l9D?zToi!Uek-KL+r)n)Y2sRh4^E5 zDv2NAr0^^GT-vVF&O%+K&) zbnEPo>1Xd%;Jmw-+Haokzi+P3hWjC2zqgJlekP6r`>(x5`>)&SWY2$TH6QK2nH{&H z!k^jx`~Bqo;mbknTJMK`Q2uiAX5wEw*A$en|7M*3!i<4+uKvMW_~2N>I1b7f&@+Rc?^TSFoeY^M3?*IP& zfLjs9o*Rrzut%s!*f2YI4h*wY=p0%Wjp7&v5pCw@>j-_{x;6fU7n_7|gx_}UDV)A% zS&lcv%WurqA`k?Pe!Gr$1#gaafnq9&Mz#$*bh9{&QD|R6Es>#pJ8`Q0iQ`(39_Gan z`&)+m?+TG5Ov4qxhhsk{RWiP#YINmz@Yfty@$Sk|v1NfQGIoFE=ulcrcu#Yf#VCtb zj?{%ykn=FI`zu11%HL-r6)pG`!B^4;hjGHo1G5Zd_Y>&EfD+$3cbzC5g@as)pTu|y zv|~qAc?DB8jBJS04?-tkFO0l5_*--2`(=2uWEtMl<;B(1?^U9bVpf$`7jRaKy-FN3 zerdR_kVkx^@`1TRz`zHOozR6W;g>0PFa>^J>5-gPJWs(V&3s?*pCjL^;-6Il<)e&! zmHRLa=0IPHY_68r7tJHtPQB;AO(`SG%AtM1!I}bznvLnW2Luh`G9Eu9e4pMRoP&Wn zwkpjK`bnk+JNpaF1<=Q3oSVxqHS=AJR10&(MJNYs2Pk@G4z3J%8SAMN+bn7$^2xO% zs`CxVfw;n?2M%l}v6oqzFBGhqxa`a%ey|?sVR?$W6`DgA&ZsBVJaOf7U}Di;Lv}iY z*sLcg=8rSo5^>9mpIis_6n~wWz9=g<97C~KRV*rJORtGinK7^Ef-AYZLR&nP>Gmjb zf;aMU)=$_oJryokIuNBD?7N~sRBCZ=?a`pJ54xf<5ruGYctiRYvp4?RbHB3$pFsd^JH7J~qiT@OC)XwMH<(iR zl}_D0;fIbIi~;Ak8Vl7_CT%HwKA-}dEGa_4wP6X8iAiU0j^nsssJZGmtx;8%= znYCT(Gf|Y{=0aU2U=;M2C{Cfs?J%w>iA=$&wPb_h$W!*{vJP8aOPpKUVdFeW8v1K= z*mChN;IP#aAH`vVY*5&jsp$Tm4%?^Bmc8}$w%d63CfW?Wi|N;PbgjLp;o%*& z?pCw2mFz_biyv4U#Z611mY>i*G{^jfsH-3TH?b|QkX4~K2yENbb ztF_kY|8?8ljQ{ue{_pij#?S2k<>r5CDo?Eci~LVmdI;dv8@8?#Upba#d!z=m%u!I5 zAsE?ck5iF09rB5bW;0YCbuE||+i=JXoT^FB%*>+1={k{ASb?O%4~{)OvGL8&EMkn- zwTgTz*Mct-UERK7r=|T@n}^3*3WHx zgDpSQ9goD)D!}1&@QRsC8N3|CuCOxoPJ{#!+p}h&ki{7USaLUbYZAg6N?`SlwKd%W zSq#p?B(@{H1?e&lLTjU}0c$0`2Rle-l<}ug?nvMT!>J4DtVpr3mcOHvS4_E;3Eqh( zz@vs24zpJ~!(*vOaOBYHhg`>@U(d}LmV@~F3C=g_wc2lD1%!*0dRc4Y{lr-eaxk&O z%5bNeGxRWP#}BmSBSQNMvTyKUBl%A6sbj^X?MC}I@ouCn`H4GfoSGD{;*4c$J=(j% z8QgALv?>9F{ZOC;Co2qQFQ+ozqMl1Ec8Q9~u_*5HZ@wayZ8ET79$smBP3UdC)q?#R zRwA^389A*MP%$*4t>kF{>5@GOr+!Ix@r|1@^pbu8e~Z@7)zX}{WMHZWaP)FyBK7k@ z!1Ga2d7>K2v}Pt3l0B_qg93IetQgu%J<~aBYMNcv9j$4T`qJ*`NyZ9Tqc568zKA2b z)zu7(fpB{qWiA@apRMRoV4M|1SGS+N!|=JEJR3YtQ+pRZSwHh4!RBv> zZS#<8M)8XqbWGp{Y!Q}v;7|Mm10?W)tY6{t1d~4G%8YDF>3+|ieuNXJ{V4&}^jCE2 z`9b7l!TD22XMGPFt$27wBLr3pLKCg2Gjo`IkngS|LJl)C#ow;B1!?B2`;ldRZEwHyU9fW%11Sle+J8C;ukBk^GGoex9I)WfkDW_6 zGX}jFdR}WRrh(Fa#azG(Os9>_gvbBJA6y9*WyPCwkZ^8ob+@+K-G)X~Xk*X&9yl0` znRPguvR&V5HZ{|wFa#^&1~a-_?~J*oxzDd&zV5$%ULStFc3ymb{mTD1-XG49Boo0X zr#%Fap^2yVxJ(z$BDqd9&?tJp#0L}masVQ1l literal 8835 zcmV-}B7EH+iwFP!000001MNNgbK5r3`MG}u&o@2Y&77>aWjnTR9H(j0CU)vLP211k zcqoyU7*nJ|QhwyV{_o#D@Zw9BELmwLb|w-<0K33qvDjTKfXycl|5vZqyPeLHC-}Vu z->okHS?aI;q|vB%yNzbIRo{AIHR_E{_lX5rAO3F|Cw2r?yLS7-sds;T&^Y*`M$-5F zA+5C})w-cSyW8}NYa{-)eVSPb{G3!~Z>0|8G8g)mMSx zzu&q(Mv3Rf_?EI^&OzkbiR(PO#kU)+4a$rOz8xn& z+)Tm*%t9d;P%+obZ}})^$RB8-$bC%YzHA12=jf zyU{BrTM_priR_oI?VQ@fd_g;o-9!{}wm-gk^X9~H-u==|uHUx(#vkuqU2E*q$S2@Y z7$!AujBTsM)9A{*tvT+6J@u0+|EwnVrK`(%@k`Hf+<*!<%=d4jFbR{}2~)yo=r9VW zlUL3Uj+bz$rY@GaNeZ+ZrXwr0RZ}dRO~r8;4<#xIt1q1-NG$)_{LPLIR|y zjgqnd)EbQJ2pYaWO)je2XB$21EIJGJ5-;)H-Uqk;;OUX7D57v&rQ zJ$v-zd%>j@xjw*;lUv_~o^%sHi>;D42XPE3I&F2^O;VgI8$NNUWDVz}ku6YJ%9j#=n$)hbq^A3C?zfAI zKb3F#_TUo7UEowBcLHK<7x)^#tG7jYCSmL)UWgzjH~612{fW@%V-v@S8)=N!o|BAr zt?l~v3f#!`h9kh!l*M(;s=j*xDcdrIVE&!ui-yUq$mT^T5?hC{QSoY(2~s0+(KA+e zucn7H5orLzJBFbOL$rzmrV8T)gaqYvyemtl#}j+tMv$^M>Fw3+QB#s7!66Dq%g<;hR$5rjC*VNOhQ8+OFIxywdc)@&CV9K! z1_*I0r0a@-15E-DJut+PJmN7!8k#qkVqHaf-3J*QQa;^#bfD^9!;e)19>|$MKFna! zrCSmE9*EN#f0ZD*Cz8x0V>_UQcyZ!JEN-D^#^cq{?hZ@^NU%w=S@L_&6v8~sfPDK$ z(2plt1QS>w zCr4r8U3dc<#Rs7=lzWtfr>JV*jUOpAC97q_o`4BoHiV$YjFly<3bb~>3J4xP3 zz(%zadnoL`t5)ls*BO2K`R8$?@#)Zey*)lS8Jcx_cMDQsOlS-U)G$dF(*_0>Aq%*O zNyu={P@~z{*=lSVrXKVns57E^oqlliIdPA=*R7-A=biD3_HW+da09LLKfn8P6~;fn zC>dx?kWB0H|7>lw^8TN8^U?paqAs2Z=3DmvynTjq8I1t-VU9-W{}Ilf^I-%AUOx;k z&%sUvXOJl=9?;`6YWDP`%YGTK;F>+q6TpRI*j$@nbK%T&LbZz_!ye67*1+|B6qsHx z1l6F4P9k_Su^orsG|<#SXAY$H!wA%_-8cmG%Zfe!3QXDt8oOW*0=x*(CVPnkekOz& zK#?}3ohA4lMIYOukN{Kn_X61+=m{#8XZQ>Y@QX^ZaocKr{}g>%RonN5!R`P=r5imp z%y_6$814T3MIHZPjrYJ+#$G5*LGHUv)tQ^9$6#Ki*yM8fcHi~Ep0weA0)8-{z#3`@ zlYevt-C0^em0`{Gb6np|+)dl}HzSyc!ytC!d?gEW71k7pD!UyXk%O4YnARdyvIerA zWQ*mQ!KL|n(+=Wm(Ejs{$fOrk|3T{WY3jzPNtV}0=U7*rW^}cnlFqTNI)R}^ZaKHK z=X8!-og`xkmb1_?Cd4W7U$EDYtXj|FFBY~W-J~~+I2DvzTZ%^IC!>^?$0b$iy9A_Y zc<*~?F3Nt{YUUN$P%XF2S$SfE&zWq(O?Y$!sVE z6E`PlgM?Eso`!DEvi>m!dp%5^mSl!Zufe~uIh~w_&3f;S>;X)%1Q#9W!oQFj8d~o$ z&A@^s!MhE5!}eL)p#M>-XBI0!x|(aW>dPy!h-u&Ier=|Gqut$VH`@(kML2ER8}@U& zplPpYs(W-U`+m{~4GKLFO1p;#!;j#_4{F~xn(fw3XKQCmS9|^T{Y>Mp-2UHQpZ(vc zx7*!Z{71L`X#d~UcdJPMmhJyW`0OMe9K9O6IDS=~{BRl_9>kui14I3&^r56& z8Q8Am9ySVz-wA3P3*?&5ecM7-R(&beolFqS7OygpG8_4AyHSe>Y7Z3&7R zttl!Ds~Z)zQY9eyi5Lp!8jh6HEdPgB*me?UYK{D3>;`_oea7W~k@rGpI6T|n2h#Y9dLDhcJ~`~P4PTONgzEzI{BN+f|m|LA_}U|2jUGz)(}F!R#OjzB zsqQ)avOg`bU@TPV6=Uqh;K3OrV)RJUD1Pfkm`#rwZGMn-m(8dei}~L=Ob&<|!|Q>24uuX{Y#FH|sS;aI zQOPAl9pD`w1F94?!1ZJBrLCf_ zE2|@fB9h!N>#E%@vL6j0C#w(LLyM@`ZxHnp-CC0rPs<*oH0&hGJ!k9Fg_h`{Vn9pv zOfksD{5?_(pgvzu0M%jonV;z9Ts3=i=xRZkm5|(kvm%Nc5bs5Bqx=H&jvyYz_NCsY z#kOQ|SoWYCb27Kgz66c4AeJI;7T5xm%@&=TsFrmqh$hKuy+3)av@wcaMm>w?M2Y5o zMu^v7+!g-ftTY zPArN}O96p8-q7Jy9HzEGmUhh<9;l^Vb8?=g_;zI`t9A-Y@sJ?Efo_|1lOYr2kLG z|HycYwTAzIGVvGywDA}KlnEHX__IyPkZMtWO#w=Up*^`Us={0{xFJZHSaa_lE4sdMD&B-jqVM9djHaX6(B z{{!-u;(#as=&t>0FjKe@1U}L?MR4r>4K^bNxJE*r(IgxWefPO{^-ox^dFA{IcJ`qs zA3UP}bi%m0uXM93~DvpeF!dCxd~6j#iV@6GExX)Kl_Hg zE4dqN-ad8)M23n$SDCWu#V5Fofq^ZQLq(q!$7gZCW_0fuEe;V>l9ob&ii1EG3CLOy zLU|At140@RdAYWlxH=hFO*F-e4@I055}5zNGM%E(2==N%pzR2DcMAf`ZeX{vSx9Fv zhmeetH9D4Y%lIpa)Qsg4wUe?W9k4Y|0U59bquGqr75oEHtKsz_Z195drD}~0gF2{a z;lD%Fau^JJZ*U2tnFsAZDkwt(6aa*EsxXC8(j!T)I*CJvjPA+5rcf^wRFbrG2x8 z=Wc1=?6KHp@Fk-rOY5+Rhqlu&_7#2=9$FbR+19L)_Rua7G$~1{LC@u-eT=@v3UOE&r5T~6d``s+3NVHJZWKleCRgMp z(Bwir=m(>%m%ONs5L_|RM&T8Mhfunei1Cb5;4WY_EY?X+X!;OI! z9~U*dIS^d{Ey?s7ygcCTjf}Zuf=fyRSn$4oi0n zX6I~V>2OA2Po;C|oT$BXMo?0dxF8#KCwqJtRw^b2A>p5Sv`GakCxc%z#5vpW955g% zMGS%_AxC;vI`ss3u1nPyV?G#fr_RK%3V9bO z#DFcyyt$gFZqyy8DxcvJq<5BKO>3=`GpH5mCW~NgMX&|9zznTS$9$Ld9LHbhC=-i`>p;lfPF||GUYorVh!C z5`XsFtPe|Up0x6`K?0Tt8zQbj);q`sQbg|)%2o(}<9euMGgO@JfX79Uv9tn$oHd)H z=BP!ASG9DxlcskxPd3@4eM-cY>AR{5Ld(iXYw8A-XC5ZGqZ!CEa z#AYI^scSwdZF2J$lgxK;7LndiQtw^Q!afq6?p+k88hFQ6_gf(-a51Q~TrHbx zsbyXtCvRbaW-R(kDPB1`-|d5=fDw{yLKNi24EL>8Manyiu$A=>#@$qU^^yr7+Y;Fa z_zh_&o8Z5E$hC9so|>bIS*gRW+7b`qEcT(=7Kuzr={lVg{ggk;8#ha^iZi(TLy&%U zpEh&vSE>#8g{KcqmOh~2F42J)=d4=#2FCst`H7O&Ej<`e5QWSt50pdJ~A+%Q!{%dzVC-=r1&hQmAx zd^sR~c)4HrOjvnF8_o-+c-p5nuJ+)vuxL!|&Isg`L%+nBJ=?f|d)oMVA~jQChNAyE zTx022Ok+dw(y^Go$TOUD{nofiz5x3I@t51Jwh_npRm5M4`zW@JFw1oOr4eVl=nnaN z+()tV%ge2|;r2myYq~x9(Yg91{5-xf&ZB$y9rAD=Mbo^U<8g=l!$;tKSqvrdpF8V| z|FpU-xEwfr|1aGC+IfusTnA@-%kiJr2ZOf#`KMpKUr#4twR!aW@oyiljQf8Ui2wW& z2Y|}RN>(1tsK?w1pfcXWNN~`a}Bvytp{zlIud>vpg6zZ&5(t$y}_A@N?@uI@{p;|<>Gh7Ol;zLCb zM5w8VkSRJ+RAgDnfub37WygsYqf8$rnk7Fjsi@W$pP-puely%ha{OTi)whJ8?8HoB zh*<|_Y8%st@D*&7IW045kP%{aQl{oK)!B}94Z)JJZY{#qk%N2~><7$Z;7+|Q&hNHDd9Xl1vv`U% z+5q?(wTr_-~K+{TgT8@a1SS5T)*Agk zt#+%P^Z&FS{Xffe>)d6(W&cm%`HzOnU;2OK`H#F;)s%HF>6&!9AKEAf@;QPl8c?gt zUL7rFOA@?r-S$SqxBv}qnuc3X5-tO0*O12o7xwfTCEWo23WDs#9d1jQyu@ z)sG#;Zn8g3E~?uQ<1Y>?!SLhKgc;vdU zLpP7Z8b$5} zW|&%`7%MJa zIiNd0(ldK-X~AWz@4UoiuZ@f+H-f0nHXsJ#5`!KDu)Wk?W~IK6vu5h^nMvYcJ&?od z6m=)Ehd!K9PojD1t8$=X(OyG7ok4EalQkB_S+>MN^Aac5fj%X!Gcy-u)rMn8mN7_W z>AdusN>vf_x?b?4c2^i{lq%dFIZo0>73Y4!p6O|K!P1T><6z$vIifOah->#oW$-WH zl4@?(4X5$fvWAI1sV$=$SLKtcp$ArT+FXvQ>$ZJz^sMvx^YM=R;*X|(^x+^nUF#Yq z#My&;N>}^Ktzj1Xe;RcV!C_!J3YK^V99!-7lPB=q-ReAf((3Xbica|Jw7U8D@Al*R z-x3s`zv#E@|2gpGcV41b4Z``scu&91>v?5~7 z{;4i70?V;jY2+d%nqiCTcS+3RtJq3L9)7ssD2;%~iMS4F&d@@2X_5^7Ga}kmS|;*u zq2NLVL?Xz99;@^Wl5}_>5*7yD8*sszVUk449B+WfRI&y<7KC3yq~|>CBfz9|6n zE^#Mwz=)Q&D`s+Oa5;#($!YpdgcK4taAu)U$vFg=ayNKq8o>=EuzJUB&9*=# zgRwA8+}LbEHcfyq+Ng5CT1gnd4$>KEqBQayF}x%=bs?PnSFdS81^GTLo+zL$3+<*T21qsO>S4l6-eUh6UL3TL?8 zj%-y52>;NaBqcW)X0ISKzM`H>Eq2L_>9Hu^if^$ZmTxkUVIEo;a!tx@v(=LP23D$Q z2{8&Ib9WtKqS+YVg1o?~23P^Y-5= zEk8D4?pXh8wqa2)WB=9bkMZAsN&C;-@Ri;7Hh^H6#C4wCQi8F0$hYIxn+aR38ULIU{4dJZsVWZV6 zCtDF%Er@K?rcUi)zM$A$M}<25;OKMW9(AurG zeCHgF>|j{fvk*FL55+b|lqH}N%g?T{1!?B2`+=jrc6VQdKIplcfE0vI?SD6ouH0Ll zGGoex7_iAvn0Oa(W(-;}RNiPThJn(4#X`UfOsCE5)Sl1R;owq|sFZ?)b7!Z!v(xD| zjY>r>_IwzCfx*OVz}b|Y#!jncs4k^5pWHb*qr1({m}{E*`0~Y1{hyvUhM%vzA3px{ zGW;+;9L^CW6T>K{Jp>S;iKq7XEDf@4m6X~r#Do{KkU)))2xZWhWJ`)b;_`H}6H>0< zx6f!i6F;gCGjb~OAoLwjy-RL=cfJvW66??J{#=V>enj#}fkz5FQs7}J@c&9l>k Date: Thu, 23 Oct 2008 02:49:34 +0000 Subject: [PATCH 51/64] i18nd --- lib/WebGUI/i18n/English/Asset_Survey.pm | 1479 ++++------------------- survey_templates.wgpkg | Bin 8873 -> 9014 bytes 2 files changed, 218 insertions(+), 1261 deletions(-) diff --git a/lib/WebGUI/i18n/English/Asset_Survey.pm b/lib/WebGUI/i18n/English/Asset_Survey.pm index 278eccc19..312d8e306 100644 --- a/lib/WebGUI/i18n/English/Asset_Survey.pm +++ b/lib/WebGUI/i18n/English/Asset_Survey.pm @@ -3,1269 +3,226 @@ use strict; our $I18N = { - '100' => { - message => q|Add a HTML Area Answer|, - lastUpdated => 1122296097 - }, - - '101' => { - message => q|Add a Text Area Answer|, - lastUpdated => 1122296097 - }, - - '102' => { - message => q|Section Name|, - lastUpdated => 1122296097 - }, - - '103' => { - message => q|Survey Section, Add/Edit|, - lastUpdated => 1122296097 - }, - - '104' => { - message => q|Add a new section|, - lastUpdated => 1122296097 - }, - - '105' => { - message => q|Are you sure you wish to delete this section?|, - lastUpdated => 1122296097 - }, - - '106' => { - message => q|Section|, - lastUpdated => 1122296097 - }, - - '106 description' => { - message => q|Which section should this question be added to?|, - lastUpdated => 1122296097 - }, - - '107' => { - message => q|None|, - lastUpdated => 1122296097 - }, - - - '32' => { - message => q|False|, - lastUpdated => 1037498832 - }, - - - '33' => { - message => q|Strongly Agree|, - lastUpdated => 1037498857 - }, - - '21' => { - message => q|Go To|, - lastUpdated => 1035506057 - }, - - '90' => { - message => q|Survey Template Common Vars|, - lastUpdated => 1078223067 - }, - - '63' => { - message => q|Export questions.|, - lastUpdated => 1037556710 - }, - - '71' => { - message => q|Grade Book|, - lastUpdated => 1037573252 - }, - - '7' => { - message => q|Response Driven|, - lastUpdated => 1033944729 - }, - - '26' => { - message => q|Add a frequency (always/never) answer scale.|, - lastUpdated => 1035947924 - }, - - '80' => { - message => q|seconds|, - lastUpdated => 1038789602 - }, - - '18' => { - message => q|Edit Answer|, - lastUpdated => 1035436102 - }, - - '72' => { - message => q|Are you certain you wish to delete this user's responses?|, - lastUpdated => 1037573460 - }, - - '16' => { - message => q|Randomize answers?|, - lastUpdated => 1035429242 - }, - - '44' => { - message => q|Are you certain you wish to delete this question, its answers and responses?|, - lastUpdated => 1035951626 - }, - - '55' => { - message => q|View responses.|, - lastUpdated => 1037555778 - }, - - '27' => { - message => q|Add an opinion (agree/disagree) answer scale.|, - lastUpdated => 1035948010 - }, - - '84' => { - message => q|Max Responses Per User|, - lastUpdated => 1075639389 - }, - - '74' => { - message => q|Are you certain you wish to delete all the responses?|, - lastUpdated => 1037574455 - }, - - '57' => { - message => q|Comments|, - lastUpdated => 1037556124 - }, - - '61' => { - message => q|View grade book.|, - lastUpdated => 1037556642 - }, - - '20' => { - message => q|Is this answer correct?|, - lastUpdated => 1035436321 - }, - - 'question.add.url' => { - message => q|The URL to add a new question to the survey.|, - lastUpdated => 1149654653, - }, - - 'question.add.label' => { - message => q|The default label for question.add.url.|, - lastUpdated => 1149654653, - }, - - 'section.add.url' => { - message => q|The URL to add a new section to the survey.|, - lastUpdated => 1149654653, - }, - - 'section.add.label' => { - message => q|The default label for section.add.url.|, - lastUpdated => 1149654653, - }, - - 'user.canTakeSurvey' => { - message => q|A boolean indicating whether the current user has the rights to take the survey.|, - lastUpdated => 1149654653, - }, - - 'form.header' => { - message => q|The required form elements that go at the top of the survey questions.|, - lastUpdated => 1149654653, - }, - - 'form.footer' => { - message => q|The required form elements that go after the survey questions.|, - lastUpdated => 1149654653, - }, - - 'form.submit' => { - message => q|The default submit button for the survey response.|, - lastUpdated => 1149654653, - }, - - 'questions.sofar.label' => { - message => q|The default label for indicating how many questions have been answered to this point in the survey.|, - lastUpdated => 1149654653, - }, - - 'start.newresponse.label' => { - message => q|The default label for start.newresponse.url.|, - lastUpdated => 1149654653, - }, - - 'start.newresponse.url' => { - message => q|The URL to start a new response to the survey after the user has already taken the survey once.|, - lastUpdated => 1149654653, - }, - - 'thanks.survey.label' => { - message => q|A message thanking the user for completing the survey.|, - lastUpdated => 1149654653, - }, - - 'thanks.quiz.label' => { - message => q|A message thanking the user for completing the quiz.|, - lastUpdated => 1149654653, - }, - - 'questions.total' => { - message => q|The total number of questions in the survey.|, - lastUpdated => 1149654653, - }, - - 'questions.correct.count.label' => { - message => q|The default label for questions.correct.count.|, - lastUpdated => 1149654653, - }, - - 'questions.correct.percent.label' => { - message => q|The default label for questions.correct.percent.|, - lastUpdated => 1149654653, - }, - - 'mode.isSurvey' => { - message => q|A boolean indicating whether we are in survey mode or quiz mode.|, - lastUpdated => 1149654653, - }, - - 'survey.noprivs.label' => { - message => q|A message telling the user that they do not have the privileges necessary to take this survey.|, - lastUpdated => 1149654653, - }, - - 'quiz.noprivs.label' => { - message => q|A message telling the user that they do not have the privileges necessary to take the quiz.|, - lastUpdated => 1149654653, - }, - - 'response.id' => { - message => q|The unique id for the current response for this user.|, - lastUpdated => 1149654653, - }, - - 'response.count' => { - message => q|The number of responses this user has provided for this survey.|, - lastUpdated => 1149654653, - }, - - 'user.isFirstResponse' => { - message => q|A boolean indicating whether this is the first response for this user.|, - lastUpdated => 1149654653, - }, - - 'user.canRespondAgain' => { - message => q|A boolean indicating whether the user is allowed to respond to this survey again.|, - lastUpdated => 1149654653, - }, - - 'questions.sofar.count' => { - message => q|The number of questions that have been answered to this point in the survey.|, - lastUpdated => 1149654653, - }, - - 'questions.correct.count' => { - message => q|The number of questions the user has correct in the quiz to this point.|, - lastUpdated => 1149654653, - }, - - 'questions.correct.percent' => { - message => q|The percentage of questions that the user has correct in the quiz to this point.|, - lastUpdated => 1149654653, - }, - - 'response.isComplete' => { - message => q|A boolean indicating whether the user has answered all of the questions for this survey response.|, - lastUpdated => 1149654653, - }, - - 'question_loop' => { - message => q|A loop which contains the questions for this survey response.|, - lastUpdated => 1149654653, - }, - - 'question.question' => { - message => q|The survey question itself.|, - lastUpdated => 1149654653, - }, - - 'question.allowComment' => { - message => q|A boolean indicating whether this question allows comments or not.|, - lastUpdated => 1149654653, - }, - - 'question.id' => { - message => q|The unique id for this question.|, - lastUpdated => 1149654653, - }, - - 'question.comment.field' => { - message => q|The form field to enter comments for this question.|, - lastUpdated => 1149654653, - }, - - 'question.comment.label' => { - message => q|The default label for question.comment.field.|, - lastUpdated => 1149654653, - }, - - 'question.answer.field' => { - message => q|The form field containing the possible answers for this question.|, - lastUpdated => 1149654653, - }, - - 'section.questions_loop' => { - message => q|A loop containing all the questions in this section of the survey with edit controls.|, - lastUpdated => 1149654653, - }, - - 'section.edit_loop' => { - message => q|A loop containing all the sections and their questions with edit controls.|, - lastUpdated => 1162445117, - }, - - 'section.edit.controls' => { - message => q|A toolbar to use to edit, delete or move this section.|, - lastUpdated => 1162270258, - }, - - 'section.edit.sectionName' => { - message => q|The name of this section of questions.|, - lastUpdated => 1162270301, - }, - - 'question.edit.controls' => { - message => q|A toolbar to use to edit, delete or move this question.|, - lastUpdated => 1162270256, - }, - - 'question.edit.question' => { - message => q|The question to be edited.|, - lastUpdated => 1149654653, - }, - - 'question.edit.id' => { - message => q|The unique id for this question.|, - lastUpdated => 1149654653, - }, - - 'section.edit.id' => { - message => q|The unique id for this section.|, - lastUpdated => 1162270283, - }, - - '10' => { - message => q|Quiz|, - lastUpdated => 1033949566 - }, - - '31' => { - message => q|True|, - lastUpdated => 1037498842 - }, - - '35' => { - message => q|Somewhat Agree|, - lastUpdated => 1037498927 - }, - - '11' => { - message => q|Mode|, - lastUpdated => 1033949647 - }, - - 'user.canViewReports' => { - message => q|A boolean indicating whether the user has the privileges to view survey reports.|, - lastUpdated => 1149654717, - }, - - 'delete.all.responses.url' => { - message => q|This URL will delete all of the responses to this survey.|, - lastUpdated => 1149654717, - }, - - 'delete.all.responses.label' => { - message => q|The default label for delete.all.responses.url.|, - lastUpdated => 1149654717, - }, - - 'export.answers.url' => { - message => q|The URL to create a tab delimited file containing all of the answers to the questions in this survey.|, - lastUpdated => 1149654717, - }, - - 'export.answers.label' => { - message => q|The default label for export.answers.url.|, - lastUpdated => 1149654717, - }, - - 'export.questions.url' => { - message => q|The URL to create a tab delimited file containing all of the questions in this survey.|, - lastUpdated => 1149654717, - }, - - 'export.questions.label' => { - message => q|The default label for export.questions.url.|, - lastUpdated => 1149654717, - }, - - 'export.responses.url' => { - message => q|The URL to create a tab delimited file containing all of the responses to the questions in this survey.|, - lastUpdated => 1149654717, - }, - - 'export.responses.label' => { - message => q|The default label for export.responses.url|, - lastUpdated => 1149654717, - }, - - 'export.composite.url' => { - message => q|The URL to create a tab delimited file containing a composite view of all of the data in this survey.|, - lastUpdated => 1149654717, - }, - - 'export.composite.label' => { - message => q|The default label for export.composite.url.|, - lastUpdated => 1149654717, - }, - - 'report.gradebook.url' => { - message => q|The URL to view the gradebook report for this quiz.|, - lastUpdated => 1149654717, - }, - - 'report.gradebook.label' => { - message => q|The default label for report.gradebook.url.|, - lastUpdated => 1149654717, - }, - - 'report.overview.url' => { - message => q|The URL to view statistical overview report for this survey.|, - lastUpdated => 1149654717, - }, - - 'report.overview.label' => { - message => q|The default label for report.overview.url.|, - lastUpdated => 1149654717, - }, - - 'survey.url' => { - message => q|The URL to view the survey. Usually used to get back to the survey after looking at a report.|, - lastUpdated => 1149654717, - }, - - 'survey.label' => { - message => q|The default label for survey.url.|, - lastUpdated => 1149654717, - }, - - '78' => { - message => q|Total Time|, - lastUpdated => 1038782125 - }, - - '48' => { - message => q|You are not currently eligible to participate in this survey. |, - lastUpdated => 1037499301 - }, - - '87' => { - message => q|Click here to start a new response.|, - lastUpdated => 1075639972 - }, - - '77' => { - message => q|End Time|, - lastUpdated => 1038782119 - }, - - '29' => { - message => q|Add a text answer.|, - lastUpdated => 1035874640 - }, - - '65' => { - message => q|Export composite summary.|, - lastUpdated => 1037556821 - }, - - '50' => { - message => q|Next|, - lastUpdated => 1037499410 - }, - - '39' => { - message => q|Not Applicable|, - lastUpdated => 1037574804 - }, - - '64' => { - message => q|Export responses.|, - lastUpdated => 1037556721 - }, - - '12' => { - message => q|Who can take the survey?|, - lastUpdated => 1033949789 - }, - - '41' => { - message => q|Frequently|, - lastUpdated => 1037574786 - }, - - '58' => { - message => q|Statistical Overview|, - lastUpdated => 1037556179 - }, - - '15' => { - message => q|Allow comment?|, - lastUpdated => 1035429212 - }, - - '81' => { - message => q|Anonymous responses?|, - lastUpdated => 1059069492 - }, - - '52' => { - message => q|Score|, - lastUpdated => 1037506007 - }, - - '60' => { - message => q|Back to survey.|, - lastUpdated => 1037556626 - }, - - '56' => { - message => q|View comments.|, - lastUpdated => 1037555787 - }, - - '45' => { - message => q|Are you certain you wish to delete this answer and its responses?|, - lastUpdated => 1035951913 - }, - - '66' => { - message => q|Responses|, - lastUpdated => 1037557127 - }, - - '73' => { - message => q|Delete all the responses.|, - lastUpdated => 1037573893 - }, - - '86' => { - message => q|Progress|, - lastUpdated => 1075639914 - }, - - '19' => { - message => q|Answer|, - lastUpdated => 1035436296 - }, - - '76' => { - message => q|Start Time|, - lastUpdated => 1038782111 - }, - - '62' => { - message => q|Export answers.|, - lastUpdated => 1037556697 - }, - - '54' => { - message => q|Percentage|, - lastUpdated => 1037555267 - }, - - '67' => { - message => q|User|, - lastUpdated => 1037558860 - }, - - '70' => { - message => q|Individual Responses|, - lastUpdated => 1037573240 - }, - - '2' => { - message => q|Edit Survey|, - lastUpdated => 1033943825 - }, - - '17' => { - message => q|Survey Question, Add/Edit|, - lastUpdated => 1110068088, - }, - 'assetName' => { message => q|Survey|, - lastUpdated => 1128832543 - }, - - '88' => { - message => q|Survey Template|, - lastUpdated => 1078223096 - }, - - '30' => { - message => q|Add a new question.|, - lastUpdated => 1035944708 - }, - - '82' => { - message => q|Terminate Survey|, - lastUpdated => 1068901816 - }, - - '25' => { - message => q|Add a true/false answer.|, - lastUpdated => 1035947960 - }, - - '28' => { - message => q|Add a question.|, - lastUpdated => 1035872173 - }, - - '83' => { - message => q|Questions Per Page|, - lastUpdated => 1075639327 - }, - - '75' => { - message => q|Edit this question.|, - lastUpdated => 1038778819 - }, - - '40' => { - message => q|Always|, - lastUpdated => 1037574725 - }, - - '14' => { - message => q|Question|, - lastUpdated => 1035428770 - }, - - '69' => { - message => q|Delete this user's responses.|, - lastUpdated => 1037573082 - }, - - '59' => { - message => q|View statistical overview.|, - lastUpdated => 1037556614 - }, - - '49' => { - message => q|You may not take this quiz at this time.|, - lastUpdated => 1037499363 - }, - - '24' => { - message => q|Add a multiple choice answer.|, - lastUpdated => 1035874502 - }, - - '53' => { - message => q|Responses|, - lastUpdated => 1037555255 - }, - - '79' => { - message => q|minutes|, - lastUpdated => 1038789595 - }, - - '42' => { - message => q|Occasionally|, - lastUpdated => 1037574859 - }, - - '22' => { - message => q|Answer Type|, - lastUpdated => 1035864413 - }, - - '46' => { - message => q|Thank you for taking the time to complete our survey.|, - lastUpdated => 1037499049 - }, - - '13' => { - message => q|Who can view reports?|, - lastUpdated => 1033949863 - }, - - '23' => { - message => q|Add a new answer.|, - lastUpdated => 1035864494 - }, - - '6' => { - message => q|Random|, - lastUpdated => 1033944643 - }, - - '85' => { - message => q|Questions Per Response|, - lastUpdated => 1075639549 - }, - - '36' => { - message => q|Somewhat Disagree|, - lastUpdated => 1037498872 - }, - - '9' => { - message => q|Survey|, - lastUpdated => 1033949540 - }, - - '51' => { - message => q|Comments?|, - lastUpdated => 1037499470 - }, - - '47' => { - message => q|You have completed this quiz.|, - lastUpdated => 1037499131 - }, - - '8' => { - message => q|Question Order|, - lastUpdated => 1033949393 - }, - - '38' => { - message => q|Strongly Disagree|, - lastUpdated => 1037498903 - }, - - 'view template description' => { - message => q|This template is used to display the Survey itself.|, - lastUpdated => 1146455534, - }, - - 'response template description' => { - message => q|This template is used to display the questions and answers for the user to pick.|, - lastUpdated => 1146455536, - }, - - 'gradebook template description' => { - message => q|This template is used to display, on a user-by-user basis how many questions they got -correct and what percentage answered were correct.|, - lastUpdated => 1146455538, - }, - - 'overview template description' => { - message => q|This template is used to display a statistical overview of the all responses to the Survey.|, - lastUpdated => 1146455541, - }, - - '8 description' => { - message => q|The order the questions will be asked. Sequential displays the questions in the order you create them. Random displays the questions randomly. Response driven displays the questions in order based on the responses of the users.|, - lastUpdated => 1146455543, - }, - - '83 description' => { - message => q|The number of questions that will be displayed per page. The default is 1.|, - lastUpdated => 1146455544, - }, - - '11 description' => { - message => q|By default the Survey is in survey mode. This allows it to ask questions of your users. However, if you switch to Quiz mode, you can have a self-correcting test of your user's knowledge.|, - lastUpdated => 1146455546, - }, - - '81 description' => { - message => q|Select whether or not the survey will record and display information that can identify a user and their responses. If left at the default value of "No", the survey will record the user's IP address as well as their WebGUI User ID and Username if logged in. This info will then be available in the survey's reports. If set to "Yes", these three fields will contain scrambled data that can not be traced to a particular user.|, - lastUpdated => 1146455548, - }, - - '84 description' => { - message => q|The number of times the user can attempt to get the correct answer on each question. The default is 1.|, - lastUpdated => 1146455549, - }, - - '85 description' => { - message => q|The number of questions given to each user.|, - lastUpdated => 1168642765, - }, - - '12 description' => { - message => q|Which users can participate in the survey?|, - lastUpdated => 1146455552, - }, - - '13 description' => { - message => q|Who can view the results of the survey?|, - lastUpdated => 1146455553, - }, - - 'what next description' => { - message => q|After creating a new Survey, you may either start adding questions or go back to the page where -the survey was added.|, - lastUpdated => 1167193079, - }, - - - '34' => { - message => q|Agree|, - lastUpdated => 1037498914 - }, - - '37' => { - message => q|Disagree|, - lastUpdated => 1037498886 - }, - - '43' => { - message => q|Never|, - lastUpdated => 1037574752 - }, - - '5' => { - message => q|Sequential|, - lastUpdated => 1033944535 - }, - - 'cannot delete the last answer' => { - message=>q|You cannot delete the last answer from a question. Every question must have at least one answer.|, - lastUpdated=>1083944535, - context=>q|This message is displayed when a user is trying to delete the last answer from a survey question.| - }, - - '1087' => { - message => q|Gradebook Report Template|, - lastUpdated => 1078513217 - }, - - 'title' => { - message => q|The default title of the report.|, - lastUpdated => 1149654771, - }, - - 'question.count' => { - message => q|The number of questions in the survey.|, - lastUpdated => 1149654771, - }, - - 'response.user.label' => { - message => q|The default label for response.user.name.|, - lastUpdated => 1149654771, - }, - - 'response.count.label' => { - message => q|The default label for response.count.correct.|, - lastUpdated => 1149654771, - }, - - 'response.percent.label' => { - message => q|The default label for response.percent.|, - lastUpdated => 1149654771, - }, - - 'response_loop' => { - message => q|A loop containing a list of responses.|, - lastUpdated => 1149654771, - }, - - 'response.url' => { - message => q|The URL to view this response.|, - lastUpdated => 1149654771, - }, - - 'response.user.name' => { - message => q|The username of the user that gave this response.|, - lastUpdated => 1149654771, - }, - - 'response.count.correct' => { - message => q|The total number of questions that this user got correct.|, - lastUpdated => 1149654771, - }, - - 'response.percent' => { - message => q|The percentage of correct questions.|, - lastUpdated => 1149654771, - }, - - '1089' => { - message => q|Survey Response Template|, - lastUpdated => 1078515839 - }, - - 'delete.url' => { - message => q|The URL to delete this response.|, - lastUpdated => 1149654822, - }, - - 'delete.label' => { - message => q|The default label for delete.url.|, - lastUpdated => 1149654822, - }, - - 'start.date.label' => { - message => q|The default label for start.date.human.|, - lastUpdated => 1149654822, - }, - - 'start.date.epoch' => { - message => q|The epoch representation of when the user started the survey response.|, - lastUpdated => 1149654822, - }, - - 'start.date.human' => { - message => q|The human representation of the date when the user started the response.|, - lastUpdated => 1149654822, - }, - - 'start.time.human' => { - message => q|The human representation of the time when the user started the response.|, - lastUpdated => 1149654822, - }, - - 'end.date.label' => { - message => q|The default label for end.date.human.|, - lastUpdated => 1149654822, - }, - - 'end.date.epoch' => { - message => q|The epoch representation of the date when the user completed this response.|, - lastUpdated => 1149654822, - }, - - 'end.date.human' => { - message => q|The human representation of the date when the user completed this response.|, - lastUpdated => 1149654822, - }, - - 'end.time.human' => { - message => q|The human representation of the time when the user completed this response.|, - lastUpdated => 1149654822, - }, - - 'duration.label' => { - message => q|The default label for the duration.|, - lastUpdated => 1149654822, - }, - - 'duration.minutes' => { - message => q|The number of minutes it took to complete the survey.|, - lastUpdated => 1149654822, - }, - - 'duration.minutes.label' => { - message => q|A label for "minutes".|, - lastUpdated => 1149654822, - }, - - 'duration.seconds' => { - message => q|The left over seconds from the duration.minutes.|, - lastUpdated => 1167193028, - }, - - 'duration.seconds.label' => { - message => q|A label for "seconds".|, - lastUpdated => 1149654822, - }, - - 'answer.label' => { - message => q|The internationalized word "Answer". If the survey is not in quiz mode, this label will be blank.|, - lastUpdated => 1149654822, - }, - - 'response.label' => { - message => q|The internationalized word "Responses".|, - lastUpdated => 1149654822, - }, - - 'comment.label' => { - message => q|The internationalized word "Comments".|, - lastUpdated => 1149654822, - }, - - 'question' => { - message => q|The question itself.|, - lastUpdated => 1149654822, - }, - - 'question.isRadioList' => { - message => q|A boolean indicating whether this question's answers are a radio list.|, - lastUpdated => 1149654822, - }, - - 'question.response' => { - message => q|The user's response to this question.|, - lastUpdated => 1149654822, - }, - - 'question.comment' => { - message => q|The user's comment on this question (if any).|, - lastUpdated => 1149654822, - }, - - 'question.isCorrect' => { - message => q|A boolean indicating whether the user got this question correct.|, - lastUpdated => 1149654822, - }, - - 'question.answer' => { - message => q|The correct answer for this question.|, - lastUpdated => 1149654822, - }, - - '1091' => { - message => q|Statistical Overview Report Template|, - lastUpdated => 1078517114 - }, - - 'report answer.label' => { - message => q|The internationalized label, "Answers".|, - lastUpdated => 1149654954, - }, - - 'report response.count.label' => { - message => q|The default label for response.count.|, - lastUpdated => 1149654954, - }, - - 'show.responses.label' => { - message => q|The default label that will display responses.|, - lastUpdated => 1149654954, - }, - - 'show.comments.label' => { - message => q|The default label that will display comments.|, - lastUpdated => 1149654954, - }, - - 'report question_loop' => { - message => q|A loop containing questions.|, - lastUpdated => 1149654954, - }, - - 'question.response.total' => { - message => q|The total number of responses for this answer.|, - lastUpdated => 1149654954, - }, - - 'answer_loop' => { - message => q|A loop containing the answers and responses for this question.|, - lastUpdated => 1149654954, - }, - - 'answer.isCorrect' => { - message => q|A boolean indicating whether this answer is marked correct.|, - lastUpdated => 1149654954, - }, - - 'answer' => { - message => q|The answer itself.|, - lastUpdated => 1149654954, - }, - - 'answer.response.count' => { - message => q|The total number of responses given for this answer.|, - lastUpdated => 1149654954, - }, - - 'answer.response.percent' => { - message => q|The percent of responses to this question that went to this answer.|, - lastUpdated => 1149654954, - }, - - 'comment_loop' => { - message => q|A loop that contains all of the comments for this answer.|, - lastUpdated => 1149654954, - }, - - 'answer.comment' => { - message => q|A comment.|, - lastUpdated => 1149654954, - }, - - 'overview template' => { - message => q|Overview template|, - lastUpdated => 0, - context => q|Form label indicating the overview template.| - }, - - 'gradebook template' => { - message => q|Gradebook template|, - lastUpdated => 0, - context => q|Form label indicating the gradebook template.| - }, - - 'response template' => { - message => q|Response template|, - lastUpdated => 0, - context => q|Form label indicating the response template.| - }, - - 'view template' => { - message => q|View template|, - lastUpdated => 0, - context => q|Form label indicating the response template.| - }, - - '745' => { - message => q|Go back to the page.|, - lastUpdated => 1110006174, - }, - - '45' => { - message => q|No, I made a mistake.|, - lastUpdated => 1110006259, - }, - - '14 description' => { - message => q|This is the question that the user will be asked.|, - lastUpdated => 1146455568, - }, - - '15 description' => { - message => q|If set to Yes, then the user will be allowed to add a comment to their response to this question.|, - lastUpdated => 1146455578, - }, - - '16 description' => { - message => q|If set to Yes, then the answers will be shuffled for each user.|, - lastUpdated => 1146455581, - }, - - '21 description' => { - message => q|Used to define the question that follows this one when the question order for the survey -is set to "response".|, - lastUpdated => 1146455589, - }, - - 'what next question description' => { - message => q|

          After defining the question, you may supply an answer:

          -
            -
          • Multiple Choice
          • -
          • Text
          • -
          • Frequency
          • -
          • Opinion
          • -
          • Or you may return to the survey
          • -
          |, - lastUpdated => 1146804196, - }, - - '744' => { - message => q|What next?|, - lastUpdated => 1035864828 - }, - - '19 description' => { - message => q|The answer to this question.|, - lastUpdated => 1119993924, - }, - - '20 description' => { - message => q|If you have set the Survey to Quiz mode, then you can define if this answer -is correct or not.|, - lastUpdated => 1119993924, - }, - - 'what next answer description' => { - message => q|After defining the answer, you can add an answer to this question, addi - another question, edit the current question or go back to the page containing the - Survey.|, - lastUpdated => 1146455600, - }, - - 'survey asset template variables title' => { - message => q|Survey Asset Template Variables|, - lastUpdated => 1168644075 - }, - - 'templateId' => { - message => q|The ID of the template to show the Survey.|, - lastUpdated => 1168639537, - }, - - 'Survey_id' => { - message => q|The unique ID of this Survey. This is different from the Asset ID.|, - lastUpdated => 1168639537, - }, - - 'questionOrder' => { - message => q|Defines the order of the questions in the survey, "sequential", "random", "response" or "section".|, - context => q|The strings in quotes are literals. They should not be translated.|, - lastUpdated => 1168639812, - }, - - 'groupToTakeSurvey' => { - message => q|The ID of the group that is allowed to take the Survey.|, - lastUpdated => 1168639812, - }, - - 'groupToViewReports' => { - message => q|The ID of the group that is allowed to view reports from the Survey.|, - lastUpdated => 1168639812, - }, - - 'mode' => { - message => q|The mode the survey will run in, either "survey" or "quiz".|, - context => q|The strings in quotes are literals. They should not be translated.|, - lastUpdated => 1168639812, - }, - - 'anonymous' => { - message => q|A conditional variable showing whether or not this Survey as configured to be anonymous.|, - lastUpdated => 1168639812, - }, - - 'maxResponsesPerUser' => { - message => q|The number of times the user can attempt to get the correct answer on each question. The default is 1.|, - lastUpdated => 1168643566, - }, - - 'questionsPerPage' => { - message => q|The number of questions given to each user.|, - lastUpdated => 1168643573, - }, - - 'questionsPerPage' => { - message => q|The number of questions that will be displayed per page.|, - lastUpdated => 1168643669, - }, - - 'overviewTemplateId' => { - message => q|The ID of the template used to show the overview screen.|, - lastUpdated => 1168643669, - }, - - 'gradebookTemplateId' => { - message => q|The ID of the template used to show the gradebook screen.|, - lastUpdated => 1168643669, - }, - - 'responseTemplateId' => { - message => q|The ID of the template used to show the Survey Response screen.|, - lastUpdated => 1168643669, - }, - - 'defaultSectionId' => { - message => q|The ID of the default section.|, - lastUpdated => 1168643669, - }, - + lastUpdated => 1224686319 + }, + 'edit survey' => { + message => q|Edit Survey|, + lastUpdated => 1224686319 + }, + 'take survey' => { + message => q|Take Survey|, + lastUpdated => 1224686319 + }, + 'view results' => { + message => q|View Reports|, + lastUpdated => 1224686319 + }, + 'continue button' => { + message => q|Continue|, + lastUpdated => 1224686319 + }, + 'add section' => { + message => q|Add Section|, + lastUpdated => 1224686319 + }, + 'add question' => { + message => q|Add Question|, + lastUpdated => 1224686319 + }, + 'add answer' => { + message => q|Add Answer|, + lastUpdated => 1224686319 + }, + 'submit' => { + message => q|Submit|, + lastUpdated => 1224686319 + }, + 'copy' => { + message => q|Copy|, + lastUpdated => 1224686319 + }, + 'cancel' => { + message => q|Cancel|, + lastUpdated => 1224686319 + }, + 'delete' => { + message => q|Delete|, + lastUpdated => 1224686319 + }, + 'section number' => { + message => q|Section Number:|, + lastUpdated => 1224686319 + }, + 'questions on section page' => { + message => q|Questions on section page:|, + lastUpdated => 1224686319 + }, + 'section name' => { + message => q|Section name:|, + lastUpdated => 1224686319 + }, + 'randomize questions' => { + message => q|Randomize questions:|, + lastUpdated => 1224686319 + }, + 'section custom variable name' => { + message => q|Section custom variable name:|, + lastUpdated => 1224686319 + }, + 'section branch goto variable name' => { + message => q|Section branch goto variable name:|, + lastUpdated => 1224686319 + }, + 'questions per page' => { + message => q|Questions per page:|, + lastUpdated => 1224686319 + }, + 'section text' => { + message => q|Section text:|, + lastUpdated => 1224686319 + }, + 'title on every page' => { + message => q|Title on every page:|, + lastUpdated => 1224686319 + }, + 'text on every page' => { + message => q|Text on every page:|, + lastUpdated => 1224686319 + }, + 'terminal section' => { + message => q|Terminal section:|, + lastUpdated => 1224686319 + }, + 'terminal section url' => { + message => q|Terminal section URL:|, + lastUpdated => 1224686319 + }, + 'please enter section information' => { + message => q|Please enter section information|, + lastUpdated => 1224686319 + }, + 'please enter question information' => { + message => q|Please enter question information|, + lastUpdated => 1224686319 + }, + 'question number' => { + message => q|Question number:|, + lastUpdated => 1224686319 + }, + 'question text' => { + message => q|Question text:|, + lastUpdated => 1224686319 + }, + 'question variable name' => { + message => q|Question variable name.|, + lastUpdated => 1224686319 + }, + 'randomize answers' => { + message => q|Randomize answers:|, + lastUpdated => 1224686319 + }, + 'question type' => { + message => q|Question type:|, + lastUpdated => 1224686319 + }, + 'randomzied words' => { + message => q|Randomized words:|, + lastUpdated => 1224686319 + }, + 'vertical display' => { + message => q|Vertical display:|, + lastUpdated => 1224686319 + }, + 'show text in button' => { + message => q|Show text in button:|, + lastUpdated => 1224686319 + }, + 'allow comment' => { + message => q|Allow comment:|, + lastUpdated => 1224686319 + }, + 'cols' => { + message => q|Cols:|, + lastUpdated => 1224686319 + }, + 'rows' => { + message => q|Rows:|, + lastUpdated => 1224686319 + }, + 'maximum number of answers' => { + message => q|Maximum number of answers:|, + lastUpdated => 1224686319 + }, + 'qrequired' => { + message => q|Required|, + lastUpdated => 1224686319 + }, + 'question value' => { + message => q|Question value:|, + lastUpdated => 1224686319 + }, + 'please enter answer information' => { + message => q|Please enter answer information:|, + lastUpdated => 1224686319 + }, + 'answer number' => { + message => q|Answer number:|, + lastUpdated => 1224686319 + }, + 'answer text' => { + message => q|Answer text:|, + lastUpdated => 1224686319 + }, + 'recorded answer' => { + message => q|Recorded answer:|, + lastUpdated => 1224686319 + }, + 'jump to' => { + message => q|Jump to:|, + lastUpdated => 1224686319 + }, + 'text answer' => { + message => q|Text answer|, + lastUpdated => 1224686319 + }, + 'is this the correct answer' => { + message => q|Is this the correct answer|, + lastUpdated => 1224686319 + }, + 'yes' => { + message => q|Yes|, + lastUpdated => 1224686319 + }, + 'no' => { + message => q|No|, + lastUpdated => 1224686319 + }, + 'min' => { + message => q|Min|, + lastUpdated => 1224686319 + }, + 'max' => { + message => q|Max|, + lastUpdated => 1224686319 + }, + 'step' => { + message => q|Step|, + lastUpdated => 1224686319 + }, + 'verbatim' => { + message => q|Verbatim|, + lastUpdated => 1224686319 + }, + 'answer value' => { + message => q|Answer value:|, + lastUpdated => 1224686319 + }, + 'checked' => { + message => q|Checked|, + lastUpdated => 1224686319 + }, }; 1; diff --git a/survey_templates.wgpkg b/survey_templates.wgpkg index 20abb57899bba5e1b8a2b7b16af40f03e3c70c2a..dd0ee20159309e165eef2838d6d0c24660ea668a 100644 GIT binary patch literal 9014 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 literal 8873 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 From 4e5a3c9e4d878fa79ab135920282cb4ad9fe49f0 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Thu, 23 Oct 2008 23:30:25 +0000 Subject: [PATCH 52/64] Set application/json Content Type header on JSON responses --- lib/WebGUI/Asset/Wobject/Survey.pm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 152ea5fa2..616a416ef 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -475,6 +475,7 @@ eval{ #$self->session->errorHandler->error($@); $self->session->errorHandler->error("Returning from loadSurvey"); + $session->http->setMimeType('application/json'); return encode_json($return); } @@ -720,6 +721,7 @@ $self->session->errorHandler->error("-------SurveyEnd $url"); } } $self->session->errorHandler->error("-------SurveyEnd $url"); + $session->http->setMimeType('application/json'); return encode_json({"type","forward","url",$url}); } @@ -769,6 +771,7 @@ $self->session->errorHandler->error("Question Text is: ".$q->{text}); #$self->session->errorHandler->error(Dumper $section); my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); + $session->http->setMimeType('application/json'); return encode_json({"type","displayquestions","section",$section,"questions",$questions,"html",$out}); } From efa370825c974dc668ce515cd6288b0e2ae93787 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Thu, 23 Oct 2008 23:50:53 +0000 Subject: [PATCH 53/64] Minor bugfix --- lib/WebGUI/Asset/Wobject/Survey.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 616a416ef..cdc93610f 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -475,7 +475,7 @@ eval{ #$self->session->errorHandler->error($@); $self->session->errorHandler->error("Returning from loadSurvey"); - $session->http->setMimeType('application/json'); + $self->session->http->setMimeType('application/json'); return encode_json($return); } @@ -721,7 +721,7 @@ $self->session->errorHandler->error("-------SurveyEnd $url"); } } $self->session->errorHandler->error("-------SurveyEnd $url"); - $session->http->setMimeType('application/json'); + $self->session->http->setMimeType('application/json'); return encode_json({"type","forward","url",$url}); } @@ -771,7 +771,7 @@ $self->session->errorHandler->error("Question Text is: ".$q->{text}); #$self->session->errorHandler->error(Dumper $section); my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); - $session->http->setMimeType('application/json'); + $self->session->http->setMimeType('application/json'); return encode_json({"type","displayquestions","section",$section,"questions",$questions,"html",$out}); } From c049c91976053660bb8d164a7615b78302a57576 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Fri, 24 Oct 2008 03:49:08 +0000 Subject: [PATCH 54/64] Hack to allow 20 questions per page until we support an arbitrary limit --- lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 2 +- www/extras/wobject/editsurvey/section.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 5d3ee40b9..6c4483f59 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -104,7 +104,7 @@ sub getSectionEditVars{ $var{displayed_id} = $address->[0]+1; delete $var{questions}; delete $var{questionsPerPage}; - for(1 .. 10){ + for(1 .. 20){ # if($_ == $self->section($address)->{questionsPerPage}){ if($_ == $object->{questionsPerPage}){ push(@{$var{questionsPerPage}},{'index',$_,'selected',1}); diff --git a/www/extras/wobject/editsurvey/section.js b/www/extras/wobject/editsurvey/section.js index d95ce86a7..82aebc2da 100644 --- a/www/extras/wobject/editsurvey/section.js +++ b/www/extras/wobject/editsurvey/section.js @@ -32,7 +32,7 @@ Survey.SectionTemplate = new function(){ html = html + "\

          Question per Page:\ id=> - diff --git a/www/extras/wobject/Survey/templates/fileLoaderHTML.txt b/www/extras/wobject/Survey/templates/fileLoaderHTML.txt deleted file mode 100644 index a23e89784..000000000 --- a/www/extras/wobject/Survey/templates/fileLoaderHTML.txt +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/www/extras/wobject/Survey/templates/takeSurvey.html b/www/extras/wobject/Survey/templates/takeSurvey.html deleted file mode 100644 index 5eaa2b1a0..000000000 --- a/www/extras/wobject/Survey/templates/takeSurvey.html +++ /dev/null @@ -1,189 +0,0 @@ -

          - -
          - - - - -
          -
          required>Q:
          - - - -
          selections left: max'>
          -
          -
          - - - - - - - - - - - - - verbatim' > - - - - - - - - '> - - - - - - - - - - - verbatim'> - - - - - - - - - - - - - - - - - - -
          - -
          - - - verbatim'> - -
          - - id=> - -
          - - - - - - - - verbatim'> - - - id=> - - - - - - - - -
          container'>
          - ' id='' type=text> - button'> - - verbatim'> - - - - - - - - - - ' name='' value=0> - - - ' name='' value=""> - - - -

          -
          - - show'>0 - - - - show'> - -
          0   -
          slider-bg' tabindex='-1' title='Slider' class=slider-bg> - -
          slider-min-thumb' class=slider-min-thumb> - -
          - -
          slider-max-thumb' class=slider-max-thumb> - -
          -
          - - -
          - -
          - -
          - - - - - - -

          -
          -   - show'>0 - ' name=''> -
          0   -
          slider-bg' tabindex='-1' title='Slider' class=slider-bg> -
          slider-thumb' class=slider-thumb> - -
          -
          -
          -
          - - - - - - - - -

          Comment: comment'>

          -
          - - -
          -
          - - -
          - - - - - - diff --git a/www/extras/wobject/Survey/templates/textHTML.txt b/www/extras/wobject/Survey/templates/textHTML.txt deleted file mode 100644 index 80605e73d..000000000 --- a/www/extras/wobject/Survey/templates/textHTML.txt +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From d8bc8f152063f6bc0310c8c3727fd39b3827203a Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 6 Nov 2008 20:18:23 +0000 Subject: [PATCH 64/64] preparing for merge --- lib/WebGUI/Asset/Wobject/Survey.pm | 58 ------------------ lib/WebGUI/Asset/Wobject/Survey/Survey.sql | 20 ------ lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 42 ++++++------- .../Asset/Wobject/Survey/Survey_response.sql | 13 ---- .../Asset/Wobject/Survey/survey_templates.tar | Bin 20480 -> 0 bytes 5 files changed, 21 insertions(+), 112 deletions(-) delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey.sql delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index fa7b558f3..30b969818 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -242,13 +242,9 @@ sub loadSurveyJSON{ $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]) if(! defined $jsonHash); -$self->session->errorHandler->error("LOADING JSON"); eval{ $self->{survey} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); }; -$self->session->errorHandler->error("Loaded JSON".$@); - -#$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->survey->freeze); } #------------------------------------------------------------------- @@ -268,8 +264,6 @@ sub saveSurveyJSON{ my $data = $self->survey->freeze(); -$self->session->errorHandler->error("Saving THIS DATA");#\n\n".$data); - $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -295,7 +289,6 @@ sub www_editSurvey { #------------------------------------------------------------------- sub www_submitObjectEdit{ my $self = shift; -$self->session->errorHandler->error("Submit Edit Object"); # my $ref = @{decode_json($self->session->form->process("data"))}; my $responses = $self->session->form->paramsHashRef(); @@ -304,15 +297,12 @@ $self->session->errorHandler->error("Submit Edit Object"); $self->loadSurveyJSON(); if($responses->{delete}){ -$self->session->errorHandler->error("Deleting ".join(',',@address)); return $self->deleteObject(\@address); } elsif($responses->{copy}){ -$self->session->errorHandler->error("Copying ".join(',',@address)); return $self->copyObject(\@address); } -$self->session->errorHandler->error("Updating ".join(',',@address)); #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. my $message = $self->survey->update(\@address,$responses); @@ -350,7 +340,6 @@ sub deleteObject{ }else{ pop(@{$address});# unless @$address == 1 and $$address[0] == 0; } -$self->session->errorHandler->error("returning ".join(',',@$address)); return $self->www_loadSurvey({address => $address, message=>$message}); } @@ -361,18 +350,15 @@ sub www_newObject{ my $self = shift; my $ref; -$self->session->errorHandler->error("Entering newObject"); my $ids = $self->session->form->process("data"); my @inAddress = split/-/,$ids; -$self->session->errorHandler->error("Address is:".join(',', @inAddress)); $self->loadSurveyJSON(); #Don't save after this as the new object should not stay in the survey my $address = $self->survey->newObject(\@inAddress); -$self->session->errorHandler->error("New objects address is:".join(',', @$address)); #The new temp object has an address of NEW, which means it is not a real final address. @@ -386,7 +372,6 @@ sub www_dragDrop{ my $self = shift; my $p = decode_json($self->session->form->process("data")); -$self->session->errorHandler->error("In Drag Drop ".Dumper $p); my @tid = split/-/,$p->{target}->{id}; my @bid = split/-/,$p->{before}->{id}; @@ -430,7 +415,6 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); } $self->saveSurveyJSON(); -$self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->survey->freeze()); return $self->www_loadSurvey({address => $address}); } @@ -440,7 +424,6 @@ $self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->survey-> sub www_loadSurvey{ my ($self,$options) = @_; -$self->session->errorHandler->error("Entering loadSurvey"); $self->loadSurveyJSON(); my $address = defined $options->{address} ? $options->{address} : undef; @@ -452,13 +435,9 @@ $self->session->errorHandler->error("Entering loadSurvey"); } } my $message = defined $options->{message} ? $options->{message} : ''; -#$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); my $var = defined $options->{var} ? $options->{var} : $self->survey->getEditVars($address); -#$self->session->errorHandler->error("Got edit vars".Dumper $self->survey->freeze); -#$self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); my $editHtml; -#$self->session->errorHandler->error("The edit vars:".Dumper $var); if($var->{type} eq 'section'){ $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); }elsif($var->{type} eq 'question'){ @@ -466,7 +445,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); }elsif($var->{type} eq 'answer'){ $editHtml = $self->processTemplate($var,$self->get("answerEditTemplateId")); } -#$self->session->errorHandler->error("The HTML :$editHtml"); my %buttons; $buttons{question} = $$address[0]; @@ -475,7 +453,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); } my $data = $self->survey->getDragDropList($address); -#$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; my ($scount,$qcount,$acount) = (-1,-1,-1); my $lastType; @@ -512,7 +489,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); $lastType = 'answer'; } } -#$self->session->errorHandler->error($html); #address is the address of the focused object #buttons are the data to create the Add buttons @@ -521,13 +497,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); #ids is a list of all ids passed in which are draggable (for adding events) #type is the object type my $return = {"address",$address,"buttons",\%buttons,"edithtml",$editHtml,"ddhtml",$html,"ids",\@ids,"type",$var->{type}}; -#$self->session->errorHandler->error(Dumper $return); -eval{ -# $self->session->errorHandler->error(encode_json($return)); -}; -#$self->session->errorHandler->error($@); - -$self->session->errorHandler->error("Returning from loadSurvey"); $self->session->http->setMimeType('application/json'); return encode_json($return); } @@ -632,12 +601,10 @@ sub www_takeSurvey{ eval{ my $responseId = $self->getResponseId(); if(!$responseId){ -$self->session->errorHandler->error("\n\nIn takeSurvey with no reponseId $responseId"); return $self->surveyEnd(); } }; - $self->session->errorHandler->error($@) if defined $@; return $out; } @@ -658,10 +625,8 @@ sub www_submitQuestions{ my $responseId = $self->getResponseId(); if(!$responseId){return $self->surveyEnd();} - $self->session->errorHandler->error("\n\nIn submitQuestions with reponseId $responseId"); my $responses = $self->session->form->paramsHashRef(); -$self->session->errorHandler->error(Dumper $responses); delete $$responses{'func'}; my @goodResponses = keys %$responses;#load everything. @@ -720,13 +685,11 @@ $self->session->errorHandler->error(Dumper $responses); sub www_loadQuestions{ my $self=shift; - $self->session->errorHandler->error("\n\n\n\n\t\t\t\t\t\t\t\t\t---In loadQuestions"); if(!$self->canTakeSurvey()){ return $self->surveyEnd(); } -$self->session->errorHandler->error("Can take survey"); my $responseId = $self->getResponseId();#also loads the survey and response if(!$responseId){ @@ -739,18 +702,14 @@ $self->session->errorHandler->error("Can take survey"); eval{ $questions = $self->response->nextQuestions(); }; -$self->session->errorHandler->error($@) if($@); -$self->session->errorHandler->error("Load Questions had ".@$questions." questions") if(ref $questions eq 'ARRAY'); my $section = $self->response->nextSection(); -#$self->session->errorHandler->error(Dumper $section); #return $self->prepareShowSurveyTemplate($section,$questions); $section->{id} = $self->response->nextSectionId(); my $text = $self->prepareShowSurveyTemplate($section,$questions); -$self->session->errorHandler->error("Load Questions returning"); return $text; } @@ -759,7 +718,6 @@ $self->session->errorHandler->error("Load Questions returning"); sub surveyEnd{ my $self = shift; my $url = shift; -$self->session->errorHandler->error("-------SurveyEnd $url"); my $responseId = $self->getResponseId();#also loads the survey and response # $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]); $self->session->db->setRow("Survey_response","Survey_responseId",{ @@ -775,7 +733,6 @@ $self->session->errorHandler->error("-------SurveyEnd $url"); $url = "/"; } } -$self->session->errorHandler->error("-------SurveyEnd $url"); $self->session->http->setMimeType('application/json'); return encode_json({"type","forward","url",$url}); } @@ -795,9 +752,7 @@ sub prepareShowSurveyTemplate{ my %fileUpload = ('File Upload',1); my %hidden = ('Hidden',1); -$self->session->errorHandler->error("Preparing to insert question for $#$questions questions"); foreach my $q(@$questions){ -$self->session->errorHandler->error("Question Text is: ".$q->{text}); if($fileUpload{$$q{'questionType'}}){ $q->{'fileLoader'} = 1; } elsif($text{$$q{'questionType'}}){ $q->{'textType'} = 1; } elsif($hidden{$$q{'questionType'}}){ $q->{'hidden'} = 1; } @@ -823,7 +778,6 @@ $self->session->errorHandler->error("Question Text is: ".$q->{text}); } $section->{'questions'} = $questions; -#$self->session->errorHandler->error(Dumper $section); my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); $self->session->http->setMimeType('application/json'); @@ -849,18 +803,14 @@ sub loadBothJSON{ #------------------------------------------------------------------- sub loadResponseJSON{ my $self = shift; -$self->log("1"); my $jsonHash = shift; my $rId = shift; $rId = defined $rId ? $rId : $self->{responseId}; if(defined $self->response and ! defined $rId){return;} -$self->log("loading $rId"); $jsonHash = $self->session->db->quickScalar("select responseJSON from Survey_response where assetId = ? and Survey_responseId = ?", [$self->getId,$rId]) if(! defined $jsonHash); -$self->log("jsonhash was ".(length $jsonHash)); - $self->{response} = WebGUI::Asset::Wobject::Survey::ResponseJSON->new($jsonHash,$self->session->errorHandler, $self->survey); } #------------------------------------------------------------------- @@ -869,7 +819,6 @@ sub saveResponseJSON{ my $data = $self->response->freeze(); -$self->session->errorHandler->error("Saving RESPONSE to ".$self->{responseId}." for $data"); $self->session->db->write("update Survey_response set responseJSON = ? where Survey_responseId = ?",[$data,$self->{responseId}]); } @@ -939,18 +888,15 @@ sub getResponseId{ assetId=>$self->getId(), anonId=>$anonId }); -$self->session->errorHandler->error("Creating a new response and survey order"); $self->loadBothJSON($responseId); $self->response->createSurveyOrder(); $self->{responseId} = $responseId; $self->saveResponseJSON(); }else{ -$self->session->errorHandler->error("No responses left max=$allowedTakes used up=$haveTaken"); } } $self->{responseId} = $responseId; $self->loadBothJSON($responseId); - $self->session->errorHandler->error("Survey Response was ".$responseId); return $responseId; } @@ -962,7 +908,6 @@ sub canTakeSurvey{ return $self->{canTake} if(defined $self->{canTake}); -$self->session->errorHandler->error("Can take was NOT already defined"); if(!$self->session->user->isInGroup($self->get("groupToTakeSurvey"))){ return 0; @@ -982,15 +927,12 @@ $self->session->errorHandler->error("Can take was NOT already defined"); $takenCount = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",[$id,$self->getId(),1]); } - $self->session->errorHandler->error("userid is ".$id."\t and ip is ".$ip); - $self->session->errorHandler->error("max ".$maxTakes." taken ".$takenCount); if($takenCount >= $maxTakes){ $self->{canTake} = 0; }else{ $self->{canTake} = 1; } - $self->session->errorHandler->error("Can take survey returning ".$self->{canTake}); return $self->{canTake}; } diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey.sql deleted file mode 100644 index afefabbeb..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/Survey.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE `Survey` ( - `groupToTakeSurvey` varchar(22) character set utf8 collate utf8_bin NOT NULL default '2', - `groupToViewReports` varchar(22) character set utf8 collate utf8_bin NOT NULL default '3', - `responseTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `overviewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `maxResponsesPerUser` int(11) NOT NULL default '1', - `gradebookTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `revisionDate` bigint(20) NOT NULL default '0', - `surveyEditTemplateId` varchar(22) NOT NULL, - `answerEditTemplateId` varchar(22) NOT NULL, - `questionEditTemplateId` varchar(22) NOT NULL, - `sectionEditTemplateId` varchar(22) NOT NULL, - `surveyTakeTemplateId` varchar(22) NOT NULL, - `surveyQuestionsId` varchar(22) NOT NULL, - `exitURL` varchar(512) default NULL, - `surveyJSON` longblob, - PRIMARY KEY (`assetId`,`revisionDate`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 9e54a379c..483b62e2a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -49,18 +49,18 @@ sub getDragDropList{ my $self = shift; my $address = shift; my @data; -#$self->log("dd'ing sections".$#{$self->sections}); +##$self->log("dd'ing sections".$#{$self->sections}); eval{ for(my $i = 0; $i <= $#{$self->sections}; $i++){ push(@data,{text=>$self->section([$i])->{title}, type=>'section'}); if($address->[0] == $i){ for(my $x = 0; $x <= $#{$self->questions($address)}; $x++){ -##$self->log("dd'ing questions".$#{$self->questions}); +###$self->log("dd'ing questions".$#{$self->questions}); push(@data,{text=>$self->question([$i,$x])->{text}, type=>'question'}); if($address->[1] == $x){ for(my $y = 0; $y <= $#{$self->answers($address)}; $y++){ -##$self->log("dd'ing answers".$#{$self->answers}); +###$self->log("dd'ing answers".$#{$self->answers}); push(@data,{text=>$self->answer([$i,$x,$y])->{text}, type=>'answer'}); } } @@ -68,8 +68,8 @@ eval{ } } }; -#$self->log($@); -##$self->log('finished dding'); +##$self->log($@); +###$self->log('finished dding'); return \@data; } @@ -150,14 +150,14 @@ sub update{ my $object; my $newQuestion = 0; if(@$address == 1){ -#$self->log("A section"); +##$self->log("A section"); $object = $self->section($address); if(! defined $object){ $object = $self->newSection(); push(@{$self->sections},$object); } }elsif(@$address == 2){ -#$self->log("A question"); +##$self->log("A question"); $object = $self->question($address); if(! defined $object){ my $newQuestion = 1; @@ -165,7 +165,7 @@ sub update{ push(@{$self->questions($address)},$object); } }elsif(@$address == 3){ -#$self->log("A answer"); +##$self->log("A answer"); $object = $self->answer($address); if(! defined $object){ $object = $self->newAnswer(); @@ -178,7 +178,7 @@ sub update{ } } for my $key(keys %$object){ -#$self->log("$key $$object{$key}"); +##$self->log("$key $$object{$key}"); $object->{$key} = $ref->{$key} if(defined $$ref{$key}); } } @@ -188,7 +188,7 @@ sub update{ # ref should contain all the information for the new sub insertObject{ my ($self,$object,$address) = @_; -#$self->log("Inserting ".join(',',@$address)); +##$self->log("Inserting ".join(',',@$address)); if(@$address == 1){ splice(@{$self->sections($address)},$$address[0] + 1, 0, $object); }elsif(@$address == 2){ @@ -196,7 +196,7 @@ sub insertObject{ }elsif(@$address == 3){ splice(@{$self->answers($address)},$$address[2] + 1, 0, $object); } -#$self->log("Finished inserting "); +##$self->log("Finished inserting "); } @@ -206,13 +206,13 @@ sub copy{ my %newSection = %{$self->section($address)}; push(@{$self->sections}, \%newSection); return [$#{$self->sections}]; -#$self->log("copying here $$address[0] :".$#{$self->sections}); +##$self->log("copying here $$address[0] :".$#{$self->sections}); }elsif(@$address == 2){ -#$self->log("copying question $$address[0] $$address[1]"); +##$self->log("copying question $$address[0] $$address[1]"); my %newQuestion = %{$self->question($address)}; push( @{$self->questions($address)}, \%newQuestion); $$address[1] = $#{$self->questions($address)}; -#$self->log("to $$address[0] $$address[1]"); +##$self->log("to $$address[0] $$address[1]"); return $address; } } @@ -221,14 +221,14 @@ sub copy{ sub remove{ my ($self,$address,$movingOverride) = @_; if(@$address == 1){ -#$self->log("removing here $$address[0] :".$#{$self->sections}) if($$address[0] != 0 or defined $movingOverride);; +##$self->log("removing here $$address[0] :".$#{$self->sections}) if($$address[0] != 0 or defined $movingOverride);; splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0 or defined $movingOverride);#can't delete the first section -#$self->log("removing here $$address[0] :".$#{$self->sections}); +##$self->log("removing here $$address[0] :".$#{$self->sections}); }elsif(@$address == 2){ -#$self->log("removing here $$address[0] $$address[1]"); +##$self->log("removing here $$address[0] $$address[1]"); splice(@{$self->questions($address)},$$address[1],1); }elsif(@$address == 3){ -#$self->log("removing here $$address[0] $$address[1] $$address[2]"); +##$self->log("removing here $$address[0] $$address[1] $$address[2]"); splice(@{$self->answers($address)},$$address[2],1); } } @@ -299,7 +299,7 @@ sub updateQuestionAnswers{ my $address = shift; my $type = shift; -#$self->log("In updateQuestion"); +##$self->log("In updateQuestion"); my @addy = @{$address}; my $question = $self->question($address); @@ -391,11 +391,11 @@ sub addAnswersToQuestion{ my $addy = shift; my $ans = shift; my $verbs = shift; -#$self->log(Dumper $verbs); +##$self->log(Dumper $verbs); for(0 .. $#$ans){ push(@{$self->question($addy)->{answers}},$self->newAnswer()); $$addy[2] = $_; -#$self->log("$_:".defined $$verbs{$_}." ".$$verbs{$_}); +##$self->log("$_:".defined $$verbs{$_}." ".$$verbs{$_}); if(defined $$verbs{$_} and $_ == $$verbs{$_}){ $self->update($addy,{'text',$$ans[$_],'recordedAnswer',$_+1,'verbatim',1}); }else{ diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql deleted file mode 100644 index 008af27bf..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `Survey_response` ( - `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL, - `Survey_responseId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `userId` varchar(22) default NULL, - `username` varchar(255) default NULL, - `ipAddress` varchar(15) default NULL, - `startDate` bigint(20) NOT NULL default '0', - `endDate` bigint(20) NOT NULL default '0', - `isComplete` int(11) NOT NULL default '0', - `anonId` varchar(255) default NULL, - `responseJSON` longblob, - PRIMARY KEY (`Survey_responseId`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 diff --git a/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar b/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar deleted file mode 100644 index 3a5a97f37b7df72fac7c393c57d2aa89a2813c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeHuWprIjdZi@GVp+`0Ojk@6Gcz+YGqc6a%*@OzSuZx9+3Ft3(*8k)Fs|mo!zyid;K+nnypl1az(gV>00Q3MBAbk42 z@%#R&VNMQ?diMDEKo(X`_O_;O|L)j7>;HEL{`c;{3y1jU1%5hH*|b?@fxmb7fa;@j zS2K8euw2GmW73*sk)CdmYBnM_JPlxW3sDhG)IFm2&b_CDo-7s07LO&+W4^XZ=F8YjE61=rATA`e-L}kgs zUv}FoMNNDjRq;ip&$csCC$;Hufh{#ya)N-|k)3)918!i}zilvB-421O37RYkdr#!^ zHTkkLsC7d@2yXyn<{71YA+L#eez_alS2J24oru*Xn#JeQfmR->3Nk>$mOO-(L2PJc z5n`*a5{<7!THrIuzB%MI38*BRyChB>K9F_d$^M-JMZSX6&RMpLG;UlX7X^iXR(90gPojy+6QdE%aY7}JBmL-dHf+LyOjd% z4evoThKNBngKU@$!vuC~#76>|(l@OP@2Tgk2*jU)vlg&t)zJMybR0F_D7HXn#@ zVSa~)930*sY`89YN`c-5=dq|CiA&`0Gt?2Zy%aMu$g0np=cy83fV&S6@0q zAYd`bmL5qfzY$476!L!S^EJIKE5t#;@b?_S)Y=+}Ss1vi)<1@Xy8*+sxiGGSTX1p3|dz=AiL;>eL-uRHrUC%0@4^>(D?q9Q`(H2BuIJd7L(A zkh?;1V-;D4n+RnH%9Xk{)ul&Xo7gRGU}=E5uiU@*!PxOK3kdfSgu2kDtj&K!Kzn=N z-g|tbWpuD))eh?GW*Nouf>XG#W0zSNQf7}|G_77byZf;&OkoKLT~ssQHF@IGIb+&- zr#(#5s4bZ(|G^>SkviY1ihITCS|iUPu2IyqyZ^J8E2B_r!Wh@@#U90gMii^xe1t~I zL=DbqYw5}Fk!u4_%ZvN4-tBN*^P4=};QR^{&(3!+RsI^k{f2}WQ7*!!@Q$;Xg@l0{GCS_SHJqx>*iubCjA+|wx zE&gL8*13@imCR|jMP>v1)9iR=DrbIXEFSLK+ngnf$NG7%-#eH8lrx=&>=hFn7o4H` zgm(EH7q9l*i90xi;KjRGVIPR*YRnU$aMK#jKVTTt>}xm9k+rfd(C?(KEG7hO`8zD+)J9bjDAba!3X7t$Mb2*zCx{BMa}pCM6_O^( zn4u#Y&vUzYQMT-uryFXr<5r*GfE97FXg}{px=2y` zf)8!4s1xMmgNZ;5NhpcnS3#a<*((&$IMxpabXGdar__I>aw9uN7;FG2JE?X;Mrz#A zb${NmR2E^IX3Kx33s3k=lsaiprajIR!+S)IoiX5(dJ{-$#zm&@8w|zo-aP~oq{wfp zf!I~7XO>n+tR#x`c^jSfq?L@RBA+=*ewmz)ccJ#dZ9hg(Ft%-b%6qCOtHG=u0m1O$QtSM)bObQne%15Xr$CdG2O_Hg1(QljeA z!K&K({6>85$ z8cYnq2&HLK*$5}&ci_$Z{I!t~Wp4SFr{XETxsNCtM+bJj?MyeQ2xFM)k)thSu~}fq zw#GaP)d@6g6H+^H&u=6wq#K>{hqIA%)VmvyWSa@MfSFJzWNRk@S3gR?!9qEScSu@03uDxAiqgck zC_-$bl4rPEX&IIS^#kXM$}L_4=vO#N15i%FkZRkt>~_luo$V@8#RsZH2j{H^iXx2s zQ;!hbS`?^lskgPVA9-q8CA}x#^N?`GUJzM3#gWpxgC2Ci*;AD3Y^+@%J9pBrTg-WG z|Gh-FGis1 z_ahA$jfk^5EcR(C%&ZOXX_fU;pR7SXrD7n^eSckADh}vXooWc^9hVLroUSYh1I&o5 zbcBVmkB_GY>3;RhQizM(>YOD`R9B3qUeHt4o;B=4(cY~T>tkXz*orsh`}SwERv*;9`dvzg1P z*?hT*pTu&nt2nYaDhAK)8m@f6-Ocjz06WKMG1^~GchwW|AGGjzv6!e7H0b2{QnQ$`hS}K5B!g*<*?c^Gxb2F%AG*xbgMU3=T&En zP3CgNbj2PychYdYCQC?6kSmJIr|$gYHX!_3mEwhITg`eZYpPE!(ogbLab|?iBEJ@rNPd9ipyPzwuZEPX;ao zI38kL7hcqnnhN5Q*Nu;(X>jVQJ+23DxI^anlbSq#&&-F}K-@&8~%+W8ux-&_7OPwIQz zls`$bcPfH&GU*2A!4vC7UE4I0f1&xz;Cjg88C`aD=V|sK_|+8}&(qQC-H_~5oNo-7 zT!QlxrqM|lb*s^XRyIuswdjM-M2e^zGE{w7xXapunyAFf{i73Np`1IO1h=X_Z9I86 z-COflnf)?9wWK;HY}55fFYgoE56d5Fe!kSH&ZKjOn8#dY#ruY%bG}kTK0h|`ihXyJ zHR$a4Z6+o)dk?j*4VL*#&_gFp2kA)z4=^Cu5mct&)e2aU}N;0deGXe0g_MP`8D zK~OeLGuH3r5?74H!rXUdy!BB{}HIgA$8&in`w{mHpD>=E0sk}p&WanRS@ z1urk~4VjX@A-$SSzE^1w1Yx0xsY%cezH;^u!Mw8U2KE@_NQj z4^)r2<2^~xUJsQ^_k!qlnj@9w#w`sgQZ!ui;2G5(fnF1s$U)pdLK6jE9v5zx+KK*t zQqyo!35+r})wu<3<6w~;;z3XI(#BVB*&)+9D8@b&DqM&&0H2X=|D=q1fZQ#UvFUM; zE#5JNd!$j}q@7(~gwrM{ek~$OA(hGv^0@u9#-3fBF1hmE_{+fW{nG%p( zBgy$)(M%=gHimHAt;R8{#!0p9|y0!m2l89rR;hlSvgY$DW@gXPP{&IHK8_YStRZ>?xGnAPO^f^d64 zPr=Y7Z0A(C79Gy*E?C(T=2t0hn^z!RFul14)RMIYb{Vh_a|kdLIrcwF8Tf+;#Is1*#HC90xWr5fw~z7^-7I-u(hX3!U%<3V^ub*UJ-X1t8YKm z&Ttz)p{WKRcA3|ON7-sb-!s;1Qf37=Iz_)87zrqJrq|1Mm&Re(r&Ll~s_;qx$Bj)( zohSs`_wql*(wRr6+Iz(FynCKh zXl3JVYy6U*s%F2D7Ks-$rS2myd>H<$Ms>rZQpAjK4qc7R<^}VB-_v zUVb4!(sJy{Fkr_V}gmH4S2etkFqPd zMNE7PPCDKNQw#J4wzz0iBUE4;Htx}d9TV-#5sHQ>B!oKa){e+?)~H6|xhYb?Wl}*^vFDCvX0%jFq*5M9yZd}G zA$-?*IZOjRkk+`Dk^{2bG^_Yb`G%C6uF|O98W5VX7p%K%O^?6mmvk*6;(Q+j6QX zUsL`Qq-7bz8r*_ckkrH?!cS|Dg9bFkdQ$_o)v@<-{%%bN*8S;4Zfn9=iVUL}MH>0p zpsGvJ4;GVq2aH7Sz3g+7Lhbb#{krY(x5>d3Pp6H zTmy3{wwWo?_Baddfl~?>ch&kM#*4&D+bB}y^4^35&nfBCk%;y~`DUH#kP92G@pQ9p zr)FgPG6U~%A}GG(1RYBK+$6{|Qwdq$BaZ*lTk1QMxn!%V+jd=3`Dbl1B?HM}Cb7E` zJ@IC73{A&Pe=U^x!7Ik}x5uaJ+gof6X=xc7Mlri&d_7nCr*<( zPGiIGc78ZS=)n8hNLPu&DsrP}w%GxhxJ)+88NO3Stg7u+`B6VcO2UhF2d5DoEt=0{ z=_bfp5Xh*9!9zlVo0lbWI73J=Z*AS5&ky=v%9Lx|_MPA-x_5T?;SkU+^i5VjE zzhz}aNJ|Ij`;j>IS+@cibEf@w5s?>_s9(CXtWEWIbzz2c__b zb9SG{X&q9-(kEU>Zx4j7=>j;YVh$H#IHv+0t>c0j5+(f0TO%wt<$|9UeebCP))=xx z+u(+qBfe3I4KP@P@t-H~ihyoQAfL$y$|EMqaB#|=5VM?gzNSP_-75}&VaIDE3>^!@ zr`nQ=?epy;45rZUveXPufvRYp#ZjA36^dRmu@BkME3H)MF-swQE1srM{c`B{<hgzIPTR%46tGacis2H9tvHs}HGB0~>pN5}%Z*%<>6x^6x z{j*{dHZX&J0D6f@!%m3~cTu!sZUHgVi}2P+3xl!))(7m+?%Qj%1J&3`N0_x<>3J5j z6PA4B8K{VTm&4@ZH@JRHo|w4BAQYo3+!zT5%tobzvy(YyV+0ki5^!Ru8Qb?Otu)zM zw2%C@3VkUz15Z>W@*(c|o1>Yz$rX2?&VFGSH9dMQ^Go(qK44Hm40fotHDb$O56<8z z9M3p3!WIyRwl+M!aF#S-K)=!^9zrO1^A`eeVT0`%DS*eoIkAxEzL^nb0SQGaXB!Ll zlqj~R_(ntOvfO5Mj~`)eO)Qx|5s)_9sw0=H>IrBM-*pm}lYZ$?ku@s9IOrHugTrug zPb&d0MK!aK@S;0LIDxd+I?m-A#qU2fH98yFS!=3q+WoF3l_MLLIxMY-gnw5gkyl#hToT7C95eE%?b5vx`C&$z1y3ng z+bkRw#yxprte%N8Yr?wfTxgD~Lz@t_(HS=(w!_VCf_r0jQd!m5AT!U&nW39#+eKx# zeuZisb=)|4@U!MU&A|pU+MV9wXSPEREne@!lanRaXB4c&=e#8f77ftWyb%hO+a%g? zJ&RN2Y#<5Z&iUkbvhR&7rAH2$3A}SnwOCYhXPVOw>@V}p5QxM%HuOIqO6b#ZwBB9o zsz(r`@&i)nl-=zs$MUa1gTo0IB%NVlj~tI>inDkc_z?{SNHPv=#}5$TLU!MEkKLHX zrl$3kkk`!H_Tp@!S2SoBQ?Zjm`8tjKQ8A8#j(pr-f`}~%oI^RNdMc-p!>+3kKAc%w z!oGB&l`m``3ymjrcWv$64?F^>A=kbp1#}@gOo#uQJGw;N#O< zIlt?D{~28HALRcWj12x$%71^B{{yfB{+Rz`{fqwRmlEhV|Nm#~@1M=_2mV);aQLPF zS!C}9$q%P>5R22h1-L~$93V*3F|&-XwQs% zY~~yuW(KkR`g$XK<@0=5h1b`&DWi+Dn20)?J;Q+!!}I^n-Vu|5xmd4s?C2V2H&>OgL_xX) z1uay6)mDF`v_n}jD=0l`nv>>D;Wz}zr>XKMm5@`_URXRUC3^PfYTC)DxMZZK9e$E2 ziIdU@culC>bZQn0i!w#ppJf=cSUi!pv3Y*R{&+JnNAj_y3aG&e`Ar%)-3k2Ao#FsW zN~%n;SW=U1i2#EXCym0iB0EI2=U@U2c+@D&)}!DD?XE*MOkSAz5(YS|4I@D>A;|qS z@i+;@A)CMmuieWUNP3Mlg=r?!15MmtLZG*lD9nRKKK-&o5Evb8O)1QQ;h<#MW-`6ck58Vv(s5MUd0RkXw1wt^O z62^#7`Cq>az`wX4>@#xXHMR=^hY&4MU~GN~`|Q`EdwcqkYCVR<5^rv587J-6p(|}% z;{~@H!dLedpYplOXmcpOM^BP=JAxL`pakFPQ>Kkyx8;teyxG9${O~~Ur7%CSp+b#n zMJ(f#EHUY)=F|YBv<<(p71RLFQS6*t6CGh|l2}Sk1eA~o7}p71S{p8^p9 z0mf_5mRCx+t1N@L0D(~M_|>q@fL*C?9y9Hb_psyEW#>|q1o0V65>&0;4%&(as+egU zRP9KWsTLSkI>w139g^ecsm6tdG|=$%9$-ZP-!V9CFH`>t*c#;|e41hpNf3lmxn_w1 z)iOEoDq4+2Or;V!Y7nq4`EO_>ZfZ{kOSk&xH!G7#;dW3W#P`rf;1{~AHZPBe(Cq;X ziq+&FQPMtLU$J1a(!EXTQMJ? zjZFIyZAK%irq2B!mLhc|2{#P;6j`qxY`SdXwKL@}kdBq%<|d(M8z_oF5cAfJlvYYR z5~lceJJ6OeV8!t|Q_ZcZ0xoWdp<9dO)s3x^nf*1ei$4^ZlS~^nFYaE}waaHei?``Q zg;i%;HXk;r;|!mCKF0?>SDmC=UK4; z#9|Z`U4Hs(UKyr}pMnY?z`ekOcmrRYx3(W@FI(fhJ91>UELk+3+TeNTw{UFSJF4>m zap;kK@!%VS=HR0MAJQe4Ml@V>Et{Riw_?yXrefx)OG^ z$xgXK!j(XDNQ|;Z9&6znTf)HA2ej;o#$AQ|7x`BnB%plKKw&#T06< z;XPG!788nED}P+f-Nw9*9&OLX#{I&cg)JmVkMpk9aNB{Zm4{ImY%*F}G30~`b`Y?D zn-QDjc1LPGoXkDK&iWy^d&0S7Tdk!-zY?{tj%mbpako1)u{C)Q+Jo;e# zT|n^vsDJX`Ht&BF|NYZ(kiT2~`KR_Dz)b&#_>cM5Ig!7Ff4}vgf7^!sm81S(|5g6Q z{`Y1dez$)`Y`6C9V3L|1mq0SXXoC4n!@zVbCN&h5eev{2!OJ8s78Q8{Tnag~NU?xK5qUoB`x*xT?q zQxfUk-K&PZ#Wvp6hkN#;4YBe*>|+D>tBdn_;ueY;$hURpm%*D0r}mA}r;Dc5&a_V( zYwwMfH=8S6M@puTS6||4sv2Sp#ZM-Co=z@wY{`=di{u&0#>u4_8NI|pi+ZL*5F<`?QGia^R;RZnX(t~(uTEC%agdjmn z?>FXMQ>!uudN0Lg$RkFKIC>Gtg&jN26px+EgjV-&xl`^8HILm0dUAgyZy*B*+EN5M zs~O%OlnG8A&BFe~5#wL4sfNX**Qzi$PWTMG-?B^8VR2V5;D7sU>mEX${ zb*DZEkjiHp?_iB6A)S;wY2oW8v3%cd@+NL6(qtX-_0Vwfe1QUit+F-YfZF7Ij}Tpc z3=!O9zPCPknXK&C7npDqeX#ktH+Prn5X9;5rO#D3xC$jzjm-h>Gmk4Yo{=$busy zwZMgbY>-I#9H4hjtf#lN(VLa{W+NDJks}smK~n|9lgDMp;FwU3iyq>G*lOHhuM{t6 z(Yutmay7b;YDxeTXQpL9Tc&A7UNk3#dFCo~jH+)h<8}6|*j(sQ=vJ(3nMlhe z2gj#q64djFRk6#k)*JQY!BF~?p4cz$edwDE6Lf0nr1d*!w&nN!T#Kcmm1prsl2phU z2*LRrhZ36eQIEv3YkG&9;_9xL263E}?vyH&XYz@8CI%`{Fdo})nqWpbu9|isG+Wh? zS!;7aQ!1CWfNs;R_3iMm)Cet{Oj8I~)niH#g!xWx%Gh%Ul~OFvgi^4Kr)yTMN^tXp##*9aLXHBayG zY0A-)yKwW~9=#BE@IM34L)p!Qm!VsMNdT%YewN|{Ye zdG_G(=3Tr*X{9mCuCNugTVZmgUgjR4aRSj?)aD_r+o|pQgT<2|sKfidE-E#c8K) zFbRm3+Hsow4K#jG&P^#kf7qKaR(0*}lg1xG!fZmiYNc+Oka*nY9LF@yBCifS9A+QA zQAJL3i9DSiWqC(F{jN7X>EIh&K)8?Kkb^u}|8RxoUun?)%Gdv#{~h%#{?4lKpVfc= zb^Q0M{`(jH|DFH+D|hm5d;O36uk)AqZ_0ru=s?dSjeji4VA$zXfmu74m4AiUlHQo? zG@=#5KOX=U>UxP1nUgbm8hVf_Kr>jQe5My!xhXV=?CKvb}oNPNvFz zR!I($CEdOWJcMs9()q3oR1y7=@I&@<(Zq_Y`t{4nr^78ivMUcCv5zD129C0gH{d9j zX1YdXSTztt7Z>NQw2yad9`!LFm*S;$DEzeO4=&~RX1vW?QYKF~kdT_fNJYm{^!<(?e&I$pH!ac6^Pe<{MyWMow-YcDHYrE# zhMY#@%qw+o;53Qtqxe@*_~-(unKqHh4*g3X(n|9U*WsP5ki8~M?WK#;p-UIXsnJLR z#&&miUBv9~H8#g(TWkD^C{4mhLQ9R_AU6pHD`gP+{x#9_{xr{t zJV>uE@DTqY4`tw-4jv}ZzkqZq3(QU&h3&n9Dc;t0<_8?@d=NT@HK6IkFVe@$2RS3x zq?b>*z)=u;#Gb$e>S}FRZfH;`M-}Y4QOytrFalH3sO^?nyGS2T$>N9M4>@BfXAhut zONxP1Em`LrZ(VjiEns+JMNh5@h`XWt}-%Hc% z8DM_Myp5*}sobxH5-U~!sbckYHEr73p~(<1vudg%3^u+I%ta;!S6g`qr<5^Gy6MmA z(VKoWASMI8O7Y1I(^XSLGqM1W_9)06M1RqtOq~pO(xw`;IAOPH;eyfPg$RZoUR*;c zjba3&0J~hYRowm-eBTpjs|`dP!@6DHGv~x-P~;1sycZdG_f-#N_Eo@pA|?k;<{47V z_(a*pMLVGi*y6Fc5giUgJ5a`@JBnyC^M$Y6;Y2XxQ=sSG(*vm4j!(^@`^m}3Tqe^}RCN${xuAuj?5XLhoRh^r}2O`>FIqgBTPX76$#`aq% z&`&=i>;8J|svxk732>`*rM+_OilfU%$BQ{V2^W1GDd?y-sV(r2Ix)P{ph>nK3cKuT z^0wl*Mu}ij*&ti16nk6f)R7xw{Rdbn7xG$Kx8_$DMQ}Zr381bw>Y=t0d~}yWqdiF7 zq8m`TX@dr%%jjgyC6=8$@?_l%eP9bAJsc--Da>(G^2oPWlfV z1dsMpl|*V5;1CLwIZjRpa?2zs(Q+r6O{d6ikm9;XTxdU(8bc4~JkIB3*jEWt;ib-9FcWM(>pYIcrVSIOkU z+?Z8^Gbi2RwwwtXt)ql?6k1{t$oMymFa)*P_0Oj0jXMtpyw3zuR=+Qo7UAYiI&Cg!X zRLzP?mJQ2!G}TVFGok%%ehBByX0>wudN3k|H1Xkru}O5v4f1gU@%rfpJxT8W=kCJa pMl!!g{YKz70>2UXjlgdNek1T3f!_%HM&LIBzY+M2!2fdu{s+zvOeX*U