284 lines
9.1 KiB
JavaScript
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;
|
|
}
|
|
|