results.js 21 KB

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