/**
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.animation.accordionPagelevel.js $
 *
 * AUDI JavaScript library: animation.accordionPagelevel
 * 
 * @projectDescription	Animation class handling the accorion navigation on the left hand side (NAV_PAGELEVEL)
 *
 * @author 				$Author: hhoettecke $
 * @version				$Revision: 9429 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'animation.accordionPagelevel');

/**
 * Adds click events to all pagelevel navigion elements
 * @deprecated
 * @method _addClickEvents
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._addClickEvents = function(){
	// store reference
	var _self = this;
	// construct selector
	var _sSelector = this._options.sIdWrapper;
	_sSelector += ' ul li ';
	
	// add click event to first level navigation anchors
 	jQuery(_sSelector).parent('ul.first').children().children('a').click(function(event){
		_self.animate(event,_self, 1);
	});

	// add click event to second level navigation anchors
 	jQuery(_sSelector).parent('ul.second').children().children('a').click(function(event){
		_self.animate(event,_self, 2);
	});

	// add click event to third level navigation anchors
 	jQuery(_sSelector).parent('ul.third').children().children('a').click(function(event){
		_self.animate(event,_self, 3);
	});
};

/**
 * Brigde: _doAnimate
 * @method animate
 * @param {Element} 
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel.animate = function(element){

	// get last element to force the deepest element in case of duplicate href's
	element = element.eq(element.size()-1);
	var scope = audi_ngw.animation.accordionPagelevel;
	var iDepth = scope._getCurrentDepth(element);

	if (iDepth === false) { return false; }

	if (!scope._options)   {
		audi_ngw.animation.accordionPagelevel.initialize();
	}


	// call animation function

	scope._doAnimate(element,scope,iDepth);
};

/**
 * Does actual animation
 * @method _doAnimate
 * @param {Event} 
 * @param {Scope} "this"
 * @param {Number} current depth
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._doAnimate = function(element,scope,iDepth){

	if (audi_ngw.animation.getRunning(scope.__className) === true) {return;}
	

		// handle opened elements and current marker according to depth 
		switch (iDepth) {

			// dispatched on first level 
			case 1:
				// prevent unecessary slideUp
				if (jQuery(element).next().css('display') == 'block') {
					// close third level elements
					scope._closeCurrents(element,' .third', true);
					// remove active markers on second / third level
					scope._removeMarkerClass([' .second', ' .third']);
				break;
				} 
				// close first level elements
				scope._closeCurrents(element, ' .first', true);
				// close second level elements
				scope._closeCurrents(element,' .second',false);
				// close third level elements
				scope._closeCurrents(element,' .third', false);
				// remove active markers on first / second / third level
				scope._removeMarkerClass([' .first', ' .second', ' .third']);
				// add current markers
				this._addCurrentMarkers(element,1);
			break;
				
			// dispatched on second level 
			case 2:
				// current element is part of an open ul 
				if (jQuery(element).parent().parent().css('display') == 'block') {
					// check if this elements next level ain't open
					if (jQuery(element).next().css('display') != 'block') {
						// open current element's next level
						scope._closeCurrents(element, [' .third']);
					}
					// remove active marker on second third level
					scope._removeMarkerClass([' .second', ' .third']);
				// add current markers
				this._addCurrentMarkers(element,2);
				// exit
				break;
				}
				// close first level elements
				scope._closeCurrents(element, ' .first', true);
				// close second level elements (siblings)
				scope._closeCurrents(element,' .second',false);
				// close third level elements (childrens)
				scope._closeCurrents(element,' .third', true);
				// remove active markers on first / second / third level
				scope._removeMarkerClass([' .first', ' .second', ' .third']);
				// set running flag
				audi_ngw.animation.setRunning(scope.__className);
				// slide down
				jQuery(element).parent().parent().slideDown('normal', function(){
					scope._onComplete(scope);
				});
				// add current markers
				this._addCurrentMarkers(element,2);
			break;
				
			// dispatched on third level 
			case 3:
				// current element is part of an open ul 
				if (jQuery(element).parent().parent().css('display') == 'block') {
					// remove all markers
					scope._removeMarkerClass([' .third']);
				// add current markers
				this._addCurrentMarkers(element,3);
				// exit
				break;
				}

				// if current element is part of an opened list
				if (jQuery(element).parents('ul.second').css('display') == 'block') {
					// close all siblings
					scope._closeCurrents(element,' .third', true);
					// remove marker classes 
					scope._removeMarkerClass([' .second',' .third']);
					//set as running
					audi_ngw.animation.setRunning(scope.__className);
				
					//open this elements containing list element
					jQuery(element).parents('ul.third').slideDown('normal', function(){
						scope._onComplete(scope);
					});
					
					// add current markers
					this._addCurrentMarkers(element,2);
	
					break;
				}
			
				// neither second nor third opened list is parat of desired tree
				if (jQuery(element).parents('ul.second').css('display') != 'block') {
					scope._closeCurrents(element, ' .first', true);
					scope._closeCurrents(element,' .second',false);
					scope._closeCurrents(element,' .third', false);
					scope._removeMarkerClass([' .first', ' .second', ' .third']);
					jQuery(element).parents('ul.second').slideDown('normal', function(){
						scope._onComplete(scope);
					});
					jQuery(element).parents('ul.first').slideDown('normal', function(){
						scope._onComplete(scope);
					});
					
					jQuery(element).parents('ul.third').slideDown('normal', function(){
						scope._onComplete(scope);
					});

					// add current markers
					this._addCurrentMarkers(element,3);

					break;
				}
				// close first level elements
				scope._closeCurrents(element, ' .first', true);
				// close second level elements
				scope._closeCurrents(element,' .second',false);
				// close third level elements
				scope._closeCurrents(element,' .third', true);
				// remove all markers
				scope._removeMarkerClass([' .first', ' .second', ' .third']);
				// set running flag
				audi_ngw.animation.setRunning(scope.__className);
				// slide down
				jQuery(element).parent().parent().slideDown('normal', function(){
					scope._onComplete(scope);
				});
			break;
		}

		// if clicked element contains another level
		if (jQuery(element).next().is('UL')) {
			// set running flag
				audi_ngw.animation.setRunning(scope.__className);
			// slide down
			jQuery(element).next().slideDown('normal', function(){
				scope._onComplete(scope);
			});
		}
 		if (iDepth === 3) {
			jQuery(element).parent().parent().prev().removeClass('current');
		}


};
/**
 * Add class "current" according to element and depth
 * @param {HTMLElement} element
 * @param {Number} iDepth
 * @private
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._addCurrentMarkers = function(element,iDepth){
	var $element = jQuery(element);
	switch (iDepth) {
		case 3:
			$element.parent().parent().parent().parent().prev().addClass('current');
			$element.parent().parent().parent().parent().parent().addClass('current');
			$element.parent().parent().prev().addClass('current');
			$element.parent().parent().parent().addClass('current');
			$element.parent().addClass('current');
			$element.addClass('current');
			break;
		case 2:
			$element.parent().parent().prev().addClass('current');
			$element.parent().parent().parent().addClass('current');
			$element.parent().addClass('current');
			$element.addClass('current');
			break;
		case 1:
			$element.parent().addClass('current');
			$element.addClass('current');
			break;
	}
};

/**
 * Closes all open navigation elements on supplied depth (classname)
 * @method _closeCurrents
 * @param {Array} Array of classnames indication depth to close open elements on
 * @private
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._closeCurrents = function(element, _sClassName, _boolCurrentOnly) {
	// store reference
	var _self = audi_ngw.animation.accordionPagelevel;
	
	if (!_self._options)   {
		audi_ngw.animation.accordionPagelevel.initialize();
	}
	
	// cycle all supplied levels
	// construct selector
	var _sSelector = _self._options.sIdWrapper;
	if (_boolCurrentOnly === true) {
		_sSelector += ' .current ';
	} else {
		_sSelector += ' ';
	}
	_sSelector += _sClassName;
	// hide selected navigation elements
	jQuery(_sSelector).slideUp('normal', function(){_self._onComplete(_self);});

};



/**
 * Removes all marker classes on li and li/a on supplied depth (classname)
 * @method _removeMarkerClass
 * @param {Array} Array of classnames indication depth to remove classnames on
 * @private
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._removeMarkerClass = function(_aryClassNames) {
	// store reference
	var _self = this;
	// cycle all supplied levels
	jQuery(_aryClassNames).each(
		function (_i) {
		// construct selector
		var _sSelector = _self._options.sIdWrapper;
		_sSelector += _aryClassNames[_i];
		_sSelector += ' .current ';
		// remove active class on li and li/a
		jQuery(_sSelector).removeClass('current');
	});
};

/**
 * On complete callback: slide up / down 
 * @method _onComplete
 * @param {Scope} scope
 * @private
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel._onComplete = function(scope){
	audi_ngw.animation.unsetRunning(scope.__className);
};

/**
 * Returns current depth (element on navigation)
 * @param {HTMLElement} Element
 * @private
 * @return {Number}
 */
audi_ngw.animation.accordionPagelevel._getCurrentDepth = function (element) {

	if (jQuery(element).parents('.third').length !== 0) { return 3; }
	if (jQuery(element).parents('.second').length !== 0) { return 2; }
	if (jQuery(element).parents('.first').length !== 0) { return 1; }
	
};



/**
 * Returns running state
 * @method getRunning
 * @param {Object} Scope 
 * @return {Bool}
 */
audi_ngw.animation.accordionPagelevel.getRunning = function(){
	return audi_ngw.animation.unsetRunning(audi_ngw.animation.accordionPagelevel.__className);
};

/**
 *Initialize animation "accordionPagelevel"
 * @method initialize
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.animation.accordionPagelevel.initialize = function(options){
	options = options || {};
	this.__className =  'audi_ngw.animation.accordionPagelevel';
	this.__classVersion= '1.2';
	

	this._options = {};
	this._options.sIdWrapper = '#'+options.sIdWrapper || '#'+'audi_nav_pagelevel';
	this._options.sClassNameCurrent = ".current";

};
