﻿(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);