//# -----------------------------------------------------------------------------------------------------------------------
//#		 	Usprung F. Permadi 2005. modifiziert und erweitert T. Schmidt 2010
//#			script durchlaeuft den DOMTree eines HTML Dokuments bzw. Knotens (rekurives Aufrufen mittels
//#			traverseDOMTree von allen Kindknoten und gibt diesen dann mittels printDOMTree(domElement, treeMode, writeMode)							
//#
//#			Beispiel: 	html tag bekommt id <html id="MyHtml">, Aufruf dann mittels 
//#						printDOMTree(document.getElementById('myHtml'), 'treeVisualNo', 'writeFileNo');  
//#
//# 		Modus treeMode  																						
//#						treeVisual 		HMTL tags werden dargestellt												
//#						treeVisualNo 	Ursprungseite, aber javascript substituierte Knotenwerte sind abspeicherbar		
//#
//#			Modus writeMode																						 
//#						writeFile		Ausgabe in File									
//#						writeFileNo		Ausgabe in neues Fenster
//#
//#			Hartkodierte Besonderheiten, zur Zeit hier in den Code gewebt ohne seprate Konfiguration
//#				1. Tranformation 
//#						alle links mit #googtrans/X/Y werden ueber newlink_ modifiziert | siehe function newlink_()
//#
//#						ausserdem wird den Schalter eingebaut googtrans=on fuer cookie_cart.pl script
//#						zum einbinden von googleTranslateElementInit ... (damit ist der entsprechende javacode standard maessig draussen
//#						wenn nicht googtrans=on gesetzt ist
//#						
//#						<SPAN> und </SPAN> tags raus				
//#						
//#						<BODY atrributes> -> <BODY>	
//#					
//#				2. Ausschluss
//#						</BR>,  </META>, </LINK>, </INPUT>, </IMG> werden nicht ausgegeben | siehe traversaeDOMTree()
//#						<SPAN>, </SPAN> google Formatierung | siehe traversaeDOMTree()
//#
//#						<DIV id="myDivEx1">, 
//#						<IFRAME>, <OBJECT> und Kindelemente werden nicht ausgegeben 
//#						<SCRIPT>, <LINK> wenn Attribute "translate" enthalten
//#						siehe printDOMTree()
//#
//#				2do: value aus <span tag>
//# -----------------------------------------------------------------------------------------------------------------------

// init with DOCTYPE as it seems to be no memeber of DOM tree
var GlobalContent = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n';
var GlobalwriteMode;

//# -----------------------------------------------------------------------------------------------------------------------
//#			spezielles Umschreiben der googtrans Tags auf neuen Link 
//# 		1. http://www.nes.com/path/X.htm#googtrans/de/Y -> http://www.nes.com/path/X_Y.htm
//#			2. http://www.nes.com/path/X.pl#googtrans/de/Y -> http://www.nes.com/path/X.pl?googtrans=on#googtrans/de/Y	
//# -----------------------------------------------------------------------------------------------------------------------
function newlink_ (old_link)
	{
	var newlink;
	var search1 = /(.*)\.htm\#googtrans\/(.*)\/(.*)/; 
	// var search2 = /(.*)\.pl\?(.*)\#googtrans(.*)/;
	var search2 = /(.*)\.pl\?(.*)\#googtrans\/(.*)\/(.*)/; 
	var result1 = search1.exec(old_link);
	var result2 = search2.exec(old_link);
	if (result1)
		{
		// alert(old_link + "\nwe are here AAAAAA")
		//newlink =  result1[1] + "_" + result1[3] + ".htm";
		newlink =  result1[1] + "_" + result1[3] + ".htm?googtrans=" + result1[3];
		}
	else
		{
		// alert(old_link + "\nwe are here BBBBBBBB")
		if (result2)
			{
			// encodeURIComponent "&" -> "&amp;"
			// newlink =  result2[1] + ".pl?" + encodeURIComponent(result2[2]) + "&amp;googtrans=" + result2[4] + "#googtrans/" + result2[3] + "/" + result2[4];
			newlink =  result2[1] + ".pl?" + result2[2] + "&amp;googtrans=" + result2[4] + "#googtrans/" + result2[3] + "/" + result2[4];
			}
		else
			{
			newlink =  old_link
			}
		}
	return newlink;
	}

