Tooltip, он же Hint, он же всплывающая подсказка, на AS 2.0. Рабочий вариант класса, который использован мной в готовом приложении. Выкладываю as is, кому нужно, тот разберется.

Код:
class Tooltip
{
private var clientList:Array;
private var currentHintIndex;
private var globalMovieClip; // movieClip to get mouse coordinates from, usually _root?
private var xMouseValue, yMouseValue:Number;
private var delayCounter:Number;
private var hitTestCalled:Boolean;
public static var interval:Number = 50; // ticks interval in millisec
public static var delay:Number = 700; // delay mouse stops and before hint shown
public static var movieClipName; // movieclip himself
private var hint;
public function Tooltip()
{
clientList = [];
globalMovieClip = _root;
xMouseValue = globalMovieClip._Xmouse;
yMouseValue = globalMovieClip._Ymouse;
delayCounter = 0;
hitTestCalled = false;
setInterval(this, 'tick', interval);
}
public function tick()
{
if((xMouseValue == globalMovieClip._Xmouse) && (yMouseValue == globalMovieClip._Ymouse))
{
delayCounter += Tooltip.interval;
if(delayCounter >= Tooltip.delay)
{
if(!hitTestCalled) doHitTest();
hitTestCalled = true;
};
}
else
{
hitTestCalled = false;
delayCounter = 0;
hideCurrent();
}
xMouseValue = globalMovieClip._Xmouse;
yMouseValue = globalMovieClip._Ymouse;
}
private function showHint(i)
{
currentHintIndex = i;
if(!clientList[i].txt) return;
hint = mx.managers.DepthManager.createObjectAtDepth('HintMovieClip', mx.managers.DepthManager.kTooltip);
hint.txt.text = clientList[i].txt;
hint._x = globalMovieClip._Xmouse + 10;
hint._y = globalMovieClip._Ymouse + 10;
hint.setDepthTo(mx.managers.DepthManager.kTooltip);
}
private function hideHint(i)
{
currentHintIndex = undefined;
hint.removeMovieClip();
}
private function hideCurrent()
{
if(undefined == currentHintIndex) return;
hideHint(currentHintIndex);
}
private function doHitTest()
{
var mc = getTopmostVisibleMC(_root._Xmouse, _root._Ymouse, _root);
//trace('topmost='+mc);
var index = clientList.getIndexByProp('mc', mc)
if(undefined != index)
{
showHint(index);
}
else
{
sweep(); //while we're in idle
}
}
public function registerClient(mc, txt:String)
{
var i = clientList.getIndexByProp('mc', mc);
if(undefined == i)
{
clientList.push({mc:mc, txt:txt});
}
else
{
clientList[i].txt = txt;
}
}
public function removeClient(mc)
{
var i = clientList.getIndexByProp('mc', mc);
if(undefined == 1) return;
clientList.splice(i, 1);
}
public function sweep()
{
var sweepedList:Array = [];
for(var i:Number = 0; i < clientList.length; i++)
{
if(clientList[i].mc) sweepedList.push(clientList[i]);
}
clientList = sweepedList;
}
public function get length():Number
{
return clientList.length;
}
private function getTopmostVisibleMC(x, y, papa)
{
var candidate = undefined;
for(var foo in papa)
{
if('movieclip' == typeof(papa[foo]))
{
if(!candidate && papa[foo]._visible)
{
if(papa[foo].hitTest(x, y, true)) candidate = papa[foo];
}
else
{
if((candidate.getDepth() < papa[foo].getDepth()))
{
if(papa[foo]._visible && papa[foo].hitTest(x, y, true))
{
candidate = papa[foo];
//trace('ht='+candidate+'@'+candidate.getDepth());
}
}
}
}
}
return candidate;
}
}