/* 
 * Developer(s): sgray
 * 
 * Simple tabs module with hash watching
 * Requires:
 * -- jQuery 1.4.4
 * -- urlHashWatcher.js
 */

(function ($) {
    var settings = {
        tabContentID: 'tabContent',
        activeClass: 'active',
        fadeDuration: 750,
        preChangeCallback:function () { },
        postChangeCallback: function () { },
		postFadeCallback: function(tab) {fireCarouselCallback(tab)},
		loadingGifOn: false,
		loadingGif: '/wordpress/wp-content/themes/mhm/images/ajax-loader.gif',
		loadingGifID: 'ajaxLoader',
		identicalTabs: true
    };

    $.fn.tabs = function (options) {
        options = $.extend({}, settings, options),
		$root = $(this),
		$tabContent = $('#' + options.tabContentID),
		$tabs = $root.find('li a'),
		$tabsArray = tabsArray();
        $.fn.tabs.activeChange = false;
        $.fn.tabs.clickedTab = false;
		$.fn.tabs.callbacks = {};

        init();

        function init() {
            addClickHandler();
			addLoadingGif();
            pageLoadTabs();
            initTabWatcher();
        }

        function addClickHandler() {
            $tabs.live('click',function (e) {
                e.preventDefault();
				
                var clicked = $(this);

                if (!clicked.parents('li').hasClass('active') && !$.fn.tabs.activeChange) {
                    $.fn.tabs.clickedTab = true;
                    var url = clicked.attr('href');
					
                    changeTab(clicked, url);
                }
            });
        }

        function changeTab(clicked, url, notClick) {		
            var type = clicked.attr('rel'),
                activePane = $tabContent.find('div.' + options.activeClass),
                newContent = $tabContent.find('.' + type),
                activeContent = activePane.length ? activePane : $tabContent.children().eq(0);

            $.fn.tabs.activeChange = true;

            setActiveTab(clicked);

            if (!url) {
                fadeTabs(newContent, activeContent);
            } else {
                loadNewTab(url,clicked);
            }

            if (!notClick) {
                UrlHashWatcher.setNewPageHash(type);
            }
        }

        function fadeTabs(newContent, activeContent) {
            activeContent.fadeOut(options.fadeDuration, function () {
                activeContent.removeClass(options.activeClass);
                newContent.fadeIn(options.fadeDuration, function () {
                    newContent.addClass(options.activeClass);
                    options.postChangeCallback(newContent);
                    
                    $.fn.tabs.activeChange = false;
                });
            });
        }
		
		function fadeAjaxTabs(data,clicked) {
			$tabContent.fadeTo(0, .1, function() {
				$tabContent.html(data);
				
				$tabContent.fadeTo(options.fadeDuration, 1, function() {
					if (options.loadingGifOn) {
						$.fn.tabs.loader.fadeOut(options.fadeDuration);
					}
					options.postFadeCallback(clicked);
				});
			});
			
			$.fn.tabs.activeChange = false;
		}

        function loadNewTab(url,clicked) {
			if (options.loadingGifOn) {
				$.fn.tabs.loader.fadeIn(options.fadeDuration);
			}
			
			$tabContent.fadeTo(options.fadeDuration,.1);
			
            $.ajax({
                type: 'get',
                url: url + '?redirect=no',
				dataType: 'html',
                success: function (data) {
					fadeAjaxTabs(data,clicked);
					options.postChangeCallback();
                }
            });
        }

        function setActiveTab(clicked) {		
            var tabEls = clicked.parents('ul').find('li');
			
			options.preChangeCallback();
			tabEls.removeClass(options.activeClass);			
			
			if (options.identicalTabs) {
				multiActiveTabs(clicked, tabEls);
			} else {
				clicked.parent().addClass(options.activeClass);	
			}
        }
		
		function multiActiveTabs(clicked,tabEls) {
			var type = clicked.attr('rel');
			
			tabEls.each(function() {
				var root = $(this);
				
				if (root.find('a').attr('rel') == type) {
					root.addClass(options.activeClass);
				}
			});
		}

        function currentHash() {
            return window.location.hash.split('#')[1];
        }
		
		function addLoadingGif() {
			if (options.loadingGifOn) {
				$.fn.tabs.loader = $('<div/>').attr({'id': options.loadingGifID, 'class': 'loadingGif'}).html('<img src="' + options.loadingGif + '"/>');
				$tabContent.after($.fn.tabs.loader);
			}
		}

        function pageLoadTabs() {
            var hash = currentHash(),
                url = $root.find('a[rel=' + hash + ']').attr('href');

            if (!hash || $.inArray(hash, $tabsArray) < 0) {
                setFirstTabActive();
            } else {
                changeTab($root.find('a[rel=' + hash + ']'), url, false);
            }
        }

        function setFirstTabActive() {
            var firstTab = $tabs.eq(0),
				firstTabURL = firstTab.attr('href');
				
            changeTab(firstTab, firstTabURL, true);
        }

        function tabsArray() {
            var names = [];
            $tabs.each(function () {
                var name = $(this).attr('rel');
                names.push(name);
            });

            return names;
        }

        function initTabWatcher() {
            var hashChangeEvent = function () {
                if (!$.fn.tabs.clickedTab) {
                    pageLoadTabs();
                }

                $.fn.tabs.clickedTab = false;
            };

            UrlHashWatcher.init();
            $(window).bind('hashchange', hashChangeEvent);
        }
    };
})(jQuery);

function fireCarouselCallback(tab) {
	var tabName = tab.attr('rel').replace(/-/g, '');
	
	if (typeof($.fn.tabs.callbacks[tabName]) == 'function') {
		$.fn.tabs.callbacks[tabName](tabName);
	}
}
