﻿(function($) {
    $.fn.CreateToggle = function(settings) {

        // Config Array
        var config = $.extend(
        {
            // Toggle Type - single or group
            toggleType: 'single',
            initState: 'open',

            // Group toggle parameters must be filled for group toggle
            // Tag is the clickable HTML tag
            // Parent is the holder of all the toggle elements
            groupToggleTag: '',
            groupToggleParent: '',



            hasButtons: false,
            closeString: 'btn-open',
            openString: 'btn-close'

        }, settings || {});

        //  =============
        //  Global Object
        var global =
        {
            toggle: $(this),

            // Determines the current state of the toggle 
            isOpen: false
        };

        //  =================
        //  Initiate Function
        var jQueryToggle = function() {
            // Set the current state variable based on the initial state defined 
            global.isOpen = (config.initState === 'closed') ? false : true

            // Close the toggle if the inital state is set to closed
            if (!global.isOpen) { doToggle(true); }
            else {
                switch (config.toggleType) {
                    case 'single':
                        $(global.toggle).addClass('close');
                        break;
                    case 'group':
                        $(config.groupToggleTag, config.groupToggleParent).addClass('close');
                        break;
                }
            }

            // Set the proper click handler based on toggle type
            switch (config.toggleType) {
                // If each toggle is independant    
                case 'single':
                    global.toggle.css({ cursor: 'pointer' });
                    var elem = toggleItem(global.toggle);
                    elem.enableClick();
                    break;

                // If each toggle is grouped    
                case 'group':
                    $(config.groupToggleTag, global.toggle).each(function() {
                        var elem = toggleItem($(this));
                        elem.enableClick();
                    });
                    break;
            }
        };

        //  ==================
        //  Toggle Item Object
        var toggleItem = function(elem) {
            var methods = {};

            // Enable the click event for the toggle item
            methods.enableClick = function() {
                elem.css({ cursor: 'pointer' });
                elem.bind('click', doToggle);
            };

            return methods;
        };

        //  =======================
        //  Toggle Handler Function
        function doToggle(first) {
            // Based on toggle type, toggle either current item, or entire defined group
            switch (config.toggleType) {
                case 'single':
                    (first === true) ? $(global.toggle).next().toggle() : $(global.toggle).next().slideToggle();
                    setActive('single');
                    break;

                case 'group':
                    (first === true) ? $(config.groupToggleTag, config.groupToggleParent).next().toggle() : $(config.groupToggleTag, config.groupToggleParent).next().slideToggle();
                    setActive('group');
                    break;
            }

            return false;
        };

        //  ========================
        //  Set proper active states
        function setActive(type) {
            if (global.isOpen) {
                global.isOpen = false;

                if (type == 'single') {
                    $(global.toggle).removeClass('close').addClass('open');
                }
                else if (type == 'group') {
                    $(config.groupToggleTag, config.groupToggleParent).removeClass('close').addClass('open');
                }
            }
            else {
                global.isOpen = true;

                if (type == 'single') {
                    $(global.toggle).removeClass('open').addClass('close');
                }
                else if (type == 'group') {
                    $(config.groupToggleTag, config.groupToggleParent).removeClass('open').addClass('close');
                }
            }
        };

        // Initiate the toggle
        jQueryToggle();
    };
})(jQuery);
