<?xml version="1.0"?>
<!DOCTYPE activity SYSTEM "escot.dtd" >
<activity name="Scale n' Bowl Part 2" size="634,378" puzzle_id="6">
  <page name="Decimal Alley Review">
    <component class="com.sri.escot.NumberEntry" position="301,267" size="59,19" portid="NumberEntry-1">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="suffix" value=""/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="543,267" size="63,19" portid="NumberEntry-2">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="suffix" value=""/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="363,320" size="211,29" portid="ButtonPanel-3">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.javascript.JavaScript" position="13,13" size="73,25" portid="JavaScript-1">
      <![CDATA[scalebowlaction = new EscotAction("Scale and Bowl")
addExport(scalebowlaction)
addExport(new EscotAction("Reset"))

maxRatio = 5
maxExceededString = "The ball is too big."

alleyNumber = new EscotNumber("alleyNumber", 1)
addExport(alleyNumber)

scaledRadius = new
EscotNumber("scaledRadius",20)
addExport(scaledRadius)

// limitedRadius is not set if max ratio exceeded
limitedRadius = new EscotNumber("limitedRadius", 20)
addExport(limitedRadius)

// number exported to bowl counter
bowlCount = new EscotNumber("bowlCount", 0)
addExport(bowlCount)

// counters for each alley
bowlCount1 = 0
bowlCount2 = 0
bowlCount3 = 0
bowlCount4 = 0
bowlCount5 = 0

message = new EscotString("message","")
addExport(message)

pinHalfDistance = new
EscotNumber("pinHalfDistance", 16.0)
addExport(pinHalfDistance)
barrierHalfDistance = new
EscotNumber("barrierHalfDistance", 16.5)
addExport(barrierHalfDistance)

// actions to configure the sketch
configAlley1 = new EscotAction("Alley #1")
configAlley2 = new EscotAction("Alley #2")
configAlley3 = new EscotAction("Alley #3")
configAlley4 = new EscotAction("Alley #4")
configAlley5 = new EscotAction("Alley #5")

addExport(configAlley1)
addExport(configAlley2)
addExport(configAlley3)
addExport(configAlley4)
addExport(configAlley5)

// export for resetting the scaling ratio
myFraction = new EscotNumber("fractionOut", 1)
addExport(myFraction)

addImporter(new
EscotNumberImporter("originalRadius"))
addImporter(new
EscotNumberImporter("fraction"))
addImporter(new
EscotActionImporter("gspBowl"))
addImporter(new
EscotActionImporter("gspReset"))

needsReset = false

function performed(action) {
	if (action.name == scalebowlaction.name) {
		if (needsReset) {
			message.value = "Please Reset the lanes before bowling"
		} else if (fraction.value > maxRatio) {
			message.value = maxExceededString
			scaledRadius.value = originalRadius.value * fraction.value
		} else {
			message.value = ""
			if (alleyNumber.value == 1) 
				bowlCount.value = ++bowlCount1
			else if (alleyNumber.value == 2)
				bowlCount.value = ++bowlCount2
			else if (alleyNumber.value == 3)
				bowlCount.value = ++bowlCount3
			else if (alleyNumber.value == 4)
				bowlCount.value = ++bowlCount4
			else if (alleyNumber.value == 5)
				bowlCount.value = ++bowlCount5
			scaledRadius.value = originalRadius.value * fraction.value
			limitedRadius.value = scaledRadius.value
			if (gspBowl)
			{
				gspBowl.perform()
			}
			needsReset = true
		}
	} else if (action.name == configAlley1.name) {
		CompleteReset()
		alleyNumber.value = 1
		bowlCount.value = bowlCount1
		pinHalfDistance.value = 16.0
		barrierHalfDistance.value = 16.5
	} else if (action.name == configAlley2.name) {
		CompleteReset()
		alleyNumber.value = 2
		bowlCount.value = bowlCount2
		pinHalfDistance.value = 59.5
		barrierHalfDistance.value = 60.5
	} else if (action.name == configAlley3.name) {
		CompleteReset()
		alleyNumber.value = 3
		bowlCount.value = bowlCount3
		pinHalfDistance.value = 27
		barrierHalfDistance.value = 29
	} else if (action.name == configAlley4.name) {
		CompleteReset()
		alleyNumber.value = 4
		bowlCount.value = bowlCount4
		pinHalfDistance.value = 15.8
		barrierHalfDistance.value = 17
	} else if (action.name == configAlley5.name) {
		CompleteReset()
		alleyNumber.value = 5
		bowlCount.value = bowlCount5
		pinHalfDistance.value = 6.6
		barrierHalfDistance.value = 7.6
	}
}

// synchronize our local associate with foreign one
function fractionChanged() {
	myFraction.value = fraction.value
}

// resets ball size and lanes
function CompleteReset() {
	myFraction.value = 1
	scaledRadius.value = originalRadius.value
	limitedRadius.value = scaledRadius.value
	ResetPerformed()
}

// resets lanes
function ResetPerformed() {
	needsReset = false
	message.value = ""
	if (gspReset)
{
		gspReset.perform()
	}
}


]]>
    </component>
    <component class="SketchpadBean2" position="293,40" size="334,221" portid="SketchpadBean2-1">{1} Point(515,31)[hidden];
{2} Point(495,31)[hidden];
{3} Point(497,65)[hidden];
{4} Point(517,65)[hidden];
{5} Point(493,104)[hidden];
{6} Point(510,104)[hidden];
{7} Point(496,142)[hidden];
{8} Point(536,149)[hidden];
{9} Point(538,184)[hidden];
{10} Point(499,177)[hidden];
{11} Point(498,214)[hidden];
{12} Point(586,214)[hidden];
{13} Point(71,111)[hidden];
{14} Point(243,111)[hidden];
{15} Point(506,253)[hidden];
{16} Point(563,253)[hidden];
{17} Point(500,292)[hidden];
{18} Point(524,296)[hidden];
{19} Point(454,364)[hidden];
{20} Point(506,335)[hidden];
{21} Point(537,332)[hidden];
{22} Segment(1,2)[hidden,black];
{23} Segment(4,3)[hidden,black];
{24} Segment(6,5)[hidden,black];
{25} Segment(8,7)[hidden,black];
{26} Segment(10,9)[hidden,black];
{27} Segment(12,11)[hidden,black];
{28} Segment(14,13)[hidden,black];
{29} Segment(16,15)[hidden,blue];
{30} Segment(18,17)[hidden,blue];
{31} UnitPoint(19,10.00000000)[hidden];
{32} Line(14,13)[hidden,red];
{33} Segment(21,20)[hidden,blue];
{34} Length(22,482,20,'Original Ball Radius = ')[hidden,black];
{35} Length(24,483,93,'PinDiameter = ')[hidden,black];
{36} Parameter(25,486,129,'Barrier HalfDistance = ')[hidden,black];
{37} Parameter(26,490,168,'Pin HalfDistance = ')[hidden,black];
{38} Point on object(27,1.00000000)[hidden];
{39} Point on object(28,0.00000000)[hidden];
{40} Point on object(28,0.53600615)[hidden];
{41} Length(29,494,243,'Length(Segment Barrier Length) = ')[hidden,blue];
{42} Length(30,495,281,'BarrierWidth = ')[hidden,blue];
{43} Origin&amp;Unit(19,31)[hidden,red];
{44} Point on object(28,1.00000000)[hidden];
{45} Parameter(23,483,53,'BallRadius = ')[hidden,black];
{46} Point on object(33,0.73608202)[hidden];
{47} HideButton(478,337,'Hide')(28)[hidden,cyan];
{48} Translation/FixedAngle/MarkedDistance(13,34,2.35619450)[hidden];
{49} Translation/FixedAngle/MarkedDistance(39,34,2.35619450)[hidden];
{50} HideButton(511,370,'Hide')(45,2,1,22,34)[hidden,red];
{51} ShowButton(15,128,'Show')(45,2,1,22,34)[hidden,red];
{52} Translation/FixedAngle/MarkedDistance(13,45,2.35619450)[hidden];
{53} HideButton(15,86,'Hide')(44)[hidden,green];
{54} ShowButton(15,65,'Show')(44)[hidden,green];
{55} Ratio/Points(11,12,38,366,256,'Ratio(IL/IJ) = ')[hidden,black];
{56} MoveButton(322,356,0,'Reset Lanes')(13,39)[hidden,blue];
{57} Perpendicular(28,40)[hidden,blue];
{58} Translation/FixedAngle/MarkedDistance(40,36,0.00000000)[hidden];
{59} AxisX(43)[hidden,red];
{60} AxisY(43)[hidden,red];
{61} Coordinates(14,43,632,419,'DestIfClears:')[hidden,red];
{62} Translation/FixedAngle/MarkedDistance(44,37,0.00000000)[hidden];
{63} Perpendicular(32,44)[hidden,red];
{64} Ratio/Points(13,14,39,379,608,'Ratio(OriginO/OriginDestIfClears) = ')[hidden,black];
{65} ShowButton(503,503,'Show')(44)[hidden,yellow];
{66} HideButton(503,524,'Hide')(44)[hidden,yellow];
{67} Calculate(543,577,'BallHitsPins = ','1.0000000000 AB/1.0000000000 -@sgn_+@sgn_')(45,37)[hidden,yellow];
{68} Calculate(312,350,'(Barrier HalfDistance)/BallRadius = ','AB/')(36,45)[hidden,red];
{69} Translation/FixedAngle/MarkedDistance(39,45,2.35619450)[hidden];
{70} Ratio/Points(20,21,46,496,320,'Hilight Offset = ')[hidden,red];
{71} Circle(13,48)[red];
{72} Calculate(490,205,'PinTravelStrength = ','5.0000000000 A*')(55)[hidden,suffix('x'),black];
{73} Circle(40,58)[hidden,blue];
{74} Circle(44,62)[hidden,red];
{75} Circle(39,69)[hidden,green];
{76} Calculate(579,499,'ballClearsBarrier = ','1.0000000000 A1.0000000000 -@sgn_+@sgn_')(68)[hidden,red];
{77} Calculate(48,650,'BallHitsPins*(BallRadius + PinDiameter/2) + (1 - BallHitsPins)*2000pix = ','ABC2.0000000000 /+*1.0000000000 A-2000.0000000000 *+')(67,45,35)[hidden,yellow];
{78} Segment(69,39)[hidden,red];
{79} Intersect1(57,73)[hidden];
{80} Intersect1(63,74)[hidden];
{81} HideButton(503,441,'Tidy for JSP Export')(28,40,13,39,14,3,4,23,45,5,6,24,35,7,8,25,36,9,10,26,37,11,12,27,38,72,15,16,29,17,18,30,41,42,76,32)[hidden,red];
{82} Circle interior(75)[blue];
{83} Calculate(88,421,'ballClearsBarrier*(2*(Barrier HalfDistance)) + (1 - ballClearsBarrier)*BallRadius = ','A2.0000000000 B**1.0000000000 A-C*+')(76,36,45)[hidden,red];
{84} Midpoint(78)[hidden];
{85} Circle by radius(80,24)[hidden,red];
{86} Translation/FixedAngle/MarkedDistance(79,42,0.00000000)[hidden];
{87} Translation/FixedAngle/MarkedDistance(79,41,0.00000000)[hidden];
{88} Perpendicular(57,79)[hidden,blue];
{89} Translation/FixedAngle/MarkedDistance(79,45,0.00000000)[hidden];
{90} Translation/FixedAngle/MarkedDistance(79,83,0.00000000)[hidden];
{91} Dilation/MarkedRatio(69,84,70)[hidden];
{92} Intersect1(63,85)[hidden];
{93} Circle(79,86)[hidden,blue];
{94} Circle(79,87)[hidden,blue];
{95} Circle(79,90)[hidden,red];
{96} Circle(84,91)[hidden,red];
{97} Segment(80,92)[hidden,red];
{98} Intersect1(57,93)[hidden];
{99} Intersect1(32,95)[hidden,label('DestIfBlocked')];
{100} Circle interior(96)[cyan];
{101} Midpoint(97)[hidden];
{102} Segment(98,79)[black];
{103} Perpendicular(57,98)[hidden,blue];
{104} Coordinates(99,43,407,412,'Coordinate(Point DestIfBlocked): ')[hidden,red];
{105} Circle(101,80)[hidden,black];
{106} Reflection(102,28)[black];
{107} Perpendicular(103,87)[hidden,blue];
{108} Translation/FixedAngle/MarkedDistance(101,77,0.00000000)[hidden];
{109} Calculate(221,431,'ballClearsBarrier*x[DestIfClears] + (1 - ballClearsBarrier)*x[DestIfBlocked] = ','A#B1*1.0000000000 A-#C1*+')(76,61,104)[hidden,red];
{110} Calculate(221,453,'ballClearsBarrier*y[DestIfClears] + (1 - ballClearsBarrier)*y[DestIfBlocked] = ','A#B2*1.0000000000 A-#C2*+')(76,61,104)[hidden,red];
{111} Intersect(88,107)[hidden];
{112} Intersect(103,107)[hidden];
{113} Circle(101,108)[hidden,green];
{114} PlotXY(110,43,109)[hidden];
{115} Polygon(112,98,79,111)[green];
{116} Segment(79,111)[black];
{117} Segment(111,112)[black];
{118} Segment(112,98)[black];
{119} Intersect1(32,113)[hidden,label('PinHit')];
{120} MoveButton(15,44,40.0,'Bowl')(114,39)[hidden,red];
{121} MoveButton(177,358,1,'Bowl')(114,39)[hidden,black];
{122} Reflection(115,28)[green];
{123} Reflection(117,28)[black];
{124} Reflection(116,28)[black];
{125} Reflection(118,28)[black];
{126} Ratio/Points(13,14,119,366,648,'Ratio(OriginPinHit/OriginDestIfClears) = ')[hidden,green];
{127} Distance(39,119,149,504,'Distance(PinHit to O) = ')[hidden,green];
{128} Ray(101,119)[hidden,green];
{129} HideButton(490,461,'Hide')(121,56)[hidden,yellow];
{130} ShowButton(490,379,'Show')(121,56)[hidden,yellow];
{131} Calculate(3,557,'sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]] = ','1.0000000000 AB-@sgn_+@sgn_')(64,126)[hidden,green];
{132} Calculate(80,621,'(sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins = ','AB*')(131,67)[hidden,green];
{133} Calculate(21,46,'Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins) = ','AB*C*')(127,72,132)[hidden,green];
{134} Calculate(21,90,'1pix + (Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins)) = ','1.0000000000 A+')(133)[hidden,green];
{135} Translation/FixedAngle/MarkedDistance(101,134,0.00000000)[hidden];
{136} Circle(101,135)[hidden,green];
{137} Intersect2(128,136)[hidden];
{138} Intersect1(97,136)[hidden];
{139} VectorTranslation(105,101,137)[black];
{140} Circle interior(139)[red];
{141} Reflection(139,32)[black];
{142} Reflection(140,32)[red];
<property name="SketchBackColor" value="255,255,204"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="417,267" size="53,19" portid="NumberEntry-3">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value=""/>
      <property name="value" value="1.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="true"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="298,291" size="73,16">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="380,270" size="22,15">
      <property name="text" value="X"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="501,271" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="404,290" size="84,18">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Scaling Ratio&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="526,291" size="103,18">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>New Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <!--
    <component class="org.escot.demo.TextEditor" position="6,228" size="273,145" portid="TextEditor-1">
      <![CDATA[
Your solution here]]>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="229,255,255"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
-->
    <component class="org.escot.demo.HTMLViewer" position="5,7" size="273,215" portid="HTMLViewer-1">
      <![CDATA[
<html>
<body>
<b>Review:</b> Find a scaling ratio in the form of a <b>decimal</b> (e.g. 0.5) that will enlarge 
or reduce the blue ball to fit through the green bowling alley and move the 
two red pins. Then go to the next page and try scaling with percents.
</body>
</html>
]]>
    </component>
    <component class="com.sri.escot.NumberEntry" position="553,7" size="76,19" portid="NumberEntry-4">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value=""/>
      <property name="value" value="0.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="bowls"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="381,292" size="17,15">
      <property name="text" value="X"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="502,291" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.StringView" position="345,356" size="257,16" portid="StringView-1">
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <!--
    <component class="com.sri.escot.ActionMenu" position="380,5" size="165,23" portid="ActionMenu-1">
      <property name="label" value="Choose another alley..."/>
      <property name="font" value="SansSerif,SansSerif,1,10"/>
    </component>
