﻿
(function ($) {
    var currentRadius, multiplier; function parseOptions(options) { return { RADIUS: (options.radius || 20), DURATION: (options.duration || 500), TEXT_COLOR: (options.textColor || '#fff'), HALO_COLOR: (options.haloColor || '#777')} }
    function currentRadius(elem) { if (prop = elem.style['text-shadow']) { return parseInt(prop.match(/0 0 (\d+)px/)); } else { return 0; } }
    function stepTextShadow(fx) {
        if (fx.state == 0) { fx.start = currentRadius(fx.elem); }
        updatedRadius = fx.end.begin ? parseInt(fx.end.radius * fx.pos) : parseInt(fx.end.radius - (fx.end.radius * fx.pos))
        if (fx.end.begin || (fx.state < 1)) { $(fx.elem).css('text-shadow', fx.end.color + ' 0 0 ' + updatedRadius + 'px'); } else { $(fx.elem).css('text-shadow', $(fx.elem).data('glow.originalGlow')); } 
    }
    function addGlow(opts) {
        var opts = parseOptions(opts || {}); function startGlow() { $(this).stop().animate({ color: opts.TEXT_COLOR, textShadow: { begin: true, color: opts.HALO_COLOR, radius: opts.RADIUS} }, opts.DURATION); }
        function startFade() { $(this).stop().animate({ color: $(this).data('glow.originColor'), textShadow: { begin: false, color: opts.HALO_COLOR, radius: opts.RADIUS} }, opts.DURATION); }
        with ($(this)) { bind('mouseenter', startGlow); bind('mouseleave', startFade); data('glow.originColor', css('color')); data('glow.originalGlow', (css('text-shadow') || 'none')); }
        return this;
    }
    $.fx.step['textShadow'] = stepTextShadow; $.fn.addGlow = addGlow;
})(jQuery);