a5a59b2c-3e0e-47ea-9665-226cc9c48ea8d98564a9-a241-4bf2-b502-018cf75a9b72Multi_Dependent_SurveyTrueDoobloSupport-Shakedg6360565652005000006360567430613700003155378903999970000TrueFalse12False0SurveyToGo.UserLogic.Creator.SurveyLogicTempl<?xml version="1.0" encoding="utf-16"?>
<UserLogicContents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtEntranceRule</QTp>
<Key>4</Key>
<Name>HandleQuestionEnter_4</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>3</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtJumpingRule</QTp>
<Key>0</Key>
<Name>HandleQuestionJump_0</Name>
<Behv>ecsbDefault</Behv>
<QDep />
<CDep />
<QJmp />
<CJmp />
<OJmp>
<eJumpQuestionResult>ejqrCancel</eJumpQuestionResult>
</OJmp>
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtExpression</QTp>
<Key>3</Key>
<Name>QuestionExpression_3</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>4</int>
<int>2</int>
<int>1</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>8</Key>
<Name>QuestionStart_8</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
<int>2</int>
<int>4</int>
<int>5</int>
<int>6</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>7</Key>
<Name>QuestionStart_7</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
<int>2</int>
<int>4</int>
<int>5</int>
<int>6</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>6</Key>
<Name>QuestionStart_6</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
<int>2</int>
<int>4</int>
<int>5</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>5</Key>
<Name>QuestionStart_5</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
<int>2</int>
<int>4</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>4</Key>
<Name>QuestionStart_4</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
<int>2</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>2</Key>
<Name>QuestionStart_2</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>1</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtQuestion</HTp>
<STp>estLast</STp>
<CTp>echtLast</CTp>
<QTp>eqhtStart</QTp>
<Key>1</Key>
<Name>QuestionStart_1</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>0</int>
</QDep>
<CDep />
</HData>
<HData>
<HTp>ehtChapter</HTp>
<STp>estLast</STp>
<CTp>echtBreakIteration</CTp>
<QTp>eqhtLast</QTp>
<Key>1</Key>
<Name>IterationBreak_1</Name>
<Behv>ecsbDefault</Behv>
<QDep>
<int>9</int>
</QDep>
<CDep />
</HData>
</Items>
<Source>
function StartSurvey()
{
/*_@_SS_START_@*/
/*_@_SS_END_@*/
}
/*_@_USERCODE_START_@*/
/***********************************************************************/
function Kad_ValidationBrandDisposition(qidx)
{
var check = false;
var at1=0;
var at2=0;
var a=1;
for(a=1;a<=GetTopicCount(qidx);a++)
{
if(AnswerChoice(qidx,a)==1)
{
at1+=1;
}
if(AnswerChoice(qidx,a)==2)
{
at2+=1;
}
}
if(at1>1 || at2>3)
{
check=true;
}
return check;
}
function Kad_GetCodes(arrayidxbrdcodes)
{
var codes1=Array();
var codes2=Array();
var result=Array();
var a=0;
var b=0;
var c=0;
var n=0;
for(a=0;a<arrayidxbrdcodes.length;a++)
{
codes1=stringSplit(arrayidxbrdcodes[a],"/");
for(b=0;b<codes1.length;b++)
{
if(stringContains(codes1[b],"-"))
{
codes2=stringSplit(codes1[b],"-")
for(c=0;c<codes2.length;c++)
{
result[n]=codes2[c];
n+=1;
}
}
else
{
result[n]=codes1[b];
n+=1;
}
}
}
return result;
}
function Kad_BrandUmbrella(qidxfiltered,arrayidxbrdcodes)
{
var result=Array();
var a=0;
var b=0;
for(a=0;a<arrayidxbrdcodes.length;a++)
{
if(Contains(qidxfiltered,Kad_GetCodes(arrayidxbrdcodes[a])))
{
result[b]=a+1;
b+=1;
}
}
return result;
}
function Kad_CombineTomSpontAided(qidxtom,qidxspont,qidxaided,arrayothers)
{
var a=1;
var h=Array();
var n=0;
for(a=1;a<=arrayothers;a++)
{
if(Answer(qidxtom)==arrayothers[a-1] || Contains(qidxspont,arrayothers[a-1]))
{
SetAnswerVisible(qidxaided,arrayothers[a-1],true);
}
}
for(a=1;a<=GetAnswerCount(qidxaided)-1;a++)
{
if(Answer(qidxtom)==a || Contains(qidxspont,a) || Contains(qidxaided,a))
{
h[n]=a;
n=n+1;
}
}
ClearAnswer(qidxaided);
SetAnswer(qidxaided,h);
}
function Kad_CheckExistingBrand(qidxbrand,arraybrand)
{
var a = 0;
var h = false;
var res = 0;
var arr = GetAnswers(QRef(qidxbrand));
var codes = Kad_GetCodes(arraybrand);
for(a=0;a<arr.length;a++)
{
if(InArray(arraybrand[a],arr)==true)
{
h = true;
break;
}
}
return h;
}
function Kad_CheckExistingBrand(qidxbrand1,qidxbrand2,arraybrand)
{
var a = 0;
var h = false;
var res = 0;
var arr1 = GetAnswers(qidxbrand1);
var arr2 = GetAnswers(qidxbrand2);
var codes = Kad_GetCodes(arraybrand);
for(a=0;a<codes.length;a++)
{
if(InArray(codes[a],arr1)==true && InArray(codes[a],arr2)==false)
{
res = a + 1;
}
}
if(res == codes.length)
{
h = true;
}
return h;
}
function Kad_RangeScore(totalscore,arrayscore)
{
var scorecat=0;
var a=0;
for(a=0;a<arrayscore.length;a++)
{
if(totalscore<=arrayscore[a])
{
scorecat=a+1;
}
}
return scorecat;
}
function Kad_GetRespondent(iteration,qidxday,qidxmonth,qidxyear,qidxrespname)
{
var diff = Array();
var arr = Array();
var a = 1;
var val = 0;
var dtresp;
for(a=1;a<=iteration;a++)
{
dtresp = Date(AnswerIter(QRef(qidxmonth),a)+ "/" + AnswerIter(QRef(qidxday),a)+ "/" + Today.Year);
if(dtresp > Now)
{
dtresp = Date(AnswerIter(QRef(qidxmonth),a)+ "/" + AnswerIter(QRef(qidxday),a)+ "/" + (Today.Year - 1));
}
diff[a-1] = Round(TimeDiffDays(Now,dtresp));
}
val = diff[0];
for(a=1;a<iteration;a++)
{
if(val > diff[a])
{
val = diff[a];
}
}
SetAnswerVisible(CurrQues,false);
for(a=1;a<=iteration;a++)
{
if(val == diff[a-1])
{
SetAnswerTextFormat(CurrQues,a,AnswerIter(QRef(qidxrespname),a)+" - "+AnswerIter(QRef(qidxday),a)+"/"+AnswerIter(QRef(qidxmonth),a)+"/"+AnswerIter(QRef(qidxyear),a));
SetAnswerVisible(CurrQues,a,true);
}
}
}
function Kad_AgeCategory(age,arrayages)
{
var agecat=0;
var a=0;
for(a=0;a<arrayages.length;a++)
{
if(age>=arrayages[a])
{
agecat=a+1;
}
}
return agecat;
}
function Kad_GetAge(date,month,year)
{
var res = 0;
var lday = Today.Day;
var lmonth = Today.Month;
var lyear = Today.Year;
if(lmonth > month){res = lyear - year;}
if(lmonth < month){res = lyear - year - 1;}
if(lmonth == month && lday >= date){res = lyear - year;}
if(lmonth == month && lday < date){res = lyear - year - 1;}
return res;
}
function Kad_IsAllMultiVisibleAnswerChecked(qidx)
{
var a=1;
var av=Array();
var n=0;
var hs=true;
for(a=1;a<=GetAnswerCount(qidx);a++)
{
if(IsAnswerVisible(qidx,a))
{
av[n]=a;
n+=1;
}
}
for(a=0;a<av.length;a++)
{
if(NotContains(qidx,av[a]))
{
hs=false;
break;
}
}
return hs;
}
/***********************************************************************/
function MyMultipleSetFromMultipleArray (inDest, inSrc, inShow)
{
var arr = GetAnswers(inSrc);
for (var i = 0; i < arr.length; i++)
{
dblSetSpecificAnswer(inDest, arr[i], inShow);
}
}
function CheckIDPSU()
{
Vars["idInvRegEx"]="^......$";
if (!dblIsRegEx(Vars["idInvRegEx"],Answer(CurrQues)))
{
return true;
}
}
function ConvertToDp(a1,a2)
{
for(var j = 0; j <=GetAnswerCount(QRef(a1));j++)
{
for (var i=0; i <=GetAnswerCount(QRef(a2)); i++)
{
if (ContainsOneOf(QRef(a1+i),j+1 ))
{
dblSetSpecificAnswer(QRef(a2+j),i+1,true);
}
}
}
}
function dblSetSpecificTopicChoicffffffe(inQ, inTopicIndex, inValue)
{
var curTopics = GetTopicCount(inQ);
var newAnswers=new Array();
newAnswers.push(inValue);
var i;
var ansArr = GetAnswersChoice(inQ, inTopicIndex);
for (i=0;i < ansArr.length;i++)
{
newAnswers.push(ansArr[i]);
}
SetAnswerChoice(inQ, inTopicIndex, newAnswers);
}
/* sample general jump rule
var newIdx = FixJumpOrder(QRef(6),SelectedAnswerText(4),"Final");
if (newIdx != -1) {
idx = newIdx;
jump = eJumpQuestionResult.ejqrChapter;
}
*/
/*function FixJumpOrder(inStartQ,inOrder,inFinalChapter)
{
var retVal = -1;
var chapArr = inOrder.split(",");
if (CurrQues==inStartQ) {
retVal = GetChapterIdxFromName(chapArr[0]);
}
var jumpIdx = GetJumpChapterIdxOfQuestion(CurrQues, chapArr);
if (jumpIdx != -1) {
if (IsLastQuestionInChapter(CurrQues)) {
Trace("Ned to jump, last question of: "+chapArr[jumpIdx]);
jumpIdx +=1;
if (jumpIdx < chapArr.length) {
Trace("Jumping to: "+chapArr[jumpIdx]);
retVal = GetChapterIdxFromName(chapArr[jumpIdx]);
}
else {
Trace("Jumping to: "+inFinalChapter);
retVal = GetChapterIdxFromName(inFinalChapter);
}
}
}
return retVal;
}
function IsLastQuestionInChapter(inQuestion)
{
var retVal = false;
var chapterInfo = QuestionChapter(inQuestion);
if (chapterInfo.Questions[chapterInfo.Questions.length-1] == inQuestion) {
retVal = true;
}
return retVal;
}
function GetJumpChapterIdxOfQuestion(inQuestion, inJumpArray)
{
var retVal = -1;
var chapterInfo = QuestionChapter(inQuestion);
for (var i=0; i<inJumpArray.length;i++) {
if (chapterInfo.Name == inJumpArray[i]) {
retVal = i;
break;
}
}
return retVal;
}
function GetChapterIdxFromName (inChapterName)
{
var retVal = -1;
var chapterInfos = GetAllChapters();
for(var i=0;i<chapterInfos.length;i++) {
if (chapterInfos[i].Name == inChapterName) {
retVal = chapterInfos[i].ID+1;
break;
}
}
return retVal;
}*/
function AreAllTopicsDifferent (inQIdx)
{
var retVal = true;
var topicAmount = GetTopicCount(inQIdx);
var flag = false;
for (var i = 1; i <= topicAmount; i++)
{
for (var j = 1; j <= topicAmount; j++)
{
if (i != j &&
IsTopicVisible(inQIdx, i) && IsTopicVisible(inQIdx, j) &&
AnswerChoice(inQIdx, i) == AnswerChoice(inQIdx, j))
{
retVal = false;
break;
}
}
if (flag)
{
break;
}
}
return retVal;
}
/** intage thailand **/
function TNS_SetQuesOrder(controlQuestion,variant0)
{
var retVal=false;
if (variant0==8)
{
switch(Answer(controlQuestion))
{
case 1: RandomizeAnswers(CurrQues,[1,2,3,4,5,6,7,8]); break;
case 2: RandomizeAnswers(CurrQues,[4,1,2,3,5,6,7,8]); break;
case 3: RandomizeAnswers(CurrQues,[3,4,1,2,5,6,7,8]); break;
case 4: RandomizeAnswers(CurrQues,[2,3,4,1,5,6,7,8]); break;
case 5: RandomizeAnswers(CurrQues,[4,5,6,7,1,2,3,8]); break;
case 6: RandomizeAnswers(CurrQues,[7,4,5,6,1,2,3,8]); break;
case 7: RandomizeAnswers(CurrQues,[6,7,4,5,1,2,3,8]); break;
case 8: RandomizeAnswers(CurrQues,[5,6,7,4,1,2,3,8]); break;
}
retVal=true;
}
}
//################################ Prince ######################################
// ใช้สำหรับดึงอื่นๆที่พิมพ์ 5 บรรทัดมาไว้ในข้อปัจจุบัน
function SetOther(other,openEnd,start)
{
SetAnswerVisible(CurrQues, false, false, start,start+1,start+2,start+3,start+4);
if (ContainsOneOf(QRef(other),start))
{
var topic;
var answer;
for (topic = 1, answer = start; topic <= 5; answer++, topic++)
{
var text = AnswerChoice(QRef(openEnd), topic);
if (text != "")
{
SetAnswerVisible(CurrQues, true, false, answer);
SetAnswerTextFormat(CurrQues, answer, text);
}
}
}
}
function SetTopicOther(other,openEnd,start)
{
SetTopicVisible(CurrQues, false, false, start,start+1,start+2,start+3,start+4);
if (ContainsOneOf(QRef(other),start))
{
var topic;
var answer;
for (topic = 1, answer = start; topic <= 5; answer++, topic++)
{
var text = AnswerChoice(QRef(openEnd), topic);
if (text != "")
{
SetTopicVisible(CurrQues, true, false, answer);
SetTopicTextFormat(CurrQues, answer, text);
}
}
}
}
// ใช้สำหรับการโชว์คำตอบ
// ถ้า eiei เป็น 1 คือติ๊ก 1 ค่า โชว์หลายค่า
// ถ้า eiei เป็น 2 คือติ๊ก หลายค่าโชว์ 1 ค่า
// ถ้า eiei เป็น 3
function MultiSetVisible(QTarget,Qin,tick,startIdx,endIdx,eiei)
{
if(eiei==1)
{
if(Contains(Qin,tick))
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
SetAnswerVisible(QTarget,true,false,startIdx)
}
}
}
else if(eiei==2)
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
if(Contains(Qin,startIdx))
{
SetAnswerVisible(QTarget,true,false,tick)
break
}
}
}
else if(eiei==3)
{
if(Contains(Qin,tick))
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
SetTopicVisible(QTarget,true,false,startIdx)
}
}
}
else if(eiei==4)
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
if(Contains(Qin,startIdx))
{
SetTopicVisible(QTarget,true,false,tick)
break
}
}
}
}
// ใช้สำหรับการติ๊กคำตอบ
function MultiDblSetSpecificAnswer(QTarget,Qin,tick,startIdx,endIdx,eiei)
{
if(eiei==1)
{
if(Contains(Qin,tick))
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
dblSetSpecificAnswer(QTarget,startIdx,true)
}
}
}
else if(eiei==2)
{
for(startIdx;startIdx<=endIdx;startIdx++)
{
if(Contains(Qin,startIdx))
{
dblSetSpecificAnswer(QTarget,tick,true)
break
}
}
}
}
// วิธีใช้ ถ้าหน้า 1 ตอบโค้ด 998 999 ContainsOneOfByCode(Qref(1),["998","999"])
//****** ใชกับเครื่องหมายตกใจไม่ได้ !ContainsOneOfByCode(Qref(1),["998","999"])
function MyContainsOneOfByCode(qIdx, codeArr)
{
var retVal = false;
for(var i=1; i <=codeArr.length; i++)
{
if(MyContainsByCode(qIdx,codeArr[i-1]))
{
retVal = true;
break;
}
}
return retVal;
}
function MyContainsByCode(qIdx, code)
{
var retVal = Contains(qIdx,GetAnswerChoiceIdxByCode(qIdx,code));
return retVal;
}
//เอ๋ยเอง ไป โชว์การ์ด MultiContainsOneOf([QRef(20),QRef(21)....],1)
function MultiContainsOneOf(QRefArr,Idx)
{
var retVal = false;
for(var i=1 ; i<=QRefArr.length ; i++)
{
if(Contains(QRefArr[i-1],Idx))
{
retVal = true
return retVal
}
}
return retVal
}
// การดึงคำตอบโดยเรียงลำดับจากความถี่ ใช้ได้แค่กรณีที่ index ที่1 คือ ไปบ่อยสุด จนถึง ไม่ไปเลย
function FilterFrequency(curr,qref)
{
for(var i = 1; i <= GetAnswerCount(CurrQues) ; i++)
{
if(ContainsOneOf(QRef(qref),i))
{
FilterAnswersByTopics(QRef(curr),QRef(qref),i)
break
}
}
}
function AnswerRotateByNo(Qne,cons)
{
var countMod = GetAnswerCount(CurrQues) - cons.length
var newAnswers=new Array();
var t = Answer(Qne)%countMod
var k
if(t == 0)
{
t = countMod;
}
for(k = t ; k <= countMod ; k++ )
{
newAnswers.push(k)
}
if(newAnswers.length != countMod)
{
for(var j = 1 ; j < t ; j++ )
{
newAnswers.push(j)
}
//newAnswers.push(1)
}
for(var i = 0 ; i+1 <= cons.length ; i++)
newAnswers.push(cons[i])
RandomizeAnswers(CurrQues,newAnswers);
}
function SortRotateByNo(Qin,cons) // Rotate Answer By No
{
var newAnswers=new Array();
if(Answer(Qin) % 2 == 1)
{
for(var i = 1; i <= GetAnswerCount(CurrQues) ; i++)
{
newAnswers.push(i);
}
RandomizeAnswers(CurrQues,newAnswers);
}
if(Answer(Qin) % 2 == 0)// sort descending
{
for(var i = GetAnswerCount(CurrQues)-cons.length ; i >= 1 ; i--)
{
newAnswers.push(i);
}
for(var i = 0 ; i+1 <= cons.length ; i++)
newAnswers.push(cons[i])
RandomizeAnswers(CurrQues,newAnswers);
}
}
//################################ End Prince ######################################
/** Ipsos napoleon franco scripts **/
function innovaip_EdadRango(intEdad) {
if (intEdad>= 18 && intEdad<= 19){
return 1;
}
if (intEdad>= 20 && intEdad<= 24){
return 2;
}
if (intEdad>= 25 && intEdad<= 34){
return 3;
}
if (intEdad>= 35 && intEdad<= 44){
return 4;
}
if (intEdad>= 45 && intEdad<= 54){
return 5;
}
if (intEdad>= 55 && intEdad<= 64){
return 6;
}
return -1;
}
function innovaip_EdadRango1(intEdad) {
if (intEdad < 18){
return 1;
}
if (intEdad >= 18 && intEdad <= 64){
return 2;
}
if (intEdad > 64 && intEdad <= 98){
return 3;
}
if (intEdad = 99){
return 4;
}
return -1;
}
function innovaip_SortIntArray(intArray, arraySize, idx)
{
if (arraySize == 1) return 1;
var sortedArray = [];
//Prompt("ArraySize: " + arraySize);
for (var i = 0;i<arraySize;i++) {
sortedArray[i] = intArray[i];
Prompt("item " + i + " is " + sortedArray[i]);
//Prompt( "Iteration: " + i + " = " + sortedArray[i] );
}
var numSwap = 1
while (numSwap > 0) {
numSwap = 0;
for (var j = 0;j<arraySize-1;j++) {
//Prompt("Comparing: " + sortedArray[j] + "," + sortedArray[j+1] )
if (sortedArray[j] < sortedArray[j+1]) {
var temp;
temp = sortedArray[j+1];
sortedArray[j+1] = sortedArray[j];
sortedArray[j] = temp;
numSwap++;
}
}
//Prompt( "Swaps: " + numSwap );
}
var selectedAge = sortedArray[idx-1];
Prompt("Selected age is " + selectedAge);
var iterNum = 0
for (var l = 0; l<= arraySize-1 ; l++) {
Prompt("Comparing:" + intArray[l] + "," + selectedAge )
if ( intArray[l] == selectedAge) {
return l;
}
}
return 0;
}
function dblGetSubjectStoreColumn(inStoreName,inIDColumnName,inID)
{
var retVal = null;
try {
var table = GetTableFromStore(inStoreName,"","@@"+inIDColumnName+"='"+inID+"'","");
if (table != null && table.ColumnCount >0) {
var column = table[0];
retVal = column;
}
}
catch(err)
{
retVal = null;
}
return retVal;
}
/*Valida que no se repitan los numeros/id de los contactos no efectivos*/
function ValidaNumeros2(Pregunta)
{
for(var i= 1;i<=10;i++)
{
if(IterationIndex > 1)
{
if(IterationIndex == i){continue;}
if(Answer(Pregunta) == AnswerIter(Pregunta,i))
{
//var respuesta= AnswerIter(9,i);
//Prompt("Respuesta en la pregunta 3: " + respuesta + "\n iteracción No. " + i.ToString());
return true;
}
}
}
return false;
}
/*Valida y marca la edad exacta VS los rangos de Edad*/
function ValidarEdades(pregunta,r1,r2,pregunta2,respuesta)
{
if(Answer(pregunta)>= r1 && Answer(pregunta)<=r2)
{
SetAnswer(pregunta2,respuesta);
}
}
/* Valida que solo se acepten letras y no numeros en preguntas tipo texto
parametro: cadena ---> recibe el valor de la respuesta
*/
function ValidaSoloTexto(cadena)
{
var patronLet = /^[a-zA-Z]*$/;
var patronNum = /^\d*$/;
var respuesta = cadena.ToString();
var arr = new Array();
arr = respuesta;
if(respuesta.search(patronNum) != 0)
{
if(respuesta.search(patronLet) != 0 || arr.length < 3 )
{
return true;
}else
{
return false;
}
}else
{
return true;
}
}
/* recibe dos parametros*/
function ValidaMaximoDeCaracteres(cadena,limite)
{
var respuesta = cadena.ToString().replace(/^\s+/g,'').replace(/\s+$/g,'');
var arr = new Array();
arr = respuesta;
if(arr.length < limite )
{
return true;
}else
{
return false;
}
}
/* Validar solo números en una pregunta tipo texto y un minimo de 6 caracteres (validando cedulas de ciudadania)
cedana -> la respuesta como texto
limite -> el minimo de caracteres aceptados
*/
function ValidaSoloNumeros(cadena,limite)
{
var patronLet = /^[a-zA-Z]*$/;
var patronNum = /^\d*$/;
var respuesta = cadena.ToString();
var arr = new Array();
arr = respuesta;
if(respuesta.search(patronLet) != 0)
{
if(respuesta.search(patronNum) != 0 || arr.length < limite )
{
return true;
}else
{
return false;
}
}else
{
return true;
}
}
/* Validar que la pregunta sea solo números y un máximo de caracteres
cadena -> la respuesta como texto
limite -> el minimo de caracteres aceptados
*/
function ValidaNumeros(cadena,limite)
{
var patronLet = /^[a-zA-Z]*$/;
var patronNum = /^\d*$/;
var respuesta = cadena.ToString();
var arr = new Array();
arr = respuesta;
if(respuesta.search(patronLet) != 0)
{
if(respuesta.search(patronNum) != 0 || arr.length > limite || respuesta == 0)
{
return true;
}else
{
return false;
}
}else
{
return true;
}
}
//TBS Vietnam scripts
function dblNumOfCodesDupplicated(inQ)
{
var retVal = 0;
var i=0;
var j=0;
for (i=1; i<=GetTopicCount(inQ)-1;i++){
{for (j=1;j<=GetTopicCount(inQ)-1;j++){
if (IsTopicVisible(inQ,i) && IsTopicVisible(inQ,i+j)&&AnswerChoice(inQ,i)==AnswerChoice(inQ,i+j)&&AnswerChoice(inQ,i)>=1) {
retVal++;
}}}
}
return retVal;
}
/*function TNS_SetQuesOrder(controlQuestion,variant0)
{
Prompt("answer of question index = " + Answer(controlQuestion).ToInt());
var retVal=false;
if (variant0==8)
{
switch(Answer(controlQuestion).ToInt())
{
case 1: RandomizeAnswers(CurrQues,[1,2,3,4,5,6,7,8]); break;
case 2: RandomizeAnswers(CurrQues,[4,1,2,3,5,6,7,8]); break;
case 3: RandomizeAnswers(CurrQues,[3,4,1,2,5,6,7,8]); break;
case 4: RandomizeAnswers(CurrQues,[2,3,4,1,5,6,7,8]); break;
case 5: RandomizeAnswers(CurrQues,[4,5,6,7,1,2,3,8]); break;
case 6: RandomizeAnswers(CurrQues,[7,4,5,6,1,2,3,8]); break;
case 7: RandomizeAnswers(CurrQues,[6,7,4,5,1,2,3,8]); break;
case 8: RandomizeAnswers(CurrQues,[5,6,7,4,1,2,3,8]); break;
}
retVal=true;
}
if (variant0==7)
{
switch(Answer(controlQuestion).ToInt())
{
case 1: RandomizeAnswers(CurrQues,[1,2,3,4,5,6,7]); break;
case 2: RandomizeAnswers(CurrQues,[4,1,2,3,5,6,7]); break;
case 3: RandomizeAnswers(CurrQues,[3,4,1,2,5,6,7]); break;
case 4: RandomizeAnswers(CurrQues,[2,3,4,1,5,6,7]); break;
case 5: RandomizeAnswers(CurrQues,[4,5,6,7,1,2,3]); break;
case 6: RandomizeAnswers(CurrQues,[7,4,5,6,1,2,3]); break;
case 7: RandomizeAnswers(CurrQues,[6,7,4,5,1,2,3]); break;
case 8: RandomizeAnswers(CurrQues,[5,6,7,4,1,2,3]); break;
}
retVal=true;
}
return retVal;
}*/
function TNS_rand(){
return Math.floor(Math.random()*(999-100+1)+100);
}
function TNS_contains(arr,n) {
var i = arr.length;
while (i--) {
if (arr[i] == n) {
return true;
}
}
return false;
}
function decodeArray(text){
var array=[];
var dcArray=[];
var rndLetter=["А","Б","Е","И","К","Л","Р","С","Т","У"];
var letter = /^[А-Я]/;
var number = /^[0-9]/;
var flag=false;
for (var i=0;i<=text.length-1;i++){
if (text.charAt(i).match(letter)||text.charAt(i).match(number)){
array.push(text.charAt(i).toString());
};
};
for (var i=0;i<=array.length-1;i++){
if (array[i].match(number)){
dcArray.push(array[i]);
} else if (array[i].match(letter)) {
if (!flag) {
for (var j=0;j<=rndLetter.length-1;j++){
if (array[i]==rndLetter[j]){
dcArray.push(j);
break;
};
};
flag=true;
} else {
switch (array[i]) {
case "К":
case "Б":
case "А":
dcArray.push(1);
break;
case "У":
case "Э":
dcArray.push(2);
break;
case "Е":
case "И":
dcArray.push(3);
break;
case "Р":
case "Т":
dcArray.push(4);
break;
case "Л":
case "С":
case "Я":
dcArray.push(5);
break;
default:
dcArray.push(0);
break;
};
};
};
};
return dcArray;
}
function returnTimeDiff_Uni(timeDiff,t1,t2,t3,t4){
var timeCode=[
["К","Б","А"],
["У","Э"],
["Е","И"],
["Р","Т"],
["Л","С","Я"]
];
var rndLetter=["А","Б","Е","И","К","Л","Р","С","Т","У"];
var rndTimeIdx=Math.floor((Math.random()*100)+1);
var rndLetterIdx=Math.floor(Math.random()*10);
var text=new String();
var i,j;
if (timeDiff<t1){
i=0;
if (rndTimeIdx<33){
j=0;
} else if (rndTimeIdx>=33 && rndTimeIdx<66) {
j=1;
} else if (rndTimeIdx>=66) {
j=2;
};
} else if (timeDiff>=t1 && timeDiff<t2){
i=1;
if (rndTimeIdx<=50){
j=0;
} else if (rndTimeIdx>50) {
j=1;
};
} else if (timeDiff>=t2 && timeDiff<t3){
i=2;
if (rndTimeIdx<=50){
j=0;
} else if (rndTimeIdx>50) {
j=1;
};
} else if (timeDiff>=t3 && timeDiff<t4){
i=3;
if (rndTimeIdx<=50){
j=0;
} else if (rndTimeIdx>50) {
j=1;
};
} else if (timeDiff>=t4){
i=4;
if (rndTimeIdx<33){
j=0;
} else if (rndTimeIdx>=33 && rndTimeIdx<66) {
j=1;
} else if (rndTimeIdx>=66) {
j=2;
};
};
text=rndLetter[rndLetterIdx]+timeCode[i][j];
return text;
}
function generateCheckSum(array){
var c=0;
var invertedArray=[];
var d=[
[0,1,2,3,4,5,6,7,8,9],
[1,2,3,4,0,6,7,8,9,5],
[2,3,4,0,1,7,8,9,5,6],
[3,4,0,1,2,8,9,5,6,7],
[4,0,1,2,3,9,5,6,7,8],
[5,9,8,7,6,0,4,3,2,1],
[6,5,9,8,7,1,0,4,3,2],
[7,6,5,9,8,2,1,0,4,3],
[8,7,6,5,9,3,2,1,0,4],
[9,8,7,6,5,4,3,2,1,0]
];
var p=[
[0,1,2,3,4,5,6,7,8,9],
[1,5,7,6,2,8,3,0,9,4],
[5,8,0,3,7,9,6,1,4,2],
[8,9,1,6,0,4,3,5,2,7],
[9,4,5,3,1,2,6,8,7,0],
[4,2,8,6,5,7,3,9,0,1],
[2,7,9,3,8,0,6,4,1,5],
[7,0,4,6,9,1,3,2,5,8]
];
var inv=[0, 4, 3, 2, 1, 5, 6, 7, 8, 9];
for (var i=array.length-1;i>=0;i--){
invertedArray.push(array[i]);
}
for (var i=0;i<invertedArray.length-1;i++){
c=d[c][p[((i+1)%8)][invertedArray[i]]];
}
// array.push(c);
return inv[c];
}
/* Nome da Função: IsRange
Programador: Clayton
Data: 00/00/0000
Descrição: Checar se existe um valor de-para
Tipo Quest: Single e Mult
Exemplo: IsRange(QRef(5), 18, 24);
*/
function IsRange(inQIdx, inBegin, inEnd) {
var retVal = false;
for (var j = inBegin; j <= inEnd; j++) {
if (Contains(inQIdx, j)) {
retVal = true; break; }
}
return retVal;
}
/* Nome da Função: IsRangeIter
Programador: Clayton
Data: 00/00/0000
Descrição: Checar se existe um valor de-para em um Iter
Tipo Quest: Single e Mult Iter
Exemplo: IsRange(QRef(5), 18, 24);
*/
function IsRangeIter(inQIdx, inIter, inBegin, inEnd) {
var retVal = false;
for (var j = inBegin; j <= inEnd; j++) {
if (ContainsIter(inQIdx, j, inIter)) {
retVal = true; break; }
}
return retVal;
}
/* Nome da Função: IsRangeChoice
Programador: Clayton
Data: 00/00/0000
Descrição: Checar se existe um valor de-para em questões Topics
Tipo Quest: Topics
Exemplo: IsRangeChoice(QRef(5), 1, 1,5);
*/
function IsRangeChoice(inQIdx, inAnsIdx, inBegin, inEnd) {
var retVal = false;
for (var j = inBegin; j <=inEnd; j++) {
if (AnswerChoice(inQIdx, inAnsIdx) == j) {
retVal = true; break; }
}
return retVal;
}
/* Nome da Função: checkMail
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Checar se o email é válido
Tipo Quest: Strings
Exemplo: checkMail(Answer(100)); // checkMail(SelectedAnswerText(100));
*/
function checkMail(mail) {
var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
if (typeof(mail) == "string"){
if (er.test(mail)) { return true; }
} else if (typeof(mail) == "object"){
if (er.test(mail.value)){
return true;
}
} else {
return false;
}
}
/* Nome da Função: IsRight
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Buscar valor À Direita
Tipo Quest: Strings
Exemplo: IsRight(Answer(100)); // IsRight(SelectedAnswerText(100));
*/
function IsRight(str, n) {
str = str.ToString();
if (n <= 0)
{ return ""; }
else if (n > String(str).length)
{ return str;}
else {
var iLen = String(str).length;
return String(str).substring(iLen, iLen - n);
}
}
/* Nome da Função: IsLeft
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Buscar valor À Esquerda
Tipo Quest: Strings
Exemplo: IsLeft(Answer(100)); // IsLeft(SelectedAnswerText(100));
*/
function IsLeft(str, n) {
str = str.ToString();
if (n <= 0)
return "";
else if (n > String(str).length)
return str;
else
return String(str).substring(0,n);
}
/* Nome da Função: BuscaCep (Inativa)
Programador: Clayton
Data: 00/00/0000
Descrição: Buscar Cep (Projeto Leroy)
Tipo Quest: Strings
Exemplo: BuscaCep(QRef(10), QRef(11), QRef(5));
*/
function BuscaCep(inQidxCep, inQidxRua, inQidxCidade) {
var retVal = false;
var arrBaseCep = new Array();
for (var i = 0; i < arrBaseCep.length; i++) {
if (Answer(inQidxCep) == arrBaseCep[i].substr(0,8)) {
retVal = true;
break; }
}
if (retVal) {
SetAnswer(inQidxRua, arrBaseCep[i - 1].substr(9,102)); }
}
/* Nome da Função: DBLIsValidPhone
Programador: Ron Tal
Data: 00/00/0000
Descrição: Checar Telefone Válido (8 dígitos)
Tipo Quest: Numérica
Exemplo: DBLIsValidPhone(Answer(QRef(20));
OBS: Adaptado (9 dígitos SP) - 14/08/2012
*/
/* Nome da Função: IsContainsTo
Programador: Clayton
Data: 00/00/0000
Descrição: Busca um valor entre várias Questões
Tipo Quest: Single e Mult
Exemplo: IsContainsTo(QRef(108), QRef(111), 2);
*/
function IsContainsTo(inQIdxBegin, inQIdxEnd, inAnswer) {
var retVal = false;
for (var j = inQIdxBegin; j <= inQIdxEnd; j++) {
if (Contains(j, inAnswer)) {
retVal = true; }
}
return retVal;
}
/* Nome da Função: IsContainsRangeTo
Programador: Clayton
Data: 00/00/0000
Descrição: Busca um ou mais valores entre várias Questões
Tipo Quest: Single e Mult
Exemplo: IsContainsRangeTo(QRef(108), QRef(111), 2,10);
*/
function IsContainsRangeTo(inQIdxBegin, inQIdxEnd, inBegin, inEnd) {
var retVal = false;
for (var j = inQIdxBegin; j <= inQIdxEnd; j++) {
for (var k = inBegin; k <= inEnd; k++) {
if (Contains(j, k)) {
retVal = true; }
}
}
return retVal;
}
/* Nome da Função: IsSelectedAnswerRankingIdx
Programador: Clayton
Data: 00/00/0000
Descrição: Busca Index da Resposta Selecionada p/ Ranking
Tipo Quest: Ranking
Exemplo: IsSelectedAnswerRankingIdx(QRef(108), 1);
*/
function IsSelectedAnswerRankingIdx(inQidx, inRank) {
for (var i = 1; i <= GetAnswerCount(inQidx); i++) {
if (ContainsSpecificRate(inQidx, inRank, i)) {
break; }
}
return i;
}
/* Nome da Função: IsSomaAnswer
Programador: Clayton
Data: 00/00/0000
Descrição: Soma uma sequência de Questões
Tipo Quest: Numéricas Single e Multi
Exemplo: IsSomaAnswers(QRef(90), QRef(100));
*/
//Função Soma Answer
function IsSomaAnswer(inBegin, inEnd) {
var intSoma = 0;
for (var j = inBegin; j <=inEnd; j++)
{ intSoma += Answer(j); }
return intSoma;
}
/* Nome da Função: IsSomaTopic
Programador: Clayton
Data: 00/00/0000
Descrição: Soma uma sequência de Questões
Tipo Quest: Numéricas Topics
Exemplo: IsSomaTopics(QRef(90), QRef(100));
*/
function IsSomaTopic(inBegin, inEnd) {
var intSoma = 0;
for (var j = inBegin; j <= inEnd; j++)
if (IsTopicVisible(CurrQues, j)) {
intSoma += AnswerChoice(CurrQues, j); }
return intSoma;
}
function IsSomaTopics(inQidx, inBegin, inEnd) {
var intSoma = 0;
for (var j = inBegin; j <= inEnd; j++)
if (IsTopicVisible(inQidx, j)) {
intSoma += AnswerChoice(inQidx, j); }
return intSoma;
}
/* Nome da Função: IsSearchOthers
Programador: Clayton
Data: 00/00/0000
Descrição: Busca Outras na Lista Fixa
Tipo Quest: Single e Multi
Exemplo: IsSearchOthers(AddtionalText(CurrQues), QRef(CurrQues)); /
IsSearchOthers(SelectedAnswerText(CurrQues+1), QRef(CurrQues));
Msg 'Verificar Outros vs Lista de Marcas.'
OBS: Alterado dia 21/08 - inclusão do RegExp
*/
function IsSearchOthers(inQidxOther, inQidxList) {
var retVal = false;
if (inQidxOther != '') {
var arrList = new Array();
for (var j=1;j<=GetAnswerCount(inQidxList);j++) {
arrList[j-1] = IsTrim(IsUpper(GetAnswerOriginalText(inQidxList, j)));
}
var reList = new RegExp(arrList);
var reAnswer = new RegExp(IsTrim(IsUpper(inQidxOther)));
if (reAnswer.test(reList)) {
Prompt("A resposta (ou alguma variante) digitada em outros '"+inQidxOther+"' está na lista de marcas. Verifique");
retVal = true;
}
}
return retVal;
}
/* Nome da Função: IsTrim
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Remove espaços
Tipo Quest: Strings
Exemplo: IsTrim(Answer(CurrQues)); / IsTrim(SelectedAnswerText(CurrQues));
*/
function IsTrim(str) {
str = str.ToString();
return str.replace(/^\s+|\s+$/g,"");
}
/* Nome da Função: IsLTrim
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Remove espaços à Esquerda
Tipo Quest: Strings
Exemplo: IsLTrim(Answer(CurrQues)); / IsLTrim(SelectedAnswerText(CurrQues));
*/
function IsLTrim(str) {
str = str.ToString();
return str.replace(/^\s+/,"");
}
/* Nome da Função: IsRTrim
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Remove espaços à Direita
Tipo Quest: Strings
Exemplo: IsRTrim(Answer(CurrQues)); / IsRTrim(SelectedAnswerText(CurrQues));
*/
function IsRTrim(str) {
str = str.ToString();
return str.replace(/\s+$/,"");
}
/* Nome da Função: IsUpper
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Letras em Maiúscula
Tipo Quest: Strings
Exemplo: IsUpper(Answer(CurrQues)); / IsUpper(SelectedAnswerText(CurrQues));
*/
function IsUpper(str) {
str = str.ToString();
return str.toUpperCase();
}
/* Nome da Função: IsUpper
Programador: Internet (desconhecido)
Data: 00/00/0000
Descrição: Letras em Minúscula
Tipo Quest: Strings
Exemplo: IsLower(Answer(CurrQues)); / IsLower(SelectedAnswerText(CurrQues));
*/
function IsLower(str) {
str = str.ToString();
return str.toLowerCase();
}
/* Nome da Função: IsCheckAbertas
Programador: Clayton
Data: 11/07/2012
Descrição: Checagem Abertas
Tipo Quest: Single
Exemplo: IsCheckAbertas([QRef(175), QRef(177), ...]);
*/
function IsCheckAbertas(inQids) {
var retErro = '';
var numOfQues = inQids.length;
for (var j = 0; j < numOfQues; j++) {
if (Answered(inQids[j]) && NotAnswered(inQids[j] + 1))
{ retErro += ('Questão : ' + VarName(inQids[j] + 1) + ' - Falta Resposta \n'); }
if (NotAnswered(inQids[j]) && Answered(inQids[j] + 1))
{ retErro += ('Questão : ' + VarName(inQids[j] + 1) + ' - Sobra Resposta \n'); }
}
if (retErro != '') { ExtRefNum = 'Abertas - Erro'; }
else { ExtRefNum = 'Abertas - Ok'; }
return retErro;
}
/* Nome da Função: IsEncerre
Programador: Wilson Ruiz/Clayton Araujo
Data: 16/08/2012
Descrição: Essa função verifica se uma questão foi respondida como encerre, se sim ela seta as váriáveis de filtro e ocorrência e vai para o encerramento da entrevista.
Tipo Quest: Simgle/Multiple/Topic
Exemplo: IsEncerre((Contains(CurrQues, 1)), QRef(42), QRef(44)) (Encerra se na questão atual a resposta for código 1)
*/
function IsEncerre(InFunction, InMsg, InOcor, InEncer){
SetAnswer(InEncer, 2);
if (InFunction) {
Prompt("Se "+InMsg+". Agradeça e encerre.");
SetAnswer(InOcor, VarName(CurrQues) + " = "+InMsg+".");
SetAnswer(InEncer, 1);
}
return InFunction;
}
/* Nome da Função: IsArrend
Programador: Internet (desconhecido)
Data: 24/09/2012
Descrição: Arredonda um número para o inteiro mais próximo, tanto para baixo quanto para cima. Por exemplo, o número 3.3 arredondado será 3, mas o número 3.8 arredondado será 4.
Tipo Quest: Numérica
Exemplo:
*/
function IsArrend(InValue, InDecimals){
var retVal = Math.round(InValue * Math.pow(10, InDecimals)) / Math.pow(10, InDecimals);
return retVal;
}
/* Nome da Função: IsArrendDown
Programador: Internet (desconhecido)
Data: 24/09/2012
Descrição: Arredonda um número para o inteiro mais baixo
Tipo Quest: Numérica
Exemplo:
*/
function IsArrendDown(InValue, InDecimals){
var retVal = Math.floor(InValue * Math.pow(10, InDecimals)) / Math.pow(10, InDecimals);
return retVal;
}
/* Nome da Função: IsAnyOneOfVars
Programador: Clayton
Data: 13/11/2012
Descrição: Busca 1 ou Mais valores entre 1 ou mais Variáveis
Se Deseja saber onde o valor foi localizado, digite adicione true no final da função, senão, digite false;
Tipo Quest: Vars
Exemplo: IsAnyOneOfVars([1], [v1, v2], false) / IsAnyOneOfVars([1,2,3], [v1], false) / IsAnyOneOfVars([1,2,3], [v1,v2,v3], false)
*/
function IsAnyOneOfVars(inValues, inVars, inGetVar) {
var retVal = false;
var retVar = 0;
var numOfValues = inValues.length;
var numOfVars = inVars.length;
for (var i=0; i<numOfValues; i++)
{
for (var j=0; j<numOfVars; j++)
{
if (inVars[j] == inValues[i])
{
retVal = true;
retVar = j+1;
break;
}
}
}
if (inGetVar)
{
return retVar;
}
else
{
return retVal;
}
}
/* Nome da Função: IsRangeOneOfVars
Programador: Clayton
Data: 20/11/2012
Descrição: Busca valores de x a x entre 1 ou mais Variáveis
Se Deseja saber onde o valor foi localizado, digite adicione true no final da função, senão, digite false;
Tipo Quest: Vars
Exemplo: IsRangeOneOfVars(1,10, [v1, v2], false) / IsRangeOneOfVars(1,3, [v1], false) / IsRangeOneOfVars(1,200, [v1,v2,v3], false)
*/
function IsRangeOneOfVars(inValueBegin, inValueEnd, inVars, inGetVar) {
var retVal = false;
var retVar = 0;
var numOfVars = inVars.length;
for (var i=inValueBegin; i<=inValueEnd; i++)
{
for (var j=0; j<numOfVars; j++)
{
if (inVars[j] == i)
{
retVal = true;
retVar = j+1;
break;
}
}
}
if (inGetVar)
{
return retVar;
}
else
{
return retVal;
}
}
/* Nome da Função: IsRangeCount
Programador: Clayton
Data: 00/00/0000
Descrição: Checar se existe um valor de-para e retorna a quantidade
Tipo Quest: Single e Mult
Exemplo: IsRange(QRef(5), 18, 24);
*/
function IsRangeCount(inQIdx, inBegin, inEnd) {
var retVal = 0;
for (var j = inBegin; j <= inEnd; j++) {
if (Contains(inQIdx, j)) {
retVal += 1; }
}
return retVal;
}
/* Nome da Função: IsRangeChoiceCount
Programador: Clayton
Data: 00/00/0000
Descrição: Checar se existe um valor de-para em questões Topics e retorna a quantidade
Tipo Quest: Topics
Exemplo: IsRangeChoice(QRef(5), 1, 1,5);
*/
function IsRangeChoiceCount(inQIdx, inAnsIdx, inBegin, inEnd) {
var retVal = 0;
for (var j = inBegin; j <=inEnd; j++) {
if (AnswerChoice(inQIdx, inAnsIdx) == j) {
retVal += 1; }
}
return retVal;
}
/* Nome da Função: IsContainsOneOfTopics
Programador: Clayton
Data: 19/11/2012
Descrição: Checar se existe um/ou valor(es) em questões Topics
Tipo Quest: Topics
Exemplo: IsContainsOneOfTopics(QRef(5), 1, [1,2,5,4]);
*/
function IsContainsOneOfTopics(inQTarget,inTopic,inAnswers)
{
var retVal = false;
var numOfAnswers = inAnswers.length;
for (var i=0;i<numOfAnswers;i++) {
if (AnswerChoice(inQTarget,inTopic) == inAnswers[i]) {
retVal = true;
break;
}
}
return retVal;
}
/* Nome da Função: IsSetAnswersRangeVisible
Programador: Clayton
Data:
Descrição: Exibir/Ocultar respostas de X a X
Tipo Quest: Single e Multi
Exemplo: IsSetAnswersRangeVisible(CurrQues, true, true, 1, 10);
*/
function IsSetAnswersRangeVisible(inQIdx, inShow, inReset, inAnsBegin, inAnsEnd){
var inAnswers = new Array();
var i = 0;
for (var j = inAnsBegin; j<=inAnsEnd; j++)
{
inAnswers[i] = j;
i++;
}
SetAnswerVisible(inQIdx, inShow, inReset, inAnswers);
}
/* Nome da Função: IsSetTopicsRangeVisible
Programador: Clayton
Data:
Descrição: Exibir/Ocultar respostas de X a X
Tipo Quest: Topics
Exemplo: IsSetTopicsRangeVisible(CurrQues, true, true, 1, 10);
*/
function IsSetTopicsRangeVisible(inQIdx, inShow, inReset, inTopBegin, inTopEnd){
var inTopics = new Array();
var i = 0;
for (var j = inTopBegin; j<=inTopEnd; j++)
{
inTopics[i] = j;
i++;
}
SetTopicVisible(inQIdx, inShow, inReset, inTopics);
}
/* Nome da Função: IsGetIndexAnswers
Programador: Clayton
Data: 17/12/2012
Descrição: Retornar os índices dos itens da lista em Matriz
Tipo Quest: RU/RM
Exemplo: IsGetIndexAnswers(QRef(1));
*/
function IsGetIndexAnswers(inQIdx){
var inAnswers = new Array();
var i = 0;
for (var j=1;j<=GetAnswerCount(inQIdx);j++)
{
inAnswers[i] = j;
i++;
}
return inAnswers;
}
/* Nome da Função: IsGetIndexAnswersExclude
Programador: Clayton
Data: 17/12/2012
Descrição: Retornar os índices dos itens da lista em Matriz
Tipo Quest: RU/RM
Exemplo: IsGetIndexAnswersExclude(QRef(1), [1,2,3]);
*/
function IsGetIndexAnswersExclude(inQIdx, AnsExclude){
var inAnswers = new Array();
var i = 0;
for (var j=1;j<=GetAnswerCount(inQIdx);j++)
{
if (IndexOfInt(j, AnsExclude)==-1)
{
inAnswers[i] = j;
i++;
}
}
return inAnswers;
}
/* Nome da Função: IsGetIndexTopics
Programador: Clayton
Data: 17/12/2012
Descrição: Retornar os índices dos itens da lista em Matriz
Tipo Quest: Topic
Exemplo: IsGetIndexTopics(QRef(1));
*/
function IsGetIndexTopics(inQIdx){
var inTopics = new Array();
var i = 0;
for (var j=1;j<=GetTopicCount(inQIdx);j++)
{
inTopics[i] = j;
i++;
}
return inTopics;
}
/* Nome da Função: IsGetNumOfTopicsWithValuesRange
Programador: Clayton
Data: 04/01/2013
Descrição: Facilitando o uso da da função GetNumOfTopicsWithValues, para colocar um range nos valores
Tipo Quest: Topics
Exemplo: IsGetNumOfTopicsWithValuesRange(CurrQues, 20,97);
*/
function IsGetNumOfTopicsWithValuesRange(inQIdx, inBegin, inEnd) {
var retVal = false;
for (var j=inBegin;j<=inEnd;j++)
{
if (GetNumOfTopicsWithValues(inQIdx, j) > 0) { retVal = true; break;}
}
return retVal;
}
/* Nome da Função: IsDataNasc
Programador: Clayton
Data: 16/01/2013
Descrição: Retorna a idade baseada na Data de Nascimento
Tipo Quest: Date
Exemplo: IsDataNasc(QRef(1));
*/
function IsDataNasc(inQIdxDataNasc)
{
var retVal = 0;
retVal = (Now.Year-Answer(inQIdxDataNasc).Year);
if ((Answer(inQIdxDataNasc).Month > Now.Month) || (Answer(inQIdxDataNasc).Month == Now.Month && Answer(inQIdxDataNasc).Day > Now.Day))
{
retVal = retVal-1;
}
return retVal;
}
/* Nome da Função: IsDataNascIter
Programador: Clayton
Data: 16/01/2013
Descrição: Retorna a idade baseada na Data de Nascimento
Tipo Quest: Date Iter
Exemplo: IsDataNascIter(QRef(1), IterationIdex);
*/
function IsDataNascIter(inQIdxDataNasc, inIter)
{
var retVal = 0;
retVal = (Now.Year-Answer(inQIdxDataNasc).Year);
if ((AnswerIter(inQIdxDataNasc, inIter).Month > Now.Month) || (AnswerIter(inQIdxDataNasc, inIter).Month == Now.Month && AnswerIter(inQIdxDataNasc, inIter).Day > Now.Day))
{
retVal = retVal-1;
}
return retVal;
}
/* Nome da Função: IpsChekTrim
Programador: Wilson
Data: 18-01-2013
Descrição: Essa função verifica se os valores digitados em uma questão aberta ou semi-aberta
são apenas espaços, apenas números ou ambas as situações e retorna erro.
Tipo Quest: Aberta e Addictional Text
Exemplo: IpsChekTrim(true,true,false) | IpsChekTrim(false,false,true)&&Contains(CurrQues,1)
Descrição do comando: IpsTrimTeste( ; nome da função
true, ; aceita true/false. Se for true retorna erro caso a questão estiver apenas com espaços, se for false não aplica a checagem de espaços.
true, ; aceita true/false. Se for true retorna erro caso a questão estiver apenas com números, se for false não aplica a checagem de números.
false) ; aceita true/false. Faz a checagem de números e espaços para o Addictional Text. se estiver com false não checa o Addictional.
Observação: Quando usar essa função para questões Addictional precisa vincular ao código fechado de outros.
*/
function IpsChekTrim(chkTxt,chkNum,chkAdd){
var retVal = false;
if (chkTxt){
var txt = Answer(CurrQues).ToString()
txt = txt.replace(/\s/g,'')
if (txt == ''){
retVal = true;
return retVal;
}
}
if (chkNum){
var num = Answer(CurrQues).ToString()
num = num.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
if (num == ''){
retVal = true;
return retVal;
}
}
if (chkAdd){
var add = AdditionalText(CurrQues).ToString()
add = add.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
if (add == ''){
retVal = true;
return retVal;
}
}
}
/* Nome da Função: IpsChekTrimIterIter
Programador: Wilson
Data: 28-02-2013
Descrição: Essa função verifica se os valores digitados em uma questão aberta ou semi-aberta
são apenas espaços, apenas números ou ambas as situações e retorna erro.
Tipo Quest: Aberta e Addictional Text
Exemplo: IpsChekTrimIter(true,true,false) | IpsChekTrimIter(false,false,true)&&Contains(CurrQues,1)
Descrição do comando: IpsTrimTeste( ; nome da função
true, ; aceita true/false. Se for true retorna erro caso a questão estiver apenas com espaços, se for false não aplica a checagem de espaços.
true, ; aceita true/false. Se for true retorna erro caso a questão estiver apenas com números, se for false não aplica a checagem de números.
false) ; aceita true/false. Faz a checagem de números e espaços para o Addictional Text. se estiver com false não checa o Addictional.
Observação: Quando usar essa função para questões Addictional precisa vincular ao código fechado de outros.
Texto padrão da mensagem(sugestão): ATENÇÃO: Não aceitar apenas números ou em branco!
*/
function IpsChekTrimIter(chkTxt,chkNum,chkAdd){
var retVal = false;
if (chkTxt){
var txt = AnswerIter(CurrQues,IterationIndex).ToString()
txt = txt.replace(/\s/g,'')
if (txt == ''){
retVal = true;
return retVal;
}
}
if (chkNum){
var num = AnswerIter(CurrQues,IterationIndex).ToString()
num = num.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
if (num == ''){
retVal = true;
return retVal;
}
}
if (chkAdd){
var add = AdditionalTextIter(CurrQues,IterationIndex).ToString()
add = add.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
if (add == ''){
retVal = true;
return retVal;
}
}
}
/* Nome da Função: IsFilterAnswersByCods
Programador: Clayton
Data: 28/02/13
Descrição: Filtrar pór código
Tipo Quest: Single e Multiple
Exemplo: IsFilterAnswersByCods(CurrQues, true, true, [10,11,13,9996,998,999]);
*/
function IsFilterAnswersByCods(inQIdx, inShow, inReset, inCods)
{
var numOfCods = inCods.length;
var inAnswers = new Array();
for (var i=0;i<numOfCods;i++)
{
inAnswers[i] = GetAnswerChoiceIdxByCode(inQIdx,inCods[i]);
}
SetAnswerVisible(inQIdx, inShow, inReset, inAnswers);
}
/* Nome da Função: IsFilterTopicsByCods
Programador: Clayton
Data: 28/02/13
Descrição: Filtrar pór código
Tipo Quest: Grid
Exemplo: IsFilterTopicsByCods(CurrQues, true, true, [10,11,13,9996,998,999], QRef(CurrQues-1));
*/
function IsFilterTopicsByCods(inQIdx, inShow, inReset, inCods, inQIdxCod)
{
var numOfCods = inCods.length;
var inTopics = new Array();
for (var i=0;i<numOfCods;i++)
{
inTopics[i] = GetAnswerChoiceIdxByCode(inQIdxCod,inCods[i]);
}
SetTopicVisible(inQIdx, inShow, inReset, inTopics);
}
/* Nome da Função: IsFilterAnswersMarcasByCid
Programador: Clayton
Data: 28/02/13
Descrição: Filtra as marcas do AddLists por cidade(neste Add List contém todas as marcas de cigarro)
Tipo Quest: Single e Multiple
Exemplo: IsFilterAnswersMarcasByCid(CurrQues, true, true, Answer(1));
**Cidades GCS:
Bauru 1
São José do Rio Preto 2
Belo Horizonte 3
Recife 4
Porto Alegre 5
Curitiba 6
Ribeirão Preto 7
São Paulo 8
Rio de Janeiro 9 **
*/
function IsFilterAnswersMarcasByCid(inQIdx, inShow, inReset, inCodCid)
{
var inAnswers = new Array();
var i = 0;
var tblTable = GetTableFromStore("LISTA_DE_MARCAS_GCS","","cid_"+inCodCid+"=1","marca");
for (var j=0; j<tblTable.RowCount; j++)
{
var rowRow = tblTable[j];
if (rowRow["status_cod"]==1)
{
inAnswers[i] = rowRow["marca_cod"].ToInt();
i++;
}
}
IsFilterAnswersByCods(inQIdx, inShow, inReset, inAnswers);
}
/* Nome da Função: IsSetAnswerCodeLabel
Programador: Clayton
Data: 05/03/13
Descrição:
Tipo Quest: Single e Multipe
Exemplo: IsSetAnswerCodeLabel(CurrQues, [42,43]);
*/
function IsSetAnswerCodeLabel(inQIdx, inIgnore)
{
for (var j=1;j<=GetAnswerCount(inQIdx);j++)
{
SetAnswerText(inQIdx, j, AnswerCode(inQIdx, j)+'-'+GetAnswerOriginalText(inQIdx, j));
}
if (inIgnore!='undefined')
{
for (var j=0;j<inIgnore.length;j++)
{
SetAnswerText(inQIdx, inIgnore[j], GetAnswerOriginalText(inQIdx, inIgnore[j]));
}
}
}
/* Nome da Função: IsSetTopicCodeLabel
Programador: Clayton
Data: 17/05/13
Descrição:
Tipo Quest: Topic
Exemplo: IsSetTopicCodeLabel(CurrQues, [42,43]);
*/
function IsSetTopicCodeLabel(inQIdx, inQIdxCod, inIgnore)
{
for (var j=1;j<=GetTopicCount(inQIdx);j++)
{
SetTopicText(inQIdx, j, AnswerCode(inQIdxCod, j)+'-'+GetTopicOriginalText(inQIdx, j));
}
if (inIgnore!='undefined')
{
for (var j=0;j<inIgnore.length;j++)
{
SetTopicText(inQIdx, inIgnore[j], GetTopicOriginalText(inQIdx, inIgnore[j]));
}
}
}
/* Nome da Função: IsSortAnswersByCod
Programador: Clayton
Data: 06/03/2013
Descrição: Ordenar Lista por Index
Tipo Quest:
Exemplo:
*/
function IsSortAnswersByCod(inQIdx)
{
var inAnswersCod = new Array();
var inAnswersIdx = new Array();
for (var i=1;i<=GetAnswerCount(inQIdx);i++)
{
inAnswersCod[i-1] = AnswerCode(inQIdx, i);
//Prompt("cod "+inAnswersCod[i-1]);
}
var inAnswersCod = inAnswersCod.sort(IsCrescente);
for (var i=1;i<=GetAnswerCount(inQIdx);i++)
{
inAnswersIdx[i-1] = GetAnswerChoiceIdxByCode(inQIdx, inAnswersCod[i-1]);
//Prompt("idx "+inAnswersIdx[i-1]);
}
RandomizeAnswers(inQIdx, inAnswersIdx);
/* Crescente */
function IsCrescente(index1, index2)
{
return index1 - index2;
}
/* Decrescente */
function IsDecrescente(index1, index2)
{
return index2 - index1;
}
}
/* Nome da Função: IsRangeAll
Programador: Clayton
Data: 09/04/2013
Descrição: Checar se existe todos os valores de-para
Tipo Quest: Single e Mult
Exemplo: IsRangeAll(QRef(5), 18, 24);
*/
function IsRangeAll(inQIdx, inBegin, inEnd) {
var intVal = 0;
for (var j=inBegin;j<=inEnd;j++) { if (Contains(inQIdx, j)) { intVal++} }
if (intVal==inEnd) { return true; }
else { return false; }
}
/* Nome da Função: IsContainsByOriginalText
Programador: Clayton
Data: 15/04/2013
Descrição: Buscar Resposta por Original Text
Tipo Quest: Single e Mult
Exemplo: IsContainsByOriginalText(QRef(5), 'Outros');
*/
function IsContainsByOriginalText(inQues, inText)
{
var retVal = false;
for (var j=1;j<=GetAnswerCount(inQues);j++)
{
if (Contains(inQues, j) && GetAnswerOriginalText(inQues, j)==inText) { retVal = true; break; }
}
return retVal;
}
/*
Nome da Função: IsSetAnswersByCod
Programador: Clayton
Data: 29/04/13
Descrição:
Tipo Quest: Single e Multipe
Exemplo: IsSetAnswersByCod(QRef(1), CurrQues);
*/
function IsSetAnswersByCod(inQIdx, inQIdxTarget)
{
if (NumOfSelectedChoices(inQIdxTarget)>0)
{
var numOfAnswers = GetAnswers(inQIdxTarget);
var codOfAnswers = new Array();
for (var j=0; j<numOfAnswers.length; j++)
{
codOfAnswers[j] = GetAnswerChoiceIdxByCode(inQIdx, AnswerCode(inQIdxTarget, numOfAnswers[j]));
}
SetAnswer(inQIdx, codOfAnswers);
}
else
{
SetAnswer(inQIdx, GetAnswerChoiceIdxByCode(inQIdx, SelectedAnswerCode(inQIdxTarget)));
}
}
/* Nome da Função: IsRangeVar
Programador: Clayton
Data: 23/05/2013
Descrição: Checar se existe um valor de-para
Tipo Quest: Variável de Usuário
Exemplo: IsRangeVar(Var, 8,10);
*/
function IsRangeVar(inVar, inBegin, inEnd) {
var retVal = false;
if (inVar>=inBegin && inVar<=inEnd) { retVal = true; }
return retVal;
}
/* Nome da Função: IsContainsNumOfValues
Programador: Clayton
Data: 27/05/2013
Descrição: Retorna o total de valores que a questão possui
Tipo Quest: Multiple
Exemplo: IsContainsNumOfValues(CurrQues, [1,2,3,4]);
*/
function IsContainsNumOfValues(inQIdx, inAnswers) {
var retVal = 0;
for (var j=0;j<inAnswers.length;j++)
{
if (Contains(inQIdx, inAnswers[j])) { retVal++; }
}
return retVal;
}
/* Nome da Função: IsContainsTopicsValues
Programador: Clayton
Data: 27/05/2013
Descrição: Checa se há valores nos Tópics
Tipo Quest: Single Topic
Exemplo: IsContainsTopicsValues(CurrQues, [1,2,3,9], [1], false, false);
false, false = Qlqer um dos Tópicos, Qlqer um dos Valores
true, false = Todos os Tópicos, Qlqer um dos Valores
true, true = Todos os Tópicos, Todos os Valores
*/
function IsContainsTopicsValues(inQIdx, inTopics, inAnswers, inAllTopics, inAllAnswers) {
var retVal = false;
var intValTopic = 0;
var intValAnswer = 0;
for (var tpc=0;tpc<inTopics.length;tpc++)
{
if (!inAllTopics && !inAllAnswers)
{
for (var ans=0;ans<inAnswers.length;ans++)
{
if (AnswerChoice(inQIdx, inTopics[tpc])==inAnswers[ans]) { retVal=true; break; }
}
}
if (inAllTopics)
{
if (IsContainsOneOfTopics(inQIdx, inTopics[tpc], inAnswers)) { intValTopic++; }
}
if (inAllAnswers)
{
for (var ans=0;ans<inAnswers.length;ans++)
{
if (AnswerChoice(inQIdx, inTopics[tpc])==inAnswers[ans]) { intValAnswer++; }
}
}
}
if (inAllTopics && intValTopic==inTopics.length) { retVal=true; }
if (inAllAnswers && intValAnswer==inAnswers.length) { retVal=true; }
if ((inAllAnswers && intValAnswer==inAnswers.length) && (inAllTopics && intValTopic==inTopics.length)) { retVal=true; }
return retVal;
}
/* Nome da Função: IsGetTopicsTextWithValues
Programador: Clayton
Data: 04/06/2013
Descrição: Exibe o Texto dos Topics que Tem um determinado valor
Tipo Quest: Single Grid
Exemplo: IsGetTopicsTextWithValues(QRef(1), [1,2,3,4], [QRef(1),QRef(2)], [4,5]);
Se não tiver Outros, coloque 0 IsGetTopicsTextWithValues(QRef(1), [1,2,3,4], [0], [0]);
*/
function IsGetTopicsTextWithValues(inQIdx, inAnswers, inOuts, inAnswersOuts) {
var retVal = "";
var txtOut = "";
var ans = 0;
for (var tpc=1;tpc<=GetTopicCount(inQIdx);tpc++)
{
if (IsContainsOneOfTopics(inQIdx, tpc, inAnswers))
{
if (tpc==inAnswersOuts[ans])
{
txtOut = AdditionalText(inOuts[ans]) + Answer(inOuts[ans]);
retVal += txtOut+", ";
ans++;
}
else
{
retVal += GetTopicOriginalText(inQIdx, tpc)+", ";
}
}
}
return retVal.substring(0, retVal.length-2);
}
/* Nome da Função: IsGetIdxTopicsWithValues
Programador: Clayton
Data: 06/06/2013
Descrição: Exibe os IDXs dos Topics que Tem um determinado valor
Tipo Quest: Single Grid
Exemplo: IsGetIdxTopicsWithValues(QRef(1), [1,2,3,4]);
*/
function IsGetIdxTopicsWithValues(inQIdx, inAnswers) {
var retVal = new Array();
var i = 0;
for (var tpc=1;tpc<=GetTopicCount(inQIdx);tpc++)
{
if (IsContainsOneOfTopics(inQIdx, tpc, inAnswers))
{
retVal[i] = tpc; i++;
}
}
return retVal;
}
/* Nome da Função: IsRandomAnswersWithExclusive
Programador: Clayton
Data: 06/03/2013
Descrição: Retorna as opções e rodízio e fixa determinados índices no fim da lista
Tipo Quest: Single
Exemplo: IsRandomAnswersWithExclusive(CurrQues, [10,11], false);
inSet = true somente se for para setar a ordem do rodízio, se for para exibição deixe false;
*/
function IsRandomAnswersWithExclusive(inQIdx, inExcludeRandom, inSet)
{
var retVal = new Array();
var inAnswersIdx = new Array();
var j = 0;
for (var i=1;i<=GetAnswerCount(inQIdx);i++)
{
if (!InArray(i, inExcludeRandom))
{
inAnswersIdx[j] = i; j++;
}
}
inAnswersIdx = RandomizeArray(inAnswersIdx);
j = 0;
for (var i=0;i<GetAnswerCount(inQIdx);i++)
{
if (i<inAnswersIdx.length) { retVal[i] = inAnswersIdx[i]; }
else { retVal[i] = inExcludeRandom[j]; j++; }
}
if (!inSet)
{ RandomizeAnswers(inQIdx, retVal); }
else if (inSet)
{ return retVal; }
}
/* Nome da Função: IsRangeTopics
Programador: Clayton
Data: 17/05/2013
Descrição: Retorna a soma dos valores em questões Topics
Tipo Quest: Topics
Exemplo: IsRangeTopics(QRef(5), 1,5)>0;
*/
function IsRangeTopics(inQIdx, inTpcIn, inTpcEnd) {
var retVal = 0;
for (var j = inTpcIn; j <=inTpcEnd; j++) {
if (AnswerChoice(inQIdx, j)>= 0) {
retVal += AnswerChoice(inQIdx, j); }
}
return retVal;
}
/* Nome da Função: IsSortAnswersWithExclusive
Programador: Clayton
Data: 06/03/2013
Descrição: Retorna as opções em ordem de indice e fixa determinados índices no fim da lista
Tipo Quest: Single
Exemplo: IsSortAnswersWithExclusive(CurrQues, [10,11]);
*/
function IsSortAnswersWithExclusive(inQIdx, inExcludeRandom)
{
var retVal = new Array();
var inAnswersIdx = new Array();
var j = 0;
for (var i=1;i<=GetAnswerCount(inQIdx);i++)
{
if (!InArray(i, inExcludeRandom))
{
inAnswersIdx[j] = i; j++;
}
}
j = 0;
for (var i=0;i<GetAnswerCount(inQIdx);i++)
{
if (i<inAnswersIdx.length) { retVal[i] = inAnswersIdx[i]; }
else { retVal[i] = inExcludeRandom[j]; j++; }
}
RandomizeAnswers(inQIdx, retVal);
}
/* Nome da Função: IsContainsAnyIterRange
Programador: Clayton
Data: 09/08/2013
Descrição: Buscar Valor no Iter
Tipo Quest: Single e Multiple
Exemplo: IsContainsAnyIterRange(CurrQues, 1, 10);
*/
function IsContainsAnyIterRange(inQIdx, inBegin, inEnd)
{
var retVal = false;
for (var j=inBegin; j<=inEnd; j++)
{
if (ContainsAnyIter(inQIdx, j))
{
retVal = true;
break;
}
}
return retVal;
}
/* Nome da Função: IsSetTextCod
Programador: Clayton
Data: 14/08/2013
Descrição: Setar código(indíce) no lugar do label
Tipo Quest: Answer e Tópic
Exemplo: IsSetTextCod(inQIdx, inTopic)
*/
function IsSetTextCod(inQIdx, inTopic)
{
if (inTopic)
{
for (var j=1;j<=GetTopicCount(inQIdx);j++)
{
SetTopicText(inQIdx, j, ""+j+"");
}
}
else
{
for (var j=1;j<=GetAnswerCount(inQIdx);j++)
{
SetAnswerText(inQIdx, j, ""+j+"");
}
}
}
/* Nome da Função: IsRemoveAcento
Programador: Internet
Data: 21/08/2013
Descrição: Remove os Acentos da String
Tipo Quest: String
Exemplo: IsRemoveAcento("São Paulo");
*/
function IsRemoveAcento(strToReplace)
{
var str_acento= "áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÖÔÚÙÛÜÇ";
var str_sem_acento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC";
var nova="";
for (var i = 0; i < strToReplace.length; i++)
{
if (str_acento.indexOf(strToReplace.charAt(i)) != -1) {
nova+=str_sem_acento.substr(str_acento.search(strToReplace.substr(i,1)),1);
} else {
nova+=strToReplace.substr(i,1);
}
}
return nova;
}
/* Nome da Função: IsSetValuesRandom
Programador: Clayton/Carla
Data:
Descrição: Escolhe X valores rodiziado com base nos parametros de X a X
Tipo Quest: Single
Exemplo: IsSetValuesRandom(CurrQues, 1, 1, 4, 0)
*/
function IsSetValuesRandom(inSet, inSize, inMin, inMax, inIgnore)
{
if (NotAnswered(inSet))
{
do {
var arraySort = new Array();
arraySort = CreateRandomArray(inSize, inMin,inMax);
} while (IsRangeOneOfVars(inMin, inMax,[inIgnore],false) && IsAnyOneOfVars([inIgnore],[arraySort[0],arraySort[1]],false));
var inAns = new Array();
for (var j=0;j<inSize;j++)
{
inAns[j] = arraySort[j];
}
SetAnswer(inSet, inAns);
}
}
/* Nome da Função: IsCheckIntCompra
Programador: Clayton
Data: 04-11
Descrição: Checar Intenção de Compra entre Marca Mãe e Variante
Tipo Quest: Loop Single/Multiple
Exemplo:
*/
function IsCheckIntCompra(inQIdxMae, inIdxCodMae, inQIdxVar, inIdxCodVarIn, inIdxCodVarFim)
{
var retVal = false;
var i = 0;
var k = 0;
for (var j=inIdxCodVarIn;j<=inIdxCodVarFim;j++)
{
if (AnsweredIter(inQIdxVar, j))
{
k++;
if (AnswerIter(inQIdxVar, j)>AnswerIter(inQIdxMae, inIdxCodMae))
{
i++;
}
}
}
if (i == k)
{
Prompt("As variantes de "+IterationName+" não podem ter respostas maior do que "
+AnswerIter(inQIdxMae, inIdxCodMae)+" para todas");
retVal = true;
}
return retVal;
}
/* Nome da Função: IsCheckOrdemSelOutros
Programador: Clayton
Data: 02/12/2013
Descrição: Checar se os outros foram selecionados na Ordem Outros 1, Outros 2, etc.
Tipo Quest: RU/RM
Exemplo: IsCheckOrdemSelOutros(CurrQues, 3, 12);
*/
function IsCheckOrdemSelOutros(inQues, inQtdeOuts, inIdxOut1)
{
var retVal = false;
var i = 2;
for (var j=inIdxOut1+1;j<inIdxOut1+inQtdeOuts;j++)
{
if (IsAnswerVisible(inQues, j) && IsAnswerVisible(inQues, j-1) && Contains(inQues, j) && !Contains(inQues, j-1))
{
Prompt("Por favor, escolha na Ordem Outros "+(i-1)+", Outros "+i+", etc.");
retVal = true;
break;
}
i++;
}
return retVal;
}
/* Nome da Função: IsCheckEspEst (falta testar)
Programador: Clayton
Data: 04/12/2013
Descrição: Checar se o que foi mencionado no Espontâneo está no estimulado, com a possibilidade de Ignorar NH/NS
Tipo Quest: RU/RM/Grid
Exemplo: IsCheckEspEst([QRef(2), QRef(3)], CurrQues, false, [11]);
*/
function IsCheckEspEst(inEsps, inEst, inGridEst, inIgnore)
{
var retVal = false;
for (var i=0;i<inEsps.length;i++)
{
for (var j=1;j<=GetAnswerCount(inEsps[0]);j++)
{
if (!InArray(j, inIgnore))
{
if (inGridEst)
{
if (IsTopicVisible(inEst, j) && Contains(inEsps[i], j) && !ContainsSpecificRate(inEst, 1, j))
{
Prompt("Em "+VarName(inEsps[i])+" selecionou a opção "+GetAnswerOriginalText(inEsps[i], j)+" devendo selecioná-la nesta questão. Verifique!");
retVal = true;
}
} else {
if (IsAnswerVisible(inEst, j) && Contains(inEsps[i], j) && !Contains(inEst, j))
{
Prompt("Em "+VarName(inEsps[i])+" selecionou a opção "+GetAnswerOriginalText(inEsps[i], j)+" devendo selecioná-la nesta questão. Verifique!");
retVal = true;
}
}
}
if (retVal) { break; }
}
if (retVal) { break; }
}
return retVal;
}
/* Nome da Função:
Programador:
Data:
Descrição:
Tipo Quest:
Exemplo:
*/
/***************************************************************************************/
function NoMoreThanOneFirstAnswer(InQIdx)
{
var count=0;
var RetVal=false;
for(var i=1; i<=GetTopicCount(InQIdx); i++)
{
if(AnswerChoice(InQIdx,i)==1)
{
count++;
}
}
if(count>1)
{
RetVal=true;
}
return RetVal
}
function LessThan4Ans(InQIdx)
{
var count3=0;
var RetVal3=false;
for(var i=1; i<=GetTopicCount(InQIdx); i++)
{
if(AnswerChoice(InQIdx,i)==2)
{
count3++;
}
}
if(count3>3)
{
RetVal3=true;
}
return RetVal3
}
function dblToJSArray(inArray){
var retVal = new Array();
for(var i=0; i<inArray.length; i++){
retVal.push(inArray[i]);
}
return retVal;
}
function dblColorFromRGB(red, green, blue){
return (255<<24)+ (red<<16) + (green<<8) + blue;
}
function dblDistanceFromGPSFence (fenceLat, fenceLon)
{
var pi = Math.PI;
var fenceLatInRad=fenceLat* pi / 180;
var fenceLonInRad=fenceLon* pi / 180;
var targetLatInRad = GetGPSLocation().Latitude * pi / 180;
var targetLonInRad = GetGPSLocation().Longitude * pi / 180;
var dist = Math.acos(Math.sin(targetLatInRad) * Math.sin(fenceLatInRad) + Math.cos(targetLatInRad) * Math.cos(fenceLatInRad) * Math.cos(targetLonInRad - fenceLonInRad)) * 6371;
return dist;
}
function dblIsInGPSFence (fenceLat, fenceLon, distInKM)
{
var dist = dblDistanceFromGPSFence(fenceLat, fenceLon);
var retVal = false;
if(dist<distInKM){
retVal=true;}
else{
retVal=false;
}
return retVal;
}
function dblDistanceBetweenTwoLocations (firstLat, firstLon, secondLat, secondLon)
{
var pi = Math.PI;
var firstLatInRad=firstLat* pi / 180;
var firstLonInRad=firstLon* pi / 180;
var targetLatInRad = secondLat * pi / 180;
var targetLonInRad = secondLon * pi / 180;
var dist = Math.acos(Math.sin(targetLatInRad) * Math.sin(firstLatInRad) + Math.cos(targetLatInRad) * Math.cos(firstLatInRad) * Math.cos(targetLonInRad - firstLonInRad)) * 6371;
return dist;
}
function dblSumNumericGrid(inQ)
{
var retVal=0;
var numOfTopics=GetTopicCount(inQ);
var i;
for(i=1; i<=numOfTopics; i++)
{
if (IsTopicVisible(inQ,i)) {
retVal+=AnswerChoice(inQ,i);
}
}
return retVal;
}
function dblContainsOneOf(inQTarget,inAnswers)
{
var retVal = false;
var numOfAnswers = inAnswers.length;
var i;
for (i=0;i< numOfAnswers;i++) {
if (Contains(inQTarget,inAnswers[i])) {
retVal = true;
break;
}
}
return retVal;
}
//function dblContainsAll(inQTarget,inAnswers)
//{
// var retVal = true;
// var numOfAnswers = arguments.length-1;
// var i;
// for (i=0;i< numOfAnswers;i++) {
// retVal = retVal && Contains(inQTarget,arguments[i+1]);
// }
// return retVal;
//}
function dblContainsAllOf(inQTarget,inAnswers)
{
var retVal = true;
var numOfAnswers = inAnswers.length;
var i;
for (i=0;i< numOfAnswers;i++) {
retVal = retVal && Contains(inQTarget,inAnswers[i]);
}
return retVal;
}
function dblNumOfTopicsContains(inQ, inValueToCheck)
{
var retVal = 0;
var i=0;
for (i=1; i<=GetTopicCount(inQ);i++){
if (IsTopicVisible(inQ,i) && AnswerChoice(inQ,i) == inValueToCheck) {
retVal++;
}
}
return retVal;
}
function dblNumOfTopicsContainsChoice(inQ, inValueToCheck)
{
var retVal = 0;
var i=0;
for (i=1; i<=GetTopicCount(inQ);i++){
if (IsTopicVisible(inQ,i) && ContainsChoice(inQ,i,inValueToCheck)) {
retVal++;
}
}
return retVal;
}
function dblNumOfIterContains(inQ, inValueToCheck)
{
var retVal = 0;
var i=0;
for (i=1; i<IterationIndex;i++){
if (ContainsIter(inQ,inValueToCheck,i)) {
retVal++;
}
}
return retVal;
}
function dblSetSpecificTopic(inQ, inTopicIndex, inValue)
{
var curTopics = GetTopicCount(inQ);
var newAnswers=new Array();
var newArIdx=0;
var i;
for (i=0;i< curTopics;i++) {
var actualTopic = i+1;
if (actualTopic == inTopicIndex) {
newAnswers[i] = inValue;
}
else {
newAnswers[i] = AnswerChoice(inQ,actualTopic);
}
}
SetAnswer(inQ,newAnswers);
}
function dblSetSpecificTopicChoice(inQ, inTopicIndex, inValue)
{
var curTopics = GetTopicCount(inQ);
var newAnswers=new Array();
newAnswers.push(inValue);
var i;
var ansArr = GetAnswersChoice(inQ, inTopicIndex);
for (i=0;i < ansArr.length;i++)
{
newAnswers.push(ansArr[i]);
}
SetAnswerChoice(inQ, inTopicIndex, newAnswers);
}
function dblSetSpecificAnswer(inQ, inAnswerIdx, inChecked)
{
var curAnswers = GetAnswers(inQ);
var newAnswers=new Array();
var newArIdx=0;
var i;
for (i=0;i< curAnswers.length;i++) {
if (curAnswers[i] != inAnswerIdx) {
newAnswers[newArIdx] = curAnswers[i];
newArIdx++;
}
}
if (inChecked) {
newAnswers[newArIdx] = inAnswerIdx;
}
if (newAnswers.length > 0) {
SetAnswer(inQ,newAnswers);
}
else {
ClearAnswer(inQ);
}
}
function dblSetAnswersByAnswers(inQTarget,inQids)
{
var numOfQues = inQids.length;
var numOfAnswers = GetAnswerCount(inQids[0]);
var i;
for (i=1;i<= numOfAnswers;i++) {
var contained = false;
var j;
for (j=0; j<numOfQues;j++) {
contained = Contains(inQids[j],i);
if (contained) {
break;
}
}
if (contained) {
dblSetSpecificAnswer(inQTarget, i,true);
}
}
}
function dblSetAnswersByAnswersEx (inQTarget,inQids,inExcludeHiddenTargetAnswers)
{
var numOfQues = inQids.length;
var numOfAnswers = GetAnswerCount(inQids[0]);
var i;
// go over all answers and for each check if it exists in the source questions
for (i=1;i<= numOfAnswers;i++) {
var contained = false;
var j;
// go over all source questions and check if the answer is checked
for (j=0; j<numOfQues;j++) {
contained = Contains(inQids[j],i);
if (contained) {
break;
}
}
// in case it was contained check if need to add to target question
if (contained) {
var addAnswer = true;
if ((inExcludeHiddenTargetAnswers) && !IsAnswerVisible(inQTarget,i)) {
addAnswer = false;
}
if (addAnswer) {
dblSetSpecificAnswer(inQTarget, i,true);
}
}
}
}
function dblSumOfTopics (inQuesIdx)
{
var retVal = 0;
var i;
var numOfTopics = GetTopicCount(inQuesIdx);
for (i=0;i<numOfTopics;i++) {
var currTopic = i+1;
if (IsTopicVisible (inQuesIdx, currTopic)) {
var currValue = AnswerChoice(inQuesIdx, currTopic);
if (currValue != -99999) {
retVal += currValue;
}
}
}
return retVal;
}
function dblFormatNumberToCurrency(num) {
var retVal = "";
var num = num.toString().replace(/\$|\,/g,'');
if(isNaN(num))
num = "0";
var sign = (num == (num = Math.abs(num)));
num = Math.floor(num*100+0.50000000001);
var cents = num%100;
num = Math.floor(num/100).toString();
var addZero = "";
if(cents<10) {
addZero = "0";
}
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
}
retVal = (((sign)?'':'-') + '$' + num + '.' +addZero+ cents)
return retVal;
}
function dblToFloat(inNumber)
{
var retVal = parseFloat(inNumber.toString().replace(",", "."));
return retVal;
}
function dblSetAnswerVisible(inQTarget,inValue,inReset,inAnswers)
{
var retVal = false;
var numOfAnswers = inAnswers.length;
var i;
if (inReset) {
SetAnswerVisible(inQTarget,true);
}
for (i=0;i< numOfAnswers;i++) {
SetAnswerVisible(inQTarget, inAnswers[i], inValue);
}
return retVal;
}
function dblContainsByText(inQIdx, inText)
{
var retVal = false;
var i=0;
for (i=0; i<GetAnswerCount(inQIdx); i++){
var idx = i+1;
var text = AnswerText(inQIdx,idx);
if (text == inText) {
if (Contains(inQIdx,idx)) {
retVal = true;
break;
}
}
}
return retVal;
}
function dblFilterAnswersByAnswersByText (inTargetQ, inShow,inSourceQ)
{
SetAnswerVisible(inTargetQ,!inShow);
var i =0;
for (i=0; i<GetAnswerCount(inTargetQ);i++){
var idx = i+1;
var text = AnswerText(inTargetQ,idx);
if (dblContainsByText(inSourceQ,text)) {
SetAnswerVisible(inTargetQ,idx,inShow);
}
}
return true;
}
function dblFilterTopicsByAnswersByText (inTargetQ, inShow, inSourceQ)
{
SetTopicVisible(inTargetQ,!inShow);
var i=0;
for (i=0; i<GetTopicCount(inTargetQ); i++){
var idx = i+1;
var text = GetTopicOriginalText(inTargetQ,idx);
if (dblContainsByText(inSourceQ,text)) {
SetTopicVisible(inTargetQ,idx,inShow);
}
}
return true;
}
function dblGetSubjectStoreRow(inStoreName,inIDColumnName,inID)
{
var retVal = null;
try {
var table = GetTableFromStore(inStoreName,"","@@"+inIDColumnName+"='"+inID+"'","");
if (table != null && table.RowCount >0) {
var row = table[0];
retVal = row;
}
}
catch(err)
{
retVal = null;
}
return retVal;
}
function dblIsRegEx (pattern,value) {
var pattern = new RegExp(pattern);
return pattern.test(value);
}
function dblDateToSQLDate(inDate)
{
var retVal = "";
retVal = inDate.Year+"-"+inDate.Month+"-"+inDate.Day;
return retVal;
}
function dblOrderArray(inOrderArray, inDataArray)
{
var retVal = CreateRandomArray(inOrderArray.length);
var i = 0;
for (i = 0; i < inOrderArray.length; i++) {
retVal[i] = inDataArray[inOrderArray[i]-1];
}
return retVal;
}
function dblRespondentID ()
{
var retVal = "".concat("D", SID, "-", DeviceIndex);
return retVal;
}
function MyGetMultiDrinksStoreName ()
{
return "MultiDrinksStore";
}
function PipeOtherSpecTextToAnswer (inDestQ, inSrcQ, inDestAnsIdx, inSrcAnsIdx)
{
// if the answer from the source question was coded and it is an "other specify" answer type
if (Contains(inSrcQ, inSrcAnsIdx) && IsOtherSpec(inSrcQ, inSrcAnsIdx))
{
// pipe the additional text to the destination answer
SetAnswerText(inDestQ, inDestAnsIdx, AdditionalAnswerText(inSrcQ, inSrcAnsIdx));
}
}
/*_@_USERCODE_END_@*/
//_@_AddHandler_@{ Begin Add Handlers
//_@_AddHandler_@} End Add Handlers
//_@_HandlerZone_@{
function
IterationBreak_1()
{
return (IterationIndex > 1 && AnswerIter(QRef(10), IterationIndex - 1) == 2);
}
function QuestionStart_1()
{
// pipe the drink number
SetTextFormat(CurrQues, IterationIndex);
FilterAnswersByAnswers(CurrQues, QRef(1));
// handle other specify if needed (if other category was entered in the first question)
PipeOtherSpecTextToAnswer(CurrQues, QRef(1), GetAnswerCount(CurrQues), GetAnswerCount(QRef(1)) - 1);
}
function QuestionStart_2()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true));
// filter brands from drinks store based on chosen category
SetAnswerVisible(CurrQues, false); //hide all answers
var table = GetTableFromStore(MyGetMultiDrinksStoreName(), "", "@@[CategoryCode] = '" + SelectedAnswerCode(QRef(2)) + "'", "");
if (table != null && table.RowCount > 0)
{
var row = null;
var rowsAmount = table.RowCount;
var currItemCode = ""; // hold the item's code as in the store and answer scale
var currItemIdx = -1; // hold the item's index as in the answer scale
for (var i = 0; i < rowsAmount; i++)
{
row = table[i];
currItemCode = row["BrandCode"].ToString();
currItemIdx = GetAnswerChoiceIdxByCode(CurrQues, currItemCode);
SetAnswerVisible(CurrQues, true, false, currItemIdx); // show answer
}
}
else
{
Prompt("there was an error pulling the data from the '" + MyGetMultiDrinksStoreName() + "' subject store.");
}
//always show the "Other (specify)" option
SetAnswerVisible(CurrQues, true, false, GetAnswerCount(CurrQues));
}
function QuestionStart_4()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true), SelectedAnswerText(QRef(3), true));
//always show the "Other (specify)" option
SetAnswerVisible(CurrQues, true, false, GetAnswerCount(CurrQues));
}
function QuestionStart_5()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true), SelectedAnswerText(QRef(3), true), SelectedAnswerText(QRef(5), true));
// filter packs from drinks store based on chosen category, brand and flavor
SetAnswerVisible(CurrQues, false); //hide all answers
/*** If "Other" chosen at any item, show all available pack types ***/
if (SelectedAnswerCode(QRef(2)) == "9998" ||
SelectedAnswerCode(QRef(3)) == "9998" ||
SelectedAnswerCode(QRef(5)) == "9998")
{
SetAnswerVisible(CurrQues, true);
}
/*** Otherwise, show the packs of the chosen drink ***/
else
{
var table = GetTableFromStore(MyGetMultiDrinksStoreName(), "", "@@[CategoryCode] = '" + SelectedAnswerCode(QRef(2)) + "' AND [BrandCode] = '" + SelectedAnswerCode(QRef(3)) + "' AND [FlavorCode] = '" + SelectedAnswerCode(QRef(5)) + "'", "");
if (table != null && table.RowCount > 0)
{
var row = null;
var rowsAmount = table.RowCount;
var currItemCode = ""; // hold the item's code as in the store and answer scale
var currItemIdx = -1; // hold the item's index as in the answer scale
for (var i = 0; i < rowsAmount; i++)
{
row = table[i];
currItemCode = row["PackTypeCode"].ToString();
currItemIdx = GetAnswerChoiceIdxByCode(CurrQues, currItemCode);
SetAnswerVisible(CurrQues, true, false, currItemIdx); // show answer
}
}
else
{
Prompt("there was an error pulling the data from the '" + MyGetMultiDrinksStoreName() + "' subject store.");
}
//always show the "Other (specify)" option
SetAnswerVisible(CurrQues, true, false, GetAnswerCount(CurrQues));
}
}
function QuestionStart_6()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true), SelectedAnswerText(QRef(3), true), SelectedAnswerText(QRef(5), true), SelectedAnswerText(QRef(6), true));
// filter volumes from drinks store based on chosen category, brand, flavor and pack type
SetAnswerVisible(CurrQues, false); //hide all answers
/*** If "Other" chosen at any item, show all available volumes ***/
if (SelectedAnswerCode(QRef(2)) == "9998" ||
SelectedAnswerCode(QRef(3)) == "9998" ||
SelectedAnswerCode(QRef(5)) == "9998" ||
SelectedAnswerCode(QRef(6)) == "9998")
{
SetAnswerVisible(CurrQues, true);
}
/*** Otherwise, show the volumes of the chosen drink ***/
else
{
var table = GetTableFromStore(MyGetMultiDrinksStoreName(), "", "@@[CategoryCode] = '" + SelectedAnswerCode(QRef(2)) + "' AND [BrandCode] = '" + SelectedAnswerCode(QRef(3)) + "' AND [FlavorCode] = '" + SelectedAnswerCode(QRef(5)) + "' AND [PackTypeCode] = '" + SelectedAnswerCode(QRef(6)) + "'", "");
if (table != null && table.RowCount > 0)
{
var row = null;
var rowsAmount = table.RowCount;
var currItemCode = ""; // hold the item's code as in the store and answer scale
var currItemIdx = -1; // hold the item's index as in the answer scale
for (var i = 0; i < rowsAmount; i++)
{
row = table[i];
currItemCode = row["VolumeCode"].ToString();
currItemIdx = GetAnswerChoiceIdxByCode(CurrQues, currItemCode);
SetAnswerVisible(CurrQues, true, false, currItemIdx); // show answer
}
}
else
{
Prompt("there was an error pulling the data from the '" + MyGetMultiDrinksStoreName() + "' subject store.");
}
//always show the "Other (specify)" option
SetAnswerVisible(CurrQues, true, false, GetAnswerCount(CurrQues));
}
}
function QuestionStart_7()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true), SelectedAnswerText(QRef(3), true), SelectedAnswerText(QRef(5), true), SelectedAnswerText(QRef(6), true), SelectedAnswerText(QRef(7), true));
}
function QuestionStart_8()
{
SetTextFormat(CurrQues, IterationIndex, SelectedAnswerText(QRef(2), true), SelectedAnswerText(QRef(3), true), SelectedAnswerText(QRef(5), true), SelectedAnswerText(QRef(6), true), SelectedAnswerText(QRef(7), true));
}
function QuestionExpression_3()
{
var enterQuestion = 0;
// filter flavors from drinks store based on chosen category and brand
SetAnswerVisible(QRef(5), false); //hide all answers
/*** If "Other" brand chosen, show only the N/A and Other flavor options ***/
if (SelectedAnswerCode(QRef(3)) == "9998")
{
SetAnswerVisible(QRef(5), true, false, GetAnswerChoiceIdxByCode(QRef(5), "9997"), GetAnswerCount(QRef(5)));
}
/*** Otherwise, show the flavors of the chosen brands, if exist ***/
else
{
var table = GetTableFromStore(MyGetMultiDrinksStoreName(), "", "@@[CategoryCode] = '" + SelectedAnswerCode(QRef(2)) + "' AND [BrandCode] = '" + SelectedAnswerCode(QRef(3)) + "'", "");
if (table != null && table.RowCount > 0)
{
var row = null;
var rowsAmount = table.RowCount;
var currItemCode = ""; // hold the item's code as in the store and answer scale
var currItemIdx = -1; // hold the item's index as in the answer scale
for (var i = 0; i < rowsAmount; i++)
{
row = table[i];
currItemCode = row["FlavorCode"].ToString();
if (currItemCode != "9997") // if not "N/A"
{
currItemIdx = GetAnswerChoiceIdxByCode(QRef(5), currItemCode);
SetAnswerVisible(QRef(5), true, false, currItemIdx); // show answer
}
}
}
else
{
Prompt("there was an error pulling the data from the '" + MyGetMultiDrinksStoreName() + "' subject store.");
}
}
if (IsAnyAnswerVisible(QRef(5)))
{
enterQuestion = 1;
}
else // if no visible answer, auto-code "N/A"
{
SetAnswer(QRef(5), GetAnswerChoiceIdxByCode(QRef(5), "9997"));
}
return enterQuestion;
}
function HandleQuestionJump_0(ioJump)
{
/*_@_CC_@{1}_@_CC_@*/
ioJump.retVal = 4;//eJumpQuestionResult.ejqrNone
ioJump.outIdx = -2;
if (1 < 0) {
}
if (Contains(CurrQues, GetAnswerCount(CurrQues))) {
ioJump.retVal = 2;//eJumpQuestionResult.ejqrCancel
ioJump.outIdx = -2;
return;
}
}
function HandleQuestionEnter_4()
{
return (Answer(QRef(4)) == 1);
}
//_@_HandlerZone_@}
function JSDBLInitAllScript()
{
}var eJumpQuestionResult = {ejqrNext:0, ejqrSubmit:1,ejqrCancel:2,ejqrFilter:3,ejqrNone:4,ejqrIndex:5,ejqrChapter:6};
var ePlatform = {None:0, Web:1, PC:2, PDA:4, MobileWeb:8, SmartPhone:16, Android:32, AllWindows:31, AllJSEnabled: 34, All:63};
var eAttachmentSource = {easDefault:0};
var eAskButtons = {OKCancel:0, YesNoCancel:1, YesNo:2};
var eAskResult = {None:0, OK:1, Yes:2, No:3, Cancel:4};
var eQuotaFilledResult = {Default:0,Filter:1,Cancel:2,Nothing:3};
var eExtraLabel = { MatrixLower:0, MatrixMiddle:1, MatrixUpper:2, MatrixIrrelevant:3, ScaleLower:4, ScaleMiddle:5, ScaleUpper:6, CountersTotal:7,CountersRemaining:8, NumericGridTotal:9, NumericGridRemaining:10 };
var eULQuestionType = {eqtYesNo: 0,
eqtAmerican: 1,
eqtNumeric: 2,
eqtFreeText: 3,
eqtMultiSelect: 4,
eqtRating: 5,
eqtScale: 6,
eqtMatrix: 7,
eqtMultiTopics: 8,
eqtNoQuestion: 9,
eqtDateTime: 10,
eqtCounters: 11,
eqtStopper: 12,
eqtMassiveMultiSelect: 13,
eqtExpression: 14,
eqtMultiText: 15,
eqtMultiNumeric: 16,
eqtMultimedia: 17,
eqtMultiTopicsSelect: 18,
eqtGPSQuestion: 19,
eqtListSource: 20,
eqtPositionTopicsOnImage: 21,
eqtNumOfTypes: 22};
var eRenderGridAlignment = {Top: 0,
Center: 1,
Bottom: 2};
var eInterviewExtraField = {AttemptsPerCompletedInterview: 0,
AdherenceToMethodology: 1};
</Source>
</UserLogicContents>FalseFalseFalse-101.32.0.0AAEAAAD/////AQAAAAAAAAAMAgAAAEdVc2VyTG9naWNDcmVhdG9yLCBWZXJzaW9uPTEuMC4xLjMsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAKVN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuQXNzZW1ibHlEYXRhEAAAAAZtVGFibGUNbVN1cnZleUNvbnN0cw9tU3VydmV5U25pcHBldHMNbUNoYXB0ZXJUYWJsZQ1tTGFzdEJ1Y2tldElEEW1MYXN0TWV0YUJ1Y2tldElED21TdXJ2ZXlJbml0Q29kZRBtU3VydmV5QmxvY2tDb2RlEW1MYXN0TGlzdFNvdXJjZUlEE21MYXN0Q3VzdG9tQWN0aW9uSUQHbUZsYXZvcg5tVXNlR2xvYmFsQ29kZQttVXNlT3JnQ29kZQ5tU3RyaWN0SlNDaGVjaxdtTGFzdEF0dGFjaG1lbnRTb3VyY2VJRA5tU3VydmV5TmF2Q29kZQMDAwMAAAEBAAAEAAAAAAEeU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZVtdHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUeU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZVtdHlN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGVbXQgICAgkU3VydmV5VG9Hby5Vc2VyTG9naWMuQ3JlYXRvci5lRmxhdm9yAgAAAAEBAQgCAAAACQMAAAAJBAAAAAkFAAAACQYAAAABAAAAAgAAAAYHAAAAAAYIAAAA3gNmdW5jdGlvbiBNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lICgpDQp7DQoJcmV0dXJuICJNdWx0aURyaW5rc1N0b3JlIjsNCn0NCg0KZnVuY3Rpb24gUGlwZU90aGVyU3BlY1RleHRUb0Fuc3dlciAoaW5EZXN0USwgaW5TcmNRLCBpbkRlc3RBbnNJZHgsIGluU3JjQW5zSWR4KQ0Kew0KCS8vIGlmIHRoZSBhbnN3ZXIgZnJvbSB0aGUgc291cmNlIHF1ZXN0aW9uIHdhcyBjb2RlZCBhbmQgaXQgaXMgYW4gIm90aGVyIHNwZWNpZnkiIGFuc3dlciB0eXBlDQoJaWYgKENvbnRhaW5zKGluU3JjUSwgaW5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QAAAAEEQAAAAAAAAAEEUAAAAAAAAADFEAAABKVXNlckxvZ2ljSW50LlBvY2tldCwgVmVyc2lvbj0xLjAuNC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwFRgAAAC5TdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlF1ZXN0aW9uQ29uZGl0aW9uBgAAABlRdWVzdGlvbkluZm8rbVF1ZXN0aW9uSWR4FlF1ZXN0aW9uSW5mbyttSGFzRXJyb3IiUXVlc3Rpb25JbmZvK21RdWVzdGlvbkRlcGVuZGVuY2llcyFRdWVzdGlvbkluZm8rbUNoYXB0ZXJEZXBlbmRlbmNpZXMJY29uZGl0aW9uCGJlaGF2aW9yAAADAwQECAEcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0JlN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuQ29uZGl0aW9uAgAAAC9TdXJ2ZXlUb0dvLlVzZXJMb2dpYy5JbnRlcmZhY2VzLmVVTFNraXBCZWhhdmlvclEAAAACAAAABAAAAAAJUgAAAAlTAAAACVQAAAAFq////y9TdXJ2ZXlUb0dvLlVzZXJMb2dpYy5JbnRlcmZhY2VzLmVVTFNraXBCZWhhdmlvcgEAAAAHdmFsdWVfXwAIUQAAAAAAAAAFRwAAAC1TdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlF1ZXN0aW9uSnVtcEluZm8LAAAAGVF1ZXN0aW9uSW5mbyttUXVlc3Rpb25JZHgWUXVlc3Rpb25JbmZvK21IYXNFcnJvciJRdWVzdGlvbkluZm8rbVF1ZXN0aW9uRGVwZW5kZW5jaWVzIVF1ZXN0aW9uSW5mbyttQ2hhcHRlckRlcGVuZGVuY2llcwhqdW1wSW5mbwhiZWhhdmlvchRtUXVlc3Rpb25KdW1wT3B0aW9ucxNtQ2hhcHRlckp1bXBPcHRpb25zEW1PdGhlckp1bXBPcHRpb25zCWlzR2VuZXJhbAdnZW5KdW1wAAADAwQEAwMDAAIIARxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0HFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QlU3VydmV5VG9Hby5Vc2VyTG9naWMuQ3JlYXRvci5KdW1wSW5mbwIAAAAvU3VydmV5VG9Hby5Vc2VyTG9naWMuSW50ZXJmYWNlcy5lVUxTa2lwQmVoYXZpb3JRAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AQIAAAAAAAAAAAlWAAAACVcAAAAJWAAAAAGn////q////wAAAAAJWgAAAAlbAAAACVwAAAAACgVIAAAAL1N1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuUXVlc3Rpb25FeHByZXNzaW9uBgAAABlRdWVzdGlvbkluZm8rbVF1ZXN0aW9uSWR4FlF1ZXN0aW9uSW5mbyttSGFzRXJyb3IiUXVlc3Rpb25JbmZvK21RdWVzdGlvbkRlcGVuZGVuY2llcyFRdWVzdGlvbkluZm8rbUNoYXB0ZXJEZXBlbmRlbmNpZXMDZXhwCHNob3J0RXhwAAADAwEACAEcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdBxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AQIAAAADAAAAAAldAAAACV4AAAAGXwAAAK4MdmFyIGVudGVyUXVlc3Rpb24gPSAwOw0KDQovLyBmaWx0ZXIgZmxhdm9ycyBmcm9tIGRyaW5rcyBzdG9yZSBiYXNlZCBvbiBjaG9zZW4gY2F0ZWdvcnkgYW5kIGJyYW5kDQpTZXRBbnN3ZXJWaXNpYmxlKFFSZWYoNSksIGZhbHNlKTsgLy9oaWRlIGFsbCBhbnN3ZXJzDQoNCi8qKiogIElmICJPdGhlciIgYnJhbmQgY2hvc2VuLCBzaG93IG9ubHkgdGhlIE4vQSBhbmQgT3RoZXIgZmxhdm9yIG9wdGlvbnMgICoqKi8NCmlmIChTZWxlY3RlZEFuc3dlckNvZGUoUVJlZigzKSkgPT0gIjk5OTgiKQ0Kew0KCVNldEFuc3dlclZpc2libGUoUVJlZig1KSwgdHJ1ZSwgZmFsc2UsIEdldEFuc3dlckNob2ljZUlkeEJ5Q29kZShRUmVmKDUpLCAiOTk5NyIpLCBHZXRBbnN3ZXJDb3VudChRUmVmKDUpKSk7DQp9DQoNCi8qKiogIE90aGVyd2lzZSwgc2hvdyB0aGUgZmxhdm9ycyBvZiB0aGUgY2hvc2VuIGJyYW5kcywgaWYgZXhpc3QgICoqKi8NCmVsc2UNCnsNCgl2YXIgdGFibGUgPSBHZXRUYWJsZUZyb21TdG9yZShNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lKCksICIiLCAiQEBbQ2F0ZWdvcnlDb2RlXSA9ICciICsgU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpICsgIicgQU5EIFtCcmFuZENvZGVdID0gJyIgKyBTZWxlY3RlZEFuc3dlckNvZGUoUVJlZigzKSkgKyAiJyIsICIiKTsNCglpZiAodGFibGUgIT0gbnVsbCAmJiB0YWJsZS5Sb3dDb3VudCA+IDApDQoJew0KCQl2YXIgcm93ID0gbnVsbDsNCgkJdmFyIHJvd3NBbW91bnQgPSB0YWJsZS5Sb3dDb3VudDsNCgkJdmFyIGN1cnJJdGVtQ29kZSA9ICIiOyAvLyBob2xkIHRoZSBpdGVtJ3MgY29kZSBhcyBpbiB0aGUgc3RvcmUgYW5kIGFuc3dlciBzY2FsZQ0KCQl2YXIgY3Vyckl0ZW1JZHggPSAtMTsgLy8gaG9sZCB0aGUgaXRlbSdzIGluZGV4IGFzIGluIHRoZSBhbnN3ZXIgc2NhbGUNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzQW1vdW50OyBpKyspDQoJCXsNCgkJCXJvdyA9IHRhYmxlW2ldOw0KCQkJY3Vyckl0ZW1Db2RlID0gcm93WyJGbGF2b3JDb2RlIl0uVG9TdHJpbmcoKTsNCgkJCWlmIChjdXJySXRlbUNvZGUgIT0gIjk5OTciKSAvLyBpZiBub3QgIk4vQSINCgkJCXsNCgkJCQljdXJySXRlbUlkeCA9IEdldEFuc3dlckNob2ljZUlkeEJ5Q29kZShRUmVmKDUpLCBjdXJySXRlbUNvZGUpOw0KCQkJCVNldEFuc3dlclZpc2libGUoUVJlZig1KSwgdHJ1ZSwgZmFsc2UsIGN1cnJJdGVtSWR4KTsgLy8gc2hvdyBhbnN3ZXINCgkJCX0NCgkJfQ0KCX0NCg0KCWVsc2UNCgl7DQoJCVByb21wdCgidGhlcmUgd2FzIGFuIGVycm9yIHB1bGxpbmcgdGhlIGRhdGEgZnJvbSB0aGUgJyIgKyBNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lKCkgKyAiJyBzdWJqZWN0IHN0b3JlLiIpOw0KCX0NCn0NCg0KaWYgKElzQW55QW5zd2VyVmlzaWJsZShRUmVmKDUpKSkNCnsNCgllbnRlclF1ZXN0aW9uID0gMTsNCn0NCmVsc2UgLy8gaWYgbm8gdmlzaWJsZSBhbnN3ZXIsIGF1dG8tY29kZSAiTi9BIg0Kew0KCVNldEFuc3dlcihRUmVmKDUpLCBHZXRBbnN3ZXJDaG9pY2VJZHhCeUNvZGUoUVJlZig1KSwgIjk5OTciKSk7DQp9DQoNCnJldHVybiBlbnRlclF1ZXN0aW9uOwAFSQAAACtTdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlF1ZXN0aW9uQWN0aW9uBQAAABlRdWVzdGlvbkluZm8rbVF1ZXN0aW9uSWR4FlF1ZXN0aW9uSW5mbyttSGFzRXJyb3IiUXVlc3Rpb25JbmZvK21RdWVzdGlvbkRlcGVuZGVuY2llcyFRdWVzdGlvbkluZm8rbUNoYXB0ZXJEZXBlbmRlbmNpZXMGQWN0aW9uAAADAwEIARxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0HFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAACAAAAAAJYAAAAAlhAAAABmIAAADXAVNldFRleHRGb3JtYXQoQ3VyclF1ZXMsIEl0ZXJhdGlvbkluZGV4LCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZigyKSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDMpLCB0cnVlKSwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoNSksIHRydWUpLCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZig2KSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDcpLCB0cnVlKSk7AUoAAABJAAAABwAAAAAJYwAAAAlkAAAABmUAAADXAVNldFRleHRGb3JtYXQoQ3VyclF1ZXMsIEl0ZXJhdGlvbkluZGV4LCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZigyKSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDMpLCB0cnVlKSwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoNSksIHRydWUpLCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZig2KSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDcpLCB0cnVlKSk7AUsAAABJAAAABgAAAAAJZgAAAAlnAAAABmgAAADgDVNldFRleHRGb3JtYXQoQ3VyclF1ZXMsIEl0ZXJhdGlvbkluZGV4LCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZigyKSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDMpLCB0cnVlKSwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoNSksIHRydWUpLCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZig2KSwgdHJ1ZSkpOw0KDQovLyBmaWx0ZXIgdm9sdW1lcyBmcm9tIGRyaW5rcyBzdG9yZSBiYXNlZCBvbiBjaG9zZW4gY2F0ZWdvcnksIGJyYW5kLCBmbGF2b3IgYW5kIHBhY2sgdHlwZQ0KU2V0QW5zd2VyVmlzaWJsZShDdXJyUXVlcywgZmFsc2UpOyAvL2hpZGUgYWxsIGFuc3dlcnMNCg0KLyoqKiAgSWYgIk90aGVyIiBjaG9zZW4gYXQgYW55IGl0ZW0sIHNob3cgYWxsIGF2YWlsYWJsZSB2b2x1bWVzICAqKiovDQppZiAoU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpID09ICI5OTk4IiB8fA0KCVNlbGVjdGVkQW5zd2VyQ29kZShRUmVmKDMpKSA9PSAiOTk5OCIgfHwNCglTZWxlY3RlZEFuc3dlckNvZGUoUVJlZig1KSkgPT0gIjk5OTgiIHx8DQoJU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoNikpID09ICI5OTk4IikNCnsNCglTZXRBbnN3ZXJWaXNpYmxlKEN1cnJRdWVzLCB0cnVlKTsNCn0NCg0KLyoqKiAgT3RoZXJ3aXNlLCBzaG93IHRoZSB2b2x1bWVzIG9mIHRoZSBjaG9zZW4gZHJpbmsgICoqKi8NCmVsc2UNCnsNCgl2YXIgdGFibGUgPSBHZXRUYWJsZUZyb21TdG9yZShNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lKCksICIiLCAiQEBbQ2F0ZWdvcnlDb2RlXSA9ICciICsgU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpICsgIicgQU5EIFtCcmFuZENvZGVdID0gJyIgKyBTZWxlY3RlZEFuc3dlckNvZGUoUVJlZigzKSkgKyAiJyBBTkQgW0ZsYXZvckNvZGVdID0gJyIgKyBTZWxlY3RlZEFuc3dlckNvZGUoUVJlZig1KSkgKyAiJyBBTkQgW1BhY2tUeXBlQ29kZV0gPSAnIiArIFNlbGVjdGVkQW5zd2VyQ29kZShRUmVmKDYpKSArICInIiwgIiIpOw0KCWlmICh0YWJsZSAhPSBudWxsICYmIHRhYmxlLlJvd0NvdW50ID4gMCkNCgl7DQoJCXZhciByb3cgPSBudWxsOw0KCQl2YXIgcm93c0Ftb3VudCA9IHRhYmxlLlJvd0NvdW50Ow0KCQl2YXIgY3Vyckl0ZW1Db2RlID0gIiI7IC8vIGhvbGQgdGhlIGl0ZW0ncyBjb2RlIGFzIGluIHRoZSBzdG9yZSBhbmQgYW5zd2VyIHNjYWxlDQoJCXZhciBjdXJySXRlbUlkeCA9IC0xOyAvLyBob2xkIHRoZSBpdGVtJ3MgaW5kZXggYXMgaW4gdGhlIGFuc3dlciBzY2FsZQ0KCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3NBbW91bnQ7IGkrKykNCgkJew0KCQkJcm93ID0gdGFibGVbaV07DQoJCQljdXJySXRlbUNvZGUgPSByb3dbIlZvbHVtZUNvZGUiXS5Ub1N0cmluZygpOw0KCQkJY3Vyckl0ZW1JZHggPSBHZXRBbnN3ZXJDaG9pY2VJZHhCeUNvZGUoQ3VyclF1ZXMsIGN1cnJJdGVtQ29kZSk7DQoJCQlTZXRBbnN3ZXJWaXNpYmxlKEN1cnJRdWVzLCB0cnVlLCBmYWxzZSwgY3Vyckl0ZW1JZHgpOyAvLyBzaG93IGFuc3dlcg0KCQl9DQoJfQ0KDQoJZWxzZQ0KCXsNCgkJUHJvbXB0KCJ0aGVyZSB3YXMgYW4gZXJyb3IgcHVsbGluZyB0aGUgZGF0YSBmcm9tIHRoZSAnIiArIE15R2V0TXVsdGlEcmlua3NTdG9yZU5hbWUoKSArICInIHN1YmplY3Qgc3RvcmUuIik7DQoJfQ0KDQoJLy9hbHdheXMgc2hvdyB0aGUgIk90aGVyIChzcGVjaWZ5KSIgb3B0aW9uDQoJU2V0QW5zd2VyVmlzaWJsZShDdXJyUXVlcywgdHJ1ZSwgZmFsc2UsIEdldEFuc3dlckNvdW50KEN1cnJRdWVzKSk7DQp9AUwAAABJAAAABQAAAAAJaQAAAAlqAAAABmsAAADLDFNldFRleHRGb3JtYXQoQ3VyclF1ZXMsIEl0ZXJhdGlvbkluZGV4LCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZigyKSwgdHJ1ZSksIFNlbGVjdGVkQW5zd2VyVGV4dChRUmVmKDMpLCB0cnVlKSwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoNSksIHRydWUpKTsNCg0KLy8gZmlsdGVyIHBhY2tzIGZyb20gZHJpbmtzIHN0b3JlIGJhc2VkIG9uIGNob3NlbiBjYXRlZ29yeSwgYnJhbmQgYW5kIGZsYXZvcg0KU2V0QW5zd2VyVmlzaWJsZShDdXJyUXVlcywgZmFsc2UpOyAvL2hpZGUgYWxsIGFuc3dlcnMNCg0KLyoqKiAgSWYgIk90aGVyIiBjaG9zZW4gYXQgYW55IGl0ZW0sIHNob3cgYWxsIGF2YWlsYWJsZSBwYWNrIHR5cGVzICAqKiovDQppZiAoU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpID09ICI5OTk4IiB8fA0KCVNlbGVjdGVkQW5zd2VyQ29kZShRUmVmKDMpKSA9PSAiOTk5OCIgfHwNCglTZWxlY3RlZEFuc3dlckNvZGUoUVJlZig1KSkgPT0gIjk5OTgiKQ0Kew0KCVNldEFuc3dlclZpc2libGUoQ3VyclF1ZXMsIHRydWUpOw0KfQ0KDQovKioqICBPdGhlcndpc2UsIHNob3cgdGhlIHBhY2tzIG9mIHRoZSBjaG9zZW4gZHJpbmsgICoqKi8NCmVsc2UNCnsNCgl2YXIgdGFibGUgPSBHZXRUYWJsZUZyb21TdG9yZShNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lKCksICIiLCAiQEBbQ2F0ZWdvcnlDb2RlXSA9ICciICsgU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpICsgIicgQU5EIFtCcmFuZENvZGVdID0gJyIgKyBTZWxlY3RlZEFuc3dlckNvZGUoUVJlZigzKSkgKyAiJyBBTkQgW0ZsYXZvckNvZGVdID0gJyIgKyBTZWxlY3RlZEFuc3dlckNvZGUoUVJlZig1KSkgKyAiJyIsICIiKTsNCglpZiAodGFibGUgIT0gbnVsbCAmJiB0YWJsZS5Sb3dDb3VudCA+IDApDQoJew0KCQl2YXIgcm93ID0gbnVsbDsNCgkJdmFyIHJvd3NBbW91bnQgPSB0YWJsZS5Sb3dDb3VudDsNCgkJdmFyIGN1cnJJdGVtQ29kZSA9ICIiOyAvLyBob2xkIHRoZSBpdGVtJ3MgY29kZSBhcyBpbiB0aGUgc3RvcmUgYW5kIGFuc3dlciBzY2FsZQ0KCQl2YXIgY3Vyckl0ZW1JZHggPSAtMTsgLy8gaG9sZCB0aGUgaXRlbSdzIGluZGV4IGFzIGluIHRoZSBhbnN3ZXIgc2NhbGUNCgkJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzQW1vdW50OyBpKyspDQoJCXsNCgkJCXJvdyA9IHRhYmxlW2ldOw0KCQkJY3Vyckl0ZW1Db2RlID0gcm93WyJQYWNrVHlwZUNvZGUiXS5Ub1N0cmluZygpOw0KCQkJY3Vyckl0ZW1JZHggPSBHZXRBbnN3ZXJDaG9pY2VJZHhCeUNvZGUoQ3VyclF1ZXMsIGN1cnJJdGVtQ29kZSk7DQoJCQlTZXRBbnN3ZXJWaXNpYmxlKEN1cnJRdWVzLCB0cnVlLCBmYWxzZSwgY3Vyckl0ZW1JZHgpOyAvLyBzaG93IGFuc3dlcg0KCQl9DQoJfQ0KDQoJZWxzZQ0KCXsNCgkJUHJvbXB0KCJ0aGVyZSB3YXMgYW4gZXJyb3IgcHVsbGluZyB0aGUgZGF0YSBmcm9tIHRoZSAnIiArIE15R2V0TXVsdGlEcmlua3NTdG9yZU5hbWUoKSArICInIHN1YmplY3Qgc3RvcmUuIik7DQoJfQ0KCS8vYWx3YXlzIHNob3cgdGhlICJPdGhlciAoc3BlY2lmeSkiIG9wdGlvbg0KCVNldEFuc3dlclZpc2libGUoQ3VyclF1ZXMsIHRydWUsIGZhbHNlLCBHZXRBbnN3ZXJDb3VudChDdXJyUXVlcykpOw0KfQFNAAAASQAAAAQAAAAACWwAAAAJbQAAAAZuAAAA4AFTZXRUZXh0Rm9ybWF0KEN1cnJRdWVzLCBJdGVyYXRpb25JbmRleCwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoMiksIHRydWUpLCBTZWxlY3RlZEFuc3dlclRleHQoUVJlZigzKSwgdHJ1ZSkpOw0KDQovL2Fsd2F5cyBzaG93IHRoZSAiT3RoZXIgKHNwZWNpZnkpIiBvcHRpb24NClNldEFuc3dlclZpc2libGUoQ3VyclF1ZXMsIHRydWUsIGZhbHNlLCBHZXRBbnN3ZXJDb3VudChDdXJyUXVlcykpOwFOAAAASQAAAAIAAAAACW8AAAAJcAAAAAZxAAAArAhTZXRUZXh0Rm9ybWF0KEN1cnJRdWVzLCBJdGVyYXRpb25JbmRleCwgU2VsZWN0ZWRBbnN3ZXJUZXh0KFFSZWYoMiksIHRydWUpKTsNCg0KLy8gZmlsdGVyIGJyYW5kcyBmcm9tIGRyaW5rcyBzdG9yZSBiYXNlZCBvbiBjaG9zZW4gY2F0ZWdvcnkNClNldEFuc3dlclZpc2libGUoQ3VyclF1ZXMsIGZhbHNlKTsgLy9oaWRlIGFsbCBhbnN3ZXJzDQp2YXIgdGFibGUgPSBHZXRUYWJsZUZyb21TdG9yZShNeUdldE11bHRpRHJpbmtzU3RvcmVOYW1lKCksICIiLCAiQEBbQ2F0ZWdvcnlDb2RlXSA9ICciICsgU2VsZWN0ZWRBbnN3ZXJDb2RlKFFSZWYoMikpICsgIiciLCAiIik7DQppZiAodGFibGUgIT0gbnVsbCAmJiB0YWJsZS5Sb3dDb3VudCA+IDApDQp7DQoJdmFyIHJvdyA9IG51bGw7DQoJdmFyIHJvd3NBbW91bnQgPSB0YWJsZS5Sb3dDb3VudDsNCgl2YXIgY3Vyckl0ZW1Db2RlID0gIiI7IC8vIGhvbGQgdGhlIGl0ZW0ncyBjb2RlIGFzIGluIHRoZSBzdG9yZSBhbmQgYW5zd2VyIHNjYWxlDQoJdmFyIGN1cnJJdGVtSWR4ID0gLTE7IC8vIGhvbGQgdGhlIGl0ZW0ncyBpbmRleCBhcyBpbiB0aGUgYW5zd2VyIHNjYWxlDQoJZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzQW1vdW50OyBpKyspDQoJew0KCQlyb3cgPSB0YWJsZVtpXTsNCgkJY3Vyckl0ZW1Db2RlID0gcm93WyJCcmFuZENvZGUiXS5Ub1N0cmluZygpOw0KCQljdXJySXRlbUlkeCA9IEdldEFuc3dlckNob2ljZUlkeEJ5Q29kZShDdXJyUXVlcywgY3Vyckl0ZW1Db2RlKTsNCgkJU2V0QW5zd2VyVmlzaWJsZShDdXJyUXVlcywgdHJ1ZSwgZmFsc2UsIGN1cnJJdGVtSWR4KTsgLy8gc2hvdyBhbnN3ZXINCgl9DQp9DQoNCmVsc2UNCnsNCglQcm9tcHQoInRoZXJlIHdhcyBhbiBlcnJvciBwdWxsaW5nIHRoZSBkYXRhIGZyb20gdGhlICciICsgTXlHZXRNdWx0aURyaW5rc1N0b3JlTmFtZSgpICsgIicgc3ViamVjdCBzdG9yZS4iKTsNCn0NCg0KLy9hbHdheXMgc2hvdyB0aGUgIk90aGVyIChzcGVjaWZ5KSIgb3B0aW9uDQpTZXRBbnN3ZXJWaXNpYmxlKEN1cnJRdWVzLCB0cnVlLCBmYWxzZSwgR2V0QW5zd2VyQ291bnQoQ3VyclF1ZXMpKTsBTwAAAEkAAAABAAAAAAlyAAAACXMAAAAGdAAAAK8CLy8gcGlwZSB0aGUgZHJpbmsgbnVtYmVyDQpTZXRUZXh0Rm9ybWF0KEN1cnJRdWVzLCBJdGVyYXRpb25JbmRleCk7DQoNCkZpbHRlckFuc3dlcnNCeUFuc3dlcnMoQ3VyclF1ZXMsIFFSZWYoMSkpOw0KLy8gaGFuZGxlIG90aGVyIHNwZWNpZnkgaWYgbmVlZGVkIChpZiBvdGhlciBjYXRlZ29yeSB3YXMgZW50ZXJlZCBpbiB0aGUgZmlyc3QgcXVlc3Rpb24pDQpQaXBlT3RoZXJTcGVjVGV4dFRvQW5zd2VyKEN1cnJRdWVzLCBRUmVmKDEpLCBHZXRBbnN3ZXJDb3VudChDdXJyUXVlcyksIEdldEFuc3dlckNvdW50KFFSZWYoMSkpIC0gMSk7BVAAAAA0U3VydmV5VG9Hby5Vc2VyTG9naWMuQ3JlYXRvci5CcmVha0l0ZXJhdGlvbkNvbmRpdGlvbgUAAAAWQ2hhcHRlckluZm8rbUNoYXB0ZXJJRBVDaGFwdGVySW5mbyttSGFzRXJyb3IhQ2hhcHRlckluZm8rbVF1ZXN0aW9uRGVwZW5kZW5jaWVzIENoYXB0ZXJJbmZvK21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-11332726420601-11203271-1-165792-1-1-10-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