(function($){
	$.fn.modal = function(options) {
		
		// Set options
		var options = jQuery.extend(
			{
				modalMargin: 28,
				modalPadding: 28,
				overlayOpacity: 0.76,
				fadeSpeed: 'fast'
			}, options
		);
		
		// Add overlay code
		if(!$('#modal-overlay').length) 
		{ 
			$('<div id="modal-overlay"></div><div id="modal-window"><div id="modal-content"></div></div><img src="'+base_url+'public/images/modal-close.png" alt="Close" id="modal-close" />').appendTo('body');
		}
		
		// Create code for each box
		this.each(function() {
			
		  	var $this = $(this);
			
			// Listen for click
			$this.click(function() {
				
				// Cache modal box
				var $modalBox = $('#modal-window');
				var boxWidth = $modalBox.width();
			
				// Calculate window dimensions
				var overlayWidth = $(window).width();
				var overlayHeight = $(document).height();
							
				// Calculate box height
				var boxHeight = $(document).height() - (options.modalPadding * 2) - (options.modalMargin * 2);

				// Calculate box positioning
				var boxLeft = (overlayWidth - boxWidth) / 2;
		
				// Calculate close button positioning
				var closeLeft = boxLeft + boxWidth;
		
				// Load content from href with AJAX
				$('#modal-content').empty().load($this.attr('href'), function(response,status,xhr) {
					
					$('#container select').hide();
					
					window.scroll(0,0);

					// Animate overlay and box
					$('#modal-overlay')
						.css({
							height: overlayHeight
						})
						.fadeTo(0, 0)
						.show()
						.fadeTo(options.fadeSpeed, options.overlayOpacity, function() { 
							$modalBox
								.css({
									left: boxLeft,
									height: boxHeight
								})
								.fadeTo(0, 0, function() {
									var contentHeight = $('#modal-content').height();
									if(boxHeight > contentHeight)
									{
										$modalBox.css({height: contentHeight + 5});
									}
								})
								.fadeTo(options.fadeSpeed, 1)
								.next()
								.css({
									left: closeLeft
								})
								.fadeIn(options.fadeSpeed);
						});
					
				});

				return false;
			});
						
		});
		
		// Make sure RETURN key stroke submits form not refresh page
		$('#modal-window input').live('keypress', function(e) { 
			var code = (e.which == 0) ? e.keyCode : e.which;
			if(code == 13) {
				submitForm($(this));
				return false;
			}
		});
		
		// Submit form via button
		$('.submit a').live('click', function() { submitForm($(this)); 
			return false; });
		
		// Listen for click on overlay
		$('#modal-overlay, #modal-close').click(closeModal);		
		
		// Resize overlay if window size changes
		$(window).bind('resize', repositionModal);
		
		return this;
	}
})(jQuery);

function closeModal()
{
	$('#modal-window, #modal-close').fadeOut('fast', function() {
		$('#modal-overlay').fadeOut('fast');
		
		$('#container select').show();
	});
}

function repositionModal()
{
	// Cache modal box
	var $modalBox = $('#modal-window');
	var overlayWidth = $(window).width();
	var boxWidth = $modalBox.width();
	
	// Calculate box positioning
	var boxLeft = (overlayWidth - boxWidth) / 2;
	if(boxLeft < 0) boxLeft = 0;

	// Calculate close button positioning
	var closeLeft = boxLeft + boxWidth;
	
	$('#modal-overlay').css({height: $(window).height()});
	$modalBox.css({left: boxLeft});
	$('#modal-close').css({left: closeLeft});
}

function resizeModal()
{
	// Cache modal box
	var $modalBox = $('#modal-window');
	var overlayWidth = $(window).width();
	var boxWidth = $modalBox.width();
	
	// Calculate box height
	var boxHeight = $(document).height() - (18 * 4);
	var contentHeight = $('#modal-content').height();
	if(boxHeight > contentHeight)
	{
		boxHeight = contentHeight + 5;
	}
	
	// Calculate box positioning
	var boxLeft = (overlayWidth - boxWidth) / 2;
	if(boxLeft < 0) boxLeft = 0;

	// Calculate close button positioning
	var closeLeft = boxLeft + boxWidth;
	
	$('#modal-overlay').css({height: $.getDocHeight()});
	$modalBox.css({left: boxLeft, height: boxHeight});

	// Check if we want to hide the close bar
	if( $('#modal-close-hidden').length > 0 ) {
		$('#modal-close').hide();
	} else {
		$('#modal-close').show();
	}

	$('#modal-close').css({left: closeLeft});
}

function submitForm(element)
{
	var $form = element.parents('form');
	// Inject ajax indicator
	$('#ajax-loader').show();
	$.post($form.attr('action'), $form.serialize(), function(html) {
		// $('#modal-content').html(html);
		$('#modal-content').empty();
		var c = document.getElementById('modal-content');
		c.innerHTML = html;
		$('#modal-content .javascript').each(function(){
			eval($(this).text());
		});
		labelInit();
		submitInit();
		resizeModal();
		window.scrollTo(0,0);
	});
}
