(function ($) {
    $.fn.ajaxToggle = function (options) {
        var defaults = {
            pageName: '',
            dataString: '',
            targetObj: '',
            count: 1,
            indicatorClosed: {
                style: "background-image:url('/scripts/jQuery/ajaxToggle/collapse.gif'); background-repeat:no-repeat; width:10px; height:10px; float:left; margin-right:2px;margin-top:2px;"
            },
            indicatorOpen: {
                style: "background-image:url('/scripts/jQuery/ajaxToggle/expand.gif'); background-repeat:no-repeat; width:10px; height:10px; float:left; margin-right:2px; margin-top:2px;"
            },
            indicatorPreload: '/scripts/jQuery/ajaxToggle/collapse.gif',
            loadHTML: '<img src="/scripts/jQuery/ajaxToggle/ajax-loader.gif" border="0" style="float:left; margin-right:5px;" /> Loading...',
            effectOut: 'slide',
            easingOut: 'easeOutBounce',
            effectIn: 'slide',
            effectOutDuration: 800,
            easingIn: 'easeInQuint',
            effectInDuration: 100,
            onToggleHide: function () {},
            onToggleAfterHide: function () {},
            onToggleShow: function () {},
            onToggleAfterShow: function () {},
            ajaxBefore: function () {},
            ajaxSuccess: function () {},
            ajaxMethod: 'POST',
            mimeType: 'text/html; charset=iso-8859-1',
            start: 'closed',
            noToggler: false,
            fluidSlider: false,
            relativeMenus: false
        };
        var opts = $.extend(defaults, options);
        var $preload = $('<img />').css('display', 'none').attr('src', opts.indicatorPreload).load(function () {
            $('BODY').prepend($($preload));
        });
		var i = 1;
        return this.each(function () {
            var $this = $(this);
            var targetString;
            var getTargetObj;
            targetString = $($this).attr('href');
            getTargetObj = $($this).attr('rel');
            $this.preventDefault;
            if (targetString != undefined) {
                var targetArray = targetString.split('?s');
                var targetSrc = targetArray[0];
                var targetData = targetArray[1];
            };
            if (targetSrc != '') {
                opts.pageName = targetSrc;
                opts.dataString = targetData;
                opts.targetObj = getTargetObj;
            };
            if (getTargetObj != '') {
                opts.targetObj = getTargetObj;
            };
            var thisIndex = i;
            var parentID = $($this).attr("id");
            var toggleID = parentID + '_ajaxToggleHelper_' + thisIndex;
            var toggleHelperID = '#' + toggleID;
                if (opts.noToggler != true) {
                    var $wrapper = $('<div id="' + toggleID + '" name="' + toggleID + '" />').attr(opts.indicatorClosed);
                    $($this).prepend($wrapper);
                };
            if (opts.relativeMenus == true) {
                var menuOffset = '-' + $($this).css('width');
                if (menuOffset != '-auto') {
                    $(opts.targetObj).css('margin-left', menuOffset);
                };
            };
			i++;
            bindClick($this, opts.pageName, opts.dataString, opts.targetObj, toggleHelperID);
        });

        function bindClick(thisClickObj, pageName, dataString, targetObj, toggleHelperID) {
            opts.count++;
            var targetHTML = $(targetObj).html();			
            $(thisClickObj).unbind().toggle(function (e) {
			
				
			
                if (opts.start != 'closed') {
                    hideTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                } else {
                    if (targetHTML != '' && targetHTML != null) {
                        showTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                    } else {
                        sendRec(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                    };
                };
				return false;
            },
            function (e) {
			
			
			
			
                if (opts.start != 'closed') {
                    if (targetHTML != '' && targetHTML != null) {
                        showTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                    } else {
                        sendRec(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                    };
                } else {
                    hideTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                };
				return false;
            });
        };

       
        function hideShow(thisClickObj, pageName, dataString, targetObj, toggleHelperID, thisAction, returnAction, objListArr) {
            if (thisAction == 'show') {
                if (returnAction != 'none') {
                    var effectIn = returnAction;
                } else {
                    var effectIn = opts.effectIn;
                };
                if (opts.fluidSlider == true && returnAction == 'none') {
                    $(targetObj).slideDown(opts.effectInDuration, function () {
                        $(toggleHelperID).attr(opts.indicatorOpen);
                        bindClick(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                        opts.onToggleAfterShow.call(objListArr);
                    });
                } else {
                    $(targetObj).show(effectIn, {
                        direction: "up",
                        easing: opts.easingIn,
                        duration: opts.effectOutDuration
                    },


                    function () {
                        $(toggleHelperID).attr(opts.indicatorOpen);
                        bindClick(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                        opts.onToggleAfterShow.call(objListArr);
                    });
                };
            } else if (thisAction == 'hide') {
                if (returnAction != 'none') {
                    var effectOut = returnAction;
                } else {
                    var effectOut = opts.effectOut;
                };
                if (opts.fluidSlider == true && returnAction == 'none') {
                    $(targetObj).slideUp(opts.effectOutDuration, function () {
                        $(toggleHelperID).attr(opts.indicatorClosed);
                        bindClick(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                        opts.onToggleAfterHide.call(objListArr);
                    });
                } else {
                    $(targetObj).hide(effectOut, {
                        direction: "up",
                        easing: opts.easingOut,
                        duration: opts.effectOutDuration
                    },


                    function () {
                        $(toggleHelperID).attr(opts.indicatorClosed);
                        bindClick(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                        opts.onToggleAfterHide.call(objListArr);
                    });
                };
            } else {}
        };

        function showTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID) {
            var objectList = new Array(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
            var returnAction = opts.onToggleShow.call(objectList);
            if (returnAction == null) {
                returnAction = 'none';
            };
            hideShow(thisClickObj, pageName, dataString, targetObj, toggleHelperID, 'show', returnAction, objectList);
        };

        function hideTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID) {
            var objectList = new Array(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
            var returnAction = opts.onToggleHide.call(objectList);
            if (returnAction == null) {
                returnAction = 'none';
            };
            hideShow(thisClickObj, pageName, dataString, targetObj, toggleHelperID, 'hide', returnAction, objectList);
        };

        function sendRec(thisClickObj, pageName, dataString, targetObj, toggleHelperID) {
            var theHTML = $(thisClickObj).html();
            $(thisClickObj).html(opts.loadHTML);
            $.ajax({
                type: opts.ajaxMethod,
                url: pageName,
                data: dataString,
                beforeSend: function (xhr) {
                    opts.ajaxBefore.call(this);
                },
                success: function (c) {
                    $(targetObj).html(c);
                    opts.ajaxSuccess.call(this);
                    showTarget(thisClickObj, pageName, dataString, targetObj, toggleHelperID);
                    $(thisClickObj).html(theHTML);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    this;
                }
            });
        };
    };
})(jQuery);