/*
 * jQuery swoosh
 * copyright 2009-2010 justin talbott - justintalbott.com
 * released under the MIT and GPL licenses
 */

(function($){

    /*
     * jQuery Color Animations
     * Copyright 2007 John Resig
     * Released under the MIT and GPL licenses.
     * minified version of http://github.com/jquery/jquery-color
     */
    jQuery.each(['backgroundColor','borderBottomColor','borderLeftColor','borderRightColor','borderTopColor','color','outlineColor'],function(i,attr){jQuery.fx.step[attr]=function(fx){if(!fx.colorInit){fx.start=getColor(fx.elem,attr);fx.end=getRGB(fx.end);fx.colorInit=true}fx.elem.style[attr]="rgb("+[Math.max(Math.min(parseInt((fx.pos*(fx.end[0]-fx.start[0]))+fx.start[0]),255),0),Math.max(Math.min(parseInt((fx.pos*(fx.end[1]-fx.start[1]))+fx.start[1]),255),0),Math.max(Math.min(parseInt((fx.pos*(fx.end[2]-fx.start[2]))+fx.start[2]),255),0)].join(",")+")"}});function getRGB(color){var result;if(color&&color.constructor==Array&&color.length==3)return color;if(result=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))return[parseInt(result[1]),parseInt(result[2]),parseInt(result[3])];if(result=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))return[parseFloat(result[1])*2.55,parseFloat(result[2])*2.55,parseFloat(result[3])*2.55];if(result=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))return[parseInt(result[1],16),parseInt(result[2],16),parseInt(result[3],16)];if(result=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))return[parseInt(result[1]+result[1],16),parseInt(result[2]+result[2],16),parseInt(result[3]+result[3],16)];if(result=/rgba\(0, 0, 0, 0\)/.exec(color))return colors['transparent'];return colors[jQuery.trim(color).toLowerCase()]}function getColor(elem,attr){var color;do{color=jQuery.curCSS(elem,attr);if(color!=''&&color!='transparent'||jQuery.nodeName(elem,"body"))break;attr="backgroundColor"}while(elem=elem.parentNode);return getRGB(color)};var colors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};

    $.fn.swoosh = function(options) {

	var settings = $.extend({}, $.fn.swoosh.settings, options),
	    hover = $("<div id='"+settings.selector+"' style='display:none;'/>").appendTo("body");

	function rgbAndOpacity(elem, prop) {
	    if (rgba = elem.css(prop)) {
		elem.css('opacity', rgba.split(", ")[3].split(")")[0]);
		elem.css(prop, rgba.replace("a","").replace(", "+elem.css('opacity'),""));
	    }
	}

	jQuery.each(['textShadow'], function(i,attr){
	    jQuery.fx.step[attr] = function(fx) {
		if (fx.state == 0) {
		    fx.start = parseShadow(jQuery.curCSS(fx.elem, attr));
		    fx.end = parseShadow(fx.end);
		}
		fx.elem.style[attr] = "rgb(" +
		    Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0) + "," +
		    Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0) + "," +
		    Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0) + ") " +
		    Math.max(Math.min(parseInt(fx.end[3] * fx.pos))) + "px " +
		    Math.max(Math.min(parseInt(fx.end[4] * fx.pos))) + "px " +
		    Math.max(Math.min(parseInt(fx.end[5] * fx.pos))) + "px ";
	    }
	});

	function parseShadow(elem) {
	    var colors, dimesions;
	    if (dimesions = /\s*([0-9]{1,3})px\s*([0-9]{1,3})px\s*([0-9]{1,3})px\s*/.exec(elem)) {
		if (colors = getRGB(elem)) {
		    return [parseInt(colors[0]), parseInt(colors[1]), parseInt(colors[2]),
			    parseInt(dimesions[1]), parseInt(dimesions[2]), parseInt(dimesions[3])];
		}
	    }
	}

	$(this).each(function(){
            var $o = $(this),
		props = [
		    'color',
		    'background-color',
		    'border-bottom-color',
		    'border-left-color',
		    'border-right-color',
		    'border-top-color',
		    'outline-color'
		],
 		camelProps = [
		    'color',
		    'backgroundColor',
		    'borderBottomColor',
		    'borderLeftColor',
		    'borderRightColor',
		    'borderTopColor',
		    'outlineColor'
		],
	        inStyles = {},
	        outStyles = {};
	    $.each(props, function(i, p) {
		if (hover.css(p).match("rgba") && hover.css(p) != 'rgba\(0, 0, 0, 0\)')
		    rgbAndOpacity(hover, p)
		if ($o.css(p).match("rgba") && $o.css(p) != 'rgba\(0, 0, 0, 0\)')
		    rgbAndOpacity($o, p)
		var inColor = hover.css(p),
		    outColor = $o.css(p),
		    inOpq = hover.css('opacity'),
		    outOpq = $o.css('opacity');
		if (inColor && inColor != '' && inColor != 'transparent' && inColor != 'rgba\(0, 0, 0, 0\)') {
		    inStyles[camelProps[i]] = inColor;
		    inStyles['opacity'] = inOpq;
		}
		if (outColor && outColor != '' && outColor != 'transparent' && outColor != 'rgba\(0, 0, 0, 0\)') {
		    outStyles[camelProps[i]] = outColor;
		    outStyles['opacity'] = outOpq;
		}
	    });
	    if (!$.browser.msie && hover.css('text-shadow') && hover.css('text-shadow') != 'none')
		inStyles['textShadow'] = hover.css('text-shadow');
	    if (!$.browser.msie && $o.css('text-shadow') && $o.css('text-shadow') != 'none')
		outStyles['textShadow'] = $o.css('text-shadow');
	    $o.bind(settings.startevent, function(){
                $(this).stop().animate(inStyles, {
		    queue: false,
		    duration: settings.speedin,
		    easing: settings.easingin
		});
            });
	    $o.bind(settings.endevent, function(){
		$(this).stop().animate(outStyles, {
		    queue: false,
		    duration: settings.speedout,
		    easing: settings.easingout
		});
	    });
	});
	return this;
    };

    $.fn.swoosh.settings = {
	speedin    : 64,
	speedout   : 256,
	selector   : 'swoosh',
	easingin   : 'swing',
	easingout  : 'swing',
	startevent : 'mouseover',
	endevent   : 'mouseout'
    };

})(jQuery);
