;(function($)
{
    var hideTarget = function($this)
    {
        $(document).unbind('click.dropDown');
        $this.removeClass('dropDownActive');
        $this.find('.target').fadeOut('fast');
        $this.find('.trigger')
            .show()
            .unbind('click.dropDown');
    };

    $.fn.dropDown = function(options)
    {
        var config = $.extend({}, $.fn.dropDown.defaults, options);

        return this.each(function()
        {
            var $this = $(this);
            var $target = $this.find('.target');
            var $trigger = $this.find('.trigger');

            $trigger.click(function(event)
            {
                event.preventDefault();
                event.stopPropagation();
                $(document).unbind('click.dropDown');
                $('.target:visible')
                    .fadeOut('fast')
                    .parent()
                    .removeClass('dropDownActive')
                    .find('.trigger')
                    .show();

                if (config.hideTrigger)
                    $trigger.fadeOut('fast');

                $this.addClass('dropDownActive');
                $target.filter(':not(:visible)').fadeIn('fast');

                $trigger.bind('click.dropDown', function(event)
                {
                    event.preventDefault();
                    hideTarget($this);
                });

                $(document).bind('click.dropDown', function(event)
                {
                    event.preventDefault();

                    var $eventTarget = $(event.target);
                    if ($eventTarget.parents().is('.dropDownActive'))
                    {
                        if (config.clickedCallback($eventTarget) === true)
                            hideTarget($this);
                    }
                    else
                    {
                        hideTarget($this);
                    }
                });
            });
        });
    };

    $.fn.dropDown.defaults = {
        clickedCallback: function($elem) {},
        hideTrigger: true
    };
})(jQuery);