(function($){
	var app = {
		name: 'hoverize',
		version: '0.1.1',
		date: '2010/06/02',
		author: 'Benjamin Schudel'
	};

	var Hoverize = function(element, options) {
		// self
		var _self = this;
		
		// objects
		var core = {
			hover: false,
			css: {
				backgroundColor: null,
				backgroundImage: null,
				backgroundPosition: null,
				backgroundRepeat: null,
				color: null
			}
		};
		var opt = {
			speed: .4E3,
			css: {}
		};
		var ref = {};
		var obj = {};
		var data = {};
		
		// core
		this._get = function(name, key) {
			var obj = eval(name);
			return (obj && key) ? obj[key] : obj;
		};
		
		// functions
		this.fInit = function() {
			var root = ref.root = $(element);

			if (options)
				jQuery.extend(opt, options);

			// load data from rel tag
			var rel = root.attr('rel');
			if (rel) {
				eval('var ndata = %s;'.replace('%s', rel));
				jQuery.extend(data, ndata);
				if (data.options)
					jQuery.extend(opt, data.options);
				root.removeAttr('rel');
			}
			
			this.fSetup();
		};

		this.fSetup = function() {
			jQuery.each(core.css, function(key){
				core.css[key] = ref.root.css(key);
			});
		
			ref.root.mouseenter(this.eMouseEnter);
			ref.root.mouseleave(this.eMouseLeave);
		};
		
		this.eMouseEnter = function(event) {
			if (core.hover) return;

			var css = opt.css
			jQuery.each(['backgroundImage'], function(key, item){
				if (css[item] !== undefined)
					ref.root.css(item, css[item]);
			});
			ref.root
				.stop()
				.animate(
					css,
					{
						duration: opt.speed
					}
				);
			core.hover = true;
		};

		this.eMouseLeave = function(event) {
			if (!core.hover) return;
			
			var css = core.css;
			jQuery.each(['backgroundImage'], function(key, item){
				if (css[item] !== undefined)
					ref.root.css(item, css[item]);
			});
			ref.root
				.stop()
				.animate(
					css,
					{
						duration: opt.speed, 
						complete: function(){
							ref.root.css(css);
					}}
				);
			core.hover = false;
		};

		this.fInit();
	};
	
	jQuery.fn.extend({
		hoverize: function(options) {
			return this.each(function(){
				if ($(this).data('hoverize')) return;
				var hoverize = new Hoverize(this, options);
				$(this).data('hoverize', hoverize);
			});
		}
	});
})(jQuery);
