

/**
 * Fichier obsolète : utiliser ev/gui/opacity.js à la place.
 */
(function() {
	var window = this,
			ev = window.ev;

	// Si les namespaces/classes nécessaires ne sont pas chargées : exception
	if (!ev) {throw 'Le module ev.core est nécessaire.';}
	if (!ev.time) {throw 'Le namespace "ev.time" doit exister';}
	if (!ev.time.Timeline) {throw 'La classe "ev.time.Timeline" doit exister';}

	ev.log.fatal('ev/effects/opacity.js est DEPRECATED !! => Utiliser ev/gui/opacity.js à la place.');

	if (!ev.effects) {ev.effects = {};}
	if (!ev.gui) {ev.gui = {};}

	/**
	 * This private constant defines the delay of the timeline internally used
	 * by the slider. CAUTION: modifying this constant can cause a strong
	 * resource consumption.
	 */
	var INTERVAL = 60;

	/**
	 * Timeline unique gérant tous les gestionnaires d'opacité.
	 */
	var TIMELINE = new ev.time.Timeline(INTERVAL);

	/**
	 * Objet permettant de gérer la variation d'opacité
	 * d'un élément DOM
	 * @param {Object} _paneNode : le noeud DOM à contrôler.
	 * @param {Object} _delay : la durée d'un changement d'opacité.
	 */
	ev.gui.Opacity = function(_paneNode, _delay, _onAfter) {
		if (!_paneNode) {throw 'paneNode is not valid';}
		if (typeof(_delay) !== 'number') {throw 'delay is not a valid number';}

		/**
		 * Gets the pane node, i.e; the sliding block.
		 */
		this.getPaneNode = function() {
			return _paneNode;
		};

		/**
		 * On définit l'opacité initiale, finale, et courante
		 */
		var opacityStart = window.getStyleValue(_paneNode, 'opacity');
		var opacityEnd = 0;
		var opacity = opacityStart;

		/**
		 * constante définissant l'action d'une diminution de l'opacité
		 */
		var DECREASE = 0;

		/**
		 * constante définissant l'action d'une augmentation de l'opacité
		 */
		var INCREASE = 1;

		/**
		 * Sens de variation par défaut.
		 */
		var direction = INCREASE;

		/**
		 * Pas d'incrément utilisé pour faire varier l'opacité
		 * progressivement.<br>
		 * Ce pas est calculé en fonction l'écart entre
		 * l'opacité de départ et d'arrivée, et la durée choisie
		 * pour faire le changement.
		 */
		var incrementOpacity = INTERVAL * (opacityStart - opacityEnd) / _delay;

		/**
		 * Listener d'écoute de la TIMELINE.
		 */
		var timelineListener = new ev.time.TimelineListener();

		/**
		 * Méthode d'activation de l'objet Opacity<br>
		 * Cette méthode s'occupe d'enregistrer le listener de
		 * l'objet Opacity dans la TIMELINE et démarre cette
		 * TIMELINE si elle n'est pas encore démarrée.
		 */
		function resume() {
			// ajout du listener de l'objet Opacity dans la TIMELINE
			TIMELINE.addTimelineListener(timelineListener);
			// démarrage de la TIMELINE si ce n'est déjà fait
			if (!TIMELINE.isRunning()) {
				TIMELINE.start();
			}
		}

		/**
		 * Méthode de désactivation du Locator.<br>
		 * Cette méthode s'occupe de supprimer le listener de
		 * l'objet Locator de la TIMELINE.
		 */
		function suspend() {
			// suppression du listener de l'objet de la TIMELINE
			TIMELINE.removeTimelineListener(timelineListener);
		}

		/**
		 * Méthode appelée par la TIMELINE sur
		 * intervalle régulier.
		 * @param {Object} _e : événement envoyé par la TIMELINE.
		 */
		timelineListener.throwTimelineEvent = function(_e) {
			//Cette timeline ne se coupe jamais
			if ((direction === INCREASE || opacity > opacityEnd) && ((direction === DECREASE || opacity < opacityStart))) {
				if (direction === DECREASE) {
					opacity = opacity - incrementOpacity;
				}
				else {
					opacity = opacity + incrementOpacity;
				}
				_paneNode.style.opacity = opacity;
				_paneNode.style.filter = 'Alpha(Opacity=' + (opacity * 100) + ')';
			}
			else {
				if (direction === DECREASE) {
					_paneNode.style.opacity = opacityEnd;
					_paneNode.style.filter = 'Alpha(Opacity=' + (opacityEnd * 100) + ')';
					opacity = opacityEnd;
				}
				else {
					_paneNode.style.opacity = opacityStart;
					_paneNode.style.filter = 'Alpha(Opacity=' + (opacityStart * 100) + ')';
					opacity = opacityStart;
				}
				//
				suspend();
				if (typeof(_onAfter) == 'function') {
					_onAfter();
				}
			}
		};

		/**
		 * Cette méthode baisse l'opacité.
		 */
		this.decrease = function() {
			direction = DECREASE;
			resume();
		};

		/**
		 * Cette méthode augmente l'opacité.
		 */
		this.increase = function() {
			direction = INCREASE;
			resume();
		};

		/**
		 * Cette méthode remet l'opacité de départ
		 * avec si besoin l'opacité à utilier en param.
		 * @param {Number} op opacité à fixer [optionel].
		 */
		this.reset = function(op) {
			if (op !== undefined) {
				opacityStart = op;
			}
			_paneNode.style.opacity = opacityStart;
			_paneNode.style.filter = 'Alpha(Opacity=' + (opacityStart * 100) + ')';
			opacity = opacityStart;
			suspend();
		};
	};

	ev.effects.Opacity = ev.gui.Opacity;
	// Raccourci dispo à l'extérieur (pour compatibilité)
	window.varyOpacityESV = ev.gui.Opacity;
}());

