/* Copyright it-motive AG, Duisburg */

/*

Name:		DOMutils.js
Funktion:	Funktionen zum DOM
Aufruf:

Parameter:

Resultat:

*/
/*
  	<script language="JavaScript" src="DOMutil.js" type="text/javascript"></script>
*/

// CloneDOMnode(node, document, cloneChildren)
// Erzeugt einen Klon von "node" im Dokument "document" - sowie von seinen Kindern, wenn "cloneChildren" wahr ist.

// Parameter:
// - node: 		   		DOM-Node
// - document:   		DOM-Document
// - cloneChildren:  	true um Kinder ebenfalls zu klonen - false sonst

// Return:
// - Geklonter DOM-Node	wenn der Knotentyp Element, Text oder Attribut ist
//						Achtung: Attributknoten "id" werden nicht geklont, wenn "document" identisch mit Dokument von "node" ist.
// - null				sonst


function CloneDOMnode(node, doc, cloneChildren)
{
	var result = null;
	var i, j, k, n, m, a, v;

	switch(node.nodeType)
	{
	  // Elementknoten
	  case 1:
		result = doc.createElement(node.nodeName);

		for(i=0; i<node.attributes.length; i++)
		{
			// Workaround für IE - der kann leider:
			//		style-Attribut (muss dann auch noch umgesetzt werden von CSS in JS)
			// 		eventHandler-Funktionen (das muss dann leider auch noch einzeln erfolgen)
			// nicht als AttributeNode aufbauen :-(
			if(navigator.appName == "Microsoft Internet Explorer")
			{
				switch(node.attributes[i].nodeName.toLowerCase())
				{
				  // Einzelzuweisung von Styles (inkl. Umsetzung CSS zu JS Syntax)
				  case "style":
					a = node.attributes[i].nodeValue.split(";");	// in Bestandteile zerlegen, getrennt durch ;
					for(j=0; j<a.length; j++) if(a[j].indexOf(':') > 0)
					{
						n = a[j].replace(/:.*/, "");				// Name  vor dem :
						v = a[j].replace(/.*:/, "");				// Wert nach dem :
						if(n.length > 0 && v)
						{
							m = n.split("-");						// - ersetzen durch nix mit anschliessender Großschreibung
							n = m[0];
							for(k=1; k<m.length; k++) n += m[k].substring(0,1).toUpperCase()+m[k].substring(1);
							result.style[n] = v;
						}
					}
					break;

				  // Einzelzuweisung von Event-Handlern durch Neukonstruktion der Funktion
				  case "ononabort":		result.ononabort	= new Function(node.attributes[i].nodeValue); break;
				  case "onblur":		result.onblur		= new Function(node.attributes[i].nodeValue); break;
				  case "onchange":		result.onchange		= new Function(node.attributes[i].nodeValue); break;
				  case "onclick":		result.onclick		= new Function(node.attributes[i].nodeValue); break;
				  case "ondblclick":	result.ondblclick	= new Function(node.attributes[i].nodeValue); break;
				  case "onerror":		result.onerror		= new Function(node.attributes[i].nodeValue); break;
				  case "onfocus":		result.onfocus		= new Function(node.attributes[i].nodeValue); break;
				  case "onkeydown":		result.onkeydown	= new Function(node.attributes[i].nodeValue); break;
				  case "onkeypress":	result.onkeypress	= new Function(node.attributes[i].nodeValue); break;
				  case "onkeyup":		result.onkeyup		= new Function(node.attributes[i].nodeValue); break;
				  case "onload":		result.onload		= new Function(node.attributes[i].nodeValue); break;
				  case "onmousedown":	result.onmousedown	= new Function(node.attributes[i].nodeValue); break;
				  case "onmousemove":	result.onmousemove	= new Function(node.attributes[i].nodeValue); break;
				  case "onmouseout":	result.onmouseout	= new Function(node.attributes[i].nodeValue); break;
				  case "onmouseover":	result.onmouseover	= new Function(node.attributes[i].nodeValue); break;
				  case "onmouseup":		result.onmouseup	= new Function(node.attributes[i].nodeValue); break;
				  case "onreset":		result.onreset		= new Function(node.attributes[i].nodeValue); break;
				  case "onselect":		result.onselect		= new Function(node.attributes[i].nodeValue); break;
				  case "onsubmit":		result.onsubmit		= new Function(node.attributes[i].nodeValue); break;
				  case "onunload":		result.onunload		= new Function(node.attributes[i].nodeValue); break;

				  // Standard-DOM Weg für den Rest (Rekursion)
				  default:
					n = CloneDOMnode(node.attributes[i], doc, false);
					if(n) result.setAttributeNode(n);
					break;
				}
			}
			// Standard-DOM Weg (Rekursion) - funktioniert mit FF
			else
			{
				n = CloneDOMnode(node.attributes[i], doc, false);
				if(n) result.setAttributeNode(n);
			}
		}

		// Kinder von Elementknoten (Rekursion)
		if(cloneChildren) for(i=0; i<node.childNodes.length; i++)
		{
			n = CloneDOMnode(node.childNodes[i], doc, true);
			if(n) result.appendChild(n);
		}
		break;

	  // Attributknoten
	  case 2:
	  	// ID nicht kopieren, wenn Zieldokument = Quelldokument!
	  	if(node.nodeName.toLowerCase()!="id" || doc!=GetDocumentNode(node))
	  	{
			result = doc.createAttribute(node.nodeName);
			result.nodeValue = node.nodeValue;
		}
		break;

	  // Textknoten
	  case 3:
	  	result = doc.createTextNode(node.nodeValue);
		break;

	  default:
	  	alert(node.nodeType+" "+node.nodeName+" "+node.nodeValue);
	}
	return(result);
}

function GetDocumentNode(node)
{
	while(node.parentNode && node.nodeType != 9) node = node.parentNode;
	return(node);
}

