function closeContextMenu() {
var g = getE('cMenu');
g && g.parentNode.removeChild(g);
}
function setContextMenu(de,t,e) {
var te, g, mh = 0, mw = {$number:min_width}, link, text, line = 0,
bb, r, pos = svgCursorCoords(e,de), x = pos[0], y = pos[1],
spacing = {$number:spacing},
shadow, shadow_opacity = {$number:shadow_opacity}, target = '{$string:link_target}';
g = newel('g', { id: 'cMenu', 'font-size': {$number:font_size}, 'font-family':
'{$string:font}', 'font-weight': '{$string:font_weight}', fill:'{$string:colour}'});
for(te in t) {
text = newel('text', { x: '0px', y: '0px' });
text.appendChild(newtext(t[te][0]));
g.appendChild(text);
de.appendChild(g);
bb = text.getBBox();
de.removeChild(g);
g.removeChild(text);
if(bb.width > mw)
mw = bb.width;
}
for(te in t) {
text = newel('text', { x: {$number:pad_x} + 'px', y: ({$number:text_start} + line * spacing) + 'px' });
text.appendChild(newtext(t[te][0]));
if(t[te][1]) {
link = newel('a', { 'fill' : '{$string:link_colour}'{$string:underline_part} });
link.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', t[te][1]);
target && setattr(link, 'target', target);
r = newel('rect', { x: {$number:pad_x} + 'px', y: ({$number:rect_start} + line * spacing) + 'px',
width: mw + 'px', height: spacing + 'px', fill: '#000', opacity: 0});
link.appendChild(r);
link.appendChild(text);
g.appendChild(link);
link.addEventListener('mouseover', function(e) {
setattr(this, 'fill', '{$string:link_hover_colour}');
setattr(this.querySelector('rect'), 'opacity', 0.1);
});
link.addEventListener('mouseout', function(e) {
setattr(this, 'fill', '{$string:link_colour}');
setattr(this.querySelector('rect'), 'opacity', 0);
});
} else {
g.appendChild(text);
}
++line;
}
mw += {$number:pad_x} * 2;
mh = (line * spacing) + {$number:pad_y} * 2;
r = newel('rect', { x: '0px', y: '0px', width: mw + 'px', height: mh + 'px',
'stroke-width': {$number:stroke_width} + 'px',
fill: '{$string:back_colour}', stroke: '{$string:colour}'{$string:round_part}});
g.insertBefore(r, g.childNodes[0]);
x = Math.min(de.width.baseVal.value - mw - {$number:off_right},x);
y = (de.height.baseVal.value - mh - {$number:off_bottom} < y ? y - mh : y);
if(shadow_opacity > 0) {
shadow = newel('rect',{ fill: '#000', opacity: {$number:shadow_opacity},
'stroke-width': {$number:stroke_width} + 'px', stroke: '#000'{$string:round_part},
x:'{$number:cmoffs}px',y:'{$number:cmoffs}px', width: mw + 'px', height: mh + 'px'});
g.insertBefore(shadow, g.childNodes[0]);
}
setattr(g, 'transform', 'translate(' + x + ',' + y + ')');
de.appendChild(g);
}
function contextMenuInit() {
var c, e, nn = '{$string:namespace}svg';
for(c in menus) {
e = getE(c);
e && e.addEventListener && e.addEventListener('contextmenu', function(e) {
e.preventDefault();
e.stopPropagation();
var t = finditem(e,menus), de = svgNode(e,1), g = getE('cMenu');
g && g.parentNode.removeChild(g);
setContextMenu(de,t,e);
return false;
},false);
}
e = document.querySelectorAll(nn);
for(c = 0; c < e.length; ++c) {
e[c].addEventListener('click', closeContextMenu, false);
{$string:mouseleave}
e[c].addEventListener('keydown', function(e) {
if(e.keyCode == 27)
closeContextMenu();
},false);
e[c].addEventListener('contextmenu', rootContextMenu, false);
}
}
|