results.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. "use strict";
  2. var urlToCopy = document.getElementById("urlToCopy");
  3. if (urlToCopy) {
  4. urlToCopy.innerHTML = location.href;
  5. }
  6. function shareLink() {
  7. var urlToCopy = document.getElementById("urlToCopy");
  8. var urlToCopyContainer = document.getElementById("urlToCopyContainer");
  9. try {
  10. if (document.body.createTextRange) {
  11. // for Internet Explorer
  12. var range = document.body.createTextRange();
  13. range.moveToElementText(urlToCopy);
  14. range.select();
  15. document.execCommand("Copy");
  16. } else if (window.getSelection) {
  17. // other browsers
  18. var selection = window.getSelection();
  19. var range = document.createRange();
  20. range.selectNodeContents(urlToCopy);
  21. selection.removeAllRanges();
  22. selection.addRange(range);
  23. document.execCommand("Copy");
  24. }
  25. var button = document.getElementById("buttonLink");
  26. if (button) {
  27. button.className = "button buttonLinkGood";
  28. setTimeout(function() {
  29. var buttonTimeout = document.getElementById("buttonLink");
  30. if (buttonTimeout) button.className = "button buttonLink";
  31. }, 2000);
  32. }
  33. } catch (err) {}
  34. }
  35. function getQueryVariable(variable) {
  36. var query = window.atob(window.location.search.substring(1));
  37. var vars = query.split("&");
  38. for (var i = 0; i < vars.length; i++) {
  39. var pair = vars[i].split("=");
  40. if (pair[0] == variable) {
  41. if (pair[1] == "NaN") {
  42. return 0;
  43. } else {
  44. return pair[1] / 100;
  45. }
  46. }
  47. }
  48. return 0;
  49. }
  50. function setAxisValue(name, value) {
  51. var axis = document.getElementById(name);
  52. if (!axis) return;
  53. var text = document.getElementById(name + "Text");
  54. if (!text) return;
  55. axis.style.width = (100 * value).toFixed(1) + "%";
  56. text.innerHTML = (100 * value).toFixed(0) + "%";
  57. if (text.offsetWidth > axis.offsetWidth - 5) text.style.display = "none";
  58. else text.style.display = "";
  59. }
  60. function setBonus(name, value, limit) {
  61. var axis = document.getElementById(name);
  62. if (!axis) return;
  63. if (value > limit) {
  64. axis.style.display = "flex";
  65. axis.style.opacity = value * value;
  66. } else {
  67. axis.style.display = "none";
  68. }
  69. }
  70. var axes = ["c", "b", "p", "m", "s", "j", "e", "t"];
  71. var bonus = {
  72. anar: 0.9,
  73. prag: 0.5,
  74. femi: 0.9,
  75. comp: 0.9,
  76. vega: 0.5,
  77. reli: 0.5,
  78. mona: 0.5
  79. };
  80. var characteristics = [];
  81. var axesValues = {
  82. c: 0,
  83. b: 0,
  84. p: 0,
  85. m: 0,
  86. s: 0,
  87. j: 0,
  88. e: 0,
  89. t: 0
  90. };
  91. var left = 0;
  92. var right = 0;
  93. for (var i = 0; i < axes.length; i++) {
  94. var negativeValue = getQueryVariable(axes[i] + "0");
  95. var positiveValue = getQueryVariable(axes[i] + "1");
  96. setAxisValue(axes[i] + "AxisNeg", negativeValue);
  97. setAxisValue(axes[i] + "AxisPos", positiveValue);
  98. setAxisValue(axes[i] + "AxisMid", 1 - negativeValue - positiveValue);
  99. left += negativeValue;
  100. right += positiveValue;
  101. if (negativeValue > positiveValue) {
  102. characteristics.push({ name: axes[i] + "0", value: negativeValue });
  103. } else {
  104. characteristics.push({ name: axes[i] + "1", value: positiveValue });
  105. }
  106. axesValues[axes[i]] = positiveValue - negativeValue;
  107. }
  108. var bonusEnabled = 0;
  109. for (var b in bonus) {
  110. var value = getQueryVariable(b);
  111. setBonus(b + "Bonus", value, bonus[b]);
  112. if (value > bonus[b]) {
  113. bonusEnabled = 1;
  114. characteristics.push({ name: b, value: value });
  115. }
  116. }
  117. characteristics.sort(function(a, b) {
  118. return a.value < b.value;
  119. });
  120. var charSlogan = {
  121. b0: "Humanity",
  122. b1: "Fatherland",
  123. c0: "Equality",
  124. e0: "Ecology",
  125. j0: "Justice",
  126. j1: "Order",
  127. m1: "Liberty",
  128. p0: "Socialism",
  129. p1: "Work",
  130. s1: "Family",
  131. t0: "Revolution"
  132. };
  133. function findFlagColors() {
  134. var colors = [];
  135. for (var i = 0; i < flagColors.length; i++) {
  136. var accepted = 1;
  137. var mainValue = 0;
  138. var mainValueFound = 0;
  139. for (var j = 0; j < flagColors[i].cond.length; j++) {
  140. var charFound = 0;
  141. for (var k = 0; k < characteristics.length; k++) {
  142. if (characteristics[k].name == flagColors[i].cond[j].name) {
  143. charFound = 1;
  144. if (
  145. characteristics[k].value < flagColors[i].cond[j].vmin ||
  146. characteristics[k].value > flagColors[i].cond[j].vmax
  147. )
  148. accepted = 0;
  149. else if (!mainValueFound) {
  150. mainValueFound = 1;
  151. mainValue = characteristics[k].value;
  152. }
  153. break;
  154. }
  155. }
  156. if (!charFound) accepted = 0;
  157. if (!accepted) break;
  158. }
  159. if (accepted) {
  160. colors.push({
  161. bgColor: flagColors[i].bgColor,
  162. fgColor: flagColors[i].fgColor,
  163. value: mainValue
  164. });
  165. }
  166. }
  167. colors.sort(function(a, b) {
  168. return b.value - a.value;
  169. });
  170. return colors;
  171. }
  172. function findFlagShape(numColors) {
  173. var flagFound = -1;
  174. var flagValue = [0, 0, 0];
  175. var flagColor = 0;
  176. for (var i = 0; i < flagShapes.length; i++) {
  177. if (flagShapes[i].numColors > numColors) continue;
  178. var condValue = [0, 0];
  179. var accepted = 1;
  180. if (flagShapes[i].cond.length > 0) {
  181. for (var j = 0; j < flagShapes[i].cond.length; j++) {
  182. var value = axesValues[flagShapes[i].cond[j].name];
  183. if (
  184. value < flagShapes[i].cond[j].vmin ||
  185. value > flagShapes[i].cond[j].vmax
  186. ) {
  187. accepted = 0;
  188. }
  189. if (j < 3) condValue[j] = Math.abs(value);
  190. if (!accepted) break;
  191. }
  192. } else {
  193. var condValue = [0, 0];
  194. }
  195. if (accepted && flagColor <= flagShapes[i].numColors) {
  196. if (flagShapes[i].numColors > flagColor) {
  197. flagColor = flagShapes[i].numColors;
  198. flagValue[0] = condValue[0];
  199. flagValue[1] = condValue[1];
  200. flagValue[2] = condValue[2];
  201. flagFound = i;
  202. } else if (condValue[0] > flagValue[0]) {
  203. flagColor = flagShapes[i].numColors;
  204. flagValue[0] = condValue[0];
  205. flagValue[1] = condValue[1];
  206. flagValue[2] = condValue[2];
  207. flagFound = i;
  208. } else if (condValue[0] == flagValue[0]) {
  209. if (condValue[1] > flagValue[1]) {
  210. flagColor = flagShapes[i].numColors;
  211. flagValue[0] = condValue[0];
  212. flagValue[1] = condValue[1];
  213. flagValue[2] = condValue[2];
  214. flagFound = i;
  215. } else if (condValue[1] == flagValue[1]) {
  216. if (condValue[2] > flagValue[2]) {
  217. flagColor = flagShapes[i].numColors;
  218. flagValue[0] = condValue[0];
  219. flagValue[1] = condValue[1];
  220. flagValue[2] = condValue[2];
  221. flagFound = i;
  222. }
  223. }
  224. }
  225. }
  226. }
  227. return flagFound;
  228. }
  229. function getCharacteristic(name, vmin, vmax) {
  230. for (var k = 0; k < characteristics.length; k++) {
  231. if (characteristics[k].name != name) continue;
  232. if (characteristics[k].value >= vmin && characteristics[k].value <= vmax)
  233. return characteristics[k].value;
  234. else return -1.0;
  235. }
  236. return -1.0;
  237. }
  238. function findFlagSymbol(numColors) {
  239. var symbol0 = {
  240. parent_type: "none",
  241. transform: {}
  242. };
  243. var symbol1 = {
  244. parent_type: "none",
  245. transform: {}
  246. };
  247. var valueMax = 0;
  248. if (numColors == 0) {
  249. symbol0.parent_type = "dot";
  250. symbol0.transform = {
  251. child_type: "none",
  252. x: 3,
  253. y: 3,
  254. main: true,
  255. parent_tx: 0,
  256. parent_ty: 0,
  257. parent_sx: 1,
  258. parent_sy: 1,
  259. parent_r: 0,
  260. child_tx: 0,
  261. child_ty: 0,
  262. child_sx: 1,
  263. child_sy: 1,
  264. child_r: 0
  265. };
  266. }
  267. for (var s0 = 0; s0 < flagSymbols.length; s0++) {
  268. var charVal0 = getCharacteristic(
  269. flagSymbols[s0].cond.name,
  270. flagSymbols[s0].cond.vmin,
  271. flagSymbols[s0].cond.vmax
  272. );
  273. if (charVal0 > 0) {
  274. var value = charVal0 * 1.5;
  275. var transform0 = -1;
  276. if (value > valueMax) {
  277. for (k0 = 0; k0 < flagSymbols[s0].data.transforms.length; k0++) {
  278. if (flagSymbols[s0].data.transforms[k0].child_type == "none") {
  279. transform0 = k0;
  280. }
  281. }
  282. if (transform0 >= 0) {
  283. symbol0.parent_type = flagSymbols[s0].data.parent_type;
  284. symbol0.transform = flagSymbols[s0].data.transforms[transform0];
  285. symbol1.parent_type = "none";
  286. valueMax = value;
  287. }
  288. }
  289. for (var s1 = s0 + 1; s1 < flagSymbols.length; s1++) {
  290. transform0 = -1;
  291. var transform1 = -1;
  292. var k0 = -1;
  293. for (k0 = 0; k0 < flagSymbols[s0].data.transforms.length; k0++) {
  294. for (var k1 = 0; k1 < flagSymbols[s1].data.transforms.length; k1++) {
  295. if (
  296. flagSymbols[s0].data.parent_type ==
  297. flagSymbols[s1].data.transforms[k1].child_type &&
  298. flagSymbols[s1].data.parent_type ==
  299. flagSymbols[s0].data.transforms[k0].child_type
  300. ) {
  301. transform0 = k0;
  302. transform1 = k1;
  303. }
  304. }
  305. }
  306. if (transform1 < 0 || transform0 < 0) continue;
  307. var charVal1 = getCharacteristic(
  308. flagSymbols[s1].cond.name,
  309. flagSymbols[s1].cond.vmin,
  310. flagSymbols[s1].cond.vmax
  311. );
  312. if (charVal1 > 0) {
  313. value = charVal0 + charVal1;
  314. if (value > valueMax) {
  315. symbol0.parent_type = flagSymbols[s0].data.parent_type;
  316. symbol0.transform = flagSymbols[s0].data.transforms[transform0];
  317. symbol1.parent_type = flagSymbols[s1].data.parent_type;
  318. symbol1.transform = flagSymbols[s1].data.transforms[transform1];
  319. valueMax = value;
  320. }
  321. }
  322. }
  323. }
  324. }
  325. if (
  326. symbol0.parent_type != "none" &&
  327. symbol1.parent_type != "none" &&
  328. symbol1.transform.main &&
  329. !symbol0.transform.main
  330. )
  331. return [symbol1, symbol0];
  332. else return [symbol0, symbol1];
  333. }
  334. var generatedSlogan = "";
  335. var sloganDiv = document.getElementById("slogan");
  336. if (sloganDiv) {
  337. var selectedSlogan = [];
  338. for (var i = 0; i < characteristics.length; i++) {
  339. if (
  340. characteristics[i].value > 0 &&
  341. charSlogan.hasOwnProperty(characteristics[i].name)
  342. ) {
  343. selectedSlogan.push({
  344. text: charSlogan[characteristics[i].name],
  345. value: characteristics[i].value
  346. });
  347. }
  348. }
  349. selectedSlogan.sort(function(a, b) {
  350. return a.value < b.value;
  351. });
  352. var counter = 0;
  353. for (var i = 0; i < selectedSlogan.length; i++) {
  354. if (generatedSlogan != "") generatedSlogan += " · ";
  355. generatedSlogan += selectedSlogan[i].text;
  356. counter++;
  357. if (counter >= 3) break;
  358. }
  359. sloganDiv.innerHTML = generatedSlogan;
  360. }
  361. if (!bonusEnabled) {
  362. var bonusBox = document.getElementById("bonusBox");
  363. bonusBox.style.display = "none";
  364. }
  365. var images = {
  366. sprites: "/images/flag_sprites.png",
  367. c0: "/images/constructivism_small.png",
  368. c1: "/images/essentialism_small.png",
  369. j0: "/images/justice_soft_small.png",
  370. j1: "/images/justice_hard_small.png",
  371. s0: "/images/progressism_small.png",
  372. s1: "/images/conservatism_small.png",
  373. b0: "/images/internationalism_small.png",
  374. b1: "/images/nationalism_small.png",
  375. p0: "/images/communism_small.png",
  376. p1: "/images/capitalism_small.png",
  377. m0: "/images/regulation_small.png",
  378. m1: "/images/laissezfaire_small.png",
  379. e0: "/images/ecology_small.png",
  380. e1: "/images/productivism_small.png",
  381. t0: "/images/revolution_small.png",
  382. t1: "/images/reformism_small.png",
  383. anar: "/images/anarchism_small.png",
  384. prag: "/images/pragmatism_small.png",
  385. femi: "/images/feminism_small.png",
  386. comp: "/images/complotism_small.png",
  387. vega: "/images/veganism_small.png",
  388. mona: "/images/monarchism_small.png",
  389. reli: "/images/religion_small.png"
  390. };
  391. var numImageLoaded = 0;
  392. function onImageLoaded() {
  393. numImageLoaded++;
  394. if (numImageLoaded < images.length) {
  395. return;
  396. }
  397. var flag = document.getElementById("generatedFlag");
  398. if (flag) {
  399. var ctx = flag.getContext("2d");
  400. var spriteX = 256;
  401. var spriteY = 128;
  402. var spriteS = 1.0;
  403. var colors = findFlagColors();
  404. var symbolData = findFlagSymbol(colors.length);
  405. var flagId = findFlagShape(colors.length);
  406. if (colors.length <= 0)
  407. colors.push({ bgColor: "#ffffff", fgColor: "#000000" });
  408. if (flagId < 0) {
  409. ctx.beginPath();
  410. ctx.rect(0, 0, 512, 256);
  411. ctx.fillStyle = "#ffffff";
  412. ctx.fill();
  413. } else {
  414. for (var i = 0; i < flagShapes[flagId].shapes.length; i++) {
  415. var path = flagShapes[flagId].shapes[i];
  416. var numPoints = path.length / 2;
  417. ctx.beginPath();
  418. ctx.moveTo(path[1] * 512, path[2] * 256);
  419. if (path[1] == "circle") {
  420. ctx.arc(
  421. path[2] * 512,
  422. path[3] * 256,
  423. path[4] * 256,
  424. 0,
  425. 2 * Math.PI,
  426. false
  427. );
  428. } else if (
  429. path[1] == "circleSymbol" &&
  430. symbolData[0].parent_type != "none"
  431. ) {
  432. ctx.arc(
  433. path[2] * 512,
  434. path[3] * 256,
  435. path[4] * 256,
  436. 0,
  437. 2 * Math.PI,
  438. false
  439. );
  440. } else {
  441. for (var j = 1; j < numPoints; j++) {
  442. ctx.lineTo(path[1 + j * 2 + 0] * 512, path[1 + j * 2 + 1] * 256);
  443. }
  444. }
  445. ctx.fillStyle = colors[path[0]].bgColor;
  446. ctx.fill();
  447. }
  448. spriteX = flagShapes[flagId].symbol[0] * 512;
  449. spriteY = flagShapes[flagId].symbol[1] * 256;
  450. spriteS = flagShapes[flagId].symbol[2];
  451. }
  452. if (symbolData[0].parent_type != "none") {
  453. var tmpC = document.createElement("canvas");
  454. tmpC.width = images["sprites"].width;
  455. tmpC.height = images["sprites"].height;
  456. var tmpCtx = tmpC.getContext("2d");
  457. var coloredSprites = tmpCtx.getImageData(0, 0, tmpC.width, tmpC.height);
  458. tmpCtx.beginPath();
  459. tmpCtx.rect(0, 0, tmpC.width, tmpC.height);
  460. tmpCtx.fillStyle = colors[0].fgColor;
  461. tmpCtx.fill();
  462. tmpCtx.globalCompositeOperation = "destination-in";
  463. tmpCtx.drawImage(images["sprites"], 0, 0);
  464. ctx.save();
  465. ctx.translate(spriteX, spriteY);
  466. ctx.scale(spriteS, spriteS);
  467. var sx = symbolData[0].transform.x;
  468. var sy = symbolData[0].transform.y;
  469. ctx.save();
  470. ctx.translate(
  471. symbolData[0].transform.parent_tx,
  472. -symbolData[0].transform.parent_ty
  473. );
  474. ctx.rotate((symbolData[0].transform.parent_r * Math.PI) / 180);
  475. ctx.scale(
  476. symbolData[0].transform.parent_sx,
  477. symbolData[0].transform.parent_sy
  478. );
  479. ctx.drawImage(tmpC, sx * 128, sy * 128, 128, 128, -64, -64, 128, 128);
  480. ctx.restore();
  481. if (symbolData[1].parent_type != "none") {
  482. var sx = symbolData[1].transform.x;
  483. var sy = symbolData[1].transform.y;
  484. ctx.translate(
  485. symbolData[0].transform.child_tx,
  486. -symbolData[0].transform.child_ty
  487. );
  488. ctx.rotate((symbolData[0].transform.child_r * Math.PI) / 180);
  489. ctx.scale(
  490. symbolData[0].transform.child_sx,
  491. symbolData[0].transform.child_sy
  492. );
  493. ctx.translate(
  494. symbolData[1].transform.parent_tx,
  495. -symbolData[1].transform.parent_ty
  496. );
  497. ctx.rotate((symbolData[1].transform.parent_r * Math.PI) / 180);
  498. ctx.scale(
  499. symbolData[1].transform.parent_sx,
  500. symbolData[1].transform.parent_sy
  501. );
  502. ctx.drawImage(tmpC, sx * 128, sy * 128, 128, 128, -64, -64, 128, 128);
  503. ctx.restore();
  504. }
  505. ctx.restore();
  506. }
  507. }
  508. var rPreview = document.getElementById("generatedResults");
  509. if (rPreview) {
  510. var ctx = rPreview.getContext("2d");
  511. ctx.beginPath();
  512. ctx.rect(0, 0, rPreview.width, rPreview.height);
  513. ctx.fillStyle = "#ebebeb";
  514. ctx.fill();
  515. var yPos = 20;
  516. if (flag) {
  517. var flagCtx = flag.getContext("2d");
  518. var flagSize = 160;
  519. //Logo
  520. ctx.beginPath();
  521. ctx.rect(0, 0, rPreview.width, 42);
  522. ctx.fillStyle = "#500076";
  523. ctx.fill();
  524. ctx.fillStyle = "#ffffff";
  525. ctx.font = "bold 25px sans-serif";
  526. ctx.textAlign = "left";
  527. ctx.fillText("P️olitiScales, DBHQ Edition", 10, 30);
  528. ctx.fillStyle = "#ffffff";
  529. ctx.font = "bold 15px sans-serif";
  530. ctx.textAlign = "right";
  531. ctx.fillText("DBHQ.github.io", rPreview.width - 10, 27);
  532. yPos += 48;
  533. //Flag
  534. ctx.drawImage(
  535. flag,
  536. 0,
  537. 0,
  538. flag.width,
  539. flag.height,
  540. rPreview.width / 2.0 - flagSize,
  541. yPos,
  542. flagSize * 2,
  543. flagSize
  544. );
  545. yPos += flagSize + 10;
  546. //Slogan
  547. ctx.fillStyle = "#000000";
  548. ctx.font = "25px sans-serif";
  549. ctx.textAlign = "center";
  550. ctx.fillText(generatedSlogan, rPreview.width / 2.0, yPos + 30);
  551. yPos += 70;
  552. // Totals
  553. ctx.fillStyle = "#777";
  554. ctx.font = "16px sans-serif";
  555. ctx.textAlign = "right";
  556. ctx.fillText(
  557. `${Math.round(left * 100)}–${Math.round(right * 100)}`,
  558. rPreview.width - 7,
  559. rPreview.height - 10
  560. );
  561. //Axes
  562. var axesDrawInfo = [
  563. {
  564. key: "c",
  565. color0: "#a425b6",
  566. color1: "#34b634",
  567. name0: "Constructivism",
  568. name1: "Essentialism"
  569. },
  570. {
  571. key: "j",
  572. color0: "#14bee1",
  573. color1: "#e6cc27",
  574. name0: "Rehabilitative justice",
  575. name1: "Punitive justice"
  576. },
  577. {
  578. key: "s",
  579. color0: "#850083",
  580. color1: "#970000",
  581. name0: "Progressive",
  582. name1: "Conservative"
  583. },
  584. {
  585. key: "b",
  586. color0: "#3e6ffd",
  587. color1: "#ff8500",
  588. name0: "Internationalism",
  589. name1: "Nationalism"
  590. },
  591. {
  592. key: "p",
  593. color0: "#cc0000",
  594. color1: "#ffb800",
  595. name0: "Communism",
  596. name1: "Capitalism"
  597. },
  598. {
  599. key: "m",
  600. color0: "#269B32",
  601. color1: "#6608C0",
  602. name0: "Regulation",
  603. name1: "Laissez-faire"
  604. },
  605. {
  606. key: "e",
  607. color0: "#a0e90d",
  608. color1: "#4deae9",
  609. name0: "Ecology",
  610. name1: "Production"
  611. },
  612. {
  613. key: "t",
  614. color0: "#eb1a66",
  615. color1: "#0ee4c8",
  616. name0: "Revolution",
  617. name1: "Reform"
  618. }
  619. ];
  620. var axeMargin = 100;
  621. var axeWidth = rPreview.width - axeMargin * 2;
  622. ctx.strokeStyle = "#888888";
  623. for (var i = 0; i < axesDrawInfo.length; i++) {
  624. var negativeValue = getQueryVariable(axesDrawInfo[i]["key"] + "0");
  625. var positiveValue = getQueryVariable(axesDrawInfo[i]["key"] + "1");
  626. var neutralValue = 1 - negativeValue - positiveValue;
  627. var negSize = axeWidth * negativeValue;
  628. var posSize = axeWidth * positiveValue;
  629. var ntrSize = axeWidth * neutralValue;
  630. ctx.beginPath();
  631. ctx.rect(0.5 + axeMargin + negSize, 0.5 + yPos, ntrSize, 30);
  632. ctx.stroke();
  633. ctx.beginPath();
  634. ctx.rect(0.5 + axeMargin, 0.5 + yPos, negSize, 30);
  635. ctx.fillStyle = axesDrawInfo[i]["color0"];
  636. ctx.fill();
  637. ctx.stroke();
  638. ctx.beginPath();
  639. ctx.rect(
  640. 0.5 + rPreview.width - axeMargin - posSize,
  641. 0.5 + yPos,
  642. posSize,
  643. 30
  644. );
  645. ctx.fillStyle = axesDrawInfo[i]["color1"];
  646. ctx.fill();
  647. ctx.stroke();
  648. if (negSize > 40) {
  649. ctx.fillStyle = "#ffffff";
  650. ctx.font = "20px sans-serif";
  651. ctx.textAlign = "right";
  652. ctx.fillText(
  653. Math.round(negativeValue * 100) + "%",
  654. axeMargin + negSize - 5,
  655. yPos + 23
  656. );
  657. }
  658. if (posSize > 40) {
  659. ctx.fillStyle = "#ffffff";
  660. ctx.font = "20px sans-serif";
  661. ctx.textAlign = "left";
  662. ctx.fillText(
  663. Math.round(positiveValue * 100) + "%",
  664. axeMargin + negSize + ntrSize + 5,
  665. yPos + 23
  666. );
  667. }
  668. if (ntrSize > 40) {
  669. ctx.fillStyle = "#888888";
  670. ctx.font = "20px sans-serif";
  671. ctx.textAlign = "center";
  672. ctx.fillText(
  673. Math.round(neutralValue * 100) + "%",
  674. axeMargin + negSize + ntrSize / 2,
  675. yPos + 23
  676. );
  677. }
  678. ctx.drawImage(
  679. images[axesDrawInfo[i]["key"] + "0"],
  680. axeMargin - 73,
  681. yPos - 27
  682. );
  683. ctx.drawImage(
  684. images[axesDrawInfo[i]["key"] + "1"],
  685. rPreview.width - axeMargin + 73 - 86,
  686. yPos - 27
  687. );
  688. ctx.fillStyle = "#000000";
  689. ctx.font = "16px sans-serif";
  690. ctx.textAlign = "left";
  691. ctx.fillText(axesDrawInfo[i]["name0"], axeMargin + 8, yPos - 6);
  692. ctx.textAlign = "right";
  693. ctx.fillText(
  694. axesDrawInfo[i]["name1"],
  695. rPreview.width - axeMargin - 8,
  696. yPos - 6
  697. );
  698. yPos += 100;
  699. }
  700. var xShift = 0;
  701. var numBonus = 0;
  702. for (var b in bonus) {
  703. value = getQueryVariable(b);
  704. if (value > bonus[b]) {
  705. numBonus++;
  706. }
  707. }
  708. for (var b in bonus) {
  709. value = getQueryVariable(b);
  710. if (value > bonus[b]) {
  711. ctx.drawImage(
  712. images[b],
  713. rPreview.width / 2 - ((numBonus - 1) * 100) / 2 + xShift - 43,
  714. yPos - 27
  715. );
  716. xShift += 100;
  717. }
  718. }
  719. }
  720. }
  721. }
  722. for (var b in images) {
  723. var src = images[b];
  724. images[b] = new Image();
  725. images[b].src = src;
  726. images[b].onload = onImageLoaded;
  727. }
  728. function download_image() {
  729. var canvas = document.getElementById("generatedResults");
  730. var link = document.createElement("a");
  731. link.href = canvas.toDataURL();
  732. link.download = `PolitiScales_Results_${+new Date()}.png`;
  733. document.body.appendChild(link);
  734. link.click();
  735. document.body.removeChild(link);
  736. }