/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ var questionArray; var currentQstId = ""; var lang = ""; //locale language function init(){ //variables var toggleFlag = false; var endFlag = false; var mode = false; questionArray = new Array(); var popupFlag = false var flagForSelect = false; if(window.sankore){ try{ lang = sankore.locale().substr(0,2); sankoreLang[lang].edit; } catch(e){ lang = "en"; } } else lang = "en"; // toggle button var buttonDiv = $("<div id='buttonDiv' class='buttonDiv'>").appendTo("body"); var toggleButton = $("<button id='toggleButton' class='toggleButton'><</button>").appendTo("#buttonDiv"); buttonDiv.css({ top:"10px", right:0 }); //popup message var popupText = $("<div id='popupWordInfo' class='popupWordInfo'></div>").appendTo("body"); // adding question block var addQstDiv = $("<div id='addQstDiv' class='addQstDiv'>").appendTo("body"); var addQstButton = $("<button id='addQstButton' class='addQstButton'>").appendTo("#addQstDiv"); var addQsqSpan1 = $("<span id='addQsqSpan1'>" + sankoreLang[lang].q + "1</span>").appendTo("#addQstButton"); var addQsqSpan2 = $("<span id='addQsqSpan2'>" + sankoreLang[lang].add_new_question + "</span>").appendTo("#addQstButton"); //import saved data if(window.sankore){ if(sankore.preference("qstArrayData","")){ questionArray = jQuery.parseJSON(sankore.preference("qstArrayData","")); for(var i in questionArray){ addQstBlock(questionArray[i].id, questionArray[i].text, questionArray[i].type,"style='display: none;'"); for(var j in questionArray[i].answers) addAnsBlock(questionArray[i].answers[j].id, questionArray[i].id, questionArray[i].answers[j].text, true, questionArray[i].rightAns, questionArray[i].type); } } } //saving widget data into sankore object for a correct import $("body").mouseout(function(){ if(window.sankore) sankore.setPreference("qstArrayData", JSON.stringify(questionArray)); }) // add question addQstButton.click(function(){ //question block var id = Math.round(Math.random()*1000); var obj = new Question(); obj.id = id; questionArray.push(obj); addQstBlock(id, sankoreLang[lang].template_question, "",""); if(window.sankore) sankore.setPreference("qstArrayData", JSON.stringify(questionArray)); }); //toggle mode toggleButton.click(function(){ if(mode){ editData(); mode = false; } else { if(window.sankore) sankore.setPreference("qstArrayData", JSON.stringify(questionArray)); if(checkArrayOnFill(questionArray) != 0) displayData(true); else displayData(false); mode = true; } toggleButton.trigger("mouseout"); }); // toggle button events toggleButton.mouseover(function(){ if(!toggleFlag && !endFlag){ endFlag = true; toggleButton.animate({ width:"115px" },"fast",function(){ toggleFlag = true; if(!mode) toggleButton.text(sankoreLang[lang].display); else toggleButton.text(sankoreLang[lang].edit); }); } }); toggleButton.mouseout(function(){ if(toggleFlag && endFlag){ endFlag = false; toggleButton.animate({ width:"20px" },"fast", function(){ toggleButton.text("<"); toggleFlag = false; }); } }); //set used at this moment question id into the variable $(".qstDiv").live('mouseover', function() { currentQstId = this.id; }); //set used at this moment question id into the variable $(".qstDivDisplay").live('mouseover', function() { if(!flagForSelect) currentQstId = this.id.replace("qstDivDisplay",""); }); //adding new answer $(".ansAdd").live('click', function(){ var id = Math.round(Math.random()*1000); var obj = new Answer(); obj.id = id; getNeededElement(questionArray, currentQstId).answers.push(obj); addAnsBlock(id, currentQstId, sankoreLang[lang].template_answer); }); //set answer text $(".ansContent").live('keyup', function(event){ var id = $(event.target).attr("id").replace("ansContent",""); getNeededElement(getNeededElement(questionArray, currentQstId).answers,id).text = $(event.target).text(); }); //set question text $(".qstContent").live('keyup', function(event){ var id = $(event.target).attr("id").replace("qstContent",""); getNeededElement(questionArray, id).text = $(event.target).text(); }); //question div border $(".qstContent").live('mouseover', function(event){ $(event.target).css({ border:"3px solid #00C6FF" }); }); // deleting question div border $(".qstContent").live('mouseout', function(event){ $(event.target).css({ border:"3px solid #ccc" }); }); //answer div border $(".ansContent").live('mouseover', function(event){ $(event.target).css({ border:"3px solid #00C6FF" }); }); // deleting answer div border $(".ansContent").live('mouseout', function(event){ $(event.target).css({ border:"3px solid #ccc" }); }); //delete answer $(".ansDelete").live('click', function(){ popupText.hide(); var id = this.id.replace("ansDelete",""); $("#" + currentQstId + " #" + id).remove(); for(var i in questionArray) if(questionArray[i].id == currentQstId){ questionArray[i].rightAns = questionArray[i].rightAns.replace($("#" + currentQstId + " #" + id + " input:checkbox").val(),""); for(var j in questionArray[i].answers) if(questionArray[i].answers[j].id == id){ delete questionArray[i].answers[j]; break; } } refreshAns(); }); //delete question $(".qstDelete").live('click', function(){ popupText.hide(); $("#" + currentQstId).remove(); for(var i in questionArray) if(questionArray[i].id == currentQstId){ delete questionArray[i]; break; } refreshQst(); }); //change options $(".changeOptions").live('click', function(){ $("#" + currentQstId + "qstOptions .changeOptions").hide(); $("#" + currentQstId + "qstOptions .applyChanges").show(); $("#" + currentQstId + "qstOptChoice").show('fast'); }); //apply changes $(".applyChanges").live('click', function(){ $("#" + currentQstId + "qstOptions .applyChanges").hide(); $("#" + currentQstId + "qstOptions .changeOptions").show(); $("#" + currentQstId + "qstOptChoice").hide('fast'); }); //select option $(".qstOptChoice input:radio").live('click', function(event){ if(!mode){ $("#" + currentQstId + "qstOptChoice input:radio").removeAttr("checked"); $(event.target).attr("checked", "checked"); getNeededElement(questionArray, currentQstId).type = $(event.target).attr("value"); } }); //select right ansver in edit mode and answer question in display mode $(".newAnswer input").live('click', function(event){ if(!mode){ if(getNeededElement(questionArray, currentQstId).type == "1" || getNeededElement(questionArray, currentQstId).type == "3"){ $("#" + currentQstId + "ansDiv input").removeAttr("checked"); $(event.target).attr("checked", "checked"); getNeededElement(questionArray, currentQstId).rightAns = $(event.target).attr("value"); } else { (event.target.checked) ? $(event.target).attr("checked", "checked") : $(event.target).removeAttr("checked", "checked"); getNeededElement(questionArray, currentQstId).rightAns = ""; for(var i in $("#" + currentQstId + "ansDiv input")){ if($("#" + currentQstId + "ansDiv input")[i].checked) getNeededElement(questionArray, currentQstId).rightAns += $("#" + currentQstId + "ansDiv input")[i].value + ", "; } } } else { if(event.target.type == "radio"){ if(event.target.value == getNeededElement(questionArray, currentQstId).rightAns) $(event.target).next().next().find("span").css("background-color","#6c0"); else $(event.target).next().next().find("span").css("background-color","red"); } else { if(getNeededElement(questionArray, currentQstId).rightAns.replace(/,/g,"").indexOf(event.target.value + " ", 0) != -1) $(event.target).next().next().find("span").css("background-color","#6c0"); else $(event.target).next().next().find("span").css("background-color","red"); } } }); //popup messages $(".qstDelete").live('mouseover', function(evt){ popupFlag = true; popupText.text(sankoreLang[lang].delete_question) .css("top", evt.pageY + 15) .css("left", evt.pageX - 40) .css({ width:"130px" }) .show("fast", function(){ if(!popupFlag) popupText.hide(); }); }); $(".ansDelete").live('mouseover', function(evt){ popupFlag = true; popupText.text(sankoreLang[lang].delete_answer) .css("top", evt.pageY + 15) .css("left", evt.pageX - 40) .css({ width:"130px" }) .show("fast", function(){ if(!popupFlag) popupText.hide(); }); }); $(".newAnswer input").live('mouseover', function(evt){ if(!mode){ popupFlag = true; popupText.text(sankoreLang[lang].right_answer) .css("top", evt.pageY + 15) .css("left", evt.pageX - 40) .css({ width:"130px" }) .show("fast", function(){ if(!popupFlag) popupText.hide(); }); } }); $(".qstDelete, .ansDelete, .newAnswer input").live('mousemove', function(evt){ if(!mode){ popupText.css("top", evt.pageY + 15) .css("left", evt.pageX - 40); } }); $(".qstDelete, .ansDelete, .newAnswer input").live('mouseout', function(evt){ if(!mode){ popupFlag = false; popupText.hide(); } }); //answer the questions $("select").live('change', function(evt){ if(mode){ if(event.target.value == getNeededElement(questionArray, currentQstId).rightAns) $(event.target).parent().css("background-color","#6c0"); else $(event.target).parent().css("background-color","red"); flagForSelect = false; } }); $("select").live('mousedown', function(evt){ if(mode){ flagForSelect = true; } }); //toggle button click trigger toggleButton.trigger("click"); //show data in display mode function displayData(flag){ $("#addQstDiv").hide(); $(".qstDiv").hide(); addToPage(questionArray, flag); } //set widget in edit mode function editData(){ $(".qstDivDisplay").remove(); $("#addQstDiv").show('fast'); $(".qstDiv").show('fast'); } // show questions and answers in display mode function addToPage(array, flag){ if(flag){ var counter = 1; for(var i in array){ var qstDiv = $("<div class='qstDivDisplay' id='" + array[i].id + "qstDivDisplay'>"); var spanOptConn = $("<div class='spanOptConn'>").appendTo(qstDiv); var qstNumber = $("<span class='qstNumber'>" + sankoreLang[lang].question + " " + counter + "</span>").appendTo(spanOptConn); var qstContent = $("<div class='qstContentDisplay'>" + array[i].text + "</div>").appendTo(qstDiv); var ansDiv = $("<div class='ansDiv' id='" + array[i].id + "ansDiv'>").appendTo(qstDiv); var ansCount = 1; var type = array[i].type; var selInput = $("<select>"); if(type == 3){ var newAnswer = $("<div class='newAnswer'>"); newAnswer.appendTo(ansDiv); var selectSpan = $("<span id='answerText'>").appendTo(newAnswer); selInput.appendTo(selectSpan); $("<option value='0'>" + sankoreLang[lang].select_text + "</option>").appendTo(selInput); } for(var j in array[i].answers){ switch(type){ case "1": newAnswer = $("<div class='newAnswer'>"); var ansInput = $("<input type='radio' name='" + counter + "' value='" + array[i].answers[j].value + "' style='float: left; margin-right: 10px;'/>").appendTo(newAnswer); var ansSpan = $("<span class='ansSpanDisplay'>" + ansCount + ".</span>").appendTo(newAnswer); var ansContent = $("<div class='ansContentDisplay'><span id='answerText'>" + array[i].answers[j].text + "</span></div>").appendTo(newAnswer); newAnswer.appendTo(ansDiv); break; case "2": newAnswer = $("<div class='newAnswer'>"); ansInput = $("<input type='checkbox' value='" + array[i].answers[j].value + "' style='float: left; margin-right: 10px;'/>").appendTo(newAnswer); ansSpan = $("<span class='ansSpanDisplay'>" + ansCount + ".</span>").appendTo(newAnswer); ansContent = $("<div class='ansContentDisplay'><span id='answerText'>" + array[i].answers[j].text + "</span></div>").appendTo(newAnswer); newAnswer.appendTo(ansDiv); break; case "3": ansInput = $("<option value='" + array[i].answers[j].value + "'>" + array[i].answers[j].text + "</option>").appendTo(selInput); break; } ansCount++; } qstDiv.appendTo("body"); counter++; } } else { counter = 1; qstDiv = $("<div class='qstDivDisplay'>"); spanOptConn = $("<div class='spanOptConn'>").appendTo(qstDiv); qstNumber = $("<span class='qstNumber'>" + sankoreLang[lang].question + " " + counter + "</span>").appendTo(spanOptConn); qstContent = $("<div class='qstContentDisplay'>" + sankoreLang[lang].example_question + "</div>").appendTo(qstDiv); ansDiv = $("<div class='ansDiv'>").appendTo(qstDiv); ansCount = 1; for(j = 0; j < 3; j++){ newAnswer = $("<div class='newAnswer'>"); ansInput = $("<input type='radio' name='1' style='float: left; margin-right: 10px;'/>").appendTo(newAnswer); ansSpan = $("<span class='ansSpanDisplay'>" + ansCount + ".</span>").appendTo(newAnswer); ansContent = $("<div class='ansContentDisplay'>" + sankoreLang[lang].answer + " " + ansCount + ".</div>").appendTo(newAnswer); newAnswer.appendTo(ansDiv); ansCount++; } qstDiv.appendTo("body"); } } } //add new question block in a edit mode function addQstBlock(id, text, type, style){ var qstDiv = $("<div class='qstDiv' id='" + id + "' " + style + ">"); var spanOptConn = $("<div class='spanOptConn'>").appendTo(qstDiv); var count = $(".qstNumber").size(); var qstNumber = $("<span class='qstNumber'>" + sankoreLang[lang].q + (count + 1) + "</span>").appendTo(spanOptConn); var qstOptions = $("<div class='qstOptions' id='" + id + "qstOptions'>").appendTo(spanOptConn); var changeOptions = $("<button class='changeOptions'>" + sankoreLang[lang].options + "</button>").appendTo(qstOptions); var applyChanges = $("<button class='applyChanges' style='display: none;'>" + sankoreLang[lang].close + "</button>").appendTo(qstOptions); var qstDelete = $("<button class='qstDelete'>").appendTo(qstOptions); var qstOptChoice = $("<div class='qstOptChoice' id='" + id + "qstOptChoice' style='display: none;'>").appendTo(qstDiv); var optDesc = $("<div style='height: 65px;'>").appendTo(qstOptChoice); var optDescImg = $("<div class='optDescImg'>").appendTo(optDesc); var optDescText = $("<div class='optDescText'>" + sankoreLang[lang].options_desc + "</div>").appendTo(optDesc); var type1 = $("<div class='type'>").appendTo(qstOptChoice); var contentType1 = $("<div class='contentType'>").appendTo(type1); var divType1 = $("<div class='divType1'>").appendTo(contentType1); var textType1 = $("<div class='textType'>" + sankoreLang[lang].radio_desc + "</div>").appendTo(contentType1); var type2 = $("<div class='type'>").appendTo(qstOptChoice); var contentType2 = $("<div class='contentType'>").appendTo(type2); var divType2 = $("<div class='divType2'>").appendTo(contentType2); var textType2 = $("<div class='textType'>" + sankoreLang[lang].checkbox_desc + "</div>").appendTo(contentType2); var type3 = $("<div class='type'>").appendTo(qstOptChoice); var contentType3 = $("<div class='contentType'>").appendTo(type3); var divType3 = $("<div class='divType3'>").appendTo(contentType3); var textType3 = $("<div class='textType'>" + sankoreLang[lang].select_desc + "</div>").appendTo(contentType3); switch(type){ case "1": var radioType1 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='1' checked/><div></div>").appendTo(type1); var radioType2 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='2'/><div></div>").appendTo(type2); var radioType3 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='3'/><div></div>").appendTo(type3); break; case "2": radioType1 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='1'/><div></div>").appendTo(type1); radioType2 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='2' checked/><div></div>").appendTo(type2); radioType3 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='3'/><div></div>").appendTo(type3); break; case "3": radioType1 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='1'/><div></div>").appendTo(type1); radioType2 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='2'/><div></div>").appendTo(type2); radioType3 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='3' checked/><div></div>").appendTo(type3); break; default: radioType1 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='1'/><div></div>").appendTo(type1); radioType2 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='2'/><div></div>").appendTo(type2); radioType3 = $("<div class='radioDiv'><div class='radioType'><input type='radio' value='3'/><div></div>").appendTo(type3); break; } var qstContent = $("<div class='qstContent' id='" + id + "qstContent' contenteditable='true'>" + text + "</div>").appendTo(qstDiv); var ansDiv = $("<div class='ansDiv' id='" + id + "ansDiv'>").appendTo(qstDiv); var ansAdd = $("<button class='ansAdd'>" + sankoreLang[lang].add_answer + "</button>").appendTo(ansDiv); qstDiv.insertBefore("#addQstDiv"); $("#addQsqSpan1").text(sankoreLang[lang].q + (count + 2)); } //add answers function addAnsBlock(id, currId, text, stage, rightAns, type){ var newAnswer = $("<div class='newAnswer' id='" + id + "'>"); var value; var check = ""; if(stage){ value = getNeededElement(getNeededElement(questionArray, currId).answers,id).value; if(type != "2"){ if(rightAns == value) check = "checked='true'"; } else { rightAns = rightAns.replace(/,/g,""); if(rightAns.indexOf(value + " ", 0) != -1) check = "checked='true'"; } } else { value = ($("#" + currId + " .newAnswer input:checkbox").last().val()) ? parseInt($("#" + currId + " .newAnswer input:checkbox").last().val()) + 1 : 1; getNeededElement(getNeededElement(questionArray, currId).answers,id).value = value; } var count = $("#" + currId + " .newAnswer").size() + 1; var input = $("<input type='checkbox' style='float: left;' value='" + value + "' " + check + ">").appendTo(newAnswer); var ansSpan = $("<span class='ansSpan'>" + sankoreLang[lang].a + count + "</span>").appendTo(newAnswer); var ansContent = $("<div class='ansContent' id='" + id +"ansContent' contenteditable='true'>" + text + "</div>").appendTo(newAnswer); var ansDelete = $("<button class='ansDelete' id='" + id + "ansDelete'>").appendTo(newAnswer); newAnswer.insertBefore("#" + currId + "ansDiv .ansAdd"); if(window.sankore) sankore.setPreference("qstArrayData", JSON.stringify(questionArray)); } //get needed array element function getNeededElement(array,id){ for(var i in array) if(array[i].id == id) return array[i]; } //check on fill function checkArrayOnFill(array){ var count = 0; for(var i in array) count++; return count; } //refresh answers numbers function refreshAns(){ var count = $("#" + currentQstId + " .newAnswer").size(); for(var i = 0; i < count; i ++) $($("#" + currentQstId + " .newAnswer span")[i]).text(sankoreLang[lang].a + (i+1)); } //refresh questions numbers function refreshQst(){ var count = $(".qstNumber").size(); for(var i = 0; i < count; i ++) $($(".qstNumber")[i]).text(sankoreLang[lang].q + (i+1)); $("#addQsqSpan1").text(sankoreLang[lang].q + ++count); } //question constructor function Question(){ this.text = ""; this.type = "1"; this.id = ""; this.rightAns = ""; this.answers = new Array(); } //answer constructor function Answer(){ this.id = ""; this.text = ""; this.value = ""; }