(function($) {
	$.fn.sideNotes = function(options) {
		
		// build main options before element iteration
		var opts = $.extend({}, $.fn.sideNotes.defaults, options);
	
		// iterate and process each matched element
		return $(this)
			.addClass('dynamic-side-note').hide()
			.attr('aria-expanded', false)
			.wrap('<div class="dynamic-side-note-container"></div>')
			.before('<' + opts.toggleElement + ' class="toggler"><a href="#">' + opts.sideNoteToggleText +'</a></' + opts.toggleElement + '>')
			.parent(0)
				.find(opts.toggleElement + '.toggler > a')
					.click(doToggle);
		
		// example of private method
		function doToggle() {
			$(this)
				.parents('.dynamic-side-note-container').eq(0)
					.find('> .dynamic-side-note').each( function() {
						$.fn.sideNotes.toggle.call(this, options);
					});
	
			return false;
		}
	};

	// plugin defaults
	$.fn.sideNotes.defaults = {
		sideNoteToggleText : 'Side note:',
		speed : 'normal',
		toggleElement : 'h3'
	};
	
	// default implementation for the toggler (public. i.e. overrideable)
	$.fn.sideNotes.toggle = function(options) {
		$(this).slideToggle(options.speed, $.fn.sideNotes.toggled);
	};

	// default callback when toggle completed (public. i.e. overrideable)
	$.fn.sideNotes.toggled = function() {
		this['aria-expanded'] = this['aria-expanded'] === true ? false : true;
	
		$(this).trigger('sideNoteToggled', this['aria-expanded']);
	};
})(jQuery);