-->
    <component class="com.sri.escot.NumberEntry" position="298,8" size="65,19" portid="NumberEntry-5">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value="Alley #"/>
      <property name="value" value="1.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="false"/>
    </component>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Scale and Bowl"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="scaledRadius"/>
      <to portid="NumberEntry-2" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="limitedRadius"/>
      <to portid="SketchpadBean2-1" name="BallRadius = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="pinHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Pin HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="barrierHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Barrier HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-3" name="number"/>
      <to portid="JavaScript-1" name="fraction"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="fractionOut"/>
      <to portid="NumberEntry-3" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-1" name="number"/>
      <to portid="JavaScript-1" name="originalRadius"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Reset Lanes"/>
      <to portid="JavaScript-1" name="gspReset"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Bowl"/>
      <to portid="JavaScript-1" name="gspBowl"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="bowlCount"/>
      <to portid="NumberEntry-4" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Reset"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="message"/>
      <to portid="StringView-1" name="StringView"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="alleyNumber"/>
      <to portid="NumberEntry-5" name="number"/>
    </wire>
  </page>
  <page name="Percent Alleys">
    <component class="com.sri.escot.NumberEntry" position="422,267" size="59,19" portid="NumberEntry-1">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="suffix" value=""/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="543,267" size="63,19" portid="NumberEntry-2">
      <property name="label" value=""/>
      <property name="exporting" value="false"/>
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="suffix" value=""/>
      <property name="value" value="20.0"/>
      <property name="name" value="number"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="editable" value="false"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="363,320" size="211,29" portid="ButtonPanel-3">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.javascript.JavaScript" position="13,243" size="73,25" portid="JavaScript-1">
      <![CDATA[scalebowlaction = new EscotAction("Scale and Bowl")
addExport(scalebowlaction)
addExport(new EscotAction("Reset"))

maxRatio = 500
maxExceededString = "The ball is too big."

alleyNumber = new EscotNumber("alleyNumber", 1)
addExport(alleyNumber)

scaledRadius = new
EscotNumber("scaledRadius",20)
addExport(scaledRadius)

// limitedRadius is not set if max ratio exceeded
limitedRadius = new EscotNumber("limitedRadius", 20)
addExport(limitedRadius)

// number exported to bowl counter
bowlCount = new EscotNumber("bowlCount", 0)
addExport(bowlCount)

// counters for each alley
bowlCount1 = 0
bowlCount2 = 0
bowlCount3 = 0
bowlCount4 = 0
bowlCount5 = 0

message = new EscotString("message","")
addExport(message)

pinHalfDistance = new
EscotNumber("pinHalfDistance", 16.1)
addExport(pinHalfDistance)
barrierHalfDistance = new
EscotNumber("barrierHalfDistance", 16.5)
addExport(barrierHalfDistance)

// actions to configure the sketch
configAlley1 = new EscotAction("Alley #1")
configAlley2 = new EscotAction("Alley #2")
configAlley3 = new EscotAction("Alley #3")
configAlley4 = new EscotAction("Alley #4")
configAlley5 = new EscotAction("Alley #5")

addExport(configAlley1)
addExport(configAlley2)
addExport(configAlley3)
addExport(configAlley4)
addExport(configAlley5)

// export for resetting the scaling ratio
myFraction = new EscotNumber("fractionOut", 100)
addExport(myFraction)

addImporter(new EscotNumberImporter("originalRadius"))
addImporter(new EscotNumberImporter("fraction"))
addImporter(new EscotActionImporter("gspBowl"))
addImporter(new EscotActionImporter("gspReset"))

needsReset = false

function performed(action) {
	if (action.name == scalebowlaction.name) {
		if (needsReset) {
			message.value = "Please Reset the lanes before bowling"
		} else if (fraction.value > maxRatio) {
			message.value = maxExceededString
			scaledRadius.value = originalRadius.value * fraction.value * 0.01
		} else {
			message.value = ""
			if (alleyNumber.value == 1) 
				bowlCount.value = ++bowlCount1
			else if (alleyNumber.value == 2)
				bowlCount.value = ++bowlCount2
			else if (alleyNumber.value == 3)
				bowlCount.value = ++bowlCount3
			else if (alleyNumber.value == 4)
				bowlCount.value = ++bowlCount4
			else if (alleyNumber.value == 5)
				bowlCount.value = ++bowlCount5
			scaledRadius.value = originalRadius.value * fraction.value * 0.01
			limitedRadius.value = scaledRadius.value
			if (gspBowl)
			{
				gspBowl.perform()
			}
			needsReset = true
		}
	} else if (action.name == configAlley1.name) {
		CompleteReset()
		alleyNumber.value = 1
		bowlCount.value = bowlCount1
		pinHalfDistance.value = 16.1
		barrierHalfDistance.value = 16.5
	} else if (action.name == configAlley2.name) {
		CompleteReset()
		alleyNumber.value = 2
		bowlCount.value = bowlCount2
		pinHalfDistance.value = 8.6
		barrierHalfDistance.value = 9.6
	} else if (action.name == configAlley3.name) {
		CompleteReset()
		alleyNumber.value = 3
		bowlCount.value = bowlCount3
		pinHalfDistance.value = 12.44
		barrierHalfDistance.value = 12.59
	} else if (action.name == configAlley4.name) {
		CompleteReset()
		alleyNumber.value = 4
		bowlCount.value = bowlCount4
		pinHalfDistance.value = 26.0
		barrierHalfDistance.value = 26.2
	} else if (action.name == configAlley5.name) {
		CompleteReset()
		alleyNumber.value = 5
		bowlCount.value = bowlCount5
		pinHalfDistance.value = 6.6
		barrierHalfDistance.value = 7.6
	}
}

// synchronize our local associate with foreign one
function fractionChanged() {
	myFraction.value = fraction.value
}

// resets ball size and lanes
function CompleteReset() {
	myFraction.value = 100
	scaledRadius.value = originalRadius.value
	limitedRadius.value = scaledRadius.value
	ResetPerformed()
}

// resets lanes
function ResetPerformed() {
	needsReset = false
	message.value = ""
	if (gspReset)
{
		gspReset.perform()
	}
}


]]>
    </component>
    <component class="SketchpadBean2" position="293,40" size="334,221" portid="SketchpadBean2-1">{1} Point(515,31)[hidden];
{2} Point(495,31)[hidden];
{3} Point(497,65)[hidden];
{4} Point(517,65)[hidden];
{5} Point(493,104)[hidden];
{6} Point(510,104)[hidden];
{7} Point(496,142)[hidden];
{8} Point(536,149)[hidden];
{9} Point(538,184)[hidden];
{10} Point(499,177)[hidden];
{11} Point(498,214)[hidden];
{12} Point(586,214)[hidden];
{13} Point(71,111)[hidden];
{14} Point(243,111)[hidden];
{15} Point(506,253)[hidden];
{16} Point(563,253)[hidden];
{17} Point(500,292)[hidden];
{18} Point(524,296)[hidden];
{19} Point(454,364)[hidden];
{20} Point(506,335)[hidden];
{21} Point(537,332)[hidden];
{22} Segment(1,2)[hidden,black];
{23} Segment(4,3)[hidden,black];
{24} Segment(6,5)[hidden,black];
{25} Segment(8,7)[hidden,black];
{26} Segment(10,9)[hidden,black];
{27} Segment(12,11)[hidden,black];
{28} Segment(14,13)[hidden,black];
{29} Segment(16,15)[hidden,blue];
{30} Segment(18,17)[hidden,blue];
{31} UnitPoint(19,10.00000000)[hidden];
{32} Line(14,13)[hidden,red];
{33} Segment(21,20)[hidden,blue];
{34} Length(22,482,20,'Original Ball Radius = ')[hidden,black];
{35} Length(24,483,93,'PinDiameter = ')[hidden,black];
{36} Parameter(25,486,129,'Barrier HalfDistance = ')[hidden,black];
{37} Parameter(26,490,168,'Pin HalfDistance = ')[hidden,black];
{38} Point on object(27,1.00000000)[hidden];
{39} Point on object(28,0.00000000)[hidden];
{40} Point on object(28,0.53600615)[hidden];
{41} Length(29,494,243,'Length(Segment Barrier Length) = ')[hidden,blue];
{42} Length(30,495,281,'BarrierWidth = ')[hidden,blue];
{43} Origin&amp;Unit(19,31)[hidden,red];
{44} Point on object(28,1.00000000)[hidden];
{45} Parameter(23,483,53,'BallRadius = ')[hidden,black];
{46} Point on object(33,0.73608202)[hidden];
{47} HideButton(478,337,'Hide')(28)[hidden,cyan];
{48} Translation/FixedAngle/MarkedDistance(13,34,2.35619450)[hidden];
{49} Translation/FixedAngle/MarkedDistance(39,34,2.35619450)[hidden];
{50} HideButton(511,370,'Hide')(45,2,1,22,34)[hidden,red];
{51} ShowButton(15,128,'Show')(45,2,1,22,34)[hidden,red];
{52} Translation/FixedAngle/MarkedDistance(13,45,2.35619450)[hidden];
{53} HideButton(15,86,'Hide')(44)[hidden,green];
{54} ShowButton(15,65,'Show')(44)[hidden,green];
{55} Ratio/Points(11,12,38,366,256,'Ratio(IL/IJ) = ')[hidden,black];
{56} MoveButton(322,356,0,'Reset Lanes')(13,39)[hidden,blue];
{57} Perpendicular(28,40)[hidden,blue];
{58} Translation/FixedAngle/MarkedDistance(40,36,0.00000000)[hidden];
{59} AxisX(43)[hidden,red];
{60} AxisY(43)[hidden,red];
{61} Coordinates(14,43,632,419,'DestIfClears:')[hidden,red];
{62} Translation/FixedAngle/MarkedDistance(44,37,0.00000000)[hidden];
{63} Perpendicular(32,44)[hidden,red];
{64} Ratio/Points(13,14,39,379,608,'Ratio(OriginO/OriginDestIfClears) = ')[hidden,black];
{65} ShowButton(503,503,'Show')(44)[hidden,yellow];
{66} HideButton(503,524,'Hide')(44)[hidden,yellow];
{67} Calculate(543,577,'BallHitsPins = ','1.0000000000 AB/1.0000000000 -@sgn_+@sgn_')(45,37)[hidden,yellow];
{68} Calculate(312,350,'(Barrier HalfDistance)/BallRadius = ','AB/')(36,45)[hidden,red];
{69} Translation/FixedAngle/MarkedDistance(39,45,2.35619450)[hidden];
{70} Ratio/Points(20,21,46,496,320,'Hilight Offset = ')[hidden,red];
{71} Circle(13,48)[red];
{72} Calculate(490,205,'PinTravelStrength = ','12.0000000000 A*')(55)[hidden,suffix('x'),black];
{73} Circle(40,58)[hidden,blue];
{74} Circle(44,62)[hidden,red];
{75} Circle(39,69)[hidden,green];
{76} Calculate(579,499,'ballClearsBarrier = ','1.0000000000 A1.0000000000 -@sgn_+@sgn_')(68)[hidden,red];
{77} Calculate(48,650,'BallHitsPins*(BallRadius + PinDiameter/2) + (1 - BallHitsPins)*2000pix = ','ABC2.0000000000 /+*1.0000000000 A-2000.0000000000 *+')(67,45,35)[hidden,yellow];
{78} Segment(69,39)[hidden,red];
{79} Intersect1(57,73)[hidden];
{80} Intersect1(63,74)[hidden];
{81} HideButton(503,441,'Tidy for JSP Export')(28,40,13,39,14,3,4,23,45,5,6,24,35,7,8,25,36,9,10,26,37,11,12,27,38,72,15,16,29,17,18,30,41,42,76,32)[hidden,red];
{82} Circle interior(75)[blue];
{83} Calculate(88,421,'ballClearsBarrier*(2*(Barrier HalfDistance)) + (1 - ballClearsBarrier)*BallRadius = ','A2.0000000000 B**1.0000000000 A-C*+')(76,36,45)[hidden,red];
{84} Midpoint(78)[hidden];
{85} Circle by radius(80,24)[hidden,red];
{86} Translation/FixedAngle/MarkedDistance(79,42,0.00000000)[hidden];
{87} Translation/FixedAngle/MarkedDistance(79,41,0.00000000)[hidden];
{88} Perpendicular(57,79)[hidden,blue];
{89} Translation/FixedAngle/MarkedDistance(79,45,0.00000000)[hidden];
{90} Translation/FixedAngle/MarkedDistance(79,83,0.00000000)[hidden];
{91} Dilation/MarkedRatio(69,84,70)[hidden];
{92} Intersect1(63,85)[hidden];
{93} Circle(79,86)[hidden,blue];
{94} Circle(79,87)[hidden,blue];
{95} Circle(79,90)[hidden,red];
{96} Circle(84,91)[hidden,red];
{97} Segment(80,92)[hidden,red];
{98} Intersect1(57,93)[hidden];
{99} Intersect1(32,95)[hidden,label('DestIfBlocked')];
{100} Circle interior(96)[cyan];
{101} Midpoint(97)[hidden];
{102} Segment(98,79)[black];
{103} Perpendicular(57,98)[hidden,blue];
{104} Coordinates(99,43,407,412,'Coordinate(Point DestIfBlocked): ')[hidden,red];
{105} Circle(101,80)[hidden,black];
{106} Reflection(102,28)[black];
{107} Perpendicular(103,87)[hidden,blue];
{108} Translation/FixedAngle/MarkedDistance(101,77,0.00000000)[hidden];
{109} Calculate(221,431,'ballClearsBarrier*x[DestIfClears] + (1 - ballClearsBarrier)*x[DestIfBlocked] = ','A#B1*1.0000000000 A-#C1*+')(76,61,104)[hidden,red];
{110} Calculate(221,453,'ballClearsBarrier*y[DestIfClears] + (1 - ballClearsBarrier)*y[DestIfBlocked] = ','A#B2*1.0000000000 A-#C2*+')(76,61,104)[hidden,red];
{111} Intersect(88,107)[hidden];
{112} Intersect(103,107)[hidden];
{113} Circle(101,108)[hidden,green];
{114} PlotXY(110,43,109)[hidden];
{115} Polygon(112,98,79,111)[green];
{116} Segment(79,111)[black];
{117} Segment(111,112)[black];
{118} Segment(112,98)[black];
{119} Intersect1(32,113)[hidden,label('PinHit')];
{120} MoveButton(15,44,40.0,'Bowl')(114,39)[hidden,red];
{121} MoveButton(177,358,1,'Bowl')(114,39)[hidden,black];
{122} Reflection(115,28)[green];
{123} Reflection(117,28)[black];
{124} Reflection(116,28)[black];
{125} Reflection(118,28)[black];
{126} Ratio/Points(13,14,119,366,648,'Ratio(OriginPinHit/OriginDestIfClears) = ')[hidden,green];
{127} Distance(39,119,149,504,'Distance(PinHit to O) = ')[hidden,green];
{128} Ray(101,119)[hidden,green];
{129} HideButton(490,461,'Hide')(121,56)[hidden,yellow];
{130} ShowButton(490,379,'Show')(121,56)[hidden,yellow];
{131} Calculate(3,557,'sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]] = ','1.0000000000 AB-@sgn_+@sgn_')(64,126)[hidden,green];
{132} Calculate(80,621,'(sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins = ','AB*')(131,67)[hidden,green];
{133} Calculate(21,46,'Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins) = ','AB*C*')(127,72,132)[hidden,green];
{134} Calculate(21,90,'1pix + (Distance(PinHit to O)*PinTravelStrength*((sgn[1 + sgn[(Ratio(OriginO/OriginDestIfClears)) - (Ratio(OriginPinHit/OriginDestIfClears))]])*BallHitsPins)) = ','1.0000000000 A+')(133)[hidden,green];
{135} Translation/FixedAngle/MarkedDistance(101,134,0.00000000)[hidden];
{136} Circle(101,135)[hidden,green];
{137} Intersect2(128,136)[hidden];
{138} Intersect1(97,136)[hidden];
{139} VectorTranslation(105,101,137)[black];
{140} Circle interior(139)[red];
{141} Reflection(139,32)[black];
{142} Reflection(140,32)[red];
<property name="SketchBackColor" value="255,204,255"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="309,267" size="53,19" portid="NumberEntry-3">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value=""/>
      <property name="value" value="100.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="%"/>
      <property name="editable" value="true"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="419,291" size="73,16">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="380,270" size="22,15">
      <property name="text" value="of"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="501,271" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="307,292" size="58,16">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>Percent&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="526,291" size="103,18">
      <property name="text" value="&#60;html>&#60;font size=&#34;-1&#34;>New Ball Radius&#60;/font>&#60;/html>"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.TextEditor" answerText="true" position="6,228" size="273,145" portid="TextEditor-1">
      <![CDATA[
Your solution here]]>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="229,255,255"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.HTMLViewer" position="5,7" size="273,215" portid="HTMLViewer-1">
      <![CDATA[
<html>
<body>
Find a scaling ratio in the form of a <b>percent</b> that will enlarge 
or reduce the blue ball to fit through the green bowling alley and move the 
two red pins.
<br>1. For each of the 5 alleys, please explain the scaling ratios you tried, why you tried them, and which one worked. 
<br>2. After you have bowled all 5 alleys, put the scaling ratios which worked in order from smallest to largest 
and tell us how you chose this order.
</body>
</html>
]]>
    </component>
    <component class="com.sri.escot.NumberEntry" position="553,7" size="76,19" portid="NumberEntry-4">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value=""/>
      <property name="value" value="0.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="bowls"/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="380,293" size="18,15">
      <property name="text" value="of"/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="502,291" size="21,15">
      <property name="text" value="="/>
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.StringView" position="345,356" size="257,16" portid="StringView-1">
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.ActionMenu" position="380,5" size="165,23" portid="ActionMenu-1">
      <property name="label" value="Choose another alley..."/>
      <property name="font" value="SansSerif,SansSerif,1,10"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="298,8" size="65,19" portid="NumberEntry-5">
      <property name="maximumDecimalPlaces" value="0"/>
      <property name="label" value="Alley #"/>
      <property name="value" value="1.0"/>
      <property name="allowNegative" value="false"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="false"/>
    </component>
    <!--
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #5"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
-->
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Scale and Bowl"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="scaledRadius"/>
      <to portid="NumberEntry-2" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="limitedRadius"/>
      <to portid="SketchpadBean2-1" name="BallRadius = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="pinHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Pin HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="barrierHalfDistance"/>
      <to portid="SketchpadBean2-1" name="Barrier HalfDistance = "/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-3" name="number"/>
      <to portid="JavaScript-1" name="fraction"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="fractionOut"/>
      <to portid="NumberEntry-3" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-1" name="number"/>
      <to portid="JavaScript-1" name="originalRadius"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Reset Lanes"/>
      <to portid="JavaScript-1" name="gspReset"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="SketchpadBean2-1" name="Bowl"/>
      <to portid="JavaScript-1" name="gspBowl"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="bowlCount"/>
      <to portid="NumberEntry-4" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Reset"/>
      <to portid="ButtonPanel-3" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="message"/>
      <to portid="StringView-1" name="StringView"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #1"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #2"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #3"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #4"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="alleyNumber"/>
      <to portid="NumberEntry-5" name="number"/>
    </wire>
  </page>
</activity>

