UNPKG

chartnew.js

Version:

Simple HTML5 Charts using the canvas element

1,106 lines (1,065 loc) 66.8 kB
// options with associated default value defined in chartNew.js // annotateDisplay: false, // annotateRelocate: false, // annotateFunction: "mousemove", // annotateFontFamily: "'Arial'", // annotateBorder: 'none', // annotateBorderRadius: '2px', // annotateBackgroundColor: 'rgba(0,0,0,0.8)', // annotateFontSize: 12, // annotateFontColor: 'white', // annotateFontStyle: "normal", // annotatePadding: "3px", // annotateClassName: "", // annotateFunctionIn: null, // annotateFunctionOut : null, // annotateBarMinimumDetectionHeight : 0, // chart.defaults.IExplorer8 ={ // annotateBackgroundColor : "black", // annotateFontColor: "white" var style = document.createElement('style'); style.type = 'text/css'; line=""; line=line+".toolTipTopRight { "; line=line+"} "; line=line+".toolTipTopLeft { "; line=line+"} "; line=line+".toolTipTopCenter { "; line=line+"} "; line=line+".toolTipBottomRight { "; line=line+"} "; line=line+".toolTipBottomLeft { "; line=line+"} "; line=line+".toolTipBottomCenter { "; line=line+"} "; line=line+".toolTipRightTop { "; line=line+"} "; line=line+".toolTipRightBottom { "; line=line+"} "; line=line+".toolTipRightCenter { "; line=line+"} "; line=line+".toolTipLeftTop { "; line=line+"} "; line=line+".toolTipLeftBottom { "; line=line+"} "; line=line+".toolTipLeftCenter { "; line=line+"} "; line=line+".toolTipLeftNone { "; line=line+"}"; line=line+'.toolTipTopRight .toolTipTopRightText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent #555 transparent; '; line=line+' '; line=line+' bottom: 100%; '; line=line+' right: 5px; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' '; line=line+'/* border-bottom: 5px solid black; */ '; line=line+'} '; line=line+'.toolTipTopLeft .toolTipTopLeftText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent #555 transparent; '; line=line+' '; line=line+' bottom: 100%; '; line=line+' left: 5px; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' '; line=line+'/* border-bottom: 5px solid black; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipTopCenter .toolTipTopCenterText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent #555 transparent; '; line=line+' '; line=line+' bottom: 100%; '; line=line+' left: 50%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' margin-left : -5px; '; line=line+' '; line=line+'/* border-bottom: 5px solid black; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipBottomRight .toolTipBottomRightText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: #555 transparent transparent transparent; '; line=line+' '; line=line+' top: 100%; '; line=line+' right: 5px; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' '; line=line+'/* border-top: 5px solid black;*/ '; line=line+'} '; line=line+' '; line=line+'.toolTipBottomLeft .toolTipBottomLeftText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: #555 transparent transparent transparent; '; line=line+' '; line=line+' top: 100%; '; line=line+' left: 5px; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' '; line=line+'/* border-top: 5px solid black; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipBottomCenter .toolTipBottomCenterText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: #555 transparent transparent transparent; '; line=line+' '; line=line+' top: 100%; '; line=line+' left: 50%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-left: 5px solid transparent; '; line=line+' border-right: 5px solid transparent; '; line=line+' '; line=line+' margin-left: -5px; '; line=line+' '; line=line+'/* border-top: 5px solid black; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipRightTop .toolTipRightTopText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent transparent #555 ; '; line=line+' '; line=line+' top: 5px; '; line=line+' left: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' '; line=line+'/* border-left: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipRightBottom .toolTipRightBottomText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent transparent #555 ; '; line=line+' '; line=line+' bottom: 5px; '; line=line+' left: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' '; line=line+'/* border-left: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipRightCenter .toolTipRightCenterText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent transparent transparent #555 ; '; line=line+' '; line=line+' bottom: 50%; '; line=line+' left: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' margin-bottom: -5px; '; line=line+' '; line=line+'/* border-left: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipLeftBottom .toolTipLeftBottomText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent #555 transparent transparent ; '; line=line+' '; line=line+' bottom: 5px; '; line=line+' right: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' '; line=line+'/* border-right: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipLeftTop .toolTipLeftTopText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent #555 transparent transparent ; '; line=line+' '; line=line+' top: 5px; '; line=line+' right: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' '; line=line+'/* border-right: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipLeftCenter .toolTipLeftCenterText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+' border-style: solid; '; line=line+' border-color: transparent #555 transparent transparent ; '; line=line+' '; line=line+' bottom: 50%; '; line=line+' right: 100%; '; line=line+' '; line=line+' width: 0; '; line=line+' height: 0; '; line=line+' border-top: 5px solid transparent; '; line=line+' border-bottom: 5px solid transparent; '; line=line+' margin-bottom: -5px; '; line=line+' '; line=line+'/* border-right: 5px solid green; */ '; line=line+'} '; line=line+' '; line=line+'.toolTipNone .toolTipNoneText::after { '; line=line+' content: ""; '; line=line+' position: absolute; '; line=line+'} '; style.innerHTML = line document.getElementsByTagName('head')[0].appendChild(style); ///// var bubble_top_data = 'data:image/gif;base64,'+ 'R0lGODlhkwAQANUxAP7+/sHBwePj4+Hh4eXl5XZ2dmdnZ7q6urOzs+zs7KSkpHR0dNfX15ubm7u7'+ 'u4CAgKqqqo6Ojurq6rKyssrKyu/v73l5efr6+vv7+/Ly8vb29v39/Wtra6Ghoff392VlZZOTk9bW'+ '1oqKiufn52lpadPT0/n5+ZWVlbGxscDAwM7Ozvj4+Ovr6+jo6Ly8vGZmZv///////wAAAAAAAAAA'+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADEALAAAAACTABAAAAb2wJhw'+ 'SCwaj8ikcslsOp/QaLFCgUQsnJd2y+16v+CweEwum7kcSwRCqcBgUiJhUmg4GInLe8/v+/+AgYKD'+ 'hIWGfRcJDA4NBRMEb3EBDwgCh5eYmZqbhgIIDwEAcE8SBgoDnKmqq6yAAwoGEqNMAgsHrbi5upgH'+ 'CwMATBILAbvFxsd7AQsjwEoGt8jR0qwHBh7NRwEK09zdmgooGhtHBA+o3ujpgQMPKhrYQxMI6vT1'+ 'ewgnBCuiQxUFlvYCohNQIAALDNgoNBDI0FsDECEyjBMCwUHDi9IcFHBBwMSQCAwwijTGgESHEhmG'+ 'WEgwsmWuBB9EpGiBAUYQADs='; var bubble_middle_data = 'data:image/gif;base64,'+ 'R0lGODlhkwA8AKIGAL+/v4CAgOrq6lVVVWZmZv///////wAAACH5BAEAAAYALAAAAACTADwAAAPp'+ 'aFTc/jDKSau9OOtGRgBCoWxkaZ4o2n3hmL5wLF8rKC5zru9m3eK8oHDI8dhcxKQy5rstn9BSExmt'+ 'WiNT4HV7zXK/Vi94vBSTz0Izep1Ts98vN3wuNf7o+J7dme9n5H6BEICChQWEhoGIiX2LjHiOj3OR'+ 'km+UlWuXmGeam2Odnl+goVujpGF7VKdwpqtQra5lqVqxmbO1rLe4bLC7abq+nMDBn8PEosbHpcnK'+ 'qCx8zVy90UzM1E/T1ynZ2ifc3XXPquBK3+Qa5ucY6eoW7O0U7/AS8vOD1vYz9flF4rT8bfABjCNw'+ 'oIo9CQAAOw=='; var bubble_bottom_data = 'data:image/gif;base64,'+ 'R0lGODlhkwAtAPetAEBAQICAgOrq6lVVVb+/v2ZmZkFBQf39/fr6+vj4+Pv7+/n5+UpKSp6enuzs'+ '7PLy8uXl5UNDQ0JCQqqqqlZWVkZGRt3d3fX19VJSUsLCwkRERFxcXF5eXvb29sTExOvr68vLy9TU'+ '1LOzs2pqauPj42hoaHR0dIqKiunp6VNTU+3t7Wtra+Hh4UdHR7q6uklJScDAwHZ2dpKSkvz8/EVF'+ 'RW1tbXh4eKGhoU9PT4mJiWVlZU1NTWJiYq2trejo6Jubm9fX166uroyMjNvb26SkpISEhHp6enNz'+ 'c2FhYVhYWHx8fN/f3/T09FRUVH9/f3d3d8XFxVFRUWdnZ+Dg4NbW1t7e3vDw8O/v74GBgbu7u05O'+ 'TtPT06Wlpby8vO7u7vPz82xsbLCwsFdXV4ODg3BwcOfn59nZ2bKyspGRkb29vUtLS8bGxsrKysHB'+ 'wfHx8f7+/ubm5q+vr3JyclBQUHl5eUxMTIeHh9zc3GBgYLi4uM7OzpOTk11dXWRkZL6+vpSUlI6O'+ 'jtXV1aOjo4WFhZCQkFlZWWlpaX5+fltbW5WVlbe3t29vb3t7e+Tk5FpaWpeXl6mpqZiYmNHR0XFx'+ 'cdra2rS0tJ2dnc3NzZycnKKioo2NjcfHx4iIiLGxsYuLi+Li4qurq6ysrNLS0rm5uZaWll9fX2Nj'+ 'Y319fcPDw6CgoMnJydDQ0P///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAK0ALAAAAACTAC0A'+ 'AAj/AFutQMCqoMGDCBMqXMiwocOHECNKnMgKgY4BAQgIYNWKjgOKIEOKHElSpAMkGDVyBASkpMuX'+ 'MGM+BLKBQkYBrVpNyCKzp8+fIbNQoIAFBs5WbH4AXcq0qcEfWpIUyeAg55UYJJxq3eqSRIwWG3Ks'+ 'UZGz1RkRXNOqlSgiRQUeMkBYKQshAIu1ePMeZBGgBYMRDUIwKdsqDRG9iNcSwSEBw5MeFhIQRiDF'+ 'ReLLTl1IMdCCwwkYPhQQbrXERBvMqH22MUFDAg4yN7Y8eDN6gR4TllPrLunCRAsDL/Cc6AJhwehW'+ 'Bx5skkLk7u7nElkQkULDQAUxRiZQeXDgeCsFH9hw/wogIiv08wpJiAiAA4D1AUcagPiggLb3BBA8'+ 'yAAT40cWIA4QhF5qCDgARBY/xOCWARK8IMYRP3gAQQL2eddKByR40IANPGzAARI6FCDiiCSWaOKJ'+ 'KKaoYoorCBHKElpNIYIQBeiAxAYD7BABgy3ggIcRDXhAQgcWEnZABxCAMMEJZHCAAQMV7GgAAFRW'+ 'aeWVWGap5ZZcXtkgBhyM4cEBQIEwSClNvFClAQZEUAEDYJJxwgQgQNBBd0USlsAHVHRxwwlPjNBh'+ 'EkMNYOihiCaq6KKMNuqook2kkAIiTgzR0xBOOKImgzQwgEMKYmzAwwhPnHBDF1R8IFmexynwAARb'+ 'wP/QQwMy5FAEFgHkquuuvPbq66/ABuvrIUaYMAISJYRBpksJTMDHDu5pwEAKHBhighJj5CBDAz3A'+ 'sAUED4jGqncHLPCADxaEAMIaGcBAwLvwxivvvPTWa++99KaRx6xCPFFAJAKOpAIWTUjQJgMD6GCD'+ 'J9yOAsMaIIRggQ8PLIDnuEUqkAATVqjggAAghyzyyCSXbPLJKJeMAgoQVBGCB2GQsgggAYNkxhEY'+ 'uNdCFKYwkkgQqGxRBRwCqGAFEwmIi/HSTDft9NPILcDEB1WwEYcNiSxLUQgrQBsBA4XIQUgcqlgg'+ 'wBcWQ6322my3fUACXtzRxiFBgBTCCGoYoMEOPDj/cUMGd6iQwMVtF2744UXOcAEcUNgQwkRA4K33'+ 'HCXkEMcqPtyJ+Oacd77AB2HEkEBEKCxShwE0YLACIXmYcQUCnccue+EFPlL3Qw8oEYXeGNTwRxpV'+ 'fDHD7MQX7zQCjYyAgkMHoNEEABrMAcYfBLBwAeHGZ6/9cQsEIYhDZ1AAQARaGCKDH9Zjv/3627ux'+ 'ghsMDVFCBBLU0YcQLixxPfv8s38AKGdYCAKUsAPgcKAIIhjCF9TXvwbOrgxGWMgEKGCdJDBiAoFw'+ 'w/AcyEHjjQFGCLFACSQQgShMogGXcIDSOsjC2LkAEghRwCm0YAA16AANGYCDcVrIw845wAYIUQQF'+ 'yCvgCCyIwAIX6KESOUeHDxjkCjXQQAnlkAlJWIGBS8zi01IBBYNwAQMGYEAfcOgD2GnxjGvLwPdY'+ '8YkSoC4JTuiEBYiExjo+bQqDKMgeEKEBLdTAEnq4AhbtSEjvIGAFB5gCGDbAAD7YoQuN2GEhJ8kq'+ 'JaBgD0UoQSGOwIVAPICSoMxTEBSBCS7EoAaayAAKVhjKVuZEBTUQRSVyYIcJmCGJrsxlWTpQBg/c'+ 'gAtQEMAGdalLL1DBD1BAIjGXeYEyUGIKXhhm9gICADs='; var style = document.createElement('style'); style.type = 'text/css'; line=""; line=line+"#bubble_tooltip{ "; line=line+"width:147px; "; line=line+"position:absolute; "; line=line+"display:none; "; line=line+"} "; line=line+"#bubble_tooltip .bubble_top{ "; //line=line+"background-image: url('../Add-ins/bubble_top.gif'); "; line=line+"background-image: url("+bubble_top_data+"); "; line=line+"background-repeat:no-repeat; "; line=line+"height:16px; "; line=line+"} "; line=line+"#bubble_tooltip .bubble_middle{ "; //line=line+"background-image: url('../Add-ins/bubble_middle.gif'); "; line=line+"background-image: url("+bubble_middle_data+"); "; line=line+"background-repeat:repeat-y; "; line=line+"background-position:bottom left; "; line=line+"padding-left:7px; "; line=line+"padding-right:7px; "; line=line+"} "; line=line+"#bubble_tooltip .bubble_middle span{ "; line=line+"position:relative; "; line=line+"top:-8px; "; line=line+"font-family: Trebuchet MS, Lucida Sans Unicode, Arial, sans-serif; "; line=line+"font-size:11px; "; line=line+"} "; line=line+"#bubble_tooltip .bubble_bottom{ "; //line=line+"background-image: url('../Add-ins/bubble_bottom.gif'); "; line=line+"background-image: url("+bubble_bottom_data+"); "; line=line+"background-repeat:no-repeat; "; line=line+"background-repeat:no-repeat; "; line=line+"height:44px; "; line=line+"position:relative; "; line=line+"top:-6px; "; line=line+"} "; style.innerHTML = line document.getElementsByTagName('head')[0].appendChild(style); ///// function createCursorDiv(config) { if (cursorDivCreated == false) { cursorDivCreated=true; if(annotate_shape=="bubble_tooltip") { var div = document.createElement('div'); div.id = 'bubble_tooltip'; document.body.appendChild(div); var subdiv1 = document.createElement('div'); subdiv1.id = 'bubble_top'; subdiv1.className = 'bubble_top'; div.appendChild(subdiv1); var subdiv2 = document.createElement('div'); subdiv2.id = 'bubble_middle'; subdiv2.className = 'bubble_middle'; div.appendChild(subdiv2); var subdiv3 = document.createElement('div'); subdiv3.id = 'bubble_bottom'; subdiv3.className = 'bubble_bottom'; div.appendChild(subdiv3); var spa = document.createElement('span'); spa.id = "bubble_tooltip_content"; subdiv2.appendChild(spa); } else if(annotate_shape == "ARROW") { updateClass(".toolTipTopRight","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipTopLeft","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipTopCenter","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomRight","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomLeft","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomCenter","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightTop","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightBottom","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightCenter","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftTop","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftBottom","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftCenter","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipNone","font-size:"+config.annotateFontSize+"pt;font-style:"+config.annotateFontStyle+";font-family:"+config.annotateFontFamily+";background-color:"+config.annotateBackgroundColor+";padding:"+config.annotatePadding+"; border-style: "+config.annotateBorder+"; border-radius:"+config.annotateBorderRadius+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipTopRight .toolTipTopRightText::after","border-bottom: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipTopLeft .toolTipTopLeftText::after","border-bottom: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipTopCenter .toolTipTopCenterText::after","border-bottom: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomRight .toolTipBottomRightText::after","border-top: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomLeft .toolTipBottomLeftText::after","border-top: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipBottomCenter .toolTipBottomCenterText::after","border-top: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightTop .toolTipRightTopText::after","border-left: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightBottom .toolTipRightBottomText::after","border-left: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipRightCenter .toolTipRightCenterText::after","border-left: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftTop .toolTipLeftTopText::after","border-right: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftBottom .toolTipLeftBottomText::after","border-right: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipLeftCenter .toolTipLeftCenterText::after","border-right: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); updateClass(".toolTipNone .toolTipNoneText::after","border-right: 5px solid " +config.annotateBackgroundColor+"; color:"+config.annotateFontColor+";"); var div = document.createElement(annotate_shape); div.id = annotate_shape; div.style.position = 'absolute'; document.body.appendChild(div); var spa = document.createElement('span'); spa.id = "arrow_content"; div.appendChild(spa); } else { var div = document.createElement(annotate_shape); div.id = annotate_shape; div.style.position = 'absolute'; document.body.appendChild(div); } } }; function updateClass(name,rules){ var style = document.createElement('style'); style.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(style); if(!(style.sheet||{}).insertRule) (style.styleSheet || style.sheet).addRule(name, rules); else style.sheet.insertRule(name+"{"+rules+"}",0); } function initAnnotateDiv(annotateDIV,config,ctx) { if(annotate_shape == "ARROW") { } else if(annotate_shape!='divCursor'){ annotateDIV.className = annotate_shape; annotateDIV.style.border = '' ; annotateDIV.style.padding = '' ; annotateDIV.style.borderRadius = ''; annotateDIV.style.backgroundColor = '' ; annotateDIV.style.color = '' ; annotateDIV.style.fontFamily = '' ; annotateDIV.style.fontSize = '' ; annotateDIV.style.fontStyle = '' ; } else { annotateDIV.className = (config.annotateClassName) ? config.annotateClassName : ''; annotateDIV.style.border = (config.annotateClassName) ? '' : config.annotateBorder; annotateDIV.style.padding = (config.annotateClassName) ? '' : config.annotatePadding; annotateDIV.style.borderRadius = (config.annotateClassName) ? '' : config.annotateBorderRadius; annotateDIV.style.backgroundColor = (config.annotateClassName) ? '' : config.annotateBackgroundColor; annotateDIV.style.color = (config.annotateClassName) ? '' : config.annotateFontColor; annotateDIV.style.fontFamily = (config.annotateClassName) ? '' : config.annotateFontFamily; annotateDIV.style.fontSize = (config.annotateClassName) ? '' : (Math.ceil(ctx.chartTextScale*config.annotateFontSize)).toString() + "pt"; annotateDIV.style.fontStyle = (config.annotateClassName) ? '' : config.annotateFontStyle; } annotateDIV.style.zIndex = 999; }; function displayAnnotate(ctx,data,config,rect,event,annotateDIV,jsGraphAnnotate,piece,myStatData,statData) { var arrow_class; var dispString,newPosX,newPosY,decalX,decalY; var addDecalX,addDecalY; decalX=0; decalY=0; if(typeof config.annotatePaddingX==="number") addDecalX=1*config.annotatePaddingX; else addDecalX=fromLeft; if(typeof config.annotatePaddingY==="number") addDecalY=1*config.annotatePaddingY; else addDecalY=fromTop; if (jsGraphAnnotate[ctx.ChartNewId][piece.piece][0] == "ARC") dispString = tmplbis(setOptionValue(true,true,1,"ANNOTATELABEL",ctx,data,jsGraphAnnotate[ctx.ChartNewId][piece.piece][3],undefined,config.annotateLabel,"annotateLabel",jsGraphAnnotate[ctx.ChartNewId][piece.piece][1],-1,{otherVal:true}), myStatData,config); else dispString = tmplbis(setOptionValue(true,true,1,"ANNOTATELABEL",ctx,data,jsGraphAnnotate[ctx.ChartNewId][piece.piece][3],undefined,config.annotateLabel,"annotateLabel",jsGraphAnnotate[ctx.ChartNewId][piece.piece][1],jsGraphAnnotate[ctx.ChartNewId][piece.piece][2],{otherVal:true}), myStatData,config); if(annotate_shape=="bubble_tooltip") { document.getElementById('bubble_tooltip_content').innerHTML = dispString; annotateDIV.style.display='block'; var st = Math.max(document.body.scrollTop,document.documentElement.scrollTop); if(navigator.userAgent.toLowerCase().indexOf('safari')>=0)st=0; var leftPos = event.clientX - 100; if(leftPos<0)leftPos = 0; annotateDIV.style.left = leftPos+'px'; annotateDIV.style.top = event.clientY - annotateDIV.offsetHeight -1 + st + 'px'; } else if(annotate_shape == "ARROW") { document.getElementById('arrow_content').innerHTML = dispString; } else { annotateDIV.innerHTML = dispString; } if(annotate_shape=="bubble_tooltip") { var textMsr={textHeight: 100, textWidth : 147}; } else { var textMsr={}; annotateDIV.style.display = true ? '' : 'none'; var lrect = annotateDIV.getBoundingClientRect(); textMsr.textHeight=lrect.height; textMsr.textWidth=lrect.width; } ctx.restore(); // set position; var x,y; x = bw.ns4 || bw.ns5 ? event.pageX : event.x; y = bw.ns4 || bw.ns5 ? event.pageY : event.y; if (bw.ie4 || bw.ie5) y = y + eval(scrolled); if(config.annotateRelocate===true && (typeof config.annotatePosition)=="undefined" || config.annotatePosition=="mouse") { var relocateX, relocateY; relocateX=0;relocateY=0; if(x+fromLeft+textMsr.textWidth > window.innerWidth-rect.left-fromLeft)relocateX=-textMsr.textWidth; if(y+fromTop+textMsr.textHeight > 1*window.innerHeight-1*rect.top+fromTop)relocateY-=(textMsr.textHeight+2*fromTop); newPosX=Math.max(8-rect.left,x + fromLeft+relocateX); newPosY=Math.max(8-rect.top,y + fromTop + relocateY); } else { newPosX=x; newPosY=y; } var mouse_posrect = getMousePos(ctx.canvas, event); var vj; var debj=piece.j; var endj=piece.j+1; var refpiecei=piece.i; var refpiecej=piece.j; var rayVal=-1; var midPosX=0; var midPosY=0; var minDecalY,minDecalX,maxDecalY,maxDecalX,maxRayVal,minRayVal; var angle=9999; var minAngle, maxAngle; var forceY=false; var forceX=false; var multX=0; var multY=0; tpchart=ctx.tpchart; if(data.datasets[piece.i].type=="Line" && (ctx.tpchart=="Bar" || ctx.tpchart=="StackedBar"))tpchart="Line"; switch(config.annotatePositionAngle) { case "center" : case "middle" : switch(tpchart) { case "Pie" : case "Doughnut" : case "PolarArea" : angle=(myStatData.startAngle+myStatData.endAngle)/2; break; default: break; } break; case "start" : switch(tpchart) { case "Pie" : case "Doughnut" : case "PolarArea" : angle=myStatData.startAngle; break; default: break; } break; case "end" : switch(tpchart) { case "Pie" : case "Doughnut" : case "PolarArea" : angle=myStatData.endAngle; break; default: break; } break; default: switch(tpchart) { case "Pie" : case "Doughnut" : case "PolarArea" : midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; if(midPosX == mouse_posrect.x && midPosX > mouse_posrect.y) angle=Math.PI/2; else if(midPosX == mouse_posrect.x && midPosX > mouse_posrect.y) angle=-Math.PI/2; else angle=Math.atan((midPosY-mouse_posrect.y)/(midPosX-mouse_posrect.x)); if(midPosX>mouse_posrect.x)angle+=Math.PI; break; default: break; } break; } switch(config.annotatePositionRadius) { case "MXout" : case "Xout" : switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; var refVal=myStatData.datavalue; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXout"){debj=0;endj=statData[i].length;} for(j=debj;j<endj;j++) { if (refVal<statData[i][j].datavalue) { refVal=statData[i][j].datavalue; decalY=statData[i][j].posY-mouse_posrect.y - textMsr.textHeight; decalX=statData[i][j].posX-mouse_posrect.x; } } }; debj=piece.j;endj=piece.j+1; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=1; multY=1; rayVal=myStatData.radiusOffset; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXout"){debj=0;endj=statData[i].length;} for(j=0;j<data.labels.length;j++) { rayVal=Math.max(rayVal,statData[i][j].radiusOffset); } }; debj=piece.j;endj=piece.j+1; break; default: break; }; break; case "MXin" : case "Xin" : switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; var refVal=myStatData.datavalue; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXin"){debj=0;endj=statData[i].length;} for(j=debj;j<endj;j++) { if (refVal>statData[i][j].datavalue) { refVal=statData[i][j].datavalue; decalY=statData[i][j].posY-mouse_posrect.y - textMsr.textHeight; decalX=statData[i][j].posX-mouse_posrect.x; } } }; debj=piece.j;endj=piece.j+1; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=2; multY=2; rayVal=myStatData.int_radius; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXin"){debj=0;endj=statData[i].length;} for(j=0;j<data.labels.length;j++) { rayVal=Math.min(rayVal,statData[i][j].int_radius); } }; debj=piece.j;endj=piece.j+1; break; default: break; }; break; case "in" : switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=2; multY=2; rayVal=myStatData.int_radius; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; break; default: break; }; break; case "out" : switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=1; multY=1; rayVal=myStatData.radiusOffset; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; break; default: break; }; break; case "MXcenter" : case "MXmiddle" : case "Lcenter" : case "Lmiddle" : switch(tpchart) { case "Radar" : minDecalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; minDecalX=myStatData.posX-mouse_posrect.x; maxDecalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; maxDecalX=myStatData.posX-mouse_posrect.x; var minRefVal=myStatData.datavalue; var maxRefVal=myStatData.datavalue; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXcenter" || config.annotatePositionRadius=="MXmiddle"){debj=0;endj=statData[i].length;} for(j=debj;j<endj;j++) { if (minRefVal>statData[i][j].datavalue) { minRefVal=statData[i][j].datavalue; minDecalY=statData[i][j].posY-mouse_posrect.y - textMsr.textHeight; minDecalX=statData[i][j].posX-mouse_posrect.x; } if (maxRefVal<statData[i][j].datavalue) { maxRefVal=statData[i][j].datavalue; maxDecalY=statData[i][j].posY-mouse_posrect.y - textMsr.textHeight; maxDecalX=statData[i][j].posX-mouse_posrect.x; } } }; decalY=(maxDecalY+minDecalY)/2; decalX=(maxDecalX+minDecalX)/2; debj=piece.j;endj=piece.j+1; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=3; multY=3; maxRayVal=myStatData.radiusOffset; minRayVal=myStatData.int_radius; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionRadius=="MXcenter" || config.annotatePositionRadius=="MXmiddle"){debj=0;endj=statData[i].length;} for(j=debj;j<endj;j++) { if (minRayVal>statData[i][j].int_radius) { minRayVal=statData[i][j].int_radius; } if (maxRayVal<statData[i][j].radiusOffset) { maxRayVal=statData[i][j].radiusOffset; } } rayVal=(maxRayVal+minRayVal)/2; }; break; default: break; }; break; case "center" : case "middle" : switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; break; case "Pie" : case "Doughnut" : case "PolarArea" : multX=3; multY=3; rayVal=(myStatData.int_radius+myStatData.radiusOffset)/2; midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; break; default: break; }; break; default: switch(tpchart) { case "Radar" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; decalX=myStatData.posX-mouse_posrect.x; break; case "Pie" : case "Doughnut" : case "PolarArea" : midPosX=myStatData.midPosX; midPosY=myStatData.midPosY; rayVal=Math.sqrt(Math.pow(myStatData.midPosX-mouse_posrect.x,2)+Math.pow(myStatData.midPosY-mouse_posrect.y,2)); break; default: break; }; break; } switch(config.annotatePositionY) { case "LXtop" : switch(tpchart) { case "Line" : decalY=statData[piece.i][piece.j].posY-mouse_posrect.y - 1*textMsr.textHeight; for(vj=0;vj<statData[piece.i].length;vj++) decalY=Math.min(decalY,statData[piece.i][vj].posY-mouse_posrect.y - 1*textMsr.textHeight); break; default: break; } if(tpchart=="Line") break; case "MXtop" : case "Xtop" : case "SXtop" : switch(tpchart) { case "StackedBar" : case "Bar" : if(myStatData.datavalue>=0) { decalY=myStatData.yPosTop-mouse_posrect.y - textMsr.textHeight for(i=0;i<data.datasets.length;i++) { if(statData[i][0].tpchart!="Line") { if(config.annotatePositionY=="MXtop") {debj=0;endj=statData[i].length} for(vj=debj;vj<endj;vj++)decalY=Math.min(decalY,statData[i][vj].yPosTop-mouse_posrect.y - textMsr.textHeight); } } } else { if(config.annotatePositionY=="SXtop") { addDecalY=-addDecalY; for(i=0;i<data.datasets.length;i++) { if(statData[i][0].tpchart!="Line")decalY=Math.max(decalY,statData[i][piece.j].yPosTop-mouse_posrect.y + 0*textMsr.textHeight); } } else { for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXtop") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) if(statData[i][0].tpchart!="Line")decalY=Math.min(decalY,Math.min(statData[i][vj].yPosTop,statData[i][vj].yPosBottom)-mouse_posrect.y - 1*textMsr.textHeight); } } } ; break; case "Line" : decalY=statData[piece.i][piece.j].posY-mouse_posrect.y - 1*textMsr.textHeight; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXtop") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) decalY=Math.min(decalY,statData[i][vj].posY-mouse_posrect.y - 1*textMsr.textHeight); } break; default: break; } if(tpchart=="StackedBar" || tpchart=="Bar" || tpchart=="Line") break; case "top" : case "Stop" : switch(tpchart) { case "StackedBar" : case "Bar" : if(myStatData.datavalue>=0) decalY=myStatData.yPosTop-mouse_posrect.y - textMsr.textHeight; else { if (config.annotatePositionY=="Stop" || config.annotatePositionY=="SXtop") { decalY=myStatData.yPosTop-mouse_posrect.y + 0*textMsr.textHeight; addDecalY=-addDecalY; } else {decalY=myStatData.yPosBottom-mouse_posrect.y - textMsr.textHeight;} } break; case "HorizontalBar" : case "HorizontalStackedBar" : decalY=myStatData.yPosTop-mouse_posrect.y - textMsr.textHeight; if(config.annotatePositionY=="Stop") { var lrect = ctx.canvas.getBoundingClientRect(); if(mouse_posrect.y<(lrect.height/2)) { decalY=myStatData.yPosBottom-mouse_posrect.y - 0*textMsr.textHeight; } }; break; case "Radar" : break; case "Line" : decalY=myStatData.posY-mouse_posrect.y - textMsr.textHeight; break; default: break; }; break; case "LXbottom" : switch(tpchart) { case "Line" : decalY=statData[piece.i][piece.j].posY-mouse_posrect.y - 1*textMsr.textHeight; for(vj=0;vj<statData[piece.i].length;vj++) decalY=Math.max(decalY,statData[piece.i][vj].posY-mouse_posrect.y - 1*textMsr.textHeight); break; default: break; } if(tpchart=="Line") break; case "MXbottom" : case "Xbottom" : case "SXbottom" : switch(tpchart) { case "StackedBar" : case "Bar" : if(myStatData.datavalue>=0) { decalY=myStatData.yPosBottom-mouse_posrect.y + 0*textMsr.textHeight; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXbottom") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) { if(statData[i][vj].datavalue>=0 || config.annotatePositionY=="Xbottom" || config.annotatePositionY=="MXbottom" ) { if(statData[i][0].tpchart!="Line")decalY=Math.max(decalY,Math.max(statData[i][vj].yPosTop,statData[i][vj].yPosBottom)-mouse_posrect.y + 0*textMsr.textHeight); } } } } else { if (config.annotatePositionY=="SXbottom") { addDecalY=-addDecalY; decalY=myStatData.yPosBottom-mouse_posrect.y - textMsr.textHeight; for(i=0;i<data.datasets.length;i++) { if(statData[i][piece.j].datavalue<0) { if(statData[i][0].tpchart!="Line")decalY=Math.min(decalY,statData[i][piece.j].yPosBottom-mouse_posrect.y - textMsr.textHeight); } } } else { decalY=myStatData.yPosTop-mouse_posrect.y + 0*textMsr.textHeight; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXbottom") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) { if(statData[i][vj].datavalue<0) { if(statData[i][0].tpchart!="Line")decalY=Math.max(decalY,statData[i][vj].yPosTop-mouse_posrect.y + 0*textMsr.textHeight); } } } } } ; break; case "Line" : decalY=statData[piece.i][piece.j].posY-mouse_posrect.y - 1*textMsr.textHeight; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXbottom") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) decalY=Math.max(decalY,statData[i][vj].posY-mouse_posrect.y - 1*textMsr.textHeight); } break; default: break; } if(tpchart=="StackedBar" || tpchart=="Bar" || tpchart=="Line") break; case "bottom" : case "Sbottom" : switch(tpchart) { case "StackedBar" : case "Bar" : if(myStatData.datavalue>=0) decalY=myStatData.yPosBottom-mouse_posrect.y + 0*textMsr.textHeight; else { if (config.annotatePositionY=="Sbottom" || config.annotatePositionY=="SXbottom") {decalY=myStatData.yPosBottom-mouse_posrect.y - textMsr.textHeight; addDecalY=-addDecalY; } else decalY=myStatData.yPosTop-mouse_posrect.y + 0*textMsr.textHeight; } break; case "HorizontalBar" : case "HorizontalStackedBar" : decalY=myStatData.yPosBottom-mouse_posrect.y - 0*textMsr.textHeight; if(config.annotatePositionY=="Sbottom") { var lrect = ctx.canvas.getBoundingClientRect(); if(mouse_posrect.y<(lrect.height/2)) { decalY=myStatData.yPosTop-mouse_posrect.y - textMsr.textHeight; } }; break; case "Radar" : decalY+=textMsr.textHeight; break; case "Line" : decalY=myStatData.posY-mouse_posrect.y - 0*textMsr.textHeight; break; default : break; }; break; case "Xcenter" : case "Xmiddle" : switch(tpchart) { case "HorizontalBar" : var mtop=Math.min(statData[piece.i][piece.j].yPosTop,statData[piece.i][piece.j].yPosBottom); var mbottom=Math.max(statData[piece.i][piece.j].yPosTop,statData[piece.i][piece.j].yPosBottom); for(i=0;i<data.datasets.length;i++) { if(statData[i][0].tpchart!="Line"){ mtop=Math.min(mtop,statData[i][piece.j].yPosTop,statData[i][piece.j].yPosBottom); mbottom=Math.max(mbottom,statData[i][piece.j].yPosTop,statData[i][piece.j].yPosBottom); } } decalY=(mtop+mbottom)/2 - mouse_posrect.y - 0.5*textMsr.textHeight; break; default: break; }; if(tpchart=="HorizontalBar") break; case "center" : case "middle" : switch(tpchart) { case "Bar" : case "StackedBar" : if(myStatData.datavalue>=0) decalY=(myStatData.yPosBottom+myStatData.yPosTop)/2-mouse_posrect.y - 0.5*textMsr.textHeight; else decalY=(myStatData.yPosBottom+myStatData.yPosTop)/2-mouse_posrect.y - 0.5*textMsr.textHeight; break; case "HorizontalBar" : case "HorizontalStackedBar" : decalY=(myStatData.yPosBottom+myStatData.yPosTop)/2-mouse_posrect.y - 0.5*textMsr.textHeight; break; case "Radar" : decalY+=0.5*textMsr.textHeight; break; case "Line" : decalY=myStatData.posY-mouse_posrect.y - 0.5*textMsr.textHeight; break; default : break; }; break; default: if(typeof config.annotatePositionY==="number") { var lrect = ctx.canvas.getBoundingClientRect(); decalY=-newPosY+1*config.annotatePositionY+lrect.top+window.pageYOffset; forceY=true; } else if (typeof config.annotatePositionY!="undefined" && config.annotatePositionY.indexOf("%")>0) { var lrect = ctx.canvas.getBoundingClientRect(); var pct=1*config.annotatePositionY.substr(0,config.annotatePositionY.indexOf("%")); decalY=-newPosY+(1*ctx.canvas.height*pct/100)/window.devicePixelRatio+lrect.top+window.pageYOffset; if(Math.abs(pct-50) < config.zeroValue) { decalY=decalY-textMsr.textHeight/2; } else if(pct > 50) { decalY=decalY-textMsr.textHeight; } forceY=true; } break; } switch(config.annotatePositionX) { case "MXright" : case "Xright" : case "SXright" : switch(tpchart) { case "HorizontalStackedBar" : case "HorizontalBar" : if(myStatData.datavalue>=0) { decalX=myStatData.xPosRight-mouse_posrect.x; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionX=="MXright") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++)decalX=Math.max(decalX,statData[i][vj].xPosRight-mouse_posrect.x); } } else { if(config.annotatePositionX=="SXright") { addDecalX=-addDecalX; decalX=myStatData.xPosRight-mouse_posrect.x -textMsr.textWidth; for(i=0;i<data.datasets.length;i++) { decalX=Math.min(decalX,statData[i][piece.j].xPosRight-mouse_posrect.x -textMsr.textWidth); } } else { decalX=myStatData.xPosLeft-mouse_posrect.x -textMsr.textWidth; for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionX=="MXright") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++)decalX=Math.max(decalX,Math.max(statData[i][vj].xPosRight,statData[i][vj].xPosLeft)-mouse_posrect.x + 0*textMsr.textWidth); } } } break; case "Line" : for(i=0;i<data.datasets.length;i++) { if(config.annotatePositionY=="MXtop") {debj=0;endj=statData[i].length;} for(vj=debj;vj<endj;vj++) if(statData[i][0].tpchart!="Line")decalX=Math.min(decalY,statData[i][vj].posX-mouse_posrect.x - 1*textMsr.textWidth); } break; default : break; } if (tpchart=="HorizontalStackedBar" || tpchart=="HorizontalBar")break; case "right" : case "Sright" : switch(tpchart) { case "Bar" : case "StackedBar" : decalX=myStatData.xPosRight-mouse_posrect.x; if(config.annotatePositionX=="Sright" || config.annotatePositionX=="SXright") { var lrect = ctx.canvas.getBoundingClientRect(); if(mouse_posrect.x>(lrect.width/2)) {