Blob Blame History Raw
const char *code =
"//The scripts for the tooltip and moveobj are based on work from\n"
"//SVG - Learning By Coding - http://www.datenverdrahten.de/svglbc/\n"
"//Author: Dr. Thomas Meinike 11/03 - thomas@handmadecode.de\n"
"var svgdoc,svgroot,paths,revert;\n"
"var collapsed = new Array(2);\n"
"var name = new Array(%i);\n"
"var clickStatus = new Array(%i);\n"
"var redCount = new Array(%i);\n"
"var salmonCount = new Array(%i);\n"
"var moveObj,rect,x,y,attr1,attr2,wert1,wert2,zoom=1,active=false;\n"
"\n"
"function MoveObj(evt)\n"
"{\n"
"    if (active) {\n"
"	var roundx, roundy;\n"
"	var curtrans=svgroot.currentTranslate;\n"
"	var ctx=curtrans.x;\n"
"	var cty=curtrans.y;\n"
"\n"
"	x=evt.clientX()\n"
"	y=evt.clientY()\n"
"	wert1=(x-ctx)*zoom*%.2f+%.2f+attr1-5;\n"
"	wert2=(y-cty)*zoom*%.2f+%.2f+attr2-5;\n"
"	roundx=Math.round(wert1*100)/100;\n"
"	roundy=Math.round(wert2*100)/100;\n"
"\n"
"	moveObj.setAttribute(\"transform\",\"translate(\"+roundx+\",\"+roundy+\")\");\n"
"    }\n"
"}\n"
"\n"
"function ClickObj(evt)\n"
"{\n"
"    rect=evt.target.parentNode.getElementsByTagName(\"rect\").item(0);\n"
"    moveObj=evt.target.parentNode;\n"
"    attr1=rect.getAttribute(\"width\")/2;\n"
"    attr2=rect.getAttribute(\"height\")/2;\n"
"    active=true;\n"
"}\n"
"\n"
"function OutOfObj(evt)\n"
"{\n"
"    if (active) {\n"
"	active=false;\n"
"	findAdjacentEdges();\n"
"    }\n"
"}\n"
"\n"
"function findAdjacentEdges()\n"
"{\n"
"    var rectl, rectlid, i, nodenames;\n"
"    rectl = rect;\n"
"    rectlid = rectl.getAttribute(\"id\");\n"
"    for (i=0; i<paths.length; i++) {\n"
"	nodenames = paths.item(i).getAttribute(\"id\").split(\"-\");\n"
"	if (nodenames[0] == rectlid || nodenames[1] == rectlid) {\n"
"	    repaintEdge(paths.item(i), nodenames, i);\n"
"	}\n"
"    }\n"
"}\n"
"\n"
"function repaintEdge(edge, nodenames, j)\n"
"{\n"
"    var startnode, endnode, attr, i, k, l, m, alpha, beta;\n"
"    var nodesx, nodesy, nodeex, nodeey, nodesw, nodesh, nodeew, nodeeh;\n"
"    var edgesx, edgesy, edgeex, edgeey, sx, sy, ex, ey;\n"
"\n"
"    //extract node coordinates and dimensions\n"
"    startnode = svgdoc.getElementById(nodenames[0]);\n"
"    nodesw=startnode.getAttribute(\"width\");\n"
"    nodesh=startnode.getAttribute(\"height\");\n"
"    attr = startnode.parentNode.attributes;\n"
"    for (i=0;i<attr.length;i++) {\n"
"        if (attr.item(i).nodeName == \"transform\") {\n"
"	    k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"	    l = attr.item(i).nodeValue.indexOf(\",\");\n"
"	    m = attr.item(i).nodeValue.indexOf(\")\");\n"
"	    nodesx = parseFloat(attr.item(i).nodeValue.substring(k+1,l));\n"
"	    nodesy = parseFloat(attr.item(i).nodeValue.substring(l+1,m));\n"
"	}\n"
"    }\n"
"    endnode = svgdoc.getElementById(nodenames[1]);\n"
"    nodeew=endnode.getAttribute(\"width\");\n"
"    nodeeh=endnode.getAttribute(\"height\");\n"
"    attr = endnode.parentNode.attributes;\n"
"    for (i=0;i<attr.length;i++) {\n"
"        if (attr.item(i).nodeName == \"transform\") {\n"
"	    k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"	    l = attr.item(i).nodeValue.indexOf(\",\");\n"
"	    m = attr.item(i).nodeValue.indexOf(\")\");\n"
"	    nodeex = parseFloat(attr.item(i).nodeValue.substring(k+1,l));\n"
"	    nodeey = parseFloat(attr.item(i).nodeValue.substring(l+1,m));\n"
"	}\n"
"    }\n"
"\n"
"    alpha = Math.atan((nodesy-nodeey)/(nodesx-nodeex));\n"
"    if (alpha < 0)\n"
"	alpha += Math.PI;\n"
"\n"
"    //calculate intersection of edge and startNode\n"
"    beta = Math.atan(nodesh/nodesw);\n"
"    if (alpha < beta\n"
"	|| (alpha > Math.PI-beta && alpha < Math.PI+beta)\n"
"	|| alpha > 2*Math.PI-beta) {\n"
"	//intersection at left or right border\n"
"	if (nodesx < nodeex) {\n"
"	    edgesx = nodesx - 0 + nodesw/2;\n"
"	} else {\n"
"	    edgesx = nodesx - nodesw/2;\n"
"	}\n"
"	if (nodesy < nodeey) {\n"
"	    edgesy = nodesy - 0 + Math.abs(nodesw*Math.tan(alpha)/2);\n"
"	} else {\n"
"	    edgesy = nodesy - Math.abs(nodesw*Math.tan(alpha)/2);\n"
"	}\n"
"    } else {\n"
"	//intersection at top or bottom border\n"
"	if (nodesy < nodeey) {\n"
"	    edgesy = nodesy - 0 + nodesh/2;\n"
"	} else {\n"
"	    edgesy = nodesy - nodesh/2;\n"
"	}\n"
"	if (nodesx < nodeex) {\n"
"	    edgesx = nodesx - 0 + Math.abs(nodesh/(2*Math.tan(alpha)));\n"
"	} else {\n"
"	    edgesx = nodesx - Math.abs(nodesh/(2*Math.tan(alpha)));\n"
"	}\n"
"    }\n"
"\n"
"    //calculate intersection of edge and endNode\n"
"    beta = Math.atan(nodeeh/nodeew);\n"
"    if (alpha < beta\n"
"	|| (alpha > Math.PI-beta && alpha < Math.PI+beta)\n"
"	|| alpha > 2*Math.PI-beta) {\n"
"	//intersection at left or right border\n"
"	if (nodesx > nodeex) {\n"
"	    edgeex = nodeex - 0 + nodeew/2;\n"
"	} else {\n"
"	    edgeex = nodeex - nodeew/2;\n"
"	}\n"
"	if (nodesy > nodeey) {\n"
"	    edgeey = nodeey - 0 + Math.abs(nodeew*Math.tan(alpha)/2);\n"
"	} else {\n"
"	    edgeey = nodeey - Math.abs(nodeew*Math.tan(alpha)/2);\n"
"	}\n"
"    } else {\n"
"	//intersection at top or bottom border\n"
"	if (nodesy > nodeey) {\n"
"	    edgeey = nodeey - 0 + nodeeh/2;\n"
"	} else {\n"
"	    edgeey = nodeey - nodeeh/2;\n"
"	}\n"
"	if (nodesx > nodeex) {\n"
"	    edgeex = nodeex - 0 + Math.abs(nodeeh/(2*Math.tan(alpha)));\n"
"	} else {\n"
"	    edgeex = nodeex - Math.abs(nodeeh/(2*Math.tan(alpha)));\n"
"	}\n"
"    }\n"
"\n"
"    //set new edge coordinates\n"
"    sx=Math.round(edgesx*100)/100;\n"
"    ex=Math.round(edgeex*100)/100;\n"
"    sy=Math.round(edgesy*100)/100;\n"
"    ey=Math.round(edgeey*100)/100;\n"
"\n"
"    if (sx < ex) {\n"
"	if (revert[j] == 1) {\n"
"	    revert[j] = 0;\n"
"	    flipEdgeMarks(edge);\n"
"	}\n"
"	edge.setAttribute(\"d\",\"M \"+sx+\" \"+sy+\" \"+ex+\" \"+ey);\n"
"    } else {\n"
"	if (revert[j] == 0) {\n"
"	    revert[j] = 1;\n"
"	    flipEdgeMarks(edge);\n"
"	}\n"
"	edge.setAttribute(\"d\",\"M \"+ex+\" \"+ey+\" \"+sx+\" \"+sy);\n"
"    }\n"
"}\n"
"\n"
"function flipEdgeMarks(edge)\n"
"{\n"
"    var attr, i, j, done, textpaths, pathnamei, offset;\n"
"\n"
"    //revert start- and end-markers\n"
"    attr = edge.attributes;\n"
"    done = 0;\n"
"    for (i=0;i<attr.length;i++) {\n"
"        if (attr.item(i).nodeName == \"marker-start\") {\n"
"	    for (j=i;j<attr.length;j++) {\n"
"		if (attr.item(j).nodeName == \"marker-end\") {\n"
"		    done = 1;\n"
"		}\n"
"	    }\n"
"	    if (done == 0) {\n"
"		//start->end\n"
"		edge.removeAttribute(\"marker-start\");\n"
"		edge.setAttribute(\"marker-end\",\"url(#arrowend)\");\n"
"		break;\n"
"	    }\n"
"	}\n"
"        if (attr.item(i).nodeName == \"marker-end\") {\n"
"	    for (j=i;j<attr.length;j++) {\n"
"		if (attr.item(j).nodeName == \"marker-start\") {\n"
"		    done = 1;\n"
"		}\n"
"	    }\n"
"	    if (done == 0) {\n"
"		//end->start\n"
"		edge.removeAttribute(\"marker-end\");\n"
"		edge.setAttribute(\"marker-start\",\"url(#arrowstart)\");\n"
"		break;\n"
"	    }\n"
"	}\n"
"    }\n"
"\n"
"    //revert cardinalities\n"
"    textpaths = svgdoc.getElementsByTagName(\"textPath\");\n"
"    for (i=0;i<textpaths.length;i++) {\n"
"	pathname = textpaths.item(i).getAttribute(\"xlink:href\").replace(/#/,\"\");\n"
"	if (pathname == edge.getAttribute(\"id\")) {\n"
"	    offset = textpaths.item(i).getAttribute(\"startOffset\").substr(0,2);\n"
"	    textpaths.item(i).setAttribute(\"startOffset\",100 - offset + \"%\")\n"
"	}\n"
"    }\n"
"}\n"
"\n"
"function getSVGDoc(load_evt)\n"
"{\n"
"    svgdoc=load_evt.target.ownerDocument;\n"
"    svgroot=svgdoc.documentElement;\n"
"    texte=svgdoc.getElementById(\"tooltip\").getElementsByTagName(\"text\");\n"
"    for (i=1; i<%i; i++) {\n"
"	textNode=texte.item(1).cloneNode(\"true\");\n"
"	svgdoc.getElementById(\"tooltip\").appendChild(textNode);\n"
"    }\n"
"    texte=svgdoc.getElementById(\"tooltip\").getElementsByTagName(\"text\");\n"
"}\n"
"\n"
"function ShowTooltipMZ(mousemove_event,txt)\n"
"{\n"
"    var ttrelem,tttelem,ttline,posx,posy,curtrans,ctx,cty,txt;\n"
"    var maxbreite,tmp,i;\n"
"    ttrelem=svgdoc.getElementById(\"ttr\");\n"
"    tttelem=svgdoc.getElementById(\"ttt\");\n"
"    ttline=svgdoc.getElementById(\"ttl\");\n"
"    posx=mousemove_event.clientX;\n"
"    posy=mousemove_event.clientY;\n"
"    for (i=1;i<=%i;i++)\n"
"	texte.item(i).firstChild.data=\"\";\n"
"    tttelem.childNodes.item(0).data=\"\";\n"
"    tmp=txt.split(\"\\n\");\n"
"    maxbreite=0;\n"
"    for (i=0;i<tmp.length;i++) {\n"
"	if (tmp[i]==\"\")\n"
"	    continue;\n"
"	tttelem.childNodes.item(0).data=tmp[i];\n"
"	if (maxbreite<tttelem.getComputedTextLength())\n"
"	    maxbreite=tttelem.getComputedTextLength();\n"
"    }\n"
"    curtrans=svgroot.currentTranslate;\n"
"    ctx=curtrans.x;\n"
"    cty=curtrans.y;\n"
"    ttrelem.setAttribute(\"x\",posx-ctx+10);\n"
"    ttrelem.setAttribute(\"y\",posy-cty-20+10);\n"
"    ttrelem.setAttribute(\"width\",maxbreite*0.92+10);\n"
"    ttrelem.setAttribute(\"height\",tmp.length*15+3);\n"
"    ttrelem.setAttribute(\"style\",\n"
"			    \"fill: #FFC; stroke: #000; stroke-width: 0.5px\");\n"
"    for (i=1; i<=tmp.length; i++) {\n"
"	if (tmp[i-1]==\"-- -- --\") {\n"
"	    ttline.setAttribute(\"x1\", posx-ctx+10);\n"
"	    ttline.setAttribute(\"y1\", parseInt(i-1)*15+posy-cty);\n"
"	    ttline.setAttribute(\"x2\", posx-ctx+10+maxbreite*0.92+10);\n"
"	    ttline.setAttribute(\"y2\", parseInt(i-1)*15+posy-cty);\n"
"	    ttline.setAttribute(\"style\", \"stroke: #000; stroke-width: 0.5px\");\n"
"	} else {\n"
"	    texte.item(i).firstChild.data=tmp[i-1];\n"
"	    texte.item(i).setAttribute(\"x\",posx-ctx+15);\n"
"	    texte.item(i).setAttribute(\"y\",parseInt(i-1)*15+posy-cty+3);\n"
"	    texte.item(i).setAttribute(\"style\",\"fill: #00E; font-size: 11px\");\n"
"	}\n"
"    }\n"
"    svgdoc.getElementById(\"tooltip\").style.setProperty(\"visibility\",\"visible\");\n"
"}\n"
"\n"
"function HideTooltip()\n"
"{\n"
"    svgdoc.getElementById(\"ttl\").style.setProperty(\"visibility\",\"hidden\");\n"
"    svgdoc.getElementById(\"tooltip\").style.setProperty(\"visibility\",\"hidden\");\n"
"}\n"
"\n"
"function ZoomControl()\n"
"{\n"
"    var curzoom;\n"
"    curzoom=svgroot.currentScale;\n"
"    svgdoc.getElementById(\"tooltip\").setAttribute(\"transform\",\n"
"							\"scale(\"+1/curzoom+\")\");\n"
"    zoom=1/curzoom;\n"
"}\n"
"\n"
"function collapse(evt)\n"
"{\n"
"    var i, k, l, m, svgdoc, obj, targetID, targetX, targetY, attr;\n"
"    obj = evt.getTarget();\n"
"    svgdoc = obj.ownerDocument;\n"
"    //extract coordinates and id of the clicked text\n"
"    attr = obj.parentNode.parentNode.attributes;\n"
"    for (i=0;i<attr.length;i++) {\n"
"        if (attr.item(i).nodeName == \"transform\") {\n"
"            k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"            l = attr.item(i).nodeValue.indexOf(\",\");\n"
"            m = attr.item(i).nodeValue.indexOf(\")\");\n"
"            targetX = attr.item(i).nodeValue.substring(k+1,l);\n"
"            targetY = attr.item(i).nodeValue.substring(l+1,m);\n"
"        }\n"
"        if (attr.item(i).nodeName == \"id\") {\n"
"            targetID = attr.item(i).nodeValue.substr(2);\n"
"        }\n"
"    }\n"
"    //decide if we are collapsing or uncollapsing\n"
"    if (collapsed[0][targetID] == 0) {\n"
"        hideInfos(evt, obj, svgdoc, targetX, targetY, targetID, attr);\n"
"        collapsed[0][targetID] = 1;\n"
"    } else {\n"
"        showHiddenInfos(evt, obj, svgdoc, targetX, targetY, targetID, attr);\n"
"        collapsed[0][targetID] = 0;\n"
"    }\n"
"}\n"
"\n"
"function showHiddenInfos(evt, obj, svgdoc, targetX, targetY, targetID, attr)\n"
"{\n"
"    var i, k, l, m, nextObj, nextX, nextY, gapY=0, clickedID;\n"
"    //change clicked text\n"
"    obj.firstChild.data=\"--\";\n"
"    targetID++;\n"
"    nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"    if (nextObj == null)\n"
"        return;\n"
"    //show child texts again\n"
"    for (;;) {\n"
"        attr = nextObj.attributes;\n"
"        for (i=0;i<attr.length;i++) {\n"
"            if (attr.item(i).nodeName == \"transform\") {\n"
"                k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"                l = attr.item(i).nodeValue.indexOf(\",\");\n"
"                m = attr.item(i).nodeValue.indexOf(\")\");\n"
"                nextX = attr.item(i).nodeValue.substring(k+1,l);\n"
"                nextY = attr.item(i).nodeValue.substring(l+1,m);\n"
"            }\n"
"        }\n"
"        if (nextX > targetX) {\n"
"            nextObj.style.setProperty(\"visibility\",\"visible\");\n"
"            gapY += 15;\n"
"            if (collapsed[0][targetID] == 1) {\n"
"                targetID = collapsed[1][targetID];\n"
"            } else {\n"
"                targetID++;\n"
"            }\n"
"            nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"            if (nextObj == null)\n"
"                break;\n"
"        } else {\n"
"            break;\n"
"        }\n"
"    }\n"
"    if (nextObj == null)\n"
"        return;\n"
"    //move following texts downwards\n"
"    while (nextObj != null) {\n"
"        attr = nextObj.attributes;\n"
"        for (i=0;i<attr.length;i++) {\n"
"            if (attr.item(i).nodeName == \"transform\") {\n"
"                k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"                l = attr.item(i).nodeValue.indexOf(\",\");\n"
"                m = attr.item(i).nodeValue.indexOf(\")\");\n"
"                nextX = attr.item(i).nodeValue.substring(k+1,l);\n"
"                nextY = attr.item(i).nodeValue.substring(l+1,m);\n"
"            }\n"
"        }\n"
"        nextY = nextY - 1 + gapY + 1;\n"
"        nextObj.setAttribute(\"transform\",\"translate(\"+nextX+\",\"+nextY+\")\");\n"
"        targetID++;\n"
"        nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"    }\n"
"}\n"
"\n"
"function hideInfos(evt, obj, svgdoc, targetX, targetY, targetID, attr)\n"
"{\n"
"    var i, k, l, m, nextObj, nextX, nextY, gapY=0;\n"
"    clickedID = targetID;\n"
"    //change clicked text\n"
"    obj.firstChild.data=\"+\";\n"
"    targetID++;\n"
"    nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"    if (nextObj == null)\n"
"        return;\n"
"    //wipe out child texts\n"
"    for (;;) {\n"
"        attr = nextObj.attributes;\n"
"        for (i=0;i<attr.length;i++) {\n"
"            if (attr.item(i).nodeName == \"transform\") {\n"
"                k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"                l = attr.item(i).nodeValue.indexOf(\",\");\n"
"                m = attr.item(i).nodeValue.indexOf(\")\");\n"
"                nextX = attr.item(i).nodeValue.substring(k+1,l);\n"
"                nextY = attr.item(i).nodeValue.substring(l+1,m);\n"
"            }\n"
"        }\n"
"        if (nextX > targetX) {\n"
"            nextObj.style.setProperty(\"visibility\",\"hidden\");\n"
"            gapY += 15;\n"
"            if (collapsed[0][targetID] == 1) {\n"
"                targetID = collapsed[1][targetID];\n"
"            } else {\n"
"                targetID++;\n"
"            }\n"
"            nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"            if (nextObj == null)\n"
"                break;\n"
"        } else {\n"
"            break;\n"
"        }\n"
"    }\n"
"    //save next uncollapsed element in array\n"
"    collapsed[1][clickedID] = targetID;\n"
"    if (nextObj == null)\n"
"        return;\n"
"    //move following texts upwards\n"
"    while (nextObj != null) {\n"
"        attr = nextObj.attributes;\n"
"        for (i=0;i<attr.length;i++) {\n"
"            if (attr.item(i).nodeName == \"transform\") {\n"
"                k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"                l = attr.item(i).nodeValue.indexOf(\",\");\n"
"                m = attr.item(i).nodeValue.indexOf(\")\");\n"
"                nextX = attr.item(i).nodeValue.substring(k+1,l);\n"
"                nextY = attr.item(i).nodeValue.substring(l+1,m);\n"
"            }\n"
"        }\n"
"        nextY -= gapY;\n"
"        nextObj.setAttribute(\"transform\",\"translate(\"+nextX+\",\"+nextY+\")\");\n"
"        targetID++;\n"
"        nextObj = svgdoc.getElementById(\"MI\"+targetID);\n"
"    }\n"
"}\n"
"\n"
"function init(evt)\n"
"{\n"
"    var nodenames, startnode, endnode, attr, i, j, k, l, m, nodesx, nodeex;\n"
"    collapsed[0] = new Array(%i);\n"
"    collapsed[1] = new Array(%i);\n"
"    for (i=0; i<%i; i++) {\n"
"        collapsed[0][i] = 0;\n"
"        collapsed[1][i] = 0;\n"
"    }\n"
"    for (i=0; i<%i; i++) {\n"
"	name[i] = \"\";\n"
"	clickStatus[i] = 0;\n"
"	redCount[i] = 0;\n"
"	salmonCount[i] = 0;\n"
"    }\n"
"    getSVGDoc(evt);\n"
"\n"
"    //check which edges are printed from right to left\n"
"    paths = svgdoc.getElementsByTagName(\"path\");\n"
"    revert = new Array(paths.length);\n"
"    for (j=0; j<paths.length; j++) {\n"
"	nodenames = paths.item(j).getAttribute(\"id\").split(\"-\");\n"
"	startnode = svgdoc.getElementById(nodenames[0]);\n"
"	attr = startnode.parentNode.attributes;\n"
"	for (i=0;i<attr.length;i++) {\n"
"	    if (attr.item(i).nodeName == \"transform\") {\n"
"		k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"		l = attr.item(i).nodeValue.indexOf(\",\");\n"
"		m = attr.item(i).nodeValue.indexOf(\")\");\n"
"		nodesx = parseFloat(attr.item(i).nodeValue.substring(k+1,l));\n"
"	    }\n"
"	}\n"
"	endnode = svgdoc.getElementById(nodenames[1]);\n"
"	attr = endnode.parentNode.attributes;\n"
"	for (i=0;i<attr.length;i++) {\n"
"	    if (attr.item(i).nodeName == \"transform\") {\n"
"		k = attr.item(i).nodeValue.indexOf(\"(\");\n"
"		l = attr.item(i).nodeValue.indexOf(\",\");\n"
"		m = attr.item(i).nodeValue.indexOf(\")\");\n"
"		nodeex = parseFloat(attr.item(i).nodeValue.substring(k+1,l));\n"
"	    }\n"
"	}\n"
"	if (nodesx > nodeex) {\n"
"	    revert[j] = 1;\n"
"	} else {\n"
"	    revert[j] = 0;\n"
"	}\n"
"    }\n"
"}\n"
"\n"
"function setStatus(evt, color1, color2)\n"
"{\n"
"    var clickObj = evt.getTarget();\n"
"    var clickObjName = clickObj.getAttribute('id');\n"
"\n"
"    //find i corresponding to the clicked object\n"
"    for (i=0; i<%i; i++) {\n"
"	if (name[i] == \"\") {\n"
"	    name[i] = clickObjName;\n"
"	    break;\n"
"	}\n"
"	if (name[i] != clickObjName)\n"
"	    continue;\n"
"	break;\n"
"    }\n"
"\n"
"    //toggle click status, color clicked object\n"
"    if (clickStatus[i] == 0) {\n"
"	clickStatus[i] = 1;\n"
"	clickObj.setAttribute(\"style\",\"fill: \"+color1);\n"
"    } else {\n"
"	clickStatus[i] = 0;\n"
"	clickObj.setAttribute(\"style\",\"fill: \"+color2);\n"
"    }\n"
"\n"
"    //adjust color-counter\n"
"    if (color1 == 'red') {\n"
"	if (clickStatus[i] == 1) {\n"
"	    redCount[i]++;\n"
"	} else {\n"
"	    redCount[i]--;\n"
"	}\n"
"    }\n"
"    if (color1 == 'salmon') {\n"
"	if (clickStatus[i] == 1) {\n"
"	    salmonCount[i]++;\n"
"	} else {\n"
"	    salmonCount[i]--;\n"
"	}\n"
"    }\n"
"\n"
"    if (clickStatus[i] == 0 && salmonCount[i] > 0) {\n"
"	clickObj.setAttribute(\"style\",\"fill: salmon\");\n"
"    }\n"
"}\n"
"\n"
"function changeColor(evt, targetObjName, color1, color2)\n"
"{\n"
"    var clickObj = evt.getTarget();\n"
"    var clickObjName = clickObj.getAttribute('id');\n"
"    var targetObj = svgDocument.getElementById(targetObjName);\n"
"\n"
"    //find i corresponding to the clicked object\n"
"    for (i=0; i<%i; i++) {\n"
"	if (name[i] != clickObjName)\n"
"	    continue;\n"
"	break;\n"
"    }\n"
"\n"
"    //find j corresponding to the target object\n"
"    for (j=0; j<%i; j++) {\n"
"	if (name[j] == \"\") {\n"
"	    name[j] = targetObjName;\n"
"	    break;\n"
"	}\n"
"	if (name[j] != targetObjName)\n"
"	    continue;\n"
"	break;\n"
"    }\n"
"\n"
"    //adjust color-counter\n"
"    if (color1 == 'red') {\n"
"	if (clickStatus[i] == 1) {\n"
"	    redCount[j]++;\n"
"	} else {\n"
"	    redCount[j]--;\n"
"	}\n"
"    }\n"
"    if (color1 == 'salmon') {\n"
"	if (clickStatus[i] == 1) {\n"
"	    salmonCount[j]++;\n"
"	} else {\n"
"	    salmonCount[j]--;\n"
"	}\n"
"    }\n"
"}\n"
"\n"
"function colorText(targetObjName, color)\n"
"{\n"
"    var targetObj = svgDocument.getElementById(targetObjName);\n"
"\n"
"    //find i corresponding to the target object\n"
"    for (i=0; i<%i; i++) {\n"
"	if (name[i] != targetObjName)\n"
"	    continue;\n"
"	break;\n"
"    }\n"
"\n"
"    //color text\n"
"    if (i == %i) {\n"
"	targetObj.setAttribute(\"style\",\"fill: \"+color);\n"
"	return;\n"
"    }\n"
"    if (redCount[i] == 0 && salmonCount[i] == 0) {\n"
"	targetObj.setAttribute(\"style\",\"fill: \"+color);\n"
"    }\n"
"    if (salmonCount[i] > 0) {\n"
"	if (color == 'red') {\n"
"	    targetObj.setAttribute(\"style\",\"fill: red\");\n"
"	} else {\n"
"	    if (redCount[i] > 0) {\n"
"		targetObj.setAttribute(\"style\",\"fill: red\");\n"
"	    } else {\n"
"		targetObj.setAttribute(\"style\",\"fill: salmon\");\n"
"	    }\n"
"	}\n"
"    }\n"
"}\n"
;