<?xml version="1.0"?>
<!DOCTYPE activity SYSTEM "escot.dtd" >
<activity escotVersion="1.2.1" name="Scale n' Bowl Part 4" size="634,385" puzzle_id="8">
  <page name="Equivalences">
    <component class="com.sri.escot.NumberEntry" position="155,258" size="94,19" portid="NumberEntry-1">
      <property name="label" value="radius"/>
      <property name="exporting" value="false"/>
      <property name="suffix" value="    X"/>
      <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="355,257" size="115,19" portid="NumberEntry-2">
      <property name="label" value="new radius"/>
      <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="486,349" size="67,31" portid="ButtonPanel-3">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.javascript.JavaScript" position="87,5" size="73,25" portid="JavaScript-1">
      <![CDATA[bowlDecimal = new EscotAction("Bowl Decimal")
addExport(bowlDecimal)

bowlPercent = new EscotAction("Bowl Percent")
addExport(bowlPercent)
bowlPercent.setEnabled(false) // 1st alley is decimal

bowlFraction = new EscotAction("Bowl Fraction")
addExport(bowlFraction)
bowlFraction.setEnabled(false) // 1st alley is decimal

addExport(new EscotAction("Reset"))

// constants
DECIMAL = 0
PERCENT = 1
FRACTION = 2
representation = DECIMAL
MAXRATIO = 5
MAX_EXCEEDED_MSG = "The ball is too big."
USE_DECIMAL_MSG = "Scale with decimals"
USE_PERCENT_MSG = "Scale with percents"
USE_FRACTION_MSG = "Scale with fractions"

A1_PIN = 14.5
A1_BARRIER = 15.5
A2_PIN = 11.5
A2_BARRIER = 12.5
A3_PIN = 23.5
A3_BARRIER = 24.5

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

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

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

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

fractionScaledRadius = new EscotString("fractionScaledRadius", "20")
addExport(fractionScaledRadius)

// 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

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

pinHalfDistance = new
EscotNumber("pinHalfDistance", A1_PIN)
addExport(pinHalfDistance)
barrierHalfDistance = new
EscotNumber("barrierHalfDistance", A1_BARRIER)
addExport(barrierHalfDistance)

// actions to configure the sketch
configAlley1 = new EscotAction("Alley #1 - Decimals")
configAlley2 = new EscotAction("Alley #2 - Percents")
configAlley3 = new EscotAction("Alley #3 - Fractions")

addExport(configAlley1)
addExport(configAlley2)
addExport(configAlley3)

// export for resetting the decimal
myDecimal = new EscotNumber("decimalOut", 1)
addExport(myDecimal)

// export for resetting the percent
myPercent = new EscotNumber("percentOut", 100)
addExport(myPercent)

// export for resetting the fraction
myFraction = new EscotString("fractionOut", "1/1")
addExport(myFraction)


addImporter(new
EscotNumberImporter("originalRadius"))
addImporter(new
EscotNumberImporter("decimal"))
addImporter(new
EscotNumberImporter("percent"))
addImporter(new
EscotStringImporter("fraction"))
addImporter(new
EscotActionImporter("gspBowl"))
addImporter(new
EscotActionImporter("gspReset"))

needsReset = false

function
performed(action) {
	if (action.name == bowlFraction.name && !isLegalFraction(myFraction.value)) {
		message.value = "Please enter a fraction in the form x/y"
		return
	}
	if (action.name == bowlDecimal.name || action.name == bowlPercent.name || action.name == bowlFraction.name) {
		if (needsReset) {
			message.value = "Please Reset the lanes before bowling"
		} else {
			ratio = getRatio()
			if (ratio > MAXRATIO) {
				message.value = MAX_EXCEEDED_MSG
				scaledRadius.value = originalRadius.value * ratio
			} else {
				message.value = defaultMessage
				if (alleyNumber.value == 1) 
					bowlCount.value = ++bowlCount1
				else if (alleyNumber.value == 2)
					bowlCount.value = ++bowlCount2
				else if (alleyNumber.value == 3)
					bowlCount.value = ++bowlCount3
				scaledRadius.value = originalRadius.value * ratio
				limitedRadius.value = scaledRadius.value
				if (gspBowl)
				{
					gspBowl.perform()
				}
				needsReset = true
			}
		}
	} else if (action.name == configAlley1.name) {
		CompleteReset()
		alleyNumber.value = 1
		setRepresentation(DECIMAL)
		bowlCount.value = bowlCount1
		pinHalfDistance.value = A1_PIN
		barrierHalfDistance.value = A1_BARRIER
	} else if (action.name == configAlley2.name) {
		CompleteReset()
		alleyNumber.value = 2
		setRepresentation(PERCENT)
		bowlCount.value = bowlCount2
		pinHalfDistance.value = A2_PIN
		barrierHalfDistance.value = A2_BARRIER
	} else if (action.name == configAlley3.name) {
		CompleteReset()
		alleyNumber.value = 3
		setRepresentation(FRACTION)
		bowlCount.value = bowlCount3
		pinHalfDistance.value = A3_PIN
		barrierHalfDistance.value = A3_BARRIER
	}
}

function setRepresentation(rep) {
	representation = rep
	bowlDecimal.setEnabled(false)
	bowlPercent.setEnabled(false)
	bowlFraction.setEnabled(false)
	switch (representation) {
		case DECIMAL: 
			defaultMessage = USE_DECIMAL_MSG
			message.value = defaultMessage
			bowlDecimal.setEnabled(true)
			break;
		case PERCENT:
			defaultMessage = USE_PERCENT_MSG
			message.value = defaultMessage
			bowlPercent.setEnabled(true)
			break;
		case FRACTION:
			defaultMessage = USE_FRACTION_MSG
			message.value = defaultMessage
			bowlFraction.setEnabled(true)
			break;
	}
	
}

function getRatio() {
	switch (representation) {
		case DECIMAL: 
			return decimal.value
		case PERCENT:
			return 0.01 * percent.value
		case FRACTION:
			return getRatioFromFraction(fraction.value)
	}
}

fractionRegExp = /^ *\d+ *\/ *\d+ *$/

function isLegalFraction(str) {
	return fractionRegExp.test(fraction.value)
}

function getRatioFromFraction(str) {
	// eval didn't seem to work here so parse the integers
	slash = fraction.value.indexOf("/")
	numerator = parseInt(fraction.value.substring(0,slash))
	denominator = parseInt(fraction.value.substr(slash+1))
	return numerator / denominator
}

// synchronize our local associate with foreign one
function decimalChanged() {
	myDecimal.value = decimal.value
	decimalScaledRadius.value = originalRadius.value * myDecimal.value
}

function percentChanged() {
	myPercent.value = percent.value
	percentScaledRadius.value = originalRadius.value * 0.01 * myPercent.value
}

function fractionChanged() {
	myFraction.value = fraction.value
	if (isLegalFraction(myFraction.value)) { 
		newRadius = originalRadius.value * getRatioFromFraction(myFraction.value)
		newRadius = Math.round(newRadius * 1000) / 1000
		fractionScaledRadius.value = ""+ newRadius
	} else
		fractionScaledRadius.value = "???"
}

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

// resets lanes
function ResetPerformed() {
	needsReset = false
	message.value = defaultMessage
	if (gspReset)
{
		gspReset.perform()
	}
}
]]>
    </component>
    <component class="SketchpadBean2" position="314,34" size="312,180" 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="259,257" size="82,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="org.escot.demo.TextEditor" answerText="true" position="5,145" size="307,100" 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,5" size="306,136" portid="HTMLViewer-1">
      <![CDATA[
<html>
<body>
Find the correct scaling ratio that will enlarge or 
reduce the blue ball to fit through the green bowling alley and move 
the two red pins.
<p>
1. For alley 1: Find the correct decimal scaling ratio.  Put it 
into percent and fraction forms.
<p>
2. For alley 2: Find the correct percent scaling ratio.  Put it 
into decimal and fraction forms.
<p>
3. For alley 3: Find the correct fraction scaling ratio.  Put 
it into decimal and percent forms.
<p>
4. Put your solutions in order from largest to smallest.
<p>
BONUS: Which of the three scaling ratio forms was hardest/easiest to use? Why?
</body>
</html>
]]>
    </component>
    <component class="com.sri.escot.NumberEntry" position="553,5" 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="org.escot.demo.StringView" position="319,226" size="271,17" portid="StringView-1">
      <property name="foreground" value="0,0,0"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,1,14"/>
    </component>
    <component class="com.sri.escot.ActionMenu" position="385,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="315,7" 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>
    <component class="com.sri.escot.NumberEntry" position="152,288" size="70,19" portid="NumberEntry-6">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value=""/>
      <property name="value" value="100.0"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="% of"/>
      <property name="editable" value="true"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="248,289" size="93,19" portid="NumberEntry-7">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value="radius"/>
      <property name="value" value="20.0"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="     ="/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="357,289" size="114,19" portid="NumberEntry-8">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value="new radius"/>
      <property name="value" value="20.0"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value=""/>
      <property name="editable" value="false"/>
    </component>
    <component class="com.sri.escot.NumberEntry" position="151,322" size="94,19" portid="NumberEntry-11">
      <property name="maximumDecimalPlaces" value="3"/>
      <property name="label" value="radius"/>
      <property name="value" value="20.0"/>
      <property name="allowNegative" value="true"/>
      <property name="minimumDecimalPlaces" value="0"/>
      <property name="suffix" value="    X"/>
      <property name="editable" value="false"/>
    </component>
    <component class="org.escot.demo.StringEntry" position="256,322" size="84,19" portid="StringEntry-2">
      <property name="text" value="1/1"/>
      <property name="foreground" value="0,0,0"/>
      <property name="label" value=""/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
      <property name="suffix" value="  ="/>
      <property name="editable" value="true"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="480,248" size="124,30" portid="ButtonPanel-1">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="482,282" size="119,30" portid="ButtonPanel-4">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="org.escot.demo.ButtonPanel" position="483,316" size="116,30" portid="ButtonPanel-5">
      <property name="font" value="Dialog,Dialog,0,12"/>
    </component>
    <component class="com.sri.escot.EscotLabel" position="14,260" size="131,15">
      <property name="text" value="Compute Decimals:"/>
      <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="14,292" size="132,15">
      <property name="text" value="Compute Percents:"/>
      <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="13,323" size="129,15">
      <property name="text" value="Compute Fractions:"/>
      <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.StringEntry" position="357,323" size="116,19" portid="StringEntry-1">
      <property name="text" value="20"/>
      <property name="foreground" value="0,0,0"/>
      <property name="label" value="new radius"/>
      <property name="background" value="204,204,204"/>
      <property name="font" value="Dialog,Dialog,0,12"/>
      <property name="suffix" value=""/>
      <property name="editable" value="false"/>
    </component>
    <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-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 - Decimals"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #2 - Percents"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Alley #3 - Fractions"/>
      <to portid="ActionMenu-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="alleyNumber"/>
      <to portid="NumberEntry-5" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="decimalScaledRadius"/>
      <to portid="NumberEntry-2" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="percentScaledRadius"/>
      <to portid="NumberEntry-8" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="fractionScaledRadius"/>
      <to portid="StringEntry-1" name="text"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-6" name="number"/>
      <to portid="JavaScript-1" name="percent"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="NumberEntry-3" name="number"/>
      <to portid="JavaScript-1" name="decimal"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="StringEntry-2" name="text"/>
      <to portid="JavaScript-1" name="fraction"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Bowl Decimal"/>
      <to portid="ButtonPanel-1" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Bowl Percent"/>
      <to portid="ButtonPanel-4" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="Bowl Fraction"/>
      <to portid="ButtonPanel-5" name=""/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="decimalOut"/>
      <to portid="NumberEntry-3" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="percentOut"/>
      <to portid="NumberEntry-6" name="number"/>
    </wire>
    <wire type="org.escot.Broker">
      <from portid="JavaScript-1" name="fractionOut"/>
      <to portid="StringEntry-2" name="text"/>
    </wire>
  </page>
</activity>

