jQuery.fn.Triggerable = function(target, triggerCallback) {
	return this.each(function(){
		var s=this;
		s.$triggerable = {
			target: jQuery(target)
				.bind('click', function() {
					s.$triggerable.targetClicked = true;
				}),
			triggerCallback: triggerCallback,
			targetClicked: false,
			expanded: false,
			listener: function(e) {
				if (s.$triggerable.expanded == true && e.target != s && s.$triggerable.targetClicked == false) {
					s.$triggerable.collapse();
				}
				s.$triggerable.targetClicked = false;
			},
			expand: function() {
				if (s.$triggerable.triggerCallback instanceof Function) {
					s.$triggerable.triggerCallback.apply(s, [s.$triggerable.target]);
				}
				s.$triggerable.target.show();
				s.$triggerable.expanded = true;
			},
			collapse: function() {
				s.$triggerable.target.hide();
				s.$triggerable.expanded = false;
			}
		};
		jQuery(s)
			.bind('click', function() {
				if (s.$triggerable.expanded == false) {
					s.$triggerable.expand();
				}
			})
			.bind('keyup', function(e) {
				if (s.$triggerable.expanded == true && e.keyCode == 27) {
					s.$triggerable.collapse();
				}
			});
		jQuery(document).bind('click', s.$triggerable.listener);
		s.$triggerable.collapse();
	});
}
jQuery.fn.triggerCollapse = function() {
	return this.each(function() {
		if (this.$triggerable instanceof Object && this.$triggerable.collapse instanceof Function) {
			return this.$triggerable.collapse();
		}
	});
}
jQuery.fn.triggerExpand = function() {
	return this.each(function() {
		if (this.$triggerable instanceof Object && this.$triggerable.expand instanceof Function) {
			return this.$triggerable.expand();
		}
	});
}