var global_unique_fade_index = 0;
var global_fade_events = [];

function global_fade( element_id, time_to_fade, fade_index ) {
	
	var el = document.getElementById( element_id );
	
	if ( el == null ) {
		return false;
	}
	
	if ( el.fade_state == null ) { 
		if ( el.style.opacity == null || el.style.opacity == '' || el.style.opacity == '1' ) {
			el.fade_state = 2;
		} else {
			el.fade_state = -2;
		}
	}
	
	if ( el.fade_state == 1 || el.fade_state == -1 ) {
		el.fade_state = el.fade_state == 1 ? -1 : 1;
		el.fade_time_left = time_to_fade - el.fade_time_left;
	} else {
		el.fade_state = el.fade_state == 2 ? -1 : 1;
		el.fade_time_left = time_to_fade;
		setTimeout( 'global_animateFade( new Date().getTime(), "' + element_id.toString() + '", ' + time_to_fade + ', ' + fade_index + ' )', 33 );
	}
	
	return true;
	
}

function global_animateFade( last_tick, element_id, time_to_fade, fade_index ) {
	
	var current_tick = new Date().getTime();
	var elapsed_ticks = current_tick - last_tick;
	
	var el = document.getElementById( element_id );
	
	if ( el.fade_time_left <= elapsed_ticks ) {
		
		el.style.opacity = el.fade_state == 1 ? '1' : '0';
		el.style.filter = 'alpha(opacity = ' + ( el.fade_state == 1 ? '100' : '0' ) + ')';
		el.fade_state = el.fade_state == 1 ? 2 : -2;
		
		global_fade_events[fade_index]();
		
		return true;
		
	}
	
	el.fade_time_left -= elapsed_ticks;
	
	var new_opacity_value = el.fade_time_left / time_to_fade;
	
	if ( el.fade_state == 1 ) {
		new_opacity_value = 1 - new_opacity_value;
	}
	
	el.style.opacity = new_opacity_value;
	el.style.filter = 'alpha(opacity = ' + ( new_opacity_value * 100 ) + ')';
	
	setTimeout( 'global_animateFade( ' + current_tick.toString() + ', "' + element_id.toString() + '", ' + time_to_fade + ', ' + fade_index + ' );', 33 );
	
}
	

function Fader( on_finish ) {
	
	this.time_to_fade = 1000.0;
	this.fade_index = global_unique_fade_index;
	
	this.fade = function( element_id ) {
		global_fade( element_id, this.time_to_fade, this.fade_index );
	}
	
	global_fade_events[this.fade_index] = on_finish;
	
	global_unique_fade_index++;
	
};
