// ***************************************************************************
// ++ autoIndent-Funktion - automatisches Einrücken von Code per Javascript ++
// ***************************************************************************
// Autor: Patrick Fischer
// Datum: 26.12.2007 Version 0.8
// ***************************************************************************

// Variable path: Pfad zu dem Element, in dem der zu formatierende Code steht
function autoIndent(path, rownumbers) {


    if ( rownumbers == true ) {
        rowsnum = "<div id='rownumbers' style='border: 1px solid green; float:left; width:3%; margin-bottom:0px;>'";
        num = 0;
    }
	// Initialisierung: Anzahl der Einrückungen
	indents = 0;
	// hole den zu formatierenden Inhalt
	code = path.innerHTML;
	
	//test
	
        code = code.replace(/&gt;/gi, "&gt;\n");
        //alert(code);
        code = code.replace(/&lt;br&gt;/gi, "&lt;br /&gt;");


	// splitte code, wobei jede Zeile ein Array-Feld ist
	eArray = code.match( /(.*)\r\n|(.*)(\n)?/gi );
	// lösche code - darin wird fortan der formatierte Code geschrieben
	code = "";
	// Schleife über alle Array-Zeilen
	for ( var i = 0; eArray[i]; i++ ) {
		// entferne alle Zeilen möglichen Zeilenumbrüche
		eArray[i] = eArray[i].replace(/\r|\n|\n\r|\n\r/gi, "");
		// entferne sonstige Leerzeichen
		eArray[i] = eArray[i].replace(/^([\s]|&nbsp;|&#160;)*/, "");
		// Verringere Anzahl der Einrückungen falls } oder Abschlusstag
		if ( eArray[i].match(/\}|&lt;\/[\w]+&gt;/i) && indents > 0) {
			// Anzahl der } oder Abschlusstags
			eLength = eArray[i].match(/\}|&lt;\/[\w]+&gt;/gi).length;
			indents -= eLength;
			if ( indents < 0 ) indents = 0;
		}
		// Sonderbehandung für Zeilenumbrüche via Javascript im IE
		if ( navigator.appName.indexOf("Internet Explorer") > 0 && i != 0 ) code += "<br />";
		// nach jeder Zeile kommt ein Zeilenumbruch
		if ( i != 0 ) code += "<br>";
		// rücke nur nichtleere Zeilen ein
		if ( eArray[i] != "") {

			// Anzahl der Einrückungen entsprechend der Variable indents
			for  (var j = 0; j < indents ; j++ ) {
				code += "&nbsp;&nbsp;&nbsp;&nbsp;";
			}
		} else {
			// leere Zeilen bekommen ein Leerzeichen, da IE sonst die Zeile nicht anzeigt
			code += "&nbsp;";
		}
		// rücke Zeilen mit Anfangs- und Abschlusstag richtig ein
		if ( ( eArray[i].match(/\&lt;[\w]+&gt;/i) && eArray[i].match(/\&lt;\/[\w]+&gt;/i) ) || eArray[i].match(/[\w\s;:]+\}/i) ) code += "&nbsp;&nbsp;&nbsp;&nbsp;";
		// Zeileninhalt wird an code angehängt

        //eArray[i] = eArray[i].replace(/&lt;\/?(\w)[^&gt;]+&gt;/gi, "<span style='color:green'>$1$2</span>");

        //eArray[i] = eArray[i].replace(/(\w+)=("[^<>"]*"|'[^<>']*'|\w+)/gi, "<span style='color:red'>$1=</span><span style='color:blue'>$2</span>");
        eArray[i] = eArray[i].replace(/(\w+)=("[^<>"]*"|'[^<>']*'|\w+)/gi, "<span style='color:#75e234;'>$1=</span><span style='color:#edd400;'>$2</span>");
                
        eArray[i] = eArray[i].replace(/&lt;(.*)&gt;/gi, "<span style='color:#304989;'>&lt;$1&gt;</span>");        

	
        //eArray[i] = eArray[i].replace(/\w+\s*=\s*".*?"/gi, "<span style='color:red'>$1</span>");
        
		code += eArray[i];
		if ( rownumbers == true ) {
            rowsnum += i+"<br />";
            num = i+1;
        }
		// Erhöhe Anzahl der Einrückungen
		if ( eArray[i].match(/\{|&lt;[\w]+&gt;/i) )	{
			indents++;
		}
	}
	
    if ( rownumbers == true ) {
        rowsnum += num+"<br />";
        rowsnum += 1+num+"<br />";
        rowsnum += "</div>";
        code = "<div style='clear:both'>"+rowsnum+"<div style='width:97%; background-color:white; color:black;'>"+code+"</div></div>"
    }
	// setze neuen Inhalt
	path.innerHTML = code;
}

