194 lines
5.6 KiB
JavaScript
194 lines
5.6 KiB
JavaScript
/**
|
|
* This file is part of the ForkBB <https://github.com/forkbb>.
|
|
*
|
|
* @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
|
|
* @license The MIT License (MIT)
|
|
*/
|
|
|
|
if (typeof ForkBB === "undefined" || !ForkBB) {
|
|
var ForkBB = {};
|
|
}
|
|
|
|
ForkBB.poll = (function (doc, win) {
|
|
'use strict';
|
|
|
|
var inputPE = 0,
|
|
classHide = "f-hide-poll",
|
|
parentsPE,
|
|
othersForPE = [],
|
|
question = [],
|
|
answer = [],
|
|
type = [],
|
|
maxQuestion = 0,
|
|
maxAnswer = 0;
|
|
|
|
function getParents(start) {
|
|
var parents = [],
|
|
current = start;
|
|
|
|
while (current !== start.form && current !== doc.body) {
|
|
current = current.parentElement;
|
|
parents.unshift(current);
|
|
}
|
|
|
|
return parents;
|
|
}
|
|
|
|
function getBranchingNode(baseParents, node)
|
|
{
|
|
var nodeParents = getParents(node);
|
|
|
|
for (var i = 0; i < baseParents.length; i++) {
|
|
if (
|
|
i >= nodeParents.length
|
|
|| (
|
|
0 === i
|
|
&& baseParents[i] !== nodeParents[i]
|
|
)
|
|
) {
|
|
return null;
|
|
} else if (baseParents[i] !== nodeParents[i]) {
|
|
return nodeParents[i];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
init : function () {
|
|
if (
|
|
0 !== inputPE
|
|
|| typeof DOMTokenList === 'undefined'
|
|
) {
|
|
return;
|
|
}
|
|
|
|
inputPE = doc.querySelector("input[name=poll_enable]");
|
|
|
|
if (!inputPE) {
|
|
return;
|
|
}
|
|
|
|
inputPE.addEventListener("change", ForkBB.poll.handlerEnable);
|
|
parentsPE = getParents(inputPE);
|
|
var elements = inputPE.form.elements;
|
|
|
|
for (var i = 0; i < elements.length; i++) {
|
|
var name = elements[i].name;
|
|
|
|
if (typeof name !== "string") {
|
|
continue;
|
|
}
|
|
|
|
var matches = name.match(/poll\[([^\[\]]+)\](?:\[(\d+)\](?:\[(\d+)\])?)?/);
|
|
|
|
if (!matches) {
|
|
continue;
|
|
}
|
|
|
|
var q = typeof matches[2] === "string" ? Number(matches[2]) : 0;
|
|
var a = typeof matches[3] === "string" ? Number(matches[3]) : 0;
|
|
|
|
if ("question" === matches[1]) {
|
|
question[q] = elements[i];
|
|
|
|
if (maxQuestion < q) {
|
|
maxQuestion = q;
|
|
}
|
|
} else if ("type" === matches[1]) {
|
|
type[q] = elements[i];
|
|
} else if ("answer" === matches[1]) {
|
|
if (!answer[q]) {
|
|
answer[q] = [];
|
|
}
|
|
|
|
answer[q][a] = elements[i];
|
|
|
|
if (maxAnswer < a) {
|
|
maxAnswer = a;
|
|
}
|
|
} else {
|
|
othersForPE.push(getBranchingNode(parentsPE, elements[i]));
|
|
}
|
|
}
|
|
|
|
for (var q = 1; q <= maxQuestion; q++) {
|
|
var currentQ = question[q],
|
|
parentsQ = getParents(currentQ);
|
|
|
|
for (var a = 1; a <= maxAnswer; a++) {
|
|
var currentA = answer[q][a];
|
|
|
|
answer[q][a] = {
|
|
a: currentA,
|
|
b: getBranchingNode(parentsQ, currentA)
|
|
};
|
|
|
|
currentA.addEventListener("input", function (x, y) {
|
|
return function () {ForkBB.poll.handlerAnswer(x, y)};
|
|
}(q, a));
|
|
}
|
|
|
|
question[q] = {
|
|
q: currentQ,
|
|
b: getBranchingNode(parentsPE, currentQ)
|
|
};
|
|
type[q] = getBranchingNode(parentsQ, type[q]);
|
|
|
|
currentQ.addEventListener("input", function (x) {
|
|
return function () {ForkBB.poll.handlerQuestion(x)};
|
|
}(q));
|
|
}
|
|
|
|
ForkBB.poll.handlerEnable();
|
|
},
|
|
|
|
handlerEnable : function () {
|
|
for (var i = 0; i < othersForPE.length; i++) {
|
|
var list = othersForPE[i].classList;
|
|
inputPE.checked ? list.remove(classHide) : list.add(classHide);
|
|
}
|
|
|
|
ForkBB.poll.handlerQuestion(1, inputPE.checked ? "+" : "-");
|
|
},
|
|
|
|
handlerQuestion : function (q, t) {
|
|
if (q > maxQuestion) {
|
|
return;
|
|
} else if (typeof t === "undefined" || "+" === t) {
|
|
t = question[q].q.value == "" ? "-" : "+";
|
|
|
|
question[q].b.classList.remove(classHide);
|
|
|
|
if ("+" === t) {
|
|
type[q].classList.remove(classHide);
|
|
} else {
|
|
type[q].classList.add(classHide);
|
|
}
|
|
|
|
ForkBB.poll.handlerAnswer(q, 1, t);
|
|
} else {
|
|
question[q].b.classList.add(classHide);
|
|
}
|
|
|
|
ForkBB.poll.handlerQuestion(q + 1, t);
|
|
},
|
|
|
|
handlerAnswer : function (q, a, t) {
|
|
if (a > maxAnswer) {
|
|
return;
|
|
} else if (typeof t === "undefined" || "+" === t) {
|
|
t = answer[q][a].a.value == "" ? "-" : "+";
|
|
|
|
answer[q][a].b.classList.remove(classHide);
|
|
} else {
|
|
answer[q][a].b.classList.add(classHide);
|
|
}
|
|
|
|
ForkBB.poll.handlerAnswer(q, a + 1, t);
|
|
},
|
|
};
|
|
}(document, window));
|
|
|
|
document.addEventListener("DOMContentLoaded", ForkBB.poll.init, false);
|