// Basic wrapper to manage browser incompatibilities

function div_manager (div_name)
{
	this.div_name		= div_name;
	this.div_obj 		= get_div_obj(div_name);
	this.style_obj 		= get_div_style_obj(this.div_obj);

	this.set_visibility 	= div_set_visibility;
	this.get_visibility 	= div_get_visibility;

	this.set_style_value	= div_set_style_value;
	this.get_style_value	= div_get_style_value;

	this.set_property	= div_set_property;
	this.get_property	= div_get_property;

	this.get_content	= div_get_content;
	this.set_content	= div_set_content;

	this.get_height		= div_get_height;
	this.get_width		= div_get_width;
	this.set_height		= div_set_height;
	this.set_width		= div_set_width;

	this.debug		= div_debug;
}

function div_debug (style_name, style_value)
{
	var str	= '';
	var re	= false;
	var sto	= false;

	sto = this.style_obj;

	if (style_name)
		re = new RegExp (style_name, 'i');
	else
		re = new RegExp (style_value, 'i');

	for (i in sto)
	{
		if (style_name && re.exec(i) != null)
			str += i + ": " + sto[i] + "\n";
		else if (style_name && re.exec(sto[i]) != null)
			str += i + ": " + sto[i] + "\n";
	}

	alert (str);
}

function div_get_height (default_value)
{
	// There appears to be multiple parameters which can potentially control the height of a DIV object...
	// E.g. div.style['height']
	//	div.offsetHeight
	//	div.style['pixelHeight']
	//	etc...
	// offsetHeight always appears to be accurate, thankfully!
	return this.div_obj.offsetHeight;
}

function div_set_height (new_height, new_overflow)
{
	new_overflow = (typeof(new_overflow) != undefined ? new_overflow : 'auto');

	this.offsetHeight = new_height;
	this.set_style_value ('height', new_height + "px");
	this.set_style_value ('overflow', new_overflow);
}

function div_get_width ()
{
	return this.div_obj.offsetWidth;
}

function div_set_width (new_width, new_overflow)
{
	new_overflow = (typeof(new_overflow) != undefined ? new_overflow : 'auto');

	this.offsetWidth = new_width;
	this.set_style_value ('width', new_width + "px");
	this.set_style_value ('overflow', new_overflow);
}

function get_div_obj (div_name)
{
	var obj = false;

	if (dvm_isIE || dvm_isNN)
		obj = dvm_isIE ? document.all[div_name] : document.getElementById(div_name);
	else
		obj = document[div_name];

	if (obj == null)
		alert ('get_div_obj: Unable to find ' + div_name);

	return obj;
}

function get_div_style_obj (div_obj)
{
	// NN4 embeds values directly onto the DIV node itself
	// Note that dvm_isXYZ are global variables populated on library load
	var style = div_obj;

	if (!dvm_isN4)
		style = div_obj.style;

	return style;
}

function div_set_property (p_name, p_value)
{
	this.div_obj[p_name] = p_value;
}

function div_get_property (p_name, default_value)
{
	var retval = default_value;

	// Style objects have a nasty habit of being empty even if defined
	if (typeof(this.div_obj[p_name]) != 'undefined' && this.div_obj[p_name] != '')
		retval = this.div_obj[p_name];

	return retval;
}

function div_get_visibility ()
{
	// We assume the div is currently visible if this value is not defined in the style list
	var is_visible = this.get_style_value ('visibility', 'visible');

	if (is_visible == 'show' || is_visible == 'visible')
		return true;
	else
		return false;
}

function div_set_visibility (visibility_flag, wipe_content)
{
	var value = '';

	if (visibility_flag)
		value = dvm_isN4 ? 'show' : 'visible';
	else
		value = dvm_isN4 ? 'hide' : 'hidden';

	this.set_style_value ('visibility', value);

	// Youtube videos continue to play when the popup is hidden.
	// We therefore wipe the HTML if requested: this kills playback
	if (wipe_content)
		this.set_content('');
}

