var parentObject; if( ! parent ) { parentObject = new Object(); } else { parentObject = parent; } ColorArray = new Array("#FF9966", "#C2A00E", "#71A214", "#3399CC", "#CC99FF", "#FF9999", "#00CC99", "#C2CC0E", "#71CC14", "#CC68CC", "#66FFCC") ActiveSegment = "Pie" CurrentColor = 0; SVGDocument = null BarChartHeight = 150 BarChartWidth = 250 PieChartSize = 140 MoveDistance = 40 Values = new Array() Names = new Array() PieElements = new Array() BarElements = new Array() BarTexts = new Array() DeleteList = new Array() PieTotalSize = 0; BarTotalSize = 0; MaxSize = 0; AngleFactor = Math.pow(2, .5) Removed = false function ClearChart() { for (var I = 0; I < PieElements.length; I++) { ParentGroup1.removeChild(PieElements[I]) ParentGroup2.removeChild(BarElements[I]) SVGDocument.getElementById("labels").removeChild(Names[I]) } PieElements = new Array() BarElements = new Array() BarTexts = new Array() Values = new Array() Names = new Array() PieTotalSize = 0; BarTotalSize = 0; MaxSize = 0; if (!(Removed)) { Grandparent1.removeChild(ParentGroup1) Grandparent2.removeChild(ParentGroup2) } Removed = true } function Initialize(LoadEvent) { SVGDocument = LoadEvent.getTarget().getOwnerDocument() ParentGroup1 = SVGDocument.getElementById("slices") Grandparent1 = SVGDocument.getElementById("piechart") ParentGroup2 = SVGDocument.getElementById("bars") Grandparent2 = SVGDocument.getElementById("barchart") ShowPie(); Populate(); } function AddChartValue(Value, Name, Repress) { Value = Value * 1 if ((Value <= 0) || (isNaN(Value))) { alert("Negative, textual or null values are not allowed") return; } Color = ColorArray[CurrentColor] CurrentColor++ if (CurrentColor >= ColorArray.length) CurrentColor = 0 if (!(Removed)) { Grandparent1.removeChild(ParentGroup1) Grandparent2.removeChild(ParentGroup2) } DeleteList[DeleteList.length] = false Values[Values.length] = Value * 1 Names[Names.length] = SVGDocument.createElement("text") PieElements[PieElements.length] = SVGDocument.createElement("path") PieElements[PieElements.length - 1].setAttribute("style", "stroke:black;fill:" + Color) PieElements[PieElements.length - 1].setAttribute("onmouseover", "DisplayInfo('" + Name + "', '" + Value + "')") PieElements[PieElements.length - 1].setAttribute("onmouseout", "DisplayInfo(' ', ' ')") ParentGroup1.appendChild(PieElements[PieElements.length - 1]) BarElements[BarElements.length] = SVGDocument.createElement("path") BarTexts[BarTexts.length] = SVGDocument.createElement("text") BarElements[BarElements.length - 1].setAttribute("style", "stroke:black;fill:" + Color) BarElements[BarElements.length - 1].setAttribute("onmouseover", "BarTexts[" + (BarTexts.length - 1) + "].getStyle().setProperty('visibility', 'show')") BarElements[BarElements.length - 1].setAttribute("onmouseout", "BarTexts[" + (BarTexts.length - 1) + "].getStyle().setProperty('visibility', 'hidden')") ParentGroup2.appendChild(BarElements[BarElements.length - 1]) BarTexts[BarTexts.length - 1].setAttribute("style", "text-anchor:end;font-weight:bold;font-size:13;visibility:hidden") BarTexts[BarTexts.length - 1].setAttribute("x", "79") BarTexts[BarTexts.length - 1].appendChild(SVGDocument.createTextNode(Value + " -")) SVGDocument.getElementById("barsidetext").appendChild(BarTexts[BarTexts.length - 1]) Names[Names.length - 1].appendChild(SVGDocument.createTextNode(Name + "")) Names[Names.length - 1].setAttribute("transform", "rotate(45)") SVGDocument.getElementById("labels").appendChild(Names[Names.length - 1]) Refresh() if (Repress) Removed = true else { Removed = false Grandparent1.appendChild(ParentGroup1) Grandparent2.appendChild(ParentGroup2) } } function Refresh() { PieTotalSize = 0 BarTotalSize = 0 MaxSize = 0 for (var I = 0; I < Values.length; I++) { PieTotalSize += Values[I] BarTotalSize++ if (Values[I] > MaxSize) MaxSize = Values[I] } PieStart = 0 BarStart = 0 if (PieTotalSize > 0) for (var I = 0; I < Values.length; I++) { PieStart = DrawPieSegment(PieStart, Values[I] / PieTotalSize, PieElements[I], I) BarStart = DrawBarSegment(BarStart, Values[I] / MaxSize, BarElements[I], BarTexts[I], Names[I]) } SVGDocument.getElementById("max").replaceChild(SVGDocument.createTextNode(MaxSize + ""), SVGDocument.getElementById("max").getFirstChild()) SVGDocument.getElementById("min").replaceChild(SVGDocument.createTextNode("0"), SVGDocument.getElementById("min").getFirstChild()) } function DeleteSegment() { if (ActiveSegment == "Pie") { NewValues = new Array() NewNames = new Array() NewPieElements = new Array() NewBarElements = new Array() NewBarTexts = new Array() NewDeleteList = new Array() SomethingDeleted = false CurrentCopySpot = 0 for (var I = 0; I < PieElements.length; I++) { if (!(DeleteList[I])) { NewValues[CurrentCopySpot] = Values[I] NewNames[CurrentCopySpot] = Names[I] NewPieElements[CurrentCopySpot] = PieElements[I] NewBarElements[CurrentCopySpot] = BarElements[I] NewBarTexts[CurrentCopySpot] = BarTexts[I] NewDeleteList[CurrentCopySpot] = DeleteList[I] NewBarElements[CurrentCopySpot].setAttribute("onmouseover", "BarTexts[" + CurrentCopySpot + "].getStyle().setProperty('visibility', 'show')") NewBarElements[CurrentCopySpot].setAttribute("onmouseout", "BarTexts[" + CurrentCopySpot + "].getStyle().setProperty('visibility', 'hidden')") CurrentCopySpot++ } else { SomethingDeleted = true PieElements[I].getParentNode().removeChild(PieElements[I]) BarElements[I].getParentNode().removeChild(BarElements[I]) BarTexts[I].getParentNode().removeChild(BarTexts[I]) Names[I].getParentNode().removeChild(Names[I]) } } if (SomethingDeleted) { Values = NewValues Names = NewNames PieElements = NewPieElements BarElements = NewBarElements BarTexts = NewBarTexts DeleteList = NewDeleteList Refresh() } else alert("To delete segments, click on the segments to be deleted to pull them out, then click on the Delete button") } else { NewValues = new Array() NewNames = new Array() NewPieElements = new Array() NewBarElements = new Array() NewBarTexts = new Array() NewDeleteList = new Array() SomethingDeleted = false CurrentCopySpot = 0 for (var I = 0; I < PieElements.length - 1; I++) { NewValues[I] = Values[I] NewNames[I] = Names[I] NewPieElements[I] = PieElements[I] NewBarElements[I] = BarElements[I] NewBarTexts[I] = BarTexts[I] NewDeleteList[I] = DeleteList[I] NewBarElements[I].setAttribute("onmouseover", "BarTexts[" + CurrentCopySpot + "].getStyle().setProperty('visibility', 'show')") NewBarElements[I].setAttribute("onmouseout", "BarTexts[" + CurrentCopySpot + "].getStyle().setProperty('visibility', 'hidden')") CurrentCopySpot++ } if (PieElements.length > 0) { SomethingDeleted = true PieElements[PieElements.length - 1].getParentNode().removeChild(PieElements[PieElements.length - 1]) BarElements[PieElements.length - 1].getParentNode().removeChild(BarElements[PieElements.length - 1]) BarTexts[PieElements.length - 1].getParentNode().removeChild(BarTexts[PieElements.length - 1]) Names[PieElements.length - 1].getParentNode().removeChild(Names[PieElements.length - 1]) } if (SomethingDeleted) { Values = NewValues Names = NewNames PieElements = NewPieElements BarElements = NewBarElements BarTexts = NewBarTexts DeleteList = NewDeleteList Refresh() } } } parentObject.deleteOuties = DeleteSegment function DrawBarSegment(Start, Height, Element, Text, Label) { XOffset3D = 10 YOffset3D = 5 PathData = "M" + (Start + (BarChartWidth / BarTotalSize)) + ",0" PathData = PathData + "h" + (BarChartWidth / BarTotalSize * -1) PathData = PathData + "v" + (Height * BarChartHeight * -1) PathData = PathData + "l" + XOffset3D + ",-" + YOffset3D PathData = PathData + "h" + (BarChartWidth / BarTotalSize) PathData = PathData + "v" + (Height * BarChartHeight) PathData = PathData + "l-" + XOffset3D + "," + YOffset3D PathData = PathData + "v" + (Height * BarChartHeight * -1) PathData = PathData + "h" + (BarChartWidth / BarTotalSize * -1) PathData = PathData + "h" + (BarChartWidth / BarTotalSize) PathData = PathData + "l" + XOffset3D + ",-" + YOffset3D PathData = PathData + "l-" + XOffset3D + "," + YOffset3D Element.setAttribute("d", PathData) Label.setAttribute("x", Start / AngleFactor) Label.setAttribute("y", Start * -1 / AngleFactor) Text.setAttribute("y", (175 - BarChartHeight * Height)) return Start + BarChartWidth / BarTotalSize } function DrawPieSegment(Start, Size, Element, ID) { PathData = "M0,0L" PathData = PathData + PieChartSize * Math.sin(Start * Math.PI * 2) + "," + PieChartSize * Math.cos(Start * Math.PI * 2) if (Size >= .5) PathData = PathData + "A" + PieChartSize + " " + PieChartSize + " 1 1 0 " + PieChartSize * Math.sin((Start + Size) * Math.PI * 2) + "," + PieChartSize * Math.cos((Start + Size) * Math.PI * 2) else PathData = PathData + "A" + PieChartSize + " " + PieChartSize + " 0 0 0 " + PieChartSize * Math.sin((Start + Size) * Math.PI * 2) + "," + PieChartSize * Math.cos((Start + Size) * Math.PI * 2) PathData = PathData + "z" Element.setAttribute("d", PathData) if (Start > 0) Element.setAttribute("onclick", "MoveSegment(evt, " + (Start + Size / 2) + ", true, " + ID + ")") else { DeleteList[ID] = true; Angle = Start + Size / 2 X = MoveDistance * Math.sin(Angle * 2 * Math.PI) Y = MoveDistance * Math.cos(Angle * 2 * Math.PI) Element.setAttribute("transform", "translate(" + X + "," + Y + ")") Element.setAttribute("onclick", "MoveSegment(evt, " + ((Start + Size / 2) * -1) + ", false, " + ID + ")") } return Start + Size } function MoveSegment(MouseEvent, Angle, CanBeDeleted, ID) { Element = MouseEvent.getTarget() if (Angle < 0) { X = 0 Y = 0 } else { X = MoveDistance * Math.sin(Angle * 2 * Math.PI) Y = MoveDistance * Math.cos(Angle * 2 * Math.PI) } DeleteList[ID] = CanBeDeleted Element.setAttribute("transform", "translate(" + X + "," + Y + ")") Element.setAttribute("onclick", "MoveSegment(evt, " + (Angle * -1) + ", " + (!CanBeDeleted) + ", " + ID + ")") } function DisplayInfo(Text, Value) { if (Text != " ") Percent = " (" + Math.round(Value / PieTotalSize * 10000) / 100 + "%)" else Percent = "" NewItem = SVGDocument.createTextNode(Value + Percent) SVGDocument.getElementById("labelamount").replaceChild(NewItem, SVGDocument.getElementById("labelamount").getFirstChild()) NewItem = SVGDocument.createTextNode(Text + "") SVGDocument.getElementById("labelitem").replaceChild(NewItem, SVGDocument.getElementById("labelitem").getFirstChild()) if (Text + Value == " ") NewItem = SVGDocument.createTextNode(" ") else NewItem = SVGDocument.createTextNode(":") SVGDocument.getElementById("labelcolon").replaceChild(NewItem, SVGDocument.getElementById("labelcolon").getFirstChild()) } function SetTitle(Text) { NewItem = SVGDocument.createTextNode(Text + "") SVGDocument.getElementById("title").replaceChild(NewItem, SVGDocument.getElementById("title").getFirstChild()) } function SetAxis(Text) { NewItem = SVGDocument.createTextNode(Text + "") SVGDocument.getElementById("axis").replaceChild(NewItem, SVGDocument.getElementById("axis").getFirstChild()) NewItem = SVGDocument.createTextNode(Text + "") SVGDocument.getElementById("subtitle").replaceChild(NewItem, SVGDocument.getElementById("subtitle").getFirstChild()) } function ShowPie() { ActiveSegment = "Pie" // SVGDocument.getElementById("showpierect").getStyle().setProperty("fill", "blue"); // SVGDocument.getElementById("showbarrect").getStyle().setProperty("fill", "#FC8D4F"); SVGDocument.getElementById("barchart").getStyle().setProperty("visibility", "hidden"); SVGDocument.getElementById("subtitle").getStyle().setProperty("visibility", "show"); SVGDocument.getElementById("piechart").getStyle().setProperty("visibility", "show"); SVGDocument.getElementById("pieitemlabel").getStyle().setProperty("visibility", "show"); SVGDocument.getElementById("barsidetext").getStyle().setProperty("visibility", "hidden"); } function ShowBar() { ActiveSegment = "Bar" // SVGDocument.getElementById("showpierect").getStyle().setProperty("fill", "#FC8D4F"); // SVGDocument.getElementById("showbarrect").getStyle().setProperty("fill", "blue"); SVGDocument.getElementById("barchart").getStyle().setProperty("visibility", "show"); SVGDocument.getElementById("subtitle").getStyle().setProperty("visibility", "hidden"); SVGDocument.getElementById("piechart").getStyle().setProperty("visibility", "hidden"); SVGDocument.getElementById("pieitemlabel").getStyle().setProperty("visibility", "hidden"); SVGDocument.getElementById("barsidetext").getStyle().setProperty("visibility", "show"); } function Populate() { // Data taken from http://www.undp.org/popin/wdtrends/pop1998 parentObject.addChartValue(1255698, "China", true) /* parentObject.addChartValue(982223, "India", true) parentObject.addChartValue(274028, "United States of America", true) parentObject.addChartValue(206338, "Indonesia", true) parentObject.addChartValue(165851, "Brazil", true) parentObject.addChartValue(148166, "Pakistan", true) parentObject.addChartValue(147434, "Russian Federation", true) */ parentObject.addChartValue(126281, "Japan", true) parentObject.addChartValue(106409, "Nigeria", true) parentObject.addChartValue(212818, "Canada", true) parentObject.addChartValue(95831, "Mexico", false) parentObject.setTitle("World Populations ca. 1998") parentObject.setAxis("1000's of people") } parentObject.clearChart = ClearChart parentObject.addChartValue = AddChartValue parentObject.setTitle = SetTitle parentObject.setAxis = SetAxis