(function(addEvent)
{

addEvent(window, 'load', function(event)
{
    var replaceSrc = function(image, re, str)
    {
        var src = image.src;
        if (!re.test(src)) {
            return;
        }
        image.src = src.replace(re, function(_, m1, m2)
        {
            return m1 + str + m2;
        });
    };
    var onMouseOver = function(event)
    {
        replaceSrc(event.target, /^(.*_o)ff(\.[^\.]+)$/, 'n');
    };
    var onMouseOut = function(event)
    {
        replaceSrc(event.target, /^(.*_o)n(\.[^\.]+)$/, 'ff');
    };
    if (!window.addEventListener) {
        (function()
        {
            var eventWrapper = function(handler)
            {
                return function(event)
                {
                    event.target = event.srcElement;
                    handler(event);
                };
            };
            onMouseOver = eventWrapper(onMouseOver);
            onMouseOut = eventWrapper(onMouseOut);
        })();
    }

    var images = document.getElementsByTagName("img");
    var length = images.length;
    var re = /^(.*_o)(n|ff)(\.[^\.]+)$/;
    var preloads = [];
    for (var i = 0; i < length; ++i) {
        var image = images[i];
        var src = image.src;
        if (!re.test(src)) {
            continue;
        }
        var preload = new Image();
        preload.src = src.replace(re, function(str, m1, m2, m3)
        {
            return m1 + (m2 == 'n' ? 'ff' : 'n') + m3;
        });
        preloads[preloads.length] = preload;
        addEvent(image, 'mouseover', onMouseOver);
        addEvent(image, 'mouseout', onMouseOut);
    }
    window._preloadedImages = preloads;
});

})(window.addEventListener ? function(element, eventName, handler)
{
    element.addEventListener(eventName, handler, false);
} : (function()
{
    var cache = [];
    window.attachEvent('onunload', function(event)
    {
        for (var i = 0, length = cache.length; i < length; ++i) {
            var e = cache[i];
            e[0].detachEvent(e[1], e[2]);
        }
    });
    return function(element, eventName, handler)
    {
        eventName = 'on' + eventName;
        element.attachEvent(eventName, handler);
        cache[cache.length] = [element, eventName, handler];
    };
})());
