/src/elycharts_manager_anchor.js

https://github.com/voidlabs/ElyCharts · JavaScript · 109 lines · 71 code · 21 blank · 17 comment · 17 complexity · fb1872d917f616675fd3ab91c30cf486 MD5 · raw file

  1. /**********************************************************************
  2. * ELYCHARTS
  3. * A Javascript library to generate interactive charts with vectorial graphics.
  4. *
  5. * Copyright (c) 2010-2014 Void Labs s.n.c. (http://void.it)
  6. * Licensed under the MIT (http://creativecommons.org/licenses/MIT/) license.
  7. **********************************************************************/
  8. (function($) {
  9. var common = $.elycharts.common;
  10. /***********************************************************************
  11. * FEATURE: ANCHOR
  12. *
  13. * Permette di collegare i dati del grafico con delle aree esterne,
  14. * identificate dal loro selettore CSS, e di interagire con esse.
  15. **********************************************************************/
  16. $.elycharts.anchormanager = {
  17. afterShow : function(env, pieces) {
  18. // Prendo le aree gestite da mouseAreas, e metto i miei listener
  19. // Non c'e' bisogno di gestire il clean per una chiamata successiva, lo fa gia' il mouseareamanager
  20. // Tranne per i bind degli eventi jquery
  21. if (!env.opt.anchors)
  22. return;
  23. if (!env.anchorBinds)
  24. env.anchorBinds = [];
  25. while (env.anchorBinds.length) {
  26. var b = env.anchorBinds.pop();
  27. $(b[0]).unbind(b[1], b[2]);
  28. }
  29. for (var i = 0; i < env.mouseAreas.length; i++) {
  30. var serie = env.mouseAreas[i].piece ? env.mouseAreas[i].piece.serie : false;
  31. var anc;
  32. if (serie)
  33. anc = env.opt.anchors[serie][env.mouseAreas[i].index];
  34. else
  35. anc = env.opt.anchors[env.mouseAreas[i].index];
  36. if (anc && env.mouseAreas[i].props.anchor && env.mouseAreas[i].props.anchor.highlight) {
  37. (function(env, mouseAreaData, anc, caller) {
  38. var f1 = function() { caller.anchorMouseOver(env, mouseAreaData); };
  39. var f2 = function() { caller.anchorMouseOut(env, mouseAreaData); };
  40. if (!env.mouseAreas[i].props.anchor.useMouseEnter) {
  41. env.anchorBinds.push([anc, 'mouseover', f1]);
  42. env.anchorBinds.push([anc, 'mouseout', f2]);
  43. $(anc).mouseover(f1);
  44. $(anc).mouseout(f2);
  45. } else {
  46. env.anchorBinds.push([anc, 'mouseenter', f1]);
  47. env.anchorBinds.push([anc, 'mouseleave', f2]);
  48. $(anc).mouseenter(f1);
  49. $(anc).mouseleave(f2);
  50. }
  51. })(env, env.mouseAreas[i], anc, this);
  52. }
  53. }
  54. env.onAnchors = [];
  55. },
  56. anchorMouseOver : function(env, mouseAreaData) {
  57. $.elycharts.highlightmanager.onMouseOver(env, mouseAreaData.piece ? mouseAreaData.piece.serie : false, mouseAreaData.index, mouseAreaData);
  58. },
  59. anchorMouseOut : function(env, mouseAreaData) {
  60. $.elycharts.highlightmanager.onMouseOut(env, mouseAreaData.piece ? mouseAreaData.piece.serie : false, mouseAreaData.index, mouseAreaData);
  61. },
  62. onMouseOver : function(env, serie, index, mouseAreaData) {
  63. if (!env.opt.anchors)
  64. return;
  65. if (mouseAreaData.props.anchor && mouseAreaData.props.anchor.addClass) {
  66. //var serie = mouseAreaData.piece ? mouseAreaData.piece.serie : false;
  67. var anc;
  68. if (serie)
  69. anc = env.opt.anchors[serie][mouseAreaData.index];
  70. else
  71. anc = env.opt.anchors[mouseAreaData.index];
  72. if (anc) {
  73. $(anc).addClass(mouseAreaData.props.anchor.addClass);
  74. env.onAnchors.push([anc, mouseAreaData.props.anchor.addClass]);
  75. }
  76. }
  77. },
  78. onMouseOut : function(env, serie, index, mouseAreaData) {
  79. if (!env.opt.anchors)
  80. return;
  81. while (env.onAnchors.length > 0) {
  82. var o = env.onAnchors.pop();
  83. $(o[0]).removeClass(o[1]);
  84. }
  85. }
  86. }
  87. $.elycharts.featuresmanager.register($.elycharts.anchormanager, 30);
  88. })(jQuery);