Переливы прозрачности. Плавное изменение свойства

Работает во всех браузерах!


Исходный код этого примера:
<style>
#a {
 background-color: #dc251c;
 border: 3px solid #b4241b;
 padding: 5px;
 opacity: 0.5;
 width: 166px;
}
</style>
<script type="text/javascript">
<!--
function showElement(show, obj, time, resolution) {
 resolution=(resolution>0? resolution: 50); //пауза между фреймами
 var step=(show? 1: -1)*(1/(time>0? time: 1000))*resolution; //шаг в процентах от заданного времени
 var opacity=(typeof(obj.style.KhtmlOpacity)!="undefined")? parseFloat(obj.style.KhtmlOpacity): //konquerror и его семейство
             (typeof(obj.style.MozOpacity)!="undefined")? parseFloat(obj.style.MozOpacity): //мозилла и прочие Gecko. мозилла не покажет какое сейчас значение, если его не меняли...
             (typeof(obj.filters)!="undefined")? obj.filters.Alpha.Opacity.value/100: //IE вариант
             (typeof(obj.style.opacity)!="undefined")? parseFloat(obj.style.opacity): //не стоит доверять, может не undefined для понту, а всё равно не поддерживаеться CSS3
             null; //нет прозрачности как таковой
 if(opacity==null) return;
 opacity=isNaN(opacity)? (show? 0: 1) : opacity; //тест на вшивость
 //и так здесь мозилла(возможно konquerror) обложалась, мы не можем узнать значение opacity если оно не менялось
 //потому в первый раз возьмём как будто мы находимся на границе, либо 0, либо 1
 var timer=window.setInterval(function() {
    if((opacity+=step)>=1||opacity<=0) window.clearInterval(timer);
    if(obj.filters) obj.filters.alpha.opacity=Math.round(opacity*100);
    obj.style.KhtmlOpacity=obj.style.MozOpacity=obj.style.opacity=opacity;
 }, resolution);
}
//-->
</script>
<img src="../ann.jpg" id="a">
<br>
<input type=submit value="Скрыть" onClick="showElement(0,document.getElementById('a'),0,0)">
<input type=submit value="Отобразить" onClick="showElement(1,document.getElementById('a'),0,0)">

.