﻿(function ($) {
    $.fn.tabSlideOut = function (callerSettings) {
        var settings = $.extend({
            tabSelector: '.handle',
            speed: 200,
            action: 'click',
            tabLocation: 'left',
            topPos: '200px',
            leftPos: '20px',
            fixedPosition: false,
            positioning: 'absolute',
            pathToTabImage: null,
            imageHeight: null,
            imageWidth: null,
            onLoadSlideOut: false,
            mountToBody: false,
            mountToCustom: null
        }, callerSettings || {});

        var unitFix = function (s) {
            if (/%$/.test(s) || /px$/.test(s))
                return s;
            else
                return s + "px";
        }
        settings.topPos = unitFix(settings.topPos);
        settings.leftPos = unitFix(settings.leftPos);
        //alert(arguments.callee.caller.toString());

        var obj = this;
        obj.show();

        settings.tab = $(settings.tabSelector);
        if (settings.mountToCustom != null && settings.mountToCustom.length > 0) {
            settings.container = $(settings.mountToCustom);
            obj.appendTo(settings.container);
        } else {
            settings.container = obj.closest(".FeatureContainer");
        }

        if (settings.mountToBody) {
            obj.appendTo($("body"));
        } else {
            try {
                if (settings.container.get(0).nodeName == "TD") {
                    var oldContainer = settings.container;
                    settings.container = $('<div></div>');
                    oldContainer.children("div").each(function (i) {
                        $(this).appendTo(settings.container);
                    });
                    settings.container.prependTo(oldContainer);
                }
            } catch (err) { }
        }

        if (settings.fixedPosition === true) {
            settings.positioning = 'fixed';
        } else {
            settings.positioning = 'absolute';
        }

        //ie6 doesn't do well with the fixed option
        if (document.all && !window.opera && !window.XMLHttpRequest) {
            settings.positioning = 'absolute';
        }

        if (settings.pathToTabImage != null) {
            settings.tab.css({
                'background': 'url(' + settings.pathToTabImage + ') no-repeat',
                'width': settings.imageWidth,
                'height': settings.imageHeight,
                'textIndent': '-99999px',
                'outline': 'none'
            });
        }

        settings.tab.css({
            'display': 'block',
            'position': 'absolute'
        });

        obj.css({
            'line-height': '1',
            'position': settings.positioning
        });

        if (!settings.mountToBody) {
            settings.container.css({
                'position': 'relative',
                'overflow': 'hidden',
                'min-height': parseInt(obj.height() + settings.tab.height(), 10) + 'px'
            });
            //            settings.container.css({
            //                'position': 'relative',
            //                'overflow': 'hidden'
            //            });
        }

        var properties = {
            containerWidth: parseInt(obj.outerWidth(), 10) + 'px',
            containerHeight: parseInt(obj.outerHeight(), 10) + 'px',
            tabWidth: parseInt(settings.tab.outerWidth(), 10) + 'px',
            tabHeight: parseInt(settings.tab.outerHeight(), 10) + 'px'
        };

        //set calculated css

        if (settings.tabLocation === 'top' || settings.tabLocation === 'bottom') {
            obj.css({ 'left': settings.leftPos });
            //settings.tab.css({ 'right': 0 });
        }

        if (settings.tabLocation === 'top') {
            obj.css({ 'top': '-' + properties.containerHeight });
            settings.tab.css({ 'bottom': '-' + properties.tabHeight });
        }

        if (settings.tabLocation === 'bottom') {
            obj.css({ 'bottom': '-' + properties.containerHeight });
            settings.tab.css({ 'top': '-' + properties.tabHeight });

        }

        if (settings.tabLocation === 'left' || settings.tabLocation === 'right') {
            obj.css({
                'height': properties.containerHeight,
                'top': settings.topPos
            });
            settings.tab.css({ 'top': 0 });
        }

        if (settings.tabLocation === 'left') {
            obj.css({ 'left': '-' + properties.containerWidth });
            settings.tab.css({ 'right': '-' + properties.tabWidth });
        }

        if (settings.tabLocation === 'right') {
            obj.css({ 'right': '-' + properties.containerWidth });
            settings.tab.css({ 'left': '-' + properties.tabWidth });
            $('html').css('overflow-x', 'hidden');
        }

        //functions for animation events

        settings.tab.click(function (event) {
            event.preventDefault();
        });

        var slideIn = function () {
            if (settings.tabLocation === 'top') {
                obj.animate({ top: '-' + properties.containerHeight }, settings.speed).removeClass('open');
            } else if (settings.tabLocation === 'left') {
                obj.animate({ left: '-' + properties.containerWidth }, settings.speed).removeClass('open');
            } else if (settings.tabLocation === 'right') {
                obj.animate({ right: '-' + properties.containerWidth }, settings.speed).removeClass('open');
            } else if (settings.tabLocation === 'bottom') {
                obj.animate({ bottom: '-' + properties.containerHeight }, settings.speed).removeClass('open');
            }
        };

        var slideOut = function () {
            if (settings.tabLocation == 'top') {
                obj.animate({ top: '-3px' }, settings.speed).addClass('open');
            } else if (settings.tabLocation == 'left') {
                obj.animate({ left: '-3px' }, settings.speed).addClass('open');
            } else if (settings.tabLocation == 'right') {
                obj.animate({ right: '-3px' }, settings.speed).addClass('open');
            } else if (settings.tabLocation == 'bottom') {
                obj.animate({ bottom: '-3px' }, settings.speed).addClass('open');
            }
        };

        var clickScreenToClose = function () {
            obj.click(function (event) {
                event.stopPropagation();
            });
            $(document).click(function () {
                slideIn();
            });
        };

        var clickAction = function () {
            settings.tab.click(function (event) {
                if (obj.hasClass('open')) {
                    slideIn();
                } else {
                    slideOut();
                }
            });
            clickScreenToClose();
        };

        var hoverAction = function () {
            obj.hover(
                function () {
                    slideOut();
                },
                function () {
                    slideIn();
                });
            settings.tab.click(function (event) {
                if (obj.hasClass('open')) {
                    slideIn();
                }
            });
            clickScreenToClose();
        };

        var slideOutOnLoad = function () {
            slideIn();
            setTimeout(slideOut, 500);
        };

        //choose which type of action to bind
        if (settings.action === 'click') {
            clickAction();
        }

        if (settings.action === 'hover') {
            hoverAction();
        }

        if (settings.onLoadSlideOut) {
            slideOutOnLoad();
        };

    };
})(jQuery);