//# -----------------------------------------------------------------------------------------------------------------------
//#			Returns the filename component of the path  
//#			discuss at: http://phpjs.org/functions/basename    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
//#	    	example 1: basename('/www/site/home.htm', '.htm');    // *     returns 1: 'home'
//#			example 2: basename('ecra.php?p=1');
//#		    returns 2: 'ecra.php?p=1'
//# -----------------------------------------------------------------------------------------------------------------------
function basename_ (path, suffix) 
	{
  	var b = path.replace(/^.*[\/\\]/g, '');
    	if (typeof(suffix) == 'string' && b.substr(b.length-suffix.length) == suffix) 
			{
        	b = b.substr(0, b.length-suffix.length);
    		}
    return b;
	}

//# -----------------------------------------------------------------------------------------------------------------------
function tagAttributesList_ (currentElement)
	{
	var tagAttributes="";  
	var lengthAttributes;
	var k;
	if (currentElement.attributes)
		{
	  	lengthAttributes=currentElement.attributes.length;
	  	for (k=0; k<lengthAttributes; k++)
	   		{
	  		tagAttributes=" "+tagAttributes+" "+currentElement.attributes[k].nodeName+"=\""+currentElement.attributes[k].nodeValue+"\"";
			}
		}
	return tagAttributes;  
	}

//# -----------------------------------------------------------------------------------------------------------------------
function match_(haystack, needle)
	{
	var match = null;
	var search = /(.*)+needle+(.*)/;
	var result = search.exec(haystack);
	return result;
	}

//# -----------------------------------------------------------------------------------------------------------------------
function write(outputString)
	{
	if (GlobalwriteMode == 'writeFile')
		{
		GlobalContent = GlobalContent + outputString;
		}
	else
		{
		targetDocument.write(outputString);	
		}
	}

//# -----------------------------------------------------------------------------------------------------------------------
function writeln(outputString)
	{
   	write(outputString+"\n");
	}

//# -----------------------------------------------------------------------------------------------------------------------
function excludeTest(currentElement, domElementExclude)
	{
	var excludeTestTmp= new Boolean(true);
	var i;
	if (currentElement && domElementExclude)
		{
		for (i=0; i<domElementExclude.length; i++)
			{
			// excludeTestTmp = (domElementExclude[i] != currentElement)	
			excludeTestTmp = excludeTestTmp && (domElementExclude[i] != currentElement)	
			}
		}
	return excludeTestTmp;
	}

