/**
 * AUDI JavaScript library: Tab navigation
 * 
 * @projectDescription	Adds behavoir to tab-like element
 * @namespace			navigation.tab
 *
 * @author 				$Author: mkrause $
 * @version				$Revision: 3564 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 * 
 * @file:				audi_ngw.print.js
 */

/*
 * doppelte ids durch layer clone - gelöscht 
 * css in class
 * 
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'navigation.tab');


	
/**
 * Adds necessary events
 * @return {Void}
 */
audi_ngw.navigation.tab._addEvents = function(sIdParent){
	var scope = audi_ngw.navigation.tab;
	// get all a[rel="tabStatic"], a[rel="tabAjax"], a[rel="layerModalContent"] links
	var _sSelector = (sIdParent) ? '#'+sIdParent +' '+ scope._oOptions._sSelectorTabs : scope._oOptions._sSelectorTabs ;
	jQuery(_sSelector)
		.each(
			function (_iIndex,_$el) { 

				jQuery(_$el)
/* Holger: Click-Events werden alle und ausschließlich in audi.navigation.js gesetzt (Methode: prepareLinks)
 * martinkr: wenn du sowas entscheidest, dann teste das bitte.
				// bind click event on anchors 
//				.find('a')
//				.unbind('click.navigationTab')
//				.unbind('click')
//				.bind('click.navigationTab', audi_ngw.navigation.tab.handleClick)
*/
				.parent()
				// add hover effect 
				.unbind('mouseover.navigationTab')
				.bind('mouseover.navigationTab',audi_ngw.navigation.tab.setHover)
				.unbind('mouseout.navigationTab')
				.bind('mouseout.navigationTab',audi_ngw.navigation.tab.unsetHover)
//			 }
//		);
//	// set fixed width on tabs, remove padding, set text align to center to prevent "jumping" on bold text
//	jQuery(_sSelector)
//		.each(
//			function () { 
//				jQuery(this)
				.find('a')
				.width($(this).parent().width())
				.css( {'paddingLeft': '0', 'paddingRight':'0', 'text-align':'center'});
			}
		);
};

/**
 * Handlesclick event
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.navigation.tab.handleClick = function(event){
	// prevent default 
	//event.preventDefault();
	var scope = audi_ngw.navigation.tab;
	var _$element = jQuery(event.target) || jQuery(event);
	if(_$element.attr('rel') === "tabAjax") {
		// @TODO move to navigation.prepareLinks!
		scope._doAjaxClick(_$element);
	} 
	
	else if(_$element.attr('rel') === "layerModalContent") {
		// @TODO move to navigation.prepareLinks!
		audi_ngw.layer.modal.showContent(event,'#audi_modal_body');
		_$element
			// remove hover class from event parent
			.parent()
			.removeClass(scope._oOptions._sClassNameHover)
			// remove all active classes from active tabs (parent's siblings)
			.siblings('.'+scope._oOptions._sClassNameActive)
			.removeClass(scope._oOptions._sClassNameActive)
			.end()
			// add active class on event element
			.addClass(scope._oOptions._sClassNameActive);
		return false;
	}
	// switch supplied html elements
	else if(_$element.attr('rel') === "tabStatic") {
		scope._doSimpleClick(_$element);
	} 
	return false;
};

/**
 * Handles show on static tabs, used by history plugin.
 * Bridge to audi_ngw.navigation.tab._doSimpleClick
 * @see audi_ngw.navigation.tab._doSimpleClick
 * @param {Element} jQuery element
 * @return {Void}
 */
audi_ngw.navigation.tab.showStatic = function($element){
	audi_ngw.navigation.tab._doSimpleClick($element);
};

/**
 * Handles click event by showing given html snippet
 * @param {Element} jQuery element
 * @return {Void}
 */
audi_ngw.navigation.tab._doSimpleClick = function($element){
	// cache
	var scope = audi_ngw.navigation.tab;
	//identify selected tab // set tabbing scope 
	var _unique_id = $element.parent().parent().parent().audi_identify().attr("id");
	var _optMeta = $element.metadata().tabOptions || {};
	// be backward compatible
	if (_optMeta.sIdRelated) {_optMeta.sSelectorRelated = _optMeta.sIdRelated;}
	if (!_optMeta.sSelectorRelated) {throw new Error('[audi_ngw.navigation.tab.handleClick]: missing sSelectorRelated at metadata.tabOptions');}
	// get element to show inside current tabbing scope
	scope._setTabsVisible($element,jQuery('#'+_unique_id +" "+_optMeta.sSelectorRelated));
	
};

/**
 * API for prepareLinks / handleClick in case of rel="tabAjax" , bridges to _doAjaxClick
 * @param {Element} jQuery element
 * @param {String} $sIdWrapper, narrowing the search scope optional
 * @return {Void}
 */
audi_ngw.navigation.tab.linkHandlingAjaxClick = function($element, sIdAjaxContainer){
	audi_ngw.navigation.tab._doAjaxClick($element,null,sIdAjaxContainer);
};

/**
 * Handles click event by loading remote content
 * @param {Element} jQuery element
 * @param {String} sIdWrapper, narrowing the search scope, optional
 * @param {String} sIdAjaxContainer, injecting the xhr response, optional
 * @return {Void}
 */
