﻿(function ($)
{
    var methods = {
        init: function (options)
        {

            // INIT
            var settings = {};
            var defaults = {
                'trigger': this,
                'object': this.attr("rel"),
                'event': 'click',
                'eventon': '',
                'eventoff': '',
                'action': 'toggle',
                'actionon': '',
                'actionoff': '',
                'effect': 'fade',
                'effecton': '',
                'effectoff': '',
                'fxactive': '1',
                'fxnormal': '0',
                'fxspeed': 200,
								'callback' : function(){}
            };

            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 'appear':

                        $($this.data('object')).css({
                            'display': 'none'
                        })
                        break;

                    case 'slide':

                        $($this.data('object')).css({
                            'top': $this.data('fxnormal')
                        })
                        break;

                    case 'fade':
                    default:

                        $($this.data('object')).css({
                            'opacity': $this.data('fxnormal')
                        })
                        break;
                }

                // bind events
                $this.bind($this.data('event'), function (e)
                {
                    e.preventDefault();
                    $(this).controlToggleItem($this.data('action'));
                });
                $this.bind($this.data('eventon'), function (e)
                {
                    e.preventDefault();
                    $(this).controlToggleItem($this.data('actionon'));
                });
                $this.bind($this.data('eventoff'), function (e)
                {
                    e.preventDefault();
                    $(this).controlToggleItem($this.data('actionoff'));
                });

            });

        },
        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'));
						
						//alert($object.hasClass('active'));
            if ($object.hasClass('active'))
            {
                $trigger.controlToggleItem('hide');
            } else
            {
                $trigger.controlToggleItem('show');
            }
        },
        show: function ()
        {
						//console.log(' show');
            // Method: SHOW
            var $trigger = $(this);
            var $object = $($trigger.data('object'));
						var fnCallback = $trigger.data('callback');
						var effect = $trigger.data('effect');
						if (effect == '') { effect = $trigger.data('effecton'); }

						//$object.stop(true,true);
						if (!$object.hasClass('active')) {
								// action show/hide
								switch (effect)
								{
		
										case 'appear':
		
												/*$object.css({
														'display': 'block',
														'opacity': 1
												}).addClass('active');*/
												$object.show().addClass('active');
												break;
		
										case 'slide':
		
												$object.css({
														'display': 'block'
												}).animate({
														'top': $trigger.data('fxactive')
												}, $trigger.data('fxspeed'), function ()
												{
														$(this).addClass('active');
												});
												break;
		
										case 'fade':
										default:
		
												$object.css({
														'display': 'block'
												}).animate({
														'opacity': $trigger.data('fxactive')
												}, $trigger.data('fxspeed'), function ()
												{
														$(this).addClass('active');
												});
												break;
		
								}
							$trigger.addClass('active');
							fnCallback();
						}
						
        },
        hide: function ()
        {
						//console.log(' hide');
            // Method: HIDE
            var $trigger = $(this);
            var $object = $($trigger.data('object'));
						var fnCallback = $trigger.data('callback');
						var effect = $trigger.data('effect');
						if (effect == '') { effect = $trigger.data('effectoff'); }

						//$object.stop(true,true);
						if ($object.hasClass('active')) {
							// action show/hide
							switch (effect)
							{
	
									case 'appear':
	
											/*$object.css({
													'display': 'none',
													'opacity': 0
											}).removeClass('active');*/
											$object.hide().removeClass('active');
											break;
	
									case 'slide':
	
											$object.animate({
													'top': $trigger.data('fxnormal')
											}, $trigger.data('fxspeed'), function ()
											{
													$(this).removeClass('active');
											});
											break;
	
									case 'fade':
									default:
	
											$object.animate({
													'opacity': $trigger.data('fxnormal')
											}, $trigger.data('fxspeed'), function ()
											{
													$(this).removeClass('active').css({ 'display': 'none' });
											});
											break;
	
							}
							$trigger.removeClass('active');
							fnCallback();
						}
        }
    };

    $.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);
