﻿/* jQuery extensions
---------------------------- */
/*  
<{0} class="collapse-container">
<{1} class="collapse-item">
<{2:block markup} class="collapse-handle">title</{2:block markup}>
<{3} class="collapse-content"></{3}>
</{1}>
</{0}>                         
*/
(function($) {

    $.collapse = { version: '1.2.0', mode: { single: 1, multiple: 2 }, selector: '' };

    $.collapse.open = function(target) {
        $('.collapse-item', $.collapse.selector).each(function() {
            var obj = $(this);
            var item_index = obj.index();
            var handles = $('.collapse-handle', obj);
            $('a[name=' + target + ']', handles).parent().click();
        });
    };

    $.fn.collapse = function(args) {
        var opts = {
            mode: undefined,
            initial_state: 'closed' /* 'closed','opened' */,
            initial_index: -1
        };

        $.extend(opts, args);

        var container = this;
        $.collapse.selector = this.selector;

        $('a[href^="#"]').click(function() {
            $.collapse.open($(this).attr('href').substr(1));
        });

        return $('.collapse-item', this).each(function(i) {
            var obj = $(this);
            var item_index = obj.index();
            var handles = $('.collapse-handle', obj);

            if (opts.mode == undefined) {
                opts.mode = container.hasClass('multiple')
                    ? jQuery.collapse.mode.multiple
                    : jQuery.collapse.mode.single;
            }

            handles.click(function() {
                var handle = $(this);
                var is_open = handle.next().is(':visible');
                if (opts.mode == jQuery.collapse.mode.single) {
                    $('.collapse-handle', handle.parent().parent()).removeClass('selected').next('.collapse-content').slideUp('normal');
                }
                if (!is_open) {
                    handle.addClass('selected');
                    handle.next().slideDown('normal');
                } else if (opts.mode == jQuery.collapse.mode.multiple) {
                    handle.removeClass('selected');
                    handle.next().slideUp('normal');
                }
                return false;
            })
            .mouseenter(function() { $(this).addClass('selected'); })
            .mouseleave(function() {
                var obj = $(this);
                if (!obj.next().is(':visible'))
                    obj.removeClass('selected');
            });

            var anchor = document.location.toString();
            if (anchor.indexOf('#') > -1) {
                anchor = anchor.substr(anchor.lastIndexOf('#') + 1);
            } else {
                anchor = null;
            }

            if (opts.initial_index != -1 && opts.initial_index == item_index)
                handles.addClass('selected').next().show();
            else if (opts.initial_state == 'opened' && opts.initial_index == -1 && item_index == 0)
                handles.addClass('selected').next().show();
            else if (anchor != null)
                $('a[name=' + anchor + ']', handles).parent().click();
            else
                handles.next().hide();

            if (item_index == 0)
                handles.addClass('first');

        });

    };
})(jQuery);
