(function($)
{
	jQuery.fn.emodal = function(opts)
	{
		return this.each(function(i)
		{
			emodal(this, opts);
		});
	};

	var emodal = function(el, opts)
	{
		if(opts == "update" || opts == "updateHeight")
		{
			emodalUpdate(el, opts == "updateHeight");
			return;
		}
		else if(opts == "close")
		{
			jQuery(el).addClass('hidden');
			jQuery('#'+el.opts.modalName+'modal-overlay').addClass('hidden');
			return;
		}
		else if(typeof opts == "object" || typeof opts == "undefined")
		{
			el.opts = jQuery.extend({},
			{
				height: 0,
				width: 0,
				minHeight: 0,
				minWidth: 0,
				maxHeight: 0,
				maxWidth: 0,
				modalName: ''
			}, opts);

			if(!el.opts.maxWidth)
			{
				el.opts.maxWidth = jQuery(window).width() - 50;
			}
		}

		if(!jQuery('#'+el.opts.modalName+'modal-overlay').length)
		{
			jQuery('body').append('<div id="'+el.opts.modalName+'modal-overlay" class="hidden"></div>');
		}

		if(!jQuery('.'+el.opts.modalName+'modal-close', el).length)
		{
			jQuery(el).prepend('<div class="'+el.opts.modalName+'modal-close"></div>');
		}

		jQuery('.'+el.opts.modalName+'modal-close, #'+el.opts.modalName+'modal-overlay').unbind('click').bind('click', function(e)
		{
			jQuery(el).addClass('hidden');
			jQuery('#'+el.opts.modalName+'modal-overlay').addClass('hidden');
		});

		jQuery('.'+el.opts.modalName+'modal:not(.hidden)').emodal('close');

		jQuery('#'+el.opts.modalName+'modal-overlay').removeClass('hidden');

		emodalUpdate(el);

// 		jQuery(el).bind('resize', function(e)
// 		{
// 			emodalUpdate(el);
// 		});
	};

	var emodalUpdate = function(el, heightOnly)
	{
		if(heightOnly)
		{
			jQuery(el).css({
				marginTop: '',
				height: 'auto'
			}).removeClass('hidden');

			if(el.opts)
			{
				var outerHeight = jQuery(el).outerHeight() - jQuery(el).height();
				var height = jQuery(el).height();

				if(el.opts.maxHeight && height > el.opts.maxHeight)
				{
					height = el.opts.maxHeight;
				}
				else if(el.opts.minHeight && height < el.opts.minHeight)
				{
					height = el.opts.minHeight;
				}
			}

			jQuery(el).css({
				marginTop: '-'+((height+outerHeight)/2)+'px'
			});

			jQuery(el).css({
				height: height+'px'
			});
//			}).removeClass('hidden');
		}
		else
		{
			jQuery(el).css({
				position: '',
				left: 0,
				top: 0,
				marginLeft: '',
				marginTop: '',
				height: '',
				width: ''
			}).removeClass('hidden');

			var outerWidth  = jQuery(el).outerWidth() - jQuery(el).width();
			var width = jQuery(el).width();

			if(el.opts)
			{
				if(el.opts.maxWidth && width > el.opts.maxWidth)
				{
					width = el.opts.maxWidth;
				}
				else if(el.opts.minWidth && width < el.opts.minWidth)
				{
					width = el.opts.minWidth;
				}
			}

			jQuery(el).css({
				width: width+'px'
			});

			var outerHeight = jQuery(el).outerHeight() - jQuery(el).height();
			var height = jQuery(el).height();

			if(el.opts)
			{
				if(el.opts.maxHeight && height > el.opts.maxHeight)
				{
					height = el.opts.maxHeight;
				}
				else if(el.opts.minHeight && height < el.opts.minHeight)
				{
					height = el.opts.minHeight;
				}
			}

			jQuery(el).css({
				position: '',
				left: '',
				top: '',
				marginLeft: '-'+((width+outerWidth)/2)+'px',
				marginTop: '-'+((height+outerHeight)/2)+'px',
				height: height+'px'
			});
//			}).removeClass('hidden');
		}

		if(jQuery(el).outerHeight() > jQuery(window).height())
		{
			jQuery(el).css({ position: 'absolute', marginTop: 0, top: '15px' });

			if(jQuery.scrollTo)
			{
				jQuery.scrollTo(el);
			}
		}

		if(jQuery(el).outerWidth() > jQuery(window).width())
		{
			jQuery(el).css({ position: 'absolute', marginLeft: 0, left: '15px' });
		}
	};

})(jQuery);
