$(function () {
    var Toggler = function (opts) {
        // merge options with defaults
        var defaults = {
            'sel': '.toggle'
        };
        opts = $.extend({}, defaults, opts);

        // toggleize .toggle divs and stuff
        $(opts.sel).each(function (index, trigger) {
            var trigger = $(trigger);         // the trigger
            var dest_id = trigger.attr('rel'); // the destination id

            if (typeof dest_id != 'string') return;

            var dest = $('#' + dest_id + ":not(.notoggle)") // the destination		

            if (dest.length == 0) return;

            // sets visibility to none by default
            if(!dest.hasClass('noautotoggle')) dest.hide();

            // converts trigger tags into link if the are not so by default
            if (trigger.get(0).tagName != 'A') {
                var new_trigger = $(document.createElement('A'));
                new_trigger.html(trigger.html());
                trigger.html("");
                trigger.removeAttr('rel');
                trigger.append(new_trigger);

                var trigger = new_trigger;
            }
            trigger.attr('href', 'javascript:void(0)');
            trigger.attr('rel', dest_id);
            trigger.attr('title', TOGGLE_SHOW_LABEL);

            // creates a flexible trigger indicator
            var trigger_i = $(document.createElement('img'));
            trigger_i.attr('src', TOGGLE_IMG_SHOW);
            trigger_i.attr('border', 0);
            trigger.prepend(trigger_i);

            // sets callback
            trigger.click(function () {
                var trigger = $(this);
                var trigger_i = trigger.children('img');
                var dest = $('#' + trigger.attr('rel'));

                var status_prev = dest.css('display');
                var status_next = status_prev == 'none' ? '' : 'none';

                // sets the new status
                status_next == '' ? dest.fadeIn(300) : dest.fadeOut(300);

                // updates trigger and indicator too
                trigger.attr('title', status_next == 'none' ? TOGGLE_SHOW_LABEL : TOGGLE_HIDE_LABEL);
                trigger_i.attr('src', status_next == 'none' ? TOGGLE_IMG_SHOW : TOGGLE_IMG_HIDE);
            })
        });
    };

    // extends jquery
    $.extend({
        toggler: function (opts) {
            var toggler = new Toggler(opts);
        }
    });

    // autoload
    $.toggler();
});