//# -----------------------------------------------------------------------------------------------------------------------
//# 		This function traverses the DOM tree of an element and prints the tree.  
//# 		This function called recursively until the DOM tree is fully traversed.
//# 
//# 		Parameters:
//#  			currentElement is the element that we want to print
//#				domElementExclude			
//#  			depth is the depth of the current element,  it should be 1 for the initial element
//#  			treeMode treeVisual | treeVisualNo
//# -----------------------------------------------------------------------------------------------------------------------
function traverseDOMTree(currentElement, domElementExclude, depth, treeMode)
	{
  	if (currentElement)
		{
    	var j;
		var k;
    	var tagName=currentElement.tagName;
		var tagAttributes="";  
		var lengthAttributes;
		if (currentElement.attributes)
	  		{
	  		lengthAttributes=currentElement.attributes.length;
	  		for (k=0; k<lengthAttributes; k++)
	    		{
				// .htm#googtrans/de/X -> _X.htm  
				if (tagName == 'A') 
					{
 					currentElement.attributes[k].nodeValue = newlink_(currentElement.attributes[k].nodeValue);
					}
				
  				if (treeMode == "treeVisual")
	  				tagAttributes=tagAttributes+" "+currentElement.attributes[k].nodeName+"=&quot;"+currentElement.attributes[k].nodeValue+"&quot;";
				else
	  				tagAttributes=tagAttributes+" "+currentElement.attributes[k].nodeName+"=\""+currentElement.attributes[k].nodeValue+"\"";
				}

	  		}
    	// Prints the node tagName, such as <A>, <IMG>, etc
    	if (tagName)
			{
    		if (tagName != "SPAN")
				{	
	    		if (treeMode == "treeVisual")
					{
    				if (tagName != "BODY")
      					writeln("&lt;"+tagName+tagAttributes+"&gt;");
					else
      					writeln("&lt;"+tagName+"&gt;");
					}
	    		else
					{
    				if (tagName != "BODY")
      					writeln("<"+tagName+tagAttributes+">");
					else
      					writeln("<"+tagName+">");
					}
				}
			}
    	else
	  		{
	  		// beliebige Anzahl von Weissraumzeichen
	  		if (!currentElement.data.match(/^\s*$/))
				{
	  			if (currentElement.data.match(/CurrencyConversion/))
      			 	writeln("// "+currentElement.data);
				 else	
      				writeln(currentElement.data);
				}
	  		else
	  			if (treeMode == "treeVisual")
      				writeln("UNKNOWNTAG");
	  		}
    	// Traverse the tree
    	var i=0;
    	var currentElementChild=currentElement.childNodes[i];
    	while (currentElementChild)
    		{
			if (excludeTest(currentElementChild, domElementExclude))
				{
    			if (tagName != "SPAN")
					{
      				// Formatting code (indent the tree so it looks nice on the screen)
  	  				if (treeMode == "treeVisual")
      					write("<BR>\n");
	      			for (j=0; j<depth; j++)
    	  				{
        				// &#166 is just a vertical line
  	  					if (treeMode == "treeVisual")
        				write("&nbsp;&nbsp;&#166");
      					}								
  	  				if (treeMode == "treeVisual")
        				writeln("<BR>");
      				for (j=0; j<depth; j++)
      					{
  	  					if (treeMode == "treeVisual")
        					write("&nbsp;&nbsp;&#166");
      					}					
      				if (tagName)
  	  					if (treeMode == "treeVisual")
        					write("--");
					}
      			// Recursively traverse the tree structure of the child node
      			traverseDOMTree(currentElementChild, domElementExclude, depth+1, treeMode);
				}
      		i++;
      		currentElementChild=currentElement.childNodes[i];
    		}
    	// The remaining code is mostly for formatting the tree
    	if (tagName != "SPAN")
			{
	  		if (treeMode == "treeVisual")
    			writeln("<BR>");
    		for (j=0; j<depth-1; j++)
    			{
  				if (treeMode == "treeVisual")
      				write("&nbsp;&nbsp;&#166");
    			}	 		
  			if (treeMode == "treeVisual")
    			writeln("&nbsp;&nbsp;");
			}
		// don't include the br closing tag </br>
    	if ((tagName) && (tagName != "BR") && (tagName != "META") && (tagName != "LINK") && (tagName != "INPUT") && (tagName != "IMG") && (tagName != "SPAN"))
   	  		{
  	  		if (treeMode == "treeVisual")
      			writeln("&lt;/"+tagName+"&gt;");
	  		else
      			writeln("</"+tagName+">");
	  		}
  		}
	}

