package { import flash.display.GradientType; import flash.display.MovieClip; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.geom.Matrix; import flash.geom.Point; import flash.net.URLLoader; import flash.net.URLRequest; import flash.text.TextField; import flash.utils.Timer; import fl.events.SliderEvent; public class EventSprite extends MovieClip { static function clamp(number:Number):Number { if (number < 0) { return 0; } else if (number > 255) { return 255; } else { return number; } } static function lerp(a:Number, b:Number, t:Number) { return (b - a) * t + a; } var _eventXML:XML; public function get eventXML():XML{ return _eventXML; } function EventSprite(event:XML, timeNow:Number, cutOffEarly:Number, activeEventsStart:Array, activeEventsEnd:Array, eventsHolder:MovieClip) { var startTimeTicks:Number = event.startTime.text(); var startTimeRotation:Number = Clock.hourHandRotation(startTimeTicks); var endTimeTicks:Number = event.endTime.text(); var endTimeRotation:Number = Clock.hourHandRotation(endTimeTicks); _eventXML = event; var difference:Number = endTimeRotation - startTimeRotation; if (difference < 0) { difference += 360; } var maxRotation:Number = (cutOffEarly + Clock.MILLISECONDS_PER_HALF_DAY - startTimeTicks) / (Clock.MILLISECONDS_PER_HALF_DAY / 360); if (maxRotation < 0) { return; // event starts too late to be visible } var minRotation:Number = (cutOffEarly - startTimeTicks) / (Clock.MILLISECONDS_PER_HALF_DAY / 360); if (minRotation > difference) { return; // event starts too early to be visible } var anglePoint:Point = null; var armLength:Number = 180; var startShade:Number = 2.4; var endShade:Number = 0.60; var red:Number = event.color.red.text(); var green:Number = event.color.green.text(); var blue:Number = event.color.blue.text(); rotation = startTimeRotation - 90; var minTicks:Number = Math.max(startTimeTicks, cutOffEarly); for(var idx:int = 0; idx != activeEventsStart.length; idx++) { if (minTicks >= activeEventsStart[idx] && minTicks < activeEventsEnd[idx]) { armLength -= 5; } } activeEventsStart.push(minTicks); activeEventsEnd.push(endTimeTicks); var textRotateOffset:Number = Math.max(0, minRotation); if (Math.min(difference, maxRotation) - Math.max(minRotation, 0) >= (360 / (Clock.MINUTES_PER_HOUR * Clock.HOURS_PER_HALF_DAY)) * 15) {// 15 mins min for label var adjustedRotation:Number = rotation + textRotateOffset; while(adjustedRotation <-180) { adjustedRotation += 360; } while(adjustedRotation >= 180) { adjustedRotation -= 360; } if(adjustedRotation >= -90 && adjustedRotation < 90) { textContentFlipped.label.text = event.name.text(); textContent.visible = false; textContentFlipped.rotation += textRotateOffset; } else { textContent.label.text = event.name.text(); textContentFlipped.visible = false; textContent.rotation += textRotateOffset; } } else { textContent.visible = false; textContentFlipped.visible = false; } for (var r:Number = 0; r <= difference; r += 1) { if (r > maxRotation) { break; } var rR:Number = r / 180 * Math.PI; var newAnglePoint:Point = new Point(Math.cos(rR) * armLength, Math.sin(rR) * armLength); if (anglePoint != null && r >= minRotation) { var t:Number = r / difference; var newRed:Number = clamp(lerp(red * startShade, red * endShade, t)); var newGreen:Number = clamp(lerp(green * startShade, green * endShade, t)); var newBlue:Number = clamp(lerp(blue * startShade, blue * endShade, t)); var eventNow:Number = startTimeTicks + (r / difference) * (endTimeTicks - startTimeTicks); if (eventNow < timeNow) { var grey:Number = (newRed + newGreen + newBlue) / 3; newRed = grey; newGreen = grey; newBlue = grey; } graphics.beginFill((newRed << 16) + (newGreen << 8) + newBlue); graphics.moveTo(0, 0); graphics.lineTo(anglePoint.x, anglePoint.y); graphics.lineTo(newAnglePoint.x, newAnglePoint.y); graphics.lineTo(0, 0); } anglePoint = newAnglePoint; } eventsHolder.addChild(this); } } }