
Haedus.Fnc.Fade = {
	
	create : function(container, trigger, open, close) {
		
		var action = this.action(container, trigger, open, close);
		
		Haedus.Event.addFunction(trigger, action);
		
		Haedus.Event.addListener(
			trigger,
			'click',
			Haedus.Fnc.Fade.startAction
		);
		
	},
	
	action : function(container, trigger, open, close) {
		
		var FADE = false;
		
		return {
			
			container : Haedus.getDom(container),
			trigger : Haedus.getDom(trigger),
			
			open : open,
			close : close,
			
			fade : {
				interval : '0',
				current: 0,
				to : 0,
				jumper : 45,
				direction : '<'
			},
			
			getContainer : function() {
				return this.container;
			},
			
			getContainerId : function() {
				return container;
			},
			
			getTrigger : function() {
				return this.trigger;
			},
			
			getTriggerId : function() {
				return trigger;
			},
			
			getOpen : function() {
				return this.open;
			},
			
			getClose : function() {
				return this.close;
			},
			
			setFading : function(what) {
				
				if (what.interval) {
					this.fade.interval = what.interval;
				}
				if (what.current) {
					this.fade.current = what.current;
				}
				if (what.to) {
					this.fade.to = what.to;
				}
				if (what.direction) {
					this.fade.direction = what.direction;
				}
				
			},
			
			isFading : function() {
				return this.fade;
			}
			
			
			
		};
		
	},
	
	startAction : function(e) {
		
		time = 20;
		
		var current = Haedus.Event.findFunction(Haedus.Event.getTarget(e));
		
		if (current.getContainer().style.left == current.getOpen() && '0' === current.isFading().interval) {
			
			current.setFading({
				interval : window.setInterval("Haedus.Fnc.Fade.play('" + current.getTriggerId() + "')", time),
				current : parseInt(current.getOpen()).toString(),
				to : parseInt(current.getClose()).toString(),
				direction : '<'
			});
			
			
		} else if (current.getContainer().style.left == current.getClose() && '0' === current.isFading().interval) {
			
			current.setFading({
				interval : window.setInterval("Haedus.Fnc.Fade.play('" + current.getTriggerId() + "')", time),
				current : parseInt(current.getClose()).toString(),
				to : parseInt(current.getOpen()).toString(),
				direction : '>'
			});
			
		}
		
	},
	
	stopAction : function(trigger, what) {
		
		var current = Haedus.Event.getFunction(trigger);
		
		current.getTrigger().src = current.getTrigger().src.replace(/trigger_([a-z]*)\.gif/, 'trigger_' + what + '.gif');
		window.clearInterval(current.isFading().interval);
		current.setFading({
			interval : '0',
			current : 0,
			to : 0,
			direction : '<'
		});
		
	},
	
	play : function(trigger) {
		
		var current = Haedus.Event.getFunction(trigger);
		
		f = parseInt(current.isFading().current);
		t = parseInt(current.isFading().to);
		
		next = (('<' == current.isFading().direction)
					?	((t - f) / 5) - 1
					: 	((t - f) / 5));
		next = parseInt(current.getContainer().style.left) + next;
		
		current.getContainer().style.left = (next + 'px');
		current.setFading({
			current : next
		});
		
		if (Math.round(next) == t) {
			
			current.getContainer().style.left = t + 'px';
			
			switch (current.isFading().direction) {
				
				case '<':
					Haedus.Fnc.Fade.stopAction(trigger, 'open');
					break;
				
				case '>':
					Haedus.Fnc.Fade.stopAction(trigger, 'close');
					break;
				
			}
		}
		
	}
	
};
