jQuery(function($) {
	$.fn.extend({
		expand_me: function(options) {
			var settings = jQuery.extend({
				'text'		: 'Expand',
				'class'		: 'expand-link',
				'href'		: '#expand',
				'increase'	: 150
			},options);
		
			return this.each(
				function() {
					var $el = $(this);
					var $el_parent = $el.parent();
					var o = $.metadata ? $.extend({}, settings, $el.metadata()) : settings;

					$('<a/>').text(o['text']).addClass(o['class']).attr('href',o['href']).click(function(){
						$el.animate({
							height: $el.height()+o['increase']
						}, 'slow');
						$(this).get(0).blur();
						return false;
					}).appendTo($el_parent);
				}
			);
		}
	});
});

// validation-based functions
function toggle_error($element,type,message) {
	if(!/\S/.test($element.val()) && $element.hasClass('required')) {
		message = 'Missing input'; //change the message to missing
	}
	if(type.toLowerCase()=='add') {
		if($element.next().is('strong.error-message')) {
			$element.next().text(message); // updating existing error
		}
		else {
			$('<strong></strong>').addClass('error-message').text(message).insertAfter($element); // adding a new error
		}
		$element.addClass('error').parent('div:first').addClass('error');
	}
	if(type.toLowerCase()=='remove') {
		$element.removeClass('error').removeClass('missing').removeClass('invalid').parent('div:first').removeClass('error').find('strong.error-message').remove();
	}
}
jQuery(function($) {
	$.fn.extend({
		validate_email: function(options) {
			var o = jQuery.extend({
				'event'		: 'blur',
				'trigger'	: false
			},options);
			return this.each(
				function() {
					var $element = $(this);				
					$element.bind(o['event'],function(){
						$element_focus = $(this);
						if(!/^\s*[-\w\d.]+@(?:[-a-z\d]+\.)+[a-z]{2,6}\s*$/i.test($element_focus.val())) {
							$element_focus.addClass('invalid');
							toggle_error($element_focus,'add','Invalid email address');
						}
						else toggle_error($element_focus,'remove','');
					});
					if(o['trigger']==true) $element.trigger(o['event']);
				}
			);
		}
	});
});

jQuery(function($) {
	$.fn.extend({
		validate_required: function(options) {
			var o = jQuery.extend({
				'event'		: 'blur',
				'trigger'	: false
			},options);
			return this.each(
				function() {
					var $element = $(this);					
					$element.bind(o['event'],function(){
						$element_focus = $(this);
						if(!/\S/.test($element_focus.val())) {
							$element_focus.addClass('missing');
							toggle_error($element_focus,'add','Missing input');
						}
						else toggle_error($element_focus,'remove','');
					});
					if(o['trigger']==true) $element.trigger(o['event']);
				}
			);
		}
	});
});

jQuery(function($) {
	$.fn.extend({
		validate_telephone: function(options) {
			var o = jQuery.extend({
				'event'		: 'blur',
				'trigger'	: false
			},options);
			return this.each(
				function() {
					var $element = $(this);					
					$element.bind(o['event'],function(){
						$element_focus = $(this);
						if(!/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/i.test($element_focus.val())) {
							$element_focus.addClass('missing');
							toggle_error($element_focus,'add','Invalid telephone');
						}
						else toggle_error($element_focus,'remove','');
					});
					if(o['trigger']==true) $element.trigger(o['event']);
				}
			);
		}
	});
});

jQuery(function($) {
	$.fn.extend({
		validate_website: function(options) {
			var o = jQuery.extend({
				'event'		: 'blur',
				'trigger'	: false
			},options);
			return this.each(
				function() {
					var $element = $(this);					
					$element.bind(o['event'],function(){
						$element_focus = $(this);
						if(!/^(http:\/\/)?[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+$/i.test($element_focus.val())) {
							$element_focus.addClass('missing');
							toggle_error($element_focus,'add','Invalid website address');
						}
						else toggle_error($element_focus,'remove','');
					});
					if(o['trigger']==true) $element.trigger(o['event']);
				}
			);
		}
	});
});

