function Silk( e, style, prefix, target, suffix, rate, done )
{
    var property;
    var jsStyle = style;
    while( jsStyle.indexOf( "-" ) != -1 )
    {
        var index = jsStyle.indexOf( "-" );
        var letter = jsStyle.substring( index + 1, index + 2 );
        jsStyle = jsStyle.replace( "-" + letter, letter.toUpperCase() );
    }
    if( style == "opacity" && document.all && !window.opera ){ property = "filters.alpha.opacity"; rate *= 100; target *= 100; }
    else property = "style." + jsStyle;
    var formatProperty = property;
    while( formatProperty.indexOf( "." ) != -1 ) formatProperty = formatProperty.replace( ".", "" );
    var instance = this;
    this.kill = function()
    {
        new Function( "e", "e." + formatProperty + "Silk = null;" )( e );
        clearInterval( this.intervalId );
    };    
    if( suffix == null ) suffix = "";
    if( prefix == null ) prefix = "";
    if( new Function( "e", "try{ e." + property + "; return true; } catch( exception ){ return false; }" )( e ) == false ) return;
    new Function( "e", "try{ e." + formatProperty + "Silk; if( e." + formatProperty + "Silk != null ) e." + formatProperty + "Silk.kill(); } catch( exception ){}" )( e );
    var value = parseFloat( new Function( "e", "return new String( e." + property + " );" )( e ).replace( prefix, "" ).replace( suffix, "" ) );
    if( value == "" ) value = 0;
    var incrementFunction = "var quit = false;";
    incrementFunction += "if( value < " + target + " ){ value += " + rate + "; if( value >= " + target + " ) quit = true; }";
    incrementFunction += "else if( value > " + target + " ){ value -= " + rate + "; if( value <= " + target + " ) quit = true; }";
    incrementFunction += "else quit = true;"
    incrementFunction += "if( quit ) value = " + target + ";";
    incrementFunction += "e." + property + " = \"" + prefix + "\" + value + \"" + suffix + "\";";
    incrementFunction += "return ( quit ? null : value );";
    var increment = new Function( "e", "value", incrementFunction );
    this.intervalId = setInterval( function()
    {
        value = increment( e, value );
        if( value == null )
        {
            instance.kill();
            if( done != null ) done();
        }
    }, 1 );
    new Function( "instance", "e", "e." + formatProperty + "Silk = instance;" )( instance, e );
}