





// FAMILY: ACTION RELAY
// executes relayed actions
function tvgs_timeline_action_relay(action_values)
{
	//document.getElementById('output').innerHTML += ' ==> rl(' + action_values.relay + ') ';
	
	//if (action_values.relay == 6) for (var i in action_values) document.getElementById('output').innerHTML += ' ("'+i+'":' + action_values[i] + ') ';
	switch(action_values.relay)
	{
		
		case 1:
		
			// relay 1: tvgs_element_set_opacity(element, opacity)
			tvgs_element_set_opacity(action_values.element, action_values.opacity);
			break;
			
			
		case 2:
		
			// relay 2: tvgs_element_set_clipped_appearance(element, y1clip, x2clip, y2clip, x1clip, top, left, display, opacity)
			tvgs_element_set_clipped_appearance(action_values.element, action_values.y1clip, action_values.x2clip, action_values.y2clip, action_values.x1clip, action_values.top, action_values.left, action_values.display, action_values.opacity);
			break;

			
		case 3:
		
			// relay 3: tvgs_element_set_background_position(element, x_offset, y_offset)
			tvgs_element_set_background_position(action_values.element, action_values.x_offset, action_values.y_offset);
			break;
		
		
		case 4:
		
			// relay 4: tvgs_element_set_image_source(element, background, source)
			tvgs_element_set_image_source(action_values.element, action_values.background, action_values.source);
			break;
		
		
		case 5:
		
			// relay 5: tvgs_element_set_size(element, width, height)
			tvgs_element_set_size(action_values.element, action_values.width, action_values.height);
			break;
		

		case 6:
		
			// relay 6: tvgs_element_set_position(element, x_offset, y_offset)
			tvgs_element_set_position(action_values.element, action_values.x_offset, action_values.y_offset);
			break;
			

		case 7:
			//document.getElementById('output').innerHTML += ' 7 ';
			// relay 7: tvgs_element_set_showhide(element, showhide)
			tvgs_element_set_showhide(action_values.element, action_values.showhide);
			//document.getElementById('output').innerHTML += ' 7 done ';
			break;	


		default:
			
			break;
		
	}
	
	return;

}





// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY
// sets style.width and style.height of an element as a string

// example: "tvgs_element_set_size(my_element, '40px', '10%');"

// note: set width and height parameters to null to ignore
function tvgs_element_set_size(element, width, height)
{
	
	// check if the element is an id
	if (typeof element == 'string')
	{
		element = document.getElementById(element);
		if (TVGS.nil(element)) return false;
	}
	
	if (width !== null) element.style.width = width;
	if (height !== null) element.style.height = height;

}





// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY
// sets src or style.backgroundImage of an element

// note: returns false when a src attribute is assigned to an element that is not an image
function tvgs_element_set_image_source(element, background, source)
{
	
	if (element.nodeName == 'IMG' && background == false)
	{
	
		element.src = source;
	
	}
	else if (background == true)
	{
	
		element.style.backgroundImage = 'url(' + source + ')';
	
	}
	else return false;

}




// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY

// sets style.backgroundPosition of an element
function tvgs_element_set_background_position(element, x_offset, y_offset)
{

	element.style.backgroundPosition = x_offset + 'px ' + y_offset + 'px';

}



// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY

// sets style.left and style.top of an element
function tvgs_element_set_position(element, x_offset, y_offset)
{
	//document.getElementById('output').innerHTML += ' ==> offset ' + x_offset + ',' + y_offset;
	element.style.left = x_offset + 'px';
	element.style.top = y_offset + 'px';

}




// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY

// sets style.opacity (or style.filter for explorer) of an element
function tvgs_element_set_opacity(element, opacity)
{

	// standard browsers
	element.style.opacity = opacity + '';
	
	// explorer
	element.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';

}


// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY

// sets style.opacity (or style.filter for explorer) of an element
function tvgs_element_set_showhide(element, showhide)
{
	//alert('relayed' + showhide);
	// fully visible
	if (showhide == 1)
	{
		// disable opacity settings
		element.style.opacity = '';
		element.style.filter = '';
		
		// set display to visible
		element.style.display = '';
	}
	// fully invisible
	else if (showhide == 0)
	{
		// disable opacity settings
		element.style.opacity = '';
		element.style.filter = '';
		
		// set display to hidden
		element.style.display = 'none';
	}
	// partially visible
	else
	{
		//document.getElementById('output').innerHTML += ' ==> opcity to ' + showhide;
		// use opacity settings
		element.style.opacity = showhide + '';
		element.style.filter = 'alpha(opacity=' + (showhide * 100) + ')';
		//document.getElementById('output').innerHTML += ' ==> opcity set to ' + showhide;
		// set display to visible
		element.style.display = '';
	}
	//document.getElementById('output').innerHTML += ' ==> showhide finished';
}




// FAMILY: ELEMENT CONTROL
// TYPE: ACTION RELAY

// sets style.clip of an element
// sets style.top of an element
// sets style.left of an element
// sets style.display of an element
// sets style.opacity or style.filter of an element

// dependency: tvgs_element_set_opacity