//# -----------------------------------------------------------------------------------------------------------------------
//# 		This function accepts a DOM element as parameter and prints
//# 		out the DOM tree structure of the element.
//# -----------------------------------------------------------------------------------------------------------------------
function printDOMTree(domElement, treeMode, writeMode)
	{
	//# -------------------------------	
	//# exclude the following elements
	//# -------------------------------	
	var i, l, l1, l2, l3, l4, l5, l6;
   	var domElementExclude=new Array(); 
   	domElementExclude[0]=document.getElementById('myDivEx1');

   	l = domElementExclude.length;
   	l1 = domElementExclude.length;
   	l2 = document.getElementsByTagName("IFRAME").length;
   	l3 = document.getElementsByTagName("OBJECT").length;
   	l4 = document.getElementsByTagName("SCRIPT").length;
   	l5 = document.getElementsByTagName("LINK").length;
   	l6 = document.getElementsByTagName("DIV").length;

   	for (i=0; i<l2; i++)
		{
    	domElementExclude[l]=document.getElementsByTagName("IFRAME")[i];
		l++
		}
   	for (i=0; i<l3; i++)
		{	
       	domElementExclude[l]=document.getElementsByTagName("OBJECT")[i];
		l++
		}

   	for (i=0; i<l4; i++)
		{
		//# goolesapis.com JS File Referenz <SCRIPT> 
		currentElement = document.getElementsByTagName("SCRIPT")[i];
		var search = /(.*)translate(.*)/;
		var result = search.exec(tagAttributesList_(currentElement));
		if (result)
			{
	       	domElementExclude[l]=document.getElementsByTagName("SCRIPT")[i];
			l++
			}
		}

   	for (i=0; i<l5; i++)
		{
		//# goolesapis.com css Referenz <LINK> 
		currentElement = document.getElementsByTagName("LINK")[i];
		var search = /(.*)translate(.*)/;
		var result = search.exec(tagAttributesList_(currentElement));
		if (result)
			{
       		domElementExclude[l]=document.getElementsByTagName("LINK")[i];
			l++
			}
		}

   	for (i=0; i<l6; i++)
		{
		//# google balloonContainer at th etop of the page 
		currentElement = document.getElementsByTagName("DIV")[i];
		var search = /(.*)balloon(.*)/;
		var result = search.exec(tagAttributesList_(currentElement));
		if (result)
			{
       		domElementExclude[l]=document.getElementsByTagName("DIV")[i];
			l++
			}
		}

	//# -------------------------------	
	//# init filename
	//# http:www.nes.com/../Stirling.all_de.htm#googtrans/de/en -> http:www.nes.com/../Stirling.all_de_en.htm
	//# -------------------------------	
	var search = /(.*)\/(.*)\.htm(.*)\#googtrans\/(.*)\/(.*)/; 
	var result = search.exec(window.location.href);
	File = result[2] + "_" + result[5] + ".htm"; 

  	// make a valid html page
	if (writeMode == 'writeFile')
		{
		GlobalwriteMode = "writeFile";
		// write output to file, using Xpcom - mozilla api
		// absoluter Pfad notwendig ... 



		var Path = '/home/frosch/www/www.newenergyshop.com/htm.Translation/';
		File = Path+File;
		alert ("write output to file "+File);
		}
	else
		{
		GlobalwriteMode = "writeFileNo";
		// write output to new window 
		alert ("write output to new window");
		var outputWindow=window.open();
		// global	
		targetDocument = outputWindow.document;
		targetDocument.open("text/html", "replace");
		}

  	if (treeMode == 'treeVisual')
		{
  		write("<HTML><HEAD><TITLE>DOM</TITLE></HEAD><BODY>\n");
  		write("<CODE>\n");
  		traverseDOMTree(domElement, domElementExclude, 1, treeMode);
  		write("</CODE>\n");
  		write("</BODY>\n</HTML>\n");
		}
	else
		{
  		traverseDOMTree(domElement, domElementExclude, 1, treeMode);
		}
  	// Here we must close the document object, otherwise Mozilla browsers 
  	// might keep showing "loading in progress" state.
	if (writeMode == 'writeFile')
		{
		writeFile_(File, GlobalContent);
		}
	else
		{
  		targetDocument.close();
		}
	}