audi_ngw.navigation.tab._doAjaxClick = function($element,sIdWrapper,sIdAjaxContainer){
	// cache
	var scope = audi_ngw.navigation.tab;
	var sIdWrapper = (sIdWrapper) ?"#"+sIdWrapper : '';
	var sIdAjaxContainer = (sIdAjaxContainer) ? sIdAjaxContainer : '';
	//identify selected tab // set tabbing scope 
	var _unique_id = $element.parent().parent().parent().audi_identify().attr("id");
	var _optMeta = $element.metadata().tabOptions || {};
	// be backward compatible

	if (_optMeta.sIdRelated) {_optMeta.sSelectorRelated = _optMeta.sIdRelated; }
	if (!_optMeta.sSelectorRelated) {throw new Error('[audi_ngw.navigation.tab.handleClick]: missing sSelectorRelated at metadata.tabOptions');}
	// get target element for xhr content

	var  _$elTarget = jQuery(sIdWrapper + ' #'+_unique_id +" #"+_optMeta.sSelectorRelated);
	if(!_$elTarget.size()) {throw new Error('[audi_ngw.navigation.tab.handleClick]: missing target element');}
 
 	scope._setTabsVisible($element,_$elTarget);
	// remove content
//	_$elTarget.empty();

	// load content
//	audi_ngw.navigation.loadPage($element.attr('href'), _$elTarget,null,sIdAjaxContainer);
	audi_ngw.navigation.loadPage($element.attr('href'), jQuery(sIdWrapper + ' #'+_unique_id +" #"+sIdAjaxContainer),null,sIdAjaxContainer);
};

/**
 * Handles mouseover event by setting hover class
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.navigation.tab.setHover = function(event){
	var scope = audi_ngw.navigation.tab;
	var _$element = jQuery(this) ;
	if (!_$element.hasClass(scope._oOptions._sClassNameActive)) {
		_$element.addClass(scope._oOptions._sClassNameHover);
	}
};

/**
 * Handles mouseout event by removing hover class
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.navigation.tab.unsetHover = function(event){
	var scope = audi_ngw.navigation.tab;
	var _$element = jQuery(this) ;
	_$element.removeClass(scope._oOptions._sClassNameHover);
};
/**
 * Handles mouseout event by removing hover class
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.navigation.tab._setTabsVisible = function($elTab,$elRelated){
		var scope = audi_ngw.navigation.tab;
	$elTab
		// remove hover class from event parent
		.parent()
		.removeClass(scope._oOptions._sClassNameHover)
		// remove all active classes from active tabs (parent's siblings)
		.siblings('.'+scope._oOptions._sClassNameActive)
		.removeClass(scope._oOptions._sClassNameActive)
		.end()
		// add active class on event element
		.addClass(scope._oOptions._sClassNameActive);
		// get related element
		$elRelated.siblings().removeClass('active').hide();
		$elRelated.addClass('active').show().css('display','inline');
	
};

/**
 * Custom Event: wil be fired as soon as we filled the ajax-content into the modal layer, just before "xhrReallocate"
 * @param {Object} event
 * @param {Object} xhr
 */
audi_ngw.navigation.tab.onAjaxModalContentReady = function(event,xhr){
	// check if this xhr-response contains valid content
	if (!audi_ngw.url.hasXHRContent(xhr,event.timeStamp)) {return false;}
	//audi_ngw.log("EVENT - ajaxModalContentReady: audi_ngw.navigation.tab.onAjaxModalContentReady",arguments);
	// execute funtions on new content
	audi_ngw.navigation.tab._addEvents(audi_ngw.url.getContentId());
	
	// trigger event 
	audi_ngw.event.trigger('ajaxModalContentPrepared');
 };

/**
 * Custom Event: wil be fired as soon as we injected the xhr-snippet 
 * @param {Object} event
 * @param {Object} data {sId: new HTML parent Id}
 */
audi_ngw.navigation.tab.onAjaxSnippetReady = function(event,data){
 
	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.navigation.tab.onAjaxSnippetReady ",arguments);

	// execute funtions on new content
	audi_ngw.navigation.tab._addEvents(data.sId.slice(1));
	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared');
 };
 


/**
 * Constructor
 * @param {Object} oOptions
 * @return {Void}
 */
audi_ngw.navigation.tab.initialize = function (oOptions){
	var scope = audi_ngw.navigation.tab;

	scope.__className =  'audi_ngw.navigation.tab';
	scope.__classVersion= '1.2';

	scope._oOptions = {};
	// set otpions 
	scope._oOptions._sClassNameHover = 'rollover';
	scope._oOptions._sClassNameActive = 'active';
	scope._oOptions._sSelectorTabs = 'ul.audi_tab_navigation li a[rel="tabStatic"], ul.audi_tab_navigation li a[rel="tabAjax"], ul.audi_tab_navigation li a[rel="layerModalContent"]';
 
	
	audi_ngw.navigation.tab._addEvents();
};


/**
 *  
 */
jQuery(document).ready(function(){
	
	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady',audi_ngw.navigation.tab.onAjaxModalContentReady);
	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.navigation.tab.onAjaxSnippetReady);

	audi_ngw.navigation.tab.initialize({});
});

