openstackweb/themes/openstack/javascript/svg/param.js
2014-10-31 16:21:41 -03:00

284 lines
9.1 KiB
JavaScript

var svgns = "http://www.w3.org/2000/svg";
var xlinkns = "http://www.w3.org/1999/xlink";
GetParams();
function GetParams()
{
var uids = [];
var paramArray = [];
if ( document.defaultView.frameElement )
{
var params = document.defaultView.frameElement.getElementsByTagName("param");
for ( var i = 0, iLen = params.length; iLen > i; i++ )
{
var eachParam = params[ i ];
var name = eachParam.getAttribute( "name" );
var value = eachParam.getAttribute( "value" );
paramArray[ name ] = value;
}
}
var href = document.defaultView.location.href;
if ( -1 != href.indexOf("?") )
{
var paramList = href.split("?")[1].split(/&|;/);
for ( var p = 0, pLen = paramList.length; pLen > p; p++ )
{
var eachParam = paramList[ p ];
var valList = eachParam.split("=");
var name = unescape(valList[0]);
var value = unescape(valList[1]);
paramArray[ name ] = value;
}
}
SetElementValues( paramArray, uids );
}
function GetValue( attrStr, params )
{
// parse attribute value for parameter reference and fallback value
var paramSplit = attrStr.split(")");
var paramName = paramSplit[0].replace("param(","");
var defaultVal = null;
if (paramSplit[1])
{
defaultVal = paramSplit[1].replace(/^\s\s*/, "").replace(/\s\s*$/, "");
}
var newVal = params[ paramName ];
if ( !newVal )
{
newVal = defaultVal;
}
return newVal;
}
function SetElementValues( params, uids )
{
var useEls =[];
var elList = document.documentElement.getElementsByTagName( "*" );
for ( var i = 0, iLen = elList.length; iLen > i; i++ )
{
var eachEl = elList[ i ];
if ( "use" != eachEl.localName )
{
SetParamValues( eachEl, params );
}
else
{
var shadow = EmulateShadowTree( eachEl, params, uids, i );
if ( shadow )
{
useEls.push( [ eachEl, shadow ] );
}
}
}
for ( var u = 0, uLen = useEls.length; uLen > u; u++ )
{
var useEl = useEls[ u ][0];
var shadow = useEls[ u ][1];
useEl.setAttribute("display", "none");
if (useEl.nextSibling)
{
useEl.parentNode.insertBefore(shadow, useEl.nextSibling);
}
else
{
useEl.parentNode.appendChild(shadow);
}
}
}
function SetParamValues( el, params, isShadow )
{
for ( var a = 0, aLen = el.attributes.length; aLen > a; a++ )
{
var attr = el.attributes[ a ];
if (attr)
{
var attrVal = attr.value;
if ( -1 != attrVal.indexOf( "param(" ) )
{
//alert("attr: " + attr.localName + "\nvalue: " + attrVal)
if ( "params" == attr.localName )
{
// alert("attr.name: " + attr.name + "\nattrVal: " + attrVal + "\nisShadow: " + isShadow)
if (isShadow)
{
//alert(attrVal)
var paramSplit = attrVal.split(";");
for ( var p = 0, pLen = paramSplit.length; pLen > p; p++ )
{
var eachPair = paramSplit[ p ];
// alert("eachPair: " + eachPair)
var pairSplit = eachPair.split(":");
var newAttr = pairSplit[0];
var newVal = GetValue( pairSplit[1], params );
var attrns = null;
if ( "href" == newAttr || "xlink:href" == newAttr )
{
attrns = xlinkns;
}
el.setAttributeNS( attrns, newAttr, newVal);
}
}
}
else
{
var newVal = GetValue( attrVal, params );
if ( null != newVal && "" != newVal )
{
if ( "content-value" == attr.localName )
{
el.replaceChild( document.createTextNode( newVal ), el.firstChild );
}
else
{
el.setAttributeNS( attr.namespaceURI, attr.name, newVal);
//alert("attr.name: " + attr.name + "\nattrVal: " + newVal)
// note replacement values in params metadata attribute
var paramAttrVal = el.getAttribute( "params" );
if ( paramAttrVal )
{
el.setAttribute( "params", paramAttrVal + ";" + attr.name + ":" + attrVal);
//alert(paramAttrVal)
}
else
{
el.setAttribute( "params", attr.name + ":" + attrVal);
}
}
}
}
}
}
}
}
// au37k
//emulate modifying shadow tree by duplicating element are replacing over use element
function EmulateShadowTree( el, params, uids, idnum )
{
//alert("EmulateShadowTree")
shadowParams = params;
var hasParam = false;
var cn = el.childNodes;
for ( var c = 0, cLen = cn.length; cLen > c; c++ )
{
var eachChild = cn[ c ];
//alert(eachChild + ": " + eachChild.nodeType)
if ( 1 == eachChild.nodeType && "param" == eachChild.localName)
{
var name = eachChild.getAttribute( "name" );
var val = eachChild.getAttribute( "value" );
shadowParams[ name ] = val;
hasParam = true;
// alert("name: " + name + "\nvalue: " + val)
}
}
var parametersAttrVal = el.getAttribute( "parameters" );
if( parametersAttrVal )
{
// alert(parametersAttrVal)
var paramSplit = parametersAttrVal.split(";");
for ( var p = 0, pLen = paramSplit.length; pLen > p; p++ )
{
var eachPair = paramSplit[ p ];
//alert("eachPair: " + eachPair)
var pairSplit = eachPair.split(":");
shadowParams[ pairSplit[0] ] = pairSplit[1];
hasParam = true;
}
}
if ( hasParam )
{
//alert("hasParam")
var idref = el.getAttributeNS( xlinkns, "href").replace("#", "");
var refEl = document.getElementById( idref );
//emulate modifying shadow tree by duplicating element are replacing over use element
var newEl = refEl.cloneNode(true);
// alert("EmulateShadowTree:\n\nnewEl:" + newEl + "\nshadowParams: " + shadowParams )
SetParamValues( newEl, shadowParams, true );
var wrapper = document.createElementNS( svgns, "g");
var shadow = document.createElementNS( svgns, "g");
for ( var ua = 0, uaLen = el.attributes.length; uaLen > ua; ua++ )
{
var attr = el.attributes[ ua ];
if ( "content-value" != attr.localName && "params" != attr.localName && "parameters" != attr.localName
&& "href" != attr.localName && "x" != attr.localName && "y" != attr.localName )
{
//copy use element attributes to replacement image
shadow.setAttribute( attr.name, attr.value);
}
}
var x = el.getAttribute("x");
var y = el.getAttribute("y");
wrapper.setAttribute( "transform", "translate(" + x + "," + y + ")");
shadow.appendChild(newEl);
wrapper.appendChild(shadow);
var shadowEls = newEl.getElementsByTagName( "*" );
for ( var e = 0, eLen = shadowEls.length; eLen > e; e++ )
{
var eachEl = shadowEls[ e ];
SetParamValues( eachEl, shadowParams, true );
for ( var a = 0, aLen = eachEl.attributes.length; aLen > a; a++ )
{
var attr = eachEl.attributes[ a ];
var attrVal = attr.value;
//alert("attr: " + attr.localName + "\nvalue: " + attrVal)
if ( "id" == attr.localName )
{
//change id to unique id
eachEl.setAttribute( attr.name, attrVal + "__" + idnum);
uids[attrVal] = attrVal + "__" + idnum;
}
//alert( attrVal )
if ( -1 != attrVal.indexOf("url(#") )
{
//alert( attrVal )
for ( uid in uids )
{
//alert( uid + ": " + uids[uid] )
if ( -1 != attrVal.indexOf( "url(#" + uid + ")" ) )
{
eachEl.setAttributeNS( attr.namespaceURI, attr.name, "url(#" + uids[uid] + ")" );
}
}
}
}
}
return wrapper;
}
return null;
}