function div_set_style_value (name, value)
{
	this.style_obj[name] = value;
}

function div_get_style_value (name, default_value)
{
	var retval = default_value;

	// Style objects have a nasty habit of being empty even if defined
	if (typeof(this.style_obj[name]) != 'undefined' && this.style_obj[name] != '')
		retval = this.style_obj[name];

	return retval;
}

function div_get_content ()
{
	// You can actually display multiple child nodes for a given div, but we keep things simple...
	return this.div_obj.innerHTML;
}

function div_set_content (new_str, debug)
{
	this.div_obj.innerHTML = new_str;
}

/*
 * Adapted from http://www.codelifter.com/main/javascript/dragablelayer.html
 *
 * Original Author:     etLux
 * Script Source: 	CodeLifter.com
 * Copyright 2003
 * Do not remove this header
 *
 */

dvm_isIE = (document.all ? true : false);
dvm_isNN = (!document.all && document.getElementById ? true : false);
dvm_isN4 = (document.layers ? true : false);

dvm_default_x 	= 100;
dvm_default_y 	= 100;
dvm_popup_obj 	= false;
popup_active 	= false;
parent_layer	= false;
current_layer	= false;

function div_initialise_popup (div_wrapper, default_x, default_y)
{
	// We directly access the properties of the DIV, rather than going through the wrapper
	dvm_popup_obj = div_wrapper.div_obj;

	if (typeof (default_x) != 'undefined')
		dvm_default_x 	= default_x;

	if (typeof (default_y) != 'undefined')
		dvm_default_y 	= default_y;

	document.onmousedown = ddInit;
	document.onmouseup = Function("ddEnabled=false");
}

function ddInit (e)
{
	parent_layer	= dvm_isIE ? "BODY" : "HTML";
	current_layer 	= dvm_isIE ? event.srcElement : e.target;  

	if (!dvm_popup_obj)
		alert ('popup obj not initialised');

	while (current_layer.id != "titleBar" && current_layer.tagName != parent_layer)
		current_layer = dvm_isIE ? current_layer.parentElement : current_layer.parentNode;

	if (current_layer.id == "titleBar")
	{
		// Default values for left/top seems to be null, which causes a failure
		// We use default values in this case
		if (dvm_popup_obj.style.left == '')
			dvm_popup_obj.style.left = dvm_default_x;
		if (dvm_popup_obj.style.top == '')
			dvm_popup_obj.style.top = dvm_default_y;

		offsetx 		= dvm_isIE ? event.clientX : e.clientX;
		offsety 		= dvm_isIE ? event.clientY : e.clientY;
		nowX 			= parseInt(dvm_popup_obj.style.left);
		nowY 			= parseInt(dvm_popup_obj.style.top);
		ddEnabled 		= true;
		document.onmousemove 	= dd;
	}
	
}

function dd(e)
{
	if (ddEnabled) 
	{
		dvm_popup_obj.style.left 	= dvm_isIE ? nowX+event.clientX-offsetx : nowX+e.clientX-offsetx; 
		dvm_popup_obj.style.top 	= dvm_isIE ? nowY+event.clientY-offsety : nowY+e.clientY-offsety;
		//alert('Moving popup: ' + nowX + ' -> ' + dvm_popup_obj.style.left);
	}

	return false;  
}

function ddN4 ()
{
	if (dvm_isN4) 
	{
		N4=eval(dvm_popup_obj);
		N4.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);

		N4.onmousedown = 
			function (e)
			{
				N4.captureEvents(Event.MOUSEMOVE);
				N4x=e.x;
				N4y=e.y;
			}

		N4.onmousemove =
			function (e)
			{
				if (isHot)
				{
					N4.moveBy(e.x-N4x,e.y-N4y);
					return false;
				}
			}

		N4.onmouseup = 
			function()
			{
				N4.releaseEvents(Event.MOUSEMOVE);
			}
	}
}

