package com.zincroe.display { import flash.display.FrameLabel; import flash.display.MovieClip; import flash.errors.IllegalOperationError; import flash.utils.setTimeout; import flash.utils.getQualifiedClassName; public class Label { private static var _hash:Object; public static function repeat(context:MovieClip, name:String, callback:Function):void { var label:Label = find(context, name); if(label === null || label.totalFrames === 1) { context.stop(); } else { setTimeout(callback, 1); } } public static function find(context:MovieClip, name:String):Label { var first:int; var index:int; var key:String; var label:FrameLabel; var last:int; var total:int; if(name && name.length && context && context.currentLabels.length) { key = getQualifiedClassName(context); if(!_hash) { _hash = new Object(); } if(!_hash[key]) { _hash[key] = new Object(); first = context.totalFrames + 1; index = context.currentLabels.length; while(index--) { label = context.currentLabels[index]; if(label.frame < first) { last = first - 1; total = first - label.frame; first = label.frame; } _hash[key][label.name] = new Label(label.name, first, last, total); } } return _hash[key][name] || null; } return null; } public static function play(context:MovieClip, name:String, callback:Function):void { var label:Label = find(context, name); if(label === null) { callback(); } else { context.addFrameScript(label.lastFrame - 1, callback); if(label.totalFrames === 1) { context.gotoAndStop(label.name); } else if(context.currentLabel !== label.name || context.currentFrame === label.lastFrame) { context.gotoAndPlay(label.name); } else { context.play(); } } } private var _firstFrame:int; private var _lastFrame:int; private var _name:String; private var _totalFrames:int; public function Label(name:String, firstFrame:int, lastFrame:int, totalFrames:int) { _firstFrame = firstFrame; _lastFrame = lastFrame; _name = name; _totalFrames = totalFrames; } public function get firstFrame():int { return _firstFrame; } public function get lastFrame():int { return _lastFrame; } public function get name():String { return _name; } public function get totalFrames():int { return _totalFrames; } } }