/*
Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.charting.axis2d.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.charting.axis2d.common"] = true;
dojo.provide("dojox.charting.axis2d.common");
dojo.require("dojox.gfx");
(function(){
var g = dojox.gfx;
var clearNode = function(s){
s.marginLeft = "0px";
s.marginTop = "0px";
s.marginRight = "0px";
s.marginBottom = "0px";
s.paddingLeft = "0px";
s.paddingTop = "0px";
s.paddingRight = "0px";
s.paddingBottom = "0px";
s.borderLeftWidth = "0px";
s.borderTopWidth = "0px";
s.borderRightWidth = "0px";
s.borderBottomWidth = "0px";
};
var getBoxWidth = function(n){
// marginBox is incredibly slow, so avoid it if we can
if(n["getBoundingClientRect"]){
var bcr = n.getBoundingClientRect();
return bcr.width || (bcr.right - bcr.left);
}else{
return dojo.marginBox(n).w;
}
};
dojo.mixin(dojox.charting.axis2d.common, {
// summary:
// Common methods to be used by any axis. This is considered "static".
createText: {
gfx: function(chart, creator, x, y, align, text, font, fontColor){
// summary:
// Use dojox.gfx to create any text.
// chart: dojox.charting.Chart2D
// The chart to create the text into.
// creator: dojox.gfx.Surface
// The graphics surface to use for creating the text.
// x: Number
// Where to create the text along the x axis (CSS left).
// y: Number
// Where to create the text along the y axis (CSS top).
// align: String
// How to align the text. Can be "left", "right", "center".
// text: String
// The text to render.
// font: String
// The font definition, a la CSS "font".
// fontColor: String|dojo.Color
// The color of the resultant text.
// returns: dojox.gfx.Text
// The resultant GFX object.
return creator.createText({
x: x, y: y, text: text, align: align
}).setFont(font).setFill(fontColor); // dojox.gfx.Text
},
html: function(chart, creator, x, y, align, text, font, fontColor, labelWidth){
// summary:
// Use the HTML DOM to create any text.
// chart: dojox.charting.Chart2D
// The chart to create the text into.
// creator: dojox.gfx.Surface
// The graphics surface to use for creating the text.
// x: Number
// Where to create the text along the x axis (CSS left).
// y: Number
// Where to create the text along the y axis (CSS top).
// align: String
// How to align the text. Can be "left", "right", "center".
// text: String
// The text to render.
// font: String
// The font definition, a la CSS "font".
// fontColor: String|dojo.Color
// The color of the resultant text.
// labelWidth: Number?
// The maximum width of the resultant DOM node.
// returns: DOMNode
// The resultant DOMNode (a "div" element).
// setup the text node
var p = dojo.doc.createElement("div"), s = p.style, boxWidth;
clearNode(s);
s.font = font;
p.innerHTML = String(text).replace(/\s/g, " ");
s.color = fontColor;
// measure the size
s.position = "absolute";
s.left = "-10000px";
dojo.body().appendChild(p);
var size = g.normalizedLength(g.splitFontString(font).size);
// do we need to calculate the label width?
if(!labelWidth){
boxWidth = getBoxWidth(p);
}
// new settings for the text node
dojo.body().removeChild(p);
s.position = "relative";
if(labelWidth){
s.width = labelWidth + "px";
// s.border = "1px dotted grey";
switch(align){
case "middle":
s.textAlign = "center";
s.left = (x - labelWidth / 2) + "px";
break;
case "end":
s.textAlign = "right";
s.left = (x - labelWidth) + "px";
break;
default:
s.left = x + "px";
s.textAlign = "left";
break;
}
}else{
switch(align){
case "middle":
s.left = Math.floor(x - boxWidth / 2) + "px";
// s.left = Math.floor(x - p.offsetWidth / 2) + "px";
break;
case "end":
s.left = Math.floor(x - boxWidth) + "px";
// s.left = Math.floor(x - p.offsetWidth) + "px";
break;
//case "start":
default:
s.left = Math.floor(x) + "px";
break;
}
}
s.top = Math.floor(y - size) + "px";
s.whiteSpace = "nowrap"; // hack for WebKit
// setup the wrapper node
var wrap = dojo.doc.createElement("div"), w = wrap.style;
clearNode(w);
w.width = "0px";
w.height = "0px";
// insert nodes
wrap.appendChild(p)
chart.node.insertBefore(wrap, chart.node.firstChild);
return wrap; // DOMNode
}
}
});
})();
}