RGraph = window.RGraph || {isRGraph:
true
};
RGraph.SVG = RGraph.SVG || {};
RGraph.SVG.HTML = RGraph.SVG.HTML || {};
(
function
(win, doc, undefined)
{
var
RG = RGraph,
ua = navigator.userAgent,
ma = Math;
RG.SVG.drawKey =
function
(obj)
{
var
prop = obj.properties,
key = prop.key,
colors = prop.keyColors || prop.colors,
defaultFont = 'Arial
',
blobSize = 0,
width = 0,
keyColorShape = prop.keyColorShape;
// Work out the center point of the SVG tag
var centerx = obj.svg.getAttribute('
width
') / 2;
// If we'
re drawing a key on a funnel then work out the center of
if
(obj.type ===
'funnel'
) {
centerx = (obj.graphWidth / 2) + prop.gutterLeft;
}
if
(key && key.length) {
for
(
var
i=0,length = 0; i<key.length; i++) {
var
textDimensions = RG.SVG.measureText({
text: key[i],
bold: prop.keyTextBold ||
false
,
font: prop.keyTextFont || prop.textFont || defaultFont,
size: prop.keyTextSize || prop.textSize
});
blobSize = ma.max(blobSize, textDimensions[1]);
width = width + 10 + blobSize + 5 + textDimensions[0];
}
x = centerx - width / 2;
for
(
var
i=0,y=prop.gutterTop - 5; i<key.length; ++i) {
if
(i === 0) {
if
(obj.type ===
'pie'
&& prop.highlightStyle ==
'outline'
) {
y -= prop.highlightStyleOutlineWidth;
}
}
var
textDimensions = RG.SVG.measureText({
text: key[i],
bold: prop.keyTextBold ||
false
,
font: prop.keyTextFont || prop.textFont || defaultFont,
size: prop.keyTextSize || prop.textSize
});
var
shape = prop.keyColorShape;
if
(
typeof
shape ===
'object'
) {
shape = prop.keyColorShape[i];
}
if
(shape ===
'circle'
) {
RG.SVG.create({
svg: obj.svg,
type:
'circle'
,
parent: obj.svg.all,
attr: {
cx: x + (blobSize / 2) + prop.keyOffsety,
cy: y - (blobSize / 2) + prop.keyOffsety,
r: blobSize / 2,
fill: colors[i]
}
});
}
else
if
(shape ===
'triangle'
) {
RG.SVG.create({
svg: obj.svg,
type:
'path'
,
parent: obj.svg.all,
attr: {
d:
'M {1} {2} L {3} {4} L {5} {6} z'
.format(
x + prop.keyOffsetx + (blobSize / 2),
y - blobSize + prop.keyOffsety,
x + prop.keyOffsetx + blobSize,
y + prop.keyOffsety,
x + prop.keyOffsetx,
y + prop.keyOffsety
),
fill: colors[i]
}
});
}
else
if
(shape ===
'line'
) {
RG.SVG.create({
svg: obj.svg,
type:
'path'
,
parent: obj.svg.all,
attr: {
d:
'M {1} {2} L {3} {4}'
.format(
x + prop.keyOffsetx,
y - (blobSize / 2) + prop.keyOffsety,
x + prop.keyOffsetx + blobSize,
y - (blobSize / 2) + prop.keyOffsety
),
stroke: colors[i],
'stroke-width'
: 2,
'stroke-linecap'
:
'round'
}
});
}
else
if
(shape ===
'dot'
) {
RG.SVG.create({
svg: obj.svg,
type:
'path'
,
parent: obj.svg.all,
attr: {
d:
'M {1} {2} L {3} {4}'
.format(
x + prop.keyOffsetx,
y - (blobSize / 2) + prop.keyOffsety,
x + prop.keyOffsetx + blobSize,
y - (blobSize / 2) + prop.keyOffsety
),
stroke: colors[i],
'stroke-width'
: 2,
'stroke-linecap'
:
'round'
}
});
RG.SVG.create({
svg: obj.svg,
type:
'circle'
,
parent: obj.svg.all,
attr: {
cx: x + (blobSize / 2) + prop.keyOffsety,
cy: y - (blobSize / 2) + prop.keyOffsety,
r: blobSize / 4,
fill: colors[i]
}
});
}
else
if
(
typeof
shape ===
'function'
) {
RG.SVG.create({
svg: obj.svg,
type:
'path'
,
parent: obj.svg.all,
attr: {
d:
'M {1} {2} L {3} {4}'
.format(
x + prop.keyOffsetx,
y - (blobSize / 2) + prop.keyOffsety,
x + prop.keyOffsetx + blobSize,
y - (blobSize / 2) + prop.keyOffsety
),
stroke: colors[i],
'stroke-width'
: 2,
'stroke-linecap'
:
'round'
}
});
}
else
{
RG.SVG.create({
svg: obj.svg,
type:
'rect'
,
parent: obj.svg.all,
attr: {
x: x + prop.keyOffsetx,
y: y - blobSize + prop.keyOffsety,
width: blobSize,
height: blobSize,
fill: colors[i]
}
});
}
RGraph.SVG.text({
object: obj,
parent: obj.svg.all,
tag:
'key'
,
size: prop.keyTextSize || prop.textSize,
bold:
typeof
prop.keyTextBold ===
'boolean'
? prop.keyTextBold : prop.textBold,
italic:
typeof
prop.keyTextItalic ===
'boolean'
? prop.keyTextItalic : prop.textItalic,
font: prop.keyTextFont || prop.textFont,
halign:
'left'
,
valign:
'bottom'
,
text: key[i],
x: x + blobSize + 5 + prop.keyTextOffsetx + prop.keyOffsetx,
y: y + prop.keyTextOffsety + prop.keyOffsety,
color:
'black'
,
background:
'white'
,
padding: 0
})
x += 10 + blobSize + 5 + textDimensions[0];
}
}
};
RG.SVG.HTML.key =
function
(id, prop)
{
var
div = doc.getElementById(id);
var
str =
'<table border="0" cellspacing="0" cellpadding="0" id="rgraph_key" style="display: inline;'
+ (
function
()
{
var
style =
''
for
(i
in
prop.tableCss) {
if
(
typeof
i ===
'string'
) {
style = style + i +
': '
+ prop.tableCss[i] +
';'
;
}
}
return
style;
})() +
'" '
+ (prop.tableClass ?
'class="'
+ prop.tableClass +
'"'
:
''
) +
'>'
;
for
(
var
i=0; i<prop.labels.length; i+=1) {
str +=
'<tr><td><div style="'
+ (
function
()
{
var
style =
''
;
for
(
var
j
in
prop.blobCss) {
if
(
typeof
j ===
'string'
) {
style = style + j +
': '
+ prop.blobCss[j] +
';'
;
}
}
return
style;
})() +
'display: inline-block; margin-right: 5px; margin-top: 4px; width: 15px; height: 15px; background-color: '
+ prop.colors[i] +
'"'
+ (prop.blobClass ?
'class="'
+ prop.blobClass +
'"'
:
''
) +
'> </div><td>'
+ (prop.links && prop.links[i] ?
'<a href="'
+ prop.links[i] +
'">'
:
''
) +
'<span '
+ (prop.labelClass ?
'class="'
+ prop.labelClass +
'"'
:
''
) +
'" style="'
+ (
function
()
{
var
style =
''
;
for
(
var
j
in
prop.labelCss) {
if
(
typeof
j ===
'string'
) {
style = style + j +
': '
+ prop.labelCss[j] +
';'
;
}
}
return
style;
})() +
'" '
+ (
function
()
{
var
style =
''
;
if
(prop[
'labelCss_'
+ i]) {
for
(
var
j
in
prop[
'labelCss_'
+ i]) {
style = style + j +
': '
+ prop[
'labelCss_'
+ i][j] +
';'
;
}
}
return
style ?
'style="'
+ style +
'"'
:
''
;
})() +
'>'
+ prop.labels[i] +
'</span>'
+ (prop.links && prop.links[i] ?
'</a>'
:
''
) +
'</td></tr>'
;
}
div.innerHTML += (str +
'</table>'
);
return
doc.getElementById(
'rgraph_key'
);
};
})(window, document);