+\r
+    # parse_loop()\r
+    #\r
+    # Eine Schleife parsen\r
+    #\r
+    # Parameter: Name der Schleife\r
+    #\r
+    # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+    function parse_loop($name) {\r
+        $template = $this->get_template();\r
+        if(strpos($template,'{LOOP '.$name.'}') === false) return;\r
+\r
+        $offset   = 0;\r
+        $name_len = strlen($name);\r
+\r
+        while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false) {\r
+            if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false) {\r
+                $block   = substr($template,$begin,$end+9-$begin);\r
+                $content = substr($block,$name_len+7,-9);\r
+\r
+                $parsed_block = '';\r
+\r
+                for($x=0;$x<count($this->loop_vars[$name]);$x++) {\r
+                    $loop_data = $this->loop_vars[$name][$x];\r
+                    $loop_vars = array_keys($loop_data);\r
+\r
+                    $ctpl = new Template;\r
+                    $ctpl->set_template($content);\r
+\r
+                    foreach($loop_vars as $loop_var) {\r
+                        $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]);\r
+                    }\r
+\r
+                    if($this->old_parsing) {\r
+                        $ctpl->parse_old();\r
+                    }\r
+                    else {\r
+                        $ctpl->parse();\r
+                    }\r
+\r
+                    $parsed_block .= $ctpl->get_template();\r
+\r
+                    unset($ctpl);\r
+                }\r
+\r
+                $template = str_replace($block,$parsed_block,$template);\r
+                $offset   = $begin+strlen($parsed_block);\r
+            }\r
+            else break;\r
+        }\r
+\r
+        $this->set_template($template);\r
+        }\r
+\r
+        # get_defined_vars()\r
+        #\r
+        # In der Template-Datei definierte Variablen auslesen\r
+        #\r
+        # Parameter: -nichts-\r
+        #\r
+        # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+        function get_defined_vars() {\r
+            $template = $this->get_template();\r
+            if(strpos($template,'{DEFINE ') === false) return;\r
+\r
+            $offset = 0;\r
+\r
+            while(strpos($template,'{DEFINE ',$offset) !== false) {\r
+                $begin  = strpos($template,'{DEFINE ',$offset)+8;\r
+                $offset = $begin;\r
+\r
+                $name    = '';\r
+                $content = '';\r
+\r
+                $var_open     = 0;\r
+                $name_found   = 0;\r
+                $define_block = 0;\r
+\r
+                for($x=$begin;$x<strlen($template);$x++) {\r
+                    if($template[$x] == "\012" || $template[$x] == "\015") {\r
+                        # Wenn in einem {DEFINE}-Block ein Zeilenumbruch gefunden wird,\r
+                        # brechen wir mit dem Parsen des Blockes ab\r
+\r
+                        break;\r
+                    }\r
+\r
+                    if($var_open == 1) {\r
+                        if($template[$x] == '"') {\r
+                            # Der Inhalt der Variable ist hier zu Ende\r
+\r
+                            $var_open = 0;\r
+\r
+                            if($template[$x+1] == '}') {\r
+                                # Hier ist der Block zu Ende\r
+\r
+                                if($this->get_var($name) === false) {\r
+                                    # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+                                    $this->set_var($name,$content);\r
+                                    array_push($this->defined_vars,$name);\r
+                                }\r
+\r
+                            # {DEFINE}-Block entfernen\r
+\r
+                            $pre  = substr($template,0,$begin-8);\r
+                            $post = substr($template,$x+2);\r
+\r
+                            $template = $pre.$post;\r
+\r
+                            # Fertig!\r
+\r
+                            $offset = strlen($pre);\r
+                            break;\r
+                        }\r
+                    }\r
+                    elseif($template[$x] == '\\') {\r
+                        # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen\r
+\r
+                        if($template[$x+1] == 'n') {\r
+                            # "\n" in Zeilenumbrueche umwandeln\r
+\r
+                            $content .= "\n";\r
+                        }\r
+                        else $content .= $template[$x+1];\r
+\r
+                        $x++;\r
+                    }\r
+                    else $content .= $template[$x];\r
+                }\r
+                else {\r
+                    if($name_found == 1) {\r
+                        if($var_open == 0) {\r
+                            if($template[$x] == '"') $var_open = 1;\r
+                            else break;\r
+                        }\r
+                    }\r
+                    else {\r
+                        # Variablennamen auslesen\r
+\r
+                        if($template[$x] == '}' && $name != '') {\r
+                            # Wir haben einen {DEFINE}-Block\r
+\r
+                            $name_found   = 1;\r
+                            $define_block = 1;\r
+\r
+                            # Alles ab hier sollte mit dem Teil verbunden werden, der das\r
+                            # {DEFINE} in einer Zeile verarbeitet\r
+\r
+                            # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch\r
+                            # nicht noetig sein sollte\r
+\r
+                            if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false) {\r
+                                $x++;\r
+\r
+                                $content = substr($template,$x,$end-$x);\r
+\r
+                                if($this->get_var($name) === false) {\r
+                                    # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+                                    $this->set_var($name,$content);\r
+                                    array_push($this->defined_vars,$name);\r
+                                }\r
+\r
+                                $pre  = substr($template,0,$begin-8);\r
+                                $post = substr($template,$end+11);\r
+\r
+                                $template = $pre.$post;\r
+\r
+                                # Fertig!\r
+\r
+                                $offset = strlen($pre);\r
+                                break;\r
+                            }\r
+                            else break;\r
+                        }\r
+                        elseif($template[$x] != ' ') {\r
+                            $name .= $template[$x];\r
+                        }\r
+                        elseif($name != '') {\r
+                            $name_found = 1;\r
+                        }\r
+                        else break;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        $this->set_template($template);\r