var joDOM 	= new joDOMClass();
var joFIND 	= joDOM.GetNode;

/* ********************************************************************************************************** */

function joDOMClass()
{
	this.Clone						= _joDOM_Clone;

	this.GetNode					= _joDOM_GetNode;
	this.GetSubNode				= _joDOM_GetSubNode;
	this.AddNode					= _joDOM_AddNode;
	
	this.GetNodeValue				= _joDOM_GetNodeValue;
	this.SetNodeValue				= _joDOM_SetNodeValue;
	
	this.SetAttribute				= _joDOM_SetAttribute;
	this.GetAttribute				= _joDOM_GetAttribute;
	
	this.GetFirstChildNode		= _joDOM_GetFirstChildNode;
	this.RemoveChildNodes		= _joDOM_RemoveChildNodes;
	
	this.AddText					= _joDOM_AddText;
	this.AddTextByID				= _joDOM_AddTextByID;
	this.SetText					= _joDOM_SetText;
	this.SetTextByID				= _joDOM_SetTextByID;
	this.GetText					= _joDOM_GetText;
	this.GetTextByID				= _joDOM_GetTextByID;
	
	this.GetForm					= _joDOM_GetForm;
	this.GetFormElement			= _joDOM_GetFormElement;
}

/* ********************************************************************************************************** */

function _joDOM_GetForm (form_name) 
{
	var result = null;
	for (var i = 0; !result && i < document.forms.length; i++)
	{
		if (document.forms[i].name == form_name) result = document.forms[i];
	}
	return result;
}

/* ********************************************************************************************************** */

function _joDOM_GetFormElement (form_node, element_name) 
{
	var result = null;
	for (var i = 0; !result && i < form_node.elements.length; i++)
	{
		if (form_node.elements[i].name == element_name) result = form_node.elements[i];
	}
	return result;
}

/* ********************************************************************************************************** */

function _joDOM_GetFirstChildNode (parent_node) 
{
	var result = null;

	if (parent_node)
	{
		var count_nodes = parent_node.childNodes.length;
		
		for (var i = 0; !result && i < parent_node.childNodes.length; i++)
		{
			if (parent_node.childNodes[i].nodeType == 1)
			{
				result = parent_node.childNodes[i];
			}		
		}
	}	
	return result;
}

/* ********************************************************************************************************** */

function _joDOM_SetNodeValue (node, value) 
{
	if (node) node.nodeValue = value;
}

/* ********************************************************************************************************** */

function _joDOM_GetNodeValue (node, default_value) 
{
	var result = "";
	if (default_value) result = default_value;
	if (node && node.nodeValue && node.nodeValue != "") result = node.nodeValue;
}

/* ********************************************************************************************************** */

function _joDOM_AddNode (parent_node, node_type) 
{
	var new_node = document.createElement (node_type);
	parent_node.appendChild (new_node);
	return new_node;
}

/* ********************************************************************************************************** */

function _joDOM_GetNode (node_id) 
{
	if (window.mmIsOpera) return (document.getElementById (node_id));
	if (document.all) return (document.all [node_id]);
	if (document.getElementById) return (document.getElementById (node_id));
	return (null);
}

/* ********************************************************************************************************** */

function _joDOM_SetAttribute (node, attrib_name, attrib_value)
{
	var attrib = node.getAttributeNode (attrib_name);
	if (!attrib) 
	{
		attrib = document.createAttribute (attrib_name);
		attrib.nodeValue = attrib_value;
		node.setAttributeNode (attrib);
	}
	else attrib.nodeValue = attrib_value;
}

/* ********************************************************************************************************** */

function _joDOM_GetAttribute (parent_node, attribute_name, default_value)
{
	var result = "";
	
	if (parent_node && parent_node.getAttributeNode(attribute_name))
	{
		result = parent_node.getAttribute (attribute_name);
	}
	if (default_value && result == "")
		result = default_value;
	
	return result;
}

/* ********************************************************************************************************** */

function _joDOM_SetTextByID (node_id, text)
{
	var node = joFIND (node_id);
	if (node) this.SetText (node, text)
}

/* ********************************************************************************************************** */

function _joDOM_SetText (node, text)
{
	if (node) node.firstChild.nodeValue = text;
}

/* ********************************************************************************************************** */

function _joDOM_GetTextByID (node_id)
{
	var node = joFIND (node_id);
	if (node) this.GetText (node);
}

/* ********************************************************************************************************** */

function _joDOM_GetText (node)
{
	if (node) return node.firstChild.nodeValue + "";
}

/* ********************************************************************************************************** */

function _joDOM_AddTextByID (node_id, text)
{
	var node = joFIND (node_id);
	if (node)
	{
		this.AddText (node, text);
	}
}

/* ********************************************************************************************************** */

function _joDOM_AddText (node, text)
{
	if (node)
	{
		var text_node = document.createTextNode (text);
		node.appendChild (text_node);
	}
}

/* ********************************************************************************************************** */

function _joDOM_RemoveChildNodes (node)
{
	while (node && node.hasChildNodes())
	{
		this.RemoveChildNodes (node.firstChild);
		var subnode = node.removeChild (node.firstChild);
		subnode = null;
	}
}

/* ********************************************************************************************************** */

function _joDOM_GetSubNode (root_node, node_path, node_id)
{
	var result = null;

	if (root_node) 
	{
		var node = root_node;
		var parent_node = root_node;
		
		var path_steps = node_path.split ("/");
		for (var i = 0; parent_node && i < path_steps.length - 1; i++)
		{
			node = parent_node.getElementsByTagName (path_steps[i])[0];
			parent_node = node;
		}
	
		if (parent_node)
		{
			var nodes = parent_node.getElementsByTagName (path_steps[i]);
			if (node_id  && node_id != "")
			{
				for (i = 0; !result && i < nodes.length; i++)
				{
					if (nodes[i].getAttribute ("id") == node_id)
					{
						result = nodes[i];
					}
				} 
			}
			else result = nodes[0];
		}
	}
	
	return result;
}

/* ********************************************************************************************************** */

function _joDOM_Clone (source_node, dest_node)
{
	var nodeName = source_node.nodeName;
	var new_node = this.AddNode (dest_node, nodeName);
	
	for (var i = 0; i < source_node.attributes.length; i++)
	{
		this.SetAttribute (new_node, source_node.attributes[i].nodeName, source_node.attributes[i].nodeValue);
	}
	
	for (var i = 0; i < source_node.childNodes.length; i++)
	{
		if (source_node.childNodes[i].nodeType == 1)
		{
			this.Clone (source_node.childNodes[i], new_node);
		}		
	}
	
}
