jQuery(function($)
{
	/*
		Collapsible text blocks
	*/
	$('[data-plugin="collapsible"]').each(function()
	{
		var $this = $(this);
		var collapsedText = '[+] Show more';
		var expandedText = '[-] Show less';
		
		// Initializes the toggle switch
		var $toggle = $('<a class="collapsibleToggle"></a>');
		$toggle
			.toggle(function()
				{
					$this.removeClass('collapsed');
					$toggle.html(expandedText);
				}, function()
				{
					$this.addClass('collapsed');
					$toggle.html(collapsedText);
				})
			.html(collapsedText);
		
		
		// Adds the toggle switch to the DOM
		$this
			.addClass('collapsed')
			.after($toggle);
	});
	
	
	
	/*
		Auto-disabling buttons
	*/
	$('[data-plugin="disableOnClick"]').each(function()
	{
		$(this).click(function(event)
		{
			var $this = $(this);
			if ($this.hasClass('disabled'))
			{
				event.preventDefault();
				return false;
			}
			else
			{
				$this.addClass('disabled');
			}
		});
	});
});



/*
	Forms
----------------------------------------------------------------------------- */

jQuery(function($)
{
	/*
		Dynamic textarea expand/shrink
	*/
	$('textarea[data-plugin="expandOnFocus"]')
		
		// Expands textarea on focus
		.focus(function()
			{
				var $this = $(this);
				var height = 1.5 * parseInt($this.attr('rows'));
				$this.css('height', height + 'em');
			})
		
		// Shrinks empty textarea on blur
		.blur(function()
			{
				var $this = $(this);
				if ($this.val() === '')
				{
					$this.css('height', '');
				}
			});
	
	
	
	/*
		Submit button disable/enable
	*/
	function CheckFields($form)
	{
		var $submit = $form.find('[type="submit"], a.submit');
		
		// Checks whether any fields are empty
		var isValid = true;
		$form.find('input, textarea').filter('.required')
			.each(function()
			{
				if ($(this).val() === '')
				{
					isValid = false;
					return false;
				}
			});
		
		// Checks whether any checkboxes are unchecked
		var isValid = true;
		$form.find(':checkbox').filter('.required')
			.each(function()
			{
				if (!$(this).is(':checked'))
				{
					isValid = false;
					return false;
				}
			});
		
		// Enables/Disables the submit button accordingly
		if (isValid)
		{
			$submit
				.attr('disabled', '')
				.removeClass('disabled')
				.unbind('.disableSubmitUntilValid');
		}
		else
		{
			$submit
				.attr('disabled', 'disabled')
				.addClass('disabled')
				.filter('a.submit')
					.bind('click.disableSubmitUntilValid', function(event)
					{
						event.preventDefault();
						return false;
					});
		}
	}
	
	$('form[data-plugin="disableSubmitUntilValid"]').each(function()
	{
		if ($.browser.msie)
			return;
		
		var $form = $(this);
		
		$form
			.find('input[type="submit"], a.submit')
				.each(function()
				{
					$(this)
						.attr('disabled', 'disabled')
						.addClass('disabled');
				})
				.end()
			.find('a.submit')
				.bind('click.disableSubmitUntilValid', function(event)
				{
					event.preventDefault();
					return false;
				})
				.end()
			.find('input[type="checkbox"]')
				.click(function()
				{
					CheckFields($form);
				})
				.end()
			.keyup(function()
				{
					CheckFields($form);
				})
			.submit(function()
				{
					// Checks whether the hidden input was checked
					// (most likely by a spambot)
					if ($form.find('input.spamcheck').is(':checked'))
					{
						return false;
					}
					
					return true;
				});
	});
});
