results.js 21 KB

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