﻿(function ($)
{
    var methods = {
        init: function (options)
        {

            // INIT
            var settings = {};
            var defaults = {
                'trigger': this,
                'object': this.attr("rel"),
                'event': 'click',
                'action': 'toggle',
                'effect': 'fade',
                'effectoff': '0',
                'effectactive': '1',
                'effectspeed': 200
            };

            return this.each(function ()
            {
                // If options exist, lets merge them
                // with our default settings
                if (options)
                {
                    $.extend(settings, defaults, options);
                }

                var $this = $(this);
                $this.data(settings);

                // set default position/settings
                switch ($this.data('effect'))
                {

                    case 'slide':

                        $($this.data('object')).css({
                            'top': $this.data('effectoff')
                        })
                        break;

                    case 'fade':
                    default:

                        $($this.data('object')).css({
                            'opacity': $this.data('effectoff')
                        })
                        break;
                }

                // bind events
                $this.bind($this.data('event'), function (e)
                {
                    e.preventDefault();
                    $(this).controlToggleItem($this.data('action'));
                });

            });

        },
        highlight: function ()
        {
            // Method: FOR TESTING PURPOSES
            var $object = $(this).data('object');
            $($object).css({ "border": "red 1px solid" });

        },
        toggle: function ()
        {
            // Method: TOGGLES SHOW/HIDE Methods
            var $trigger = $(this);
            var $object = $($trigger.data('object'));

            if ($object.hasClass('active'))
            {
                $trigger.controlToggleItem('hide');
            } else
            {
                $trigger.controlToggleItem('show');
            }
        },
        show: function ()
        {
            // Method: SHOW
            var $trigger = $(this);
            var $object = $($trigger.data('object'));

            // action show/hide
            switch ($trigger.data('effect'))
            {

                case 'slide':

                    $object.css({
                        'display': 'block'
                    }).animate({
                        'top': $trigger.data('effectactive')
                    }, $trigger.data('effectspeed'), function ()
                    {
                        $(this).addClass('active');
                    });
                    break;

                case 'fade':
                default:

                    $object.css({
                        'display': 'block'
                    }).animate({
                        'opacity': $trigger.data('effectactive')
                    }, $trigger.data('effectspeed'), function ()
                    {
                        $(this).addClass('active');
                    });
                    break;

            }
        },
        hide: function ()
        {
            // Method: HIDE
            var $trigger = $(this);
            var $object = $($trigger.data('object'));

            // action show/hide
            switch ($trigger.data('effect'))
            {

                case 'slide':

                    $object.animate({
                        'top': $trigger.data('effectoff')
                    }, $trigger.data('effectspeed'), function ()
                    {
                        $(this).removeClass('active');
                    });
                    break;

                case 'fade':
                default:

                    $object.animate({
                        'opacity': $trigger.data('effectoff')
                    }, $trigger.data('effectspeed'), function ()
                    {
                        $(this).removeClass('active').css({ 'display': 'none' });
                    });
                    break;

            }
        }
    };

    $.fn.controlToggleItem = function (method)
    {

        // Method calling logic
        if (methods[method])
        {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method)
        {
            return methods.init.apply(this, arguments);
        } else
        {
            $.error('Method ' + method + ' does not exist on jQuery.controlToggleItem');
        }


    };
})(jQuery);