// 2010-01-30: updated for firefox render artefacts when using visibility to hide, now using display to hide
function tvgs_element_set_clipped_appearance(element, y1clip, x2clip, y2clip, x1clip, top, left, display, opacity)
{

	// note: uses clip property: "clip: rect(10px, 40px, 100px, 5px);"
	// note: clip usage: top, right (from left), bottom (from top), left
	element.style.clip = 'rect(' + y1clip + 'px, ' + x2clip + 'px, ' + y2clip + 'px, ' + x1clip + 'px)';

	// set position
	if (TVGS.set(top)) element.style.top = top + 'px';
	if (TVGS.set(left)) element.style.left = left + 'px';
	
	// set display
	if (TVGS.set(display)) element.style.display = display;
	
	// set opacity
	if (TVGS.set(opacity)) tvgs_element_set_opacity(element, opacity);

}






// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current height of an element
// warning: will return false on images that are not yet loaded, and have no explicit attribute or style setting for height

if (TVGS) TVGS.element_get_current_height = function (element)
{
	
	var height = null;
	
	// check if the element is an id
	if (typeof element == 'string')
	{
		element = document.getElementById(element);
		if (TVGS.nil(element)) return false;
	}
	
	// check style setting
	// note: interpret only pixel values or zero
	if (element.style.height && element.style.height.match(/^[0-9]+px$|^0$/))
	{
		height = element.style.height.replace('px', '') * 1; // style values are strings
	}
	
	// check set height (for example of an image)
	else if (element.height)
	{
		height = element.height;
	}
	
	// check rendered height
	else 
	{
		// offset height can only be calculated when display is not set to none (otherwise there is no rendered element to measure)
		var restore_display = false;
	
		if (element.style.display == 'none')
		{
			element.style.display = '';
			restore_display = true;
		}
		
		if (element.offsetHeight)
		{
			height = element.offsetHeight;
		}

		// restore display style
		if (restore_display) element.style.display = 'none';
	}
	
	// check result
	if (height === null)
	{
		return false;
	}
	else
	{
		return height;
	}
	
}



// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current width of an element
// warning: will return false on images that are not yet loaded, and have no explicit attribute or style setting for width

if (TVGS) TVGS.element_get_current_width = function (element)
{
	
	var width = null;
	
	// check if the element is an id
	if (typeof element == 'string')
	{
		element = document.getElementById(element);
		if (TVGS.nil(element)) return false;
	}
	
	// check style setting
	// note: interpret only pixel values or zero
	if (element.style.width && element.style.width.match(/^[0-9]+px$|^0$/))
	{
		width = element.style.width.replace('px', '') * 1; // style values are strings
	}
	
	// check set width (for example of an image)
	else if (element.width)
	{
		width = element.width;
	}
	
	// check rendered height
	else 
	{
		// offset width can only be calculated when display is not set to none (otherwise there is no rendered element to measure)
		var restore_display = false;
		
		if (element.style.display == 'none')
		{
			element.style.display = '';
			restore_display = true;
		}
		
		if (element.offsetWidth)
		{
			width = element.offsetWidth;
		}

		// restore display style
		if (restore_display) element.style.display = 'none';
	}
	
	// check result
	if (width === null)
	{
		return false;
	}
	else
	{
		return width;
	}
	
}



// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current top of an element
// devnote: no style value means 0 will be assumed, this will be incorrect when a css class dictates a value other than 0

if (TVGS) TVGS.element_get_current_top = function (element)
{
	
	var top = 0;
	
	// check style setting
	if (element.style.top)
	{
		//top = element.style.top.replace('px', '') * 1; // style values are strings
		top = TVGS.convert_to_float(element.style.top); // style values are strings
	}
	
	return top;
	
}



// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current left of an element
// devnote: no style value means 0 will be assumed, this will be incorrect when a css class dictates a value other than 0

if (TVGS) TVGS.element_get_current_left = function (element)
{
	
	var left = 0;
	
	// check style setting
	if (element.style.left)
	{
		//left = element.style.left.replace('px', '') * 1; // style values are strings
		left = TVGS.convert_to_float(element.style.left); // style values are strings
	}
	
	return left;
	
}



// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current display of an element

if (TVGS) TVGS.element_get_current_display = function (element)
{
	
	var display = null;
	
	// check style setting
	if (element.style.display)
	{
		display = element.style.display;
	}
	
	return display;
	
}



// FAMILY: ELEMENT CONTROL
// TYPE: PROPERTY INFO

// gets current opacity of an element

if (TVGS) TVGS.element_get_current_opacity = function (element)
{
	
	var opacity = null;
	
	// standard browsers
	if (element.style.opacity && element.style.opacity.length > 0)
	{
		opacity = element.style.opacity * 1; // style values are strings
	}
	// explorer
	else if (element.style.filter && element.style.filter.length > 0)
	{
		if (element.style.filter.match(/opacity/))
		{
			opacity = element.style.filter.replace(/[^0-9]/gi, '') * 0.01; // style values are strings, correct for explorers 0-100 range
		}
	}

	// check style setting
	if (opacity >= 0 && opacity <= 1) return opacity;
	else return null;

}
	


