/**
 * AUDI JavaScript library: core
 * 
 * @projectDescription	Animation class providing basic helper functions
 * @namespace			animation
 *
 * @author 				$Author: hhoettecke $
 * @version				$Revision: 6416 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint:	2008-10-31
 * 
 * @file:				audi_ngw.animation.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.animation.js $
 */

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

/* CREATE JQUERY PLUGINS */
/**
 * @see audi_ngw.animation.slideDown || slideUp
 */
$.fn.audi_slideDownToggleParentNext = function() {
//	audi_ngw.animation.slideDown(this);
	this.each(
		function() {
			if (jQuery(this).parent().next().css('display') == 'none') {
				audi_ngw.animation.slideDown(jQuery(this).parent().next());
			} else {
				audi_ngw.animation.slideUp(jQuery(this).parent().next());
			}
	});
	return this;
};
/**
 * @see audi_ngw.animation.slideDown
 */
$.fn.audi_slideDown = function() {
//	audi_ngw.animation.slideDown(this);
	this.each(
		function() {
			 audi_ngw.animation.slideDown(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};
/**
 * @see audi_ngw.animation.slideUp
 */
$.fn.audi_slideUp = function() {
//audi_ngw.animation.slideUp(this);
	this.each(
		function() {
			 audi_ngw.animation.slideUp(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};

/**
 * @see audi_ngw.animation.animate
 */
$.fn.audi_animate = function() {
//	audi_ngw.animation.animate(this);
	this.each(
		function() {
			 audi_ngw.animation.animate(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};

/**
 * @see audi_ngw.animation.setLoading
 */
$.fn.audi_setLoading = function() {
//  audi_ngw.animation.setLoading(this.audi_identify());
	this.each(
		function() {
			 audi_ngw.animation.setLoading(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};

/**
 * @see audi_ngw.animation.unsetLoading
 */
$.fn.audi_unsetLoading = function() {
//	audi_ngw.animation.unsetLoading(this.audi_identify());
	this.each(
		function() {
			 audi_ngw.animation.unsetLoading(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};
/**
 * @see audi_ngw.animation.unsetRunning
 */
$.fn.audi_unsetRunning = function() {
//  audi_ngw.animation.unsetRunning(this.audi_identify());
	this.each(
		function() {
			 audi_ngw.animation.unsetRunning(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};
/**
 * @see audi_ngw.animation.setRunning
 */
$.fn.audi_setRunning = function() {
//  audi_ngw.animation.setRunning(this.audi_identify());
	this.each(
		function() {
			 audi_ngw.animation.setRunning(jQuery(this).audi_identify().attr('id'));
	});
	return this;
};
/**
 * @see audi_ngw.animation.absolutize
 */
$.fn.audi_absolutize = function() {
  audi_ngw.animation.absolutize(this);
  return this;
};
/**
 * @see audi_ngw.animation.deAbsolutize
 */
$.fn.audi_deAbsolutize = function() {
  audi_ngw.animation.deAbsolutize(this);
  return this;
};

audi_ngw.animation.options = {};
/* SLIDESPEEDFACTOR is used to control slide animations speed in getSlideSpeed
 * formula is: element.height * SLIDESPEEDFACTOR + SLIDESPEEDBASE = duration of animation in ms
 */
audi_ngw.animation.options.SLIDESPEEDBASE = 100;
audi_ngw.animation.options.SLIDESPEEDFACTOR = 1.5;

audi_ngw.animation._oRegisteredLoaders = {};
audi_ngw.animation._oRegisteredRunningAnimations = {};

audi_ngw.animation._oStoredAbsolutizePositions = {};

/**
 * scrolls to top 
 * @return {Void}
 */
audi_ngw.animation.modalScrollTop = function () {
	$('#audi_modal_super_wrapper').animate({scrollTop:0}, 30); 
};

/**
 * Wrapper for Jquery animarte
 * registers Animation on start and removes it on end
 * pretends click history
 * @param {Object} element
 * @param {Object} oParam
 */
//audi_ngw.animation.animate = function (element, oParam) {
//	audi_ngw.dom.identify(element);
//	// start animation if itÂ´s not running already
//	if (!audi_ngw.animation.getRunning(jQuery(element).attr("id"))) {
//		// register animation
//		audi_ngw.animation.setRunning(jQuery(element).attr("id"));
//		var _speed = oParam.speed || 'normal';
//		var _oAnimation = oParam.animation || { };
//		jQuery(element).animate(oAnimation,_speed,'', function() {
//			// remove registered animation
//			audi_ngw.animation.unsetRunning(jQuery(element).attr("id"));
//			if (oParam && typeof oParam.fnCb == 'function') { oParam.fnCb(); }
//		});
//	}
//};

/**
 * Wrapper for Jquery slideDown
 * registers Animation on start and removes it on end
 * pretends click history
 * @param {Object} element
 * @param {Object} oParam
 */
audi_ngw.animation.slideDown = function (element, oParam) {
	audi_ngw.dom.identify(element);
	// start animation if itÂ´s not running already
	
	if (!audi_ngw.animation.getRunning(jQuery(element).attr("id"))) {
		// register animation
		audi_ngw.animation.setRunning(jQuery(element).attr("id"));
		jQuery(element).prev().addClass("open");
		
		jQuery(element).slideDown(audi_ngw.animation.getSlideSpeed(jQuery(element)), function() {
			jQuery(element).addClass("open");
			// remove registered animation
			audi_ngw.animation.unsetRunning(jQuery(element).attr("id"));

			if (oParam && typeof oParam.fnCb == 'function') { oParam.fnCb(); }
		});
	}
};
/**
 * Wrapper for Jquery slideDown
 * registers Animation on start and removes it on end
 * pretends click history
 * @param {Object} element
 * @param {Object} oParam
 */
audi_ngw.animation.slideUp = function (element, oParam) {
	audi_ngw.dom.identify(element);
	// start animation if itÂ´s not running already
	if (!audi_ngw.animation.getRunning(jQuery(element).attr("id"))) {
		// registrieren
		audi_ngw.animation.setRunning(jQuery(element).attr("id"));
		jQuery(element).slideUp(audi_ngw.animation.getSlideSpeed(jQuery(element)), function() {
			jQuery(this).removeClass("open");
			jQuery(this).prev().removeClass("open");
			audi_ngw.animation.unsetRunning(jQuery(element).attr("id"));
			
			if (oParam && typeof oParam.fnCb == 'function') { oParam.fnCb(); }
		});
	}

};

/**
 * 
 * Returns Speed in ms depending on height of the element and audi_ngw.animation.options.SLIDESPEEDFACTOR
 * @param {Object} 
 *  $element: jquery Element
 */
audi_ngw.animation.getSlideSpeed = function ($element) {
	return ($element.outerHeight() * audi_ngw.animation.options.SLIDESPEEDFACTOR)+ audi_ngw.animation.options.SLIDESPEEDBASE;
};



/**
 * 
 * Removes registered preloading class name from element
 * Adds class name to element, registeres current element as preloading
 * @param {Object} 
 *  sId: Element
 *  sCN: class name 
 */
audi_ngw.animation.setLoading = function (options) {
	var sId = (typeof options == 'string') ? options : ( (typeof options == 'object') ? options.sId :  '#audi_container_main');
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	var _sCN = options.sCN || 'preload';
	jQuery(sId).addClass(_sCN);
	this._oRegisteredLoaders[sId] = _sCN;
};

/**
 * 
 * Removes registered preloading class name from element
 * @param {String} sId: Element
 * @return {Void}
 */
audi_ngw.animation.unsetLoading = function (sId) {
	sId = sId || '#audi_container_main';
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	if (!this._oRegisteredLoaders[sId]) {
		return; 
	}
	jQuery(sId).removeClass(this._oRegisteredLoaders[sId]);
	delete this._oRegisteredLoaders[sId];
};


/**
 * audi_ngw.animation.getLoading 
 * Get's current loading state for this element
 * @param {String} sId: Element
 * @return {Boolean}
 */
audi_ngw.animation.getLoading = function (sId) {
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	return !!this._oRegisteredLoaders[sId];
};

/**
 * On complete callback removing running flag
 * @method _onComplete
 * @param {String} Identifier
 * @private
 * @return {Void}
 */
audi_ngw.animation.onComplete = function(sId){
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	audi_ngw.animation.unsetRunning(sId);
};
  
/**
 * Removes running flag for animation id 
 * @method unsetRunning
 * @param {String} Identifier
 * @return {Void}
 */
audi_ngw.animation.unsetRunning = function(sId){
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	audi_ngw.animation._oRegisteredRunningAnimations[sId] = false;
	delete audi_ngw.animation._oRegisteredRunningAnimations[sId];
};

/**
 * Sets running flag for animation id 
 * @method setRunning
 * @param {String} Identifier
 * @return {Void}
 */
audi_ngw.animation.setRunning = function(sId){
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	audi_ngw.animation._oRegisteredRunningAnimations[sId] = true;
};

/**
 * Gets running flag by animation id 
 * @method getRunning
 * @param {String} Identifier
 * @return {Void}
 */
audi_ngw.animation.getRunning = function(sId){
	sId = (sId.indexOf('#') === -1) ? "#"+sId : sId;
	return !!audi_ngw.animation._oRegisteredRunningAnimations[sId] || false;
};

/**
 * positions an element absolute
 * @method absolutize
 * @param {htmlelment} Element
 * @return {Void}
 */
audi_ngw.animation.absolutize = function(element){
	var $element = jQuery(element);
	var _sId = $element.audi_identify()[0].id;
	audi_ngw.animation._oStoredAbsolutizePositions[_sId] = {
		'top': $element.offset().top || 'auto',
		'position': $element.css('position') || 'static'
	};
	$element.css({
		'top': $element.offset().top,
		'position': $element.css('position','absolute ! important')
	});
};

/**
 * restores elements position
 * @method deAbsolutize
 * @param {String} Identifier
 * @return {Void}
 */
audi_ngw.animation.deAbsolutize = function(element){
 
	var $element = jQuery(element);
	var _sId = $element.attr('id');
	if (audi_ngw.animation._oStoredAbsolutizePositions[_sId]) {
		$element.css({
			'top': 'auto' || audi_ngw.animation._oStoredAbsolutizePositions[_sId].top,
			'position': audi_ngw.animation._oStoredAbsolutizePositions[_sId].position
		});
		audi_ngw.animation._oStoredAbsolutizePositions[_sId] = null;
		delete audi_ngw.animation._oStoredAbsolutizePositions[_sId];
	}
};

/**
 * Forces document repaint. Needed for opera for displaying new flash 
 * content after flash.update
 * @return {Void}
 */
audi_ngw.animation.forceRepaint = function (forceIE) {
	if (jQuery.browser.opera && jQuery.browser.version < 9.45) {
		jQuery('body').css({
			border: "1px solid transparent"
		});
		jQuery('body').css({
			border: "none"
		});
	}

	if (forceIE && jQuery.browser.msie && (parseInt(jQuery.browser.version, 10)==7 || parseInt(jQuery.browser.version, 10)==6)) {
		jQuery('body').css({
			zoom: "1"
		});
		jQuery('body').css({
			zoom: ""
		});
	}
};

/**
 * Slides next parent element
 * @return {Void}
 */
audi_ngw.animation.slideToggleParentNext = function(){
	jQuery(this).audi_slideDownToggleParentNext();
	return false;
};

audi_ngw.animation.initiate = function() {
	jQuery('.slideToggleParentNext')
		.unbind('click.slideToggleParentNext')
		.bind('click.slideToggleParentNext',audi_ngw.animation.slideToggleParentNext);
};

