diff --git a/config/layouts/default.json b/config/layouts/default.json
deleted file mode 100755
index 080ecd11736c57cfd05d207b7a06b0badcec4b16..0000000000000000000000000000000000000000
--- a/config/layouts/default.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-	"type": "xsplit",
-	"cut": 35,
-	"left": {
-		"type": "panel",
-		"name": "departure",
-		"config": "oh14"
-	},
-	"right": {
-		"type": "ysplit",
-		"cut": 30,
-		"up": {
-			"type": "panel",
-			"name": "clock"
-		},
-		"down": {
-			"type": "cycler",
-			"duration": 5,
-			"panels": [
-				{
-					"type": "panel",
-					"name": "ufc"
-				},
-				{
-					"type": "panel",
-					"name": "mensaPlan"
-				},
-				{
-					"type": "panel",
-					"name": "lsfView"
-				}
-			]
-		}
-	}
-}
diff --git a/config/layouts/default.json.skel b/config/layouts/default.json.skel
index dacb79cafd2137392373e8be06e10b8143b58adc..e40d6488e89b935d55bc745a5248cf2752bdf66f 100755
--- a/config/layouts/default.json.skel
+++ b/config/layouts/default.json.skel
@@ -23,12 +23,14 @@
 					"config": {
 						"files": [
 							{
-							"filename": "itour2016_0.png",
-							"enddate": "02.11.2016"
+							"filename": "SOMEFILE.png",
+							"startdate": "NEVER",
+							"enddate": "30.11.2016"
 							},
 							{
-							"filename": "DAT_2016_Flyer_DINA6.png",
-							"enddate": "18.11.2016"
+							"filename": "OpenSourceInfoscreen.jpg",
+							"startdate": "NEVER",
+							"enddate": "18.11.2017"
 							}
 						]
 					}
diff --git a/panels/GameOfLife/script.js b/panels/GameOfLife/script.js
index 66e0ff700acacf9bc1ac99e16b99116a63234ae5..dc99d193e8a7c2faee6ff64e9fdb9a73d4205163 100755
--- a/panels/GameOfLife/script.js
+++ b/panels/GameOfLife/script.js
@@ -11,14 +11,28 @@ var GOLData = {
 	grid: 1
 };
 
-this.loaded = function(panel, config) {
+this.loaded=function(panel,config) {
+	console.log("TESTV");
 	GOLData.panel = panel;
+	console.log("TESTN"+panel);
 	GOLData.config = config;
 	GOLinit();
 	GOLdraw();
 	setTimeout(function(){setInterval(function() {GOLiterate(); GOLdraw();}, 500); }, 10000);
 }
 
+this.show=function() {
+}
+
+this.resize=function() {
+}
+
+this.hide = function() {
+}
+
+this.checkShowCondition = function() {
+}
+
 function GOLinit(){
 	//if(GOLData.config[initType] == "random") {
 		//GOLinitRandom();
@@ -258,8 +272,8 @@ function GOLcountDead(temp,x,y){
 function GOLinitDraw(){
 	GOLData.canvas = document.getElementById("GOLCanvas");
     GOLData.context = document.getElementById("GOLCanvas").getContext("2d");
-	GOLData.canvas.width = panel.width();
-	GOLData.canvas.height = panel.height();
+	GOLData.canvas.width = GOLData.panel.width();
+	GOLData.canvas.height = GOLData.panel.height();
 	if(GOLData.grid) {
 		GOLData.sWidth  = (GOLData.canvas.width-(GOLData.vAmount+1)) / GOLData.vAmount;
 		GOLData.sHeight = (GOLData.canvas.height-(GOLData.hAmount+1)) / GOLData.hAmount;
diff --git a/panels/lsfView/lsfParser.php b/panels/lsfView/lsfParser.php
index de35246595be35e56ab96164158689d167323b35..c361fc6dac7aec9f66f8e59ff51d5c7be26b863d 100755
--- a/panels/lsfView/lsfParser.php
+++ b/panels/lsfView/lsfParser.php
@@ -60,34 +60,34 @@ if($SEMESTER == 1){
 // search subject
 $subjects = array ();
 foreach ( $SUBJECT_LIST as $SUBJECT ) {
-	echo "Searching ".$SUBJECT->getSearchName()."-";
+	echo "Searching ".$SUBJECT->getSearchName()."\n";
 	$html = file_get_html ( $SEARCH_URL."&veranstaltung.dtxt=".str_replace(' ',"+",$SUBJECT->getSearchName())."&veranstaltung.semester=".date("Y").$SEMESTER);
 	if ($html != null) {
 		$list = $html->find('a[title="Mehr Informationen zu '.$SUBJECT->getSearchName().'"]');
 		if (count($list) != 0) {
 			foreach($list as $a){
 				if(removeSpace($a->parent()->parent()->children (2)->innertext) == "Vorlesung") {
-					echo "Hit-";
+					echo " - Hit \n";
 					$HREF = $a->href;
 					$html->clear();
 					unset($html);
 					$html = file_get_html ( html_entity_decode($HREF) );
 					if ($html != null) {
-					array_push ( $subjects, parsSubject ($html,$SUBJECT) );
+					     array_push ( $subjects, parsSubject ($html,$SUBJECT) );
 					} else {
-						echo "\"".$SUBJECT->getSearchName()."\"-Site nicht aufrufbar\n";
+    			     echo "\"".$SUBJECT->getSearchName()."\"-Site nicht aufrufbar\n";
 					}
 					break;
 				}
 			}
+	   } else {
+		  echo " - \"".$SUBJECT->getSearchName()."\"-Search liefert kein passendes Ergebnis\n";
+	   }
 	} else {
-		echo "\"".$SUBJECT->getSearchName()."\"-Search liefert kein passendes Ergebnis\n";
-	}
-	} else {
-		echo "\"".$SUBJECT->getSearchName()."\"-Search nicht aufrufbar.\n";
+		echo " - \"".$SUBJECT->getSearchName()."\"-Search nicht aufrufbar.\n";
 	}
 }
 
 toJsonSubjects ( $subjects, $JSON_NAME_SUBJECTS, $JSON_INC_NAME_SUBJECTS, $JSON_INC_SHORT_SUBJECTS);
 toJsonEvents ( $subjects, $JSON_NAME_EVENTS, $JSON_INC_NAME_EVENTS, $JSON_INC_SHORT_EVENTS);
-?>
\ No newline at end of file
+?>
diff --git a/panels/mensaPlan/config.php.skel b/panels/mensaPlan/config.php.skel
deleted file mode 100755
index 3ff769b5d8579846eba70a1bd289e82acab3d04a..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/config.php.skel
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-// Universal
-$MENSA_URL = "http://www.stwdo.de/gastronomie/speiseplaene/hauptmensa/wochenansicht-hauptmensa/";
-$PARSE_DAYLIST = array (
-		"montag",
-		"dienstag",
-		"mittwoch",
-		"donnerstag",
-		"freitag" 
-);
-
-// JSON
-$JSON_NAME = "../../tmp/mensaPlan.json";
-$JSON_INC_NR = false;
-$JSON_INC_ORIGINAL = false;
-$JSON_INC_SHORT = true;
-$JSON_INC_ART = true;
-$JSON_INC_KIND = false;
-$JSON_INC_COUNTER = true;
-$JSON_INC_STOFFE = false;
-$JSON_INC_DATE = true;
-?>
diff --git a/panels/mensaPlan/gericht.php b/panels/mensaPlan/gericht.php
deleted file mode 100755
index ed0808573859f491ba099af5a9c14a748414b6a9..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/gericht.php
+++ /dev/null
@@ -1,348 +0,0 @@
-<?php
-class GERICHT {
-	private $nr = 0;
-	private $originalText = "";
-	private $shortText = "";
-	private $rind = false;
-	private $schwein = false;
-	private $gefluegel = false;
-	private $fisch = false;
-	private $vegetarisch = false;
-	private $vegan = false;
-	private $kinderteller = false;
-	private $counter = "";
-	private $zusatzStoffe = array (
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0,
-			0 
-	);
-	private $date = "";
-	public function getNr() {
-		return $this->nr;
-	}
-	public function getOriginalText() {
-		return $this->originalText;
-	}
-	public function getShortText() {
-		return $this->shortText;
-	}
-	public function isRind() {
-		return $this->rind;
-	}
-	public function isSchwein() {
-		return $this->schwein;
-	}
-	public function isGefluegel() {
-		return $this->gefluegel;
-	}
-	public function isFisch() {
-		return $this->fisch;
-	}
-	public function isVegetarisch() {
-		return $this->vegetarisch;
-	}
-	public function isVegan() {
-		return $this->vegan;
-	}
-	public function isKinderteller() {
-		return $this->kinderteller;
-	}
-	public function getArtAsString($seperator = " ") {
-		$art = "";
-		$first = true;
-		if ($this->rind) {
-			$art .= "R";
-			$first = false;
-		}
-		if ($this->schwein) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "S";
-			$first = false;
-		}
-		if ($this->gefluegel) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "G";
-			$first = false;
-		}
-		if ($this->fisch) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "F";
-			$first = false;
-		}
-		if ($this->vegetarisch) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "V";
-			$first = false;
-		}
-		if ($this->vegan) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "N";
-			$first = false;
-		}
-		if ($this->kinderteller) {
-			if (! $first) {
-				$art .= $seperator;
-			}
-			$art .= "K";
-			$first = false;
-		}
-		return $art;
-	}
-	public function getCounter() {
-		return $this->counter;
-	}
-	public function isZusatzstoff($id) {
-		return $this->zusatzStoffe [$id];
-	}
-	public function getZusatzstoffe() {
-		return $this->zusatzStoffe;
-	}
-	public function getZusatzstoffeAsString($seperator = " ") {
-		$stoffe = "";
-		$first = true;
-		for($i = 0; $i < count ( $this->zusatzStoffe ); $i ++) {
-			if ($this->zusatzStoffe [$i]) {
-				if (! $first) {
-					$stoffe .= $seperator . $i;
-				} else {
-					$stoffe .= $i;
-					$first = false;
-				}
-			}
-		}
-		return $stoffe;
-	}
-	public function getDate() {
-		return $this->date;
-	}
-	public function setNr($nr) {
-		$this->nr = $nr;
-	}
-	public function setOriginalText($originalText) {
-		$this->originalText = $originalText;
-	}
-	public function setShortText($shortText) {
-		$this->shortText = $shortText;
-	}
-	public function setRind($rind) {
-		$this->rind = $rind;
-	}
-	public function setSchwein($schwein) {
-		$this->schwein = $schwein;
-	}
-	public function setGefluegel($gefluegel) {
-		$this->gefluegel = $gefluegel;
-	}
-	public function setFisch($fisch) {
-		$this->fisch = $fisch;
-	}
-	public function setVegetarisch($vegetarisch) {
-		$this->vegetarisch = $vegetarisch;
-	}
-	public function setVegan($vegan) {
-		$this->vegan = $vegan;
-	}
-	public function setKinderteller($kinderteller) {
-		$this->kinderteller = $kinderteller;
-	}
-	public function setArt($in, $val) {
-		switch ($in) {
-			case "R" :
-				$this->rind = $val;
-				break;
-			case "S" :
-				$this->schwein = $val;
-				break;
-			case "G" :
-				$this->gefluegel = $val;
-				break;
-			case "F" :
-				$this->fisch = $val;
-				break;
-			case "V" :
-				$this->vegetarisch = $val;
-				break;
-			case "N" :
-				$this->vegan = $val;
-				break;
-			case "K" :
-				$this->kinderteller = $val;
-				break;
-			default :
-				echo "Angegebene Art '" . $in . "' nicht bekannt.";
-		}
-	}
-	public function setCounter($counter) {
-		$this->counter = $counter;
-	}
-	public function setZusatzstoff($in, $val) {
-		$this->zusatzStoffe [$in] = $val;
-	}
-	public function setZusatzstoffe($zusatzStoffe) {
-		$this->zusatzStoffe = $zusatzStoffe;
-	}
-	public function setDate($date) {
-		$this->date = $date;
-	}
-	public function toggleRind() {
-		$this->rind = ! $this->rind;
-	}
-	public function toggleSchwein() {
-		$this->schwein = ! $this->schwein;
-	}
-	public function toggleGefluegel() {
-		$this->gefluegel = ! $this->gefluegel;
-	}
-	public function toggleFisch() {
-		$this->fisch = ! $this->fisch;
-	}
-	public function toggleVegetarisch() {
-		$this->vegetarisch = ! $this->vegetarisch;
-	}
-	public function toggleVegan() {
-		$this->vegan = ! $this->vegan;
-	}
-	public function toggleKinderteller() {
-		$this->kinderteller = ! $this->kinderteller;
-	}
-	public function toggleArt($in) {
-		switch ($in) {
-			case "R" :
-				$this->rind = ! $this->rind;
-				break;
-			case "S" :
-				$this->schwein = ! $this->schwein;
-				break;
-			case "G" :
-				$this->gefluegel = ! $this->gefluegel;
-				break;
-			case "F" :
-				$this->fisch = ! $this->fisch;
-				break;
-			case "V" :
-				$this->vegetarisch = ! $this->vegetarisch;
-				break;
-			case "N" :
-				$this->vegan = ! $this->vegan;
-				break;
-			case "K" :
-				$this->kinderteller = ! $this->kinderteller;
-				break;
-			default :
-				echo "Angegebene Art '" . $in . "' nicht bekannt.";
-		}
-	}
-	public function toggleZusatzstoff($in) {
-		$this->zusatzStoffe [$in] = ! $this->zusatzStoffe [$in];
-	}
-	public function toJson($inc_nr = true, $inc_original = true, $inc_short = true, $inc_art = true, $inc_kind = true, $inc_counter = true, $inc_stoffe = true, $inc_date = true) {
-		$json = "{";
-		if ($inc_nr) {
-			$json .= '"nr": "' . $this->nr . '"';
-		}
-		if ($inc_nr && ($inc_original || $inc_short || $inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_original) {
-			$json .= '"originalText": "' . $this->originalText . '"';
-		}
-		if ($inc_original && ($inc_short || $inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_short) {
-			$json .= '"shortText": "' . $this->shortText . '"';
-		}
-		if ($inc_short && ($inc_art || $inc_kind || $inc_counter || $inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_art) {
-			$json .= '"rind": ' . $this->rind . ',';
-			$json .= '"schwein": ' . $this->schwein . ',';
-			$json .= '"gefluegel": ' . $this->gefluegel . ',';
-			$json .= '"fisch": ' . $this->fisch . ',';
-			$json .= '"vegetarisch": ' . $this->vegetarisch . ',';
-			$json .= '"vegan": ' . $this->vegan . '';
-		}
-		if ($inc_art && ($inc_kind || $inc_counter || $inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_kind) {
-			$json .= '"kinderteller":' . $this->kinderteller . '';
-		}
-		if ($inc_kind && ($inc_counter || $inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_counter) {
-			if ($this->getCounter () == "") {
-				$json .= '"counter": ' . 0;
-			} else {
-				$json .= '"counter": ' . $this->getCounter ();
-			}
-		}
-		if ($inc_counter && ($inc_stoffe || $inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_stoffe) {
-			$json .= '"zusatzStoffe": {' . '"0":' . $this->zusatzStoffe [0] . ',' . '"1":' . $this->zusatzStoffe [1] . ',' . '"2":' . $this->zusatzStoffe [2] . ',' . '"3":' . $this->zusatzStoffe [3] . ',' . '"4":' . $this->zusatzStoffe [4] . ',' . '"5":' . $this->zusatzStoffe [5] . ',' . '"6":' . $this->zusatzStoffe [6] . ',' . '"7":' . $this->zusatzStoffe [7] . ',' . '"8":' . $this->zusatzStoffe [8] . ',' . '"9":' . $this->zusatzStoffe [9] . ',' . '"10":' . $this->zusatzStoffe [10] . ',' . '"11":' . $this->zusatzStoffe [11] . ',' . '"12":' . $this->zusatzStoffe [12] . ',' . '"13":' . $this->zusatzStoffe [13] . ',' . '"14":' . $this->zusatzStoffe [14] . ',' . '"15":' . $this->zusatzStoffe [15] . ',' . '"16":' . $this->zusatzStoffe [16] . ',' . '"17":' . $this->zusatzStoffe [17] . ',' . '"18":' . $this->zusatzStoffe [18] . ',' . '"19":' . $this->zusatzStoffe [19] . ',' . '"20":' . $this->zusatzStoffe [20] . ',' . '"21":' . $this->zusatzStoffe [21] . ',' . '"22":' . $this->zusatzStoffe [22] . ',' . '"23":' . $this->zusatzStoffe [23] . ',' . '"24":' . $this->zusatzStoffe [24] . ',' . '"25":' . $this->zusatzStoffe [25] . ',' . '"26":' . $this->zusatzStoffe [26] . ',' . '"27":' . $this->zusatzStoffe [27] . ',' . '"28":' . $this->zusatzStoffe [28] . ',' . '"29":' . $this->zusatzStoffe [29] . ',' . '"30":' . $this->zusatzStoffe [30] . ',' . '"31":' . $this->zusatzStoffe [31] . ',' . '"32":' . $this->zusatzStoffe [32] . ',' . '"33":' . $this->zusatzStoffe [33] . '}';
-		}
-		if ($inc_stoffe && ($inc_date)) {
-			$json .= ',';
-		}
-		if ($inc_date) {
-			$json .= '"date": "' . $this->date . '"';
-		}
-		$json .= '}';
-		return $json;
-	}
-	public function __toString() {
-		for($i = 0; $i < count ( $this->zusatzStoffe ); $i ++) {
-			if ($this->zusatzStoffe [$i]) {
-				$stoffe = $stoffe . " " . $i;
-			}
-		}
-		
-		return "Nr: " . $this->nr . ", Original Text: " . $this->originalText . ",\n" . "Short Text: " . $this->shortText . ",\n" . "Rind: " . booleanToString ( $this->rind ) . ",\n" . "Schwein: " . booleanToString ( $this->schwein ) . ",\n" . "Fisch: " . booleanToString ( $this->fisch ) . ",\n" . "Vegetarisch: " . booleanToString ( $this->vegetarisch ) . ",\n" . "Vegan: " . booleanToString ( $this->vegan ) . ",\n" . "Kinderteller: " . booleanToString ( $this->kinderteller ) . ",\n" . "Counter: " . $this->counter . ",\n" . "Zusatzstoffe: " . $stoffe . ",\n";
-	}
-}
-?>
\ No newline at end of file
diff --git a/panels/mensaPlan/helper.php b/panels/mensaPlan/helper.php
deleted file mode 100755
index 8cab197c6fc0884ad5db71f5cd21666b0a60d4d3..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/helper.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-function booleanToString($bool) {
-	if ($bool) {
-		return "True";
-	} else {
-		return "False";
-	}
-}
-function toJson($tage, $name, $inc_nr, $inc_original, $inc_short, $inc_art, $inc_kind, $inc_stoffe, $inc_counter, $inc_date) {
-	$kommata = false;
-	$json = '{';
-	foreach ( $tage as $tag ) {
-		if ($kommata) {
-			$json .= ',';
-		} else {
-			$kommata = true;
-		}
-		$json .= $tag->toJson ( $inc_nr, $inc_original, $inc_short, $inc_art, $inc_kind, $inc_counter, $inc_stoffe, $inc_date );
-	}
-	$json .= "}";
-	file_put_contents ( $name, $json );
-}
-function parsDay($html, $day) {
-	$tag = new TAG ( $day, substr ( $html->find ( 'a[href="#' . $day . '"]', 0 )->innertext, - 10, 10 ) );
-	
-	$html = $html->find ( 'a.#' . $day, 0 );
-	$html = $html->first_child ()->children ( 1 );
-	$tr = $html->first_child ();
-	$nr = 0;
-	while ( $tr != null ) {
-		$nr ++;
-		$current = new GERICHT ();
-		$current->setNr ( $nr );
-		$td0 = $tr->find ( 'td', 0 );
-		$td1 = $tr->find ( 'td', 1 );
-		$td2 = $tr->find ( 'td', 2 );
-		// parse originalText shortText and Zusatzstoffe
-		if ($td0 != null) {
-			$current->setOriginalText ( $td0->innertext );
-			// prepare Zusatzstoffe
-			$zusatzstoffe = $td0->innertext;
-			preg_match_all ( '#\([\d+,]+\)#', $zusatzstoffe, $matches );
-			foreach ( $matches [0] as $match ) {
-				preg_match_all ( '#[\d+]+#', $match, $stoffe );
-				foreach ( $stoffe [0] as $stoff ) {
-					$current->setZusatzstoff ( $stoff, true );
-				}
-			}
-			// shorten Text
-			$current->setShortText ( shortenText ( $td0->innertext ) );
-		}
-		// parse Art
-		if ($td1 != null) {
-			$art = $td1->innertext;
-			$current->setRind ( substr_count ( $art, "R" ) );
-			$current->setSchwein ( substr_count ( $art, "S" ) );
-			$current->setGefluegel ( substr_count ( $art, "G" ) );
-			$current->setFisch ( substr_count ( $art, "F" ) );
-			$current->setVegetarisch ( substr_count ( $art, "V" ) );
-			$current->setVegan ( substr_count ( $art, "N" ) );
-			$current->setKinderteller ( substr_count ( $art, "K" ) );
-		}
-		// parse Counter
-		if ($td2 != null) {
-			$img = $td2->find ( 'img', 0 );
-			if ($img != null) {
-				$img = $img->src;
-				$img = array_pop ( explode ( "/", $img ) );
-				switch ($img) {
-					case "icon-menue-1.png" :
-						$current->setCounter ( 1 );
-						break;
-					case "icon-menue-2.png" :
-						$current->setCounter ( 2 );
-						break;
-					case "icon-tagesgericht.png" :
-						$current->setCounter ( 3 );
-						break;
-					case "icon-vegetarisch.png" :
-						$current->setCounter ( 4 );
-						break;
-					case "icon-aktionsteller.png" :
-						$current->setCounter ( 5 );
-						break;
-					case "icon-grillstation.png" :
-						$current->setCounter ( 6 );
-						break;
-					case "icon-fisch.png" :
-						$current->setCounter ( 7 );
-						break;
-					case "icon-vegan.png" :
-						$current->setCounter ( 8 );
-						break;
-				}
-			}
-		}
-		if ($current->getOriginalText () != "") { // remove empty Fields
-			$current->setDate ( $tag->getDate () );
-			$tag->addGericht ( $current );
-		}
-		$tr = $tr->next_sibling ();
-	}
-	return $tag;
-}
-function shortenText($text) {
-	$text = preg_replace ( '#\([^\)]*\)#', '', $text ); // remove zusatzstoffe
-	$text = preg_replace ( '#(\s,|,\s)#', ',', $text ); // fix Komma
-	$text = preg_replace ( '#,#', ', ', $text ); // fix Komma
-	$text = preg_replace ( '#\s+#', ' ', $text ); // fix double Whitespace
-	$text = preg_replace ( '#,\sdazu\s\d\sBeilagen\snach\sWahl#', '', $text ); // remove Beilagen
-	$text = preg_replace ( '#,\sdazu\s#', ' + ', $text ); // replace dazu
-	$text = preg_replace ( '#\sund\s#', ' & ', $text ); // replace und
-	$text = str_replace(' ;','; ',$text); //weniger hässlich
-	return $text;
-}
-
-?>
\ No newline at end of file
diff --git a/panels/mensaPlan/mensaParser.php b/panels/mensaPlan/mensaParser.php
deleted file mode 100755
index 9519dbfeb8c5691a3bf982d3ffd7724dc544ba3d..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/mensaParser.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-require 'config.php';
-require 'simple_html_dom.php';
-require 'helper.php';
-require 'gericht.php';
-require 'tag.php';
-
-// Parse
-$html = file_get_html ( $MENSA_URL );
-if ($html != null) {
-	$tage = array ();
-	foreach ( $PARSE_DAYLIST as $DAYNAME ) {
-		array_push ( $tage, parsDay ( $html, $DAYNAME ) );
-	}
-	
-	// CREATE JSON
-	toJson ( $tage, $JSON_NAME, $JSON_INC_NR, $JSON_INC_ORIGINAL, $JSON_INC_SHORT, $JSON_INC_ART, $JSON_INC_KIND, $JSON_INC_STOFFE, $JSON_INC_COUNTER, $JSON_INC_DATE );
-} else {
-	echo "Webseite nicht erreichbar.";
-}
-?>
\ No newline at end of file
diff --git a/panels/mensaPlan/script.js b/panels/mensaPlan/script.js
index 010bd982a136475c5676b1f2d83b15db381c1ee5..f6f81d93d74d640dbbc7d68efe539670b49052c3 100755
--- a/panels/mensaPlan/script.js
+++ b/panels/mensaPlan/script.js
@@ -1,7 +1,7 @@
 this.tabtime=20;
 
 this.checkShowCondition = function() {
-	return 3*this.tabtime;
+	return 4*this.tabtime;
 }
 
 this.show = function() {
@@ -16,6 +16,9 @@ this.show = function() {
 			currentTab = 2;
 			break;
 		case 2:
+			currentTab = 3;
+			break;
+		case 3:
 			currentTab = 0;
 			break;
 		default:
@@ -32,6 +35,48 @@ this.hide = function() {
 	clearInterval(this.interval);
 }
 
+function padTwo(num) {
+	if (num < 10) {
+		return "0" + num
+	} else {
+		return num
+	}
+}
+
+function isNextDay() {
+	if (new Date().getHours() >= 15) {
+		return true;
+	}
+}
+
+function calcDateAPI() {
+	if (isNextDay) {
+		return new Date().getFullYear() + "-" + padTwo(new Date().getMonth()+1) + "-" + (padTwo(new Date().getDate() + 1));
+	} else {
+		return new Date().getFullYear() + "-" + padTwo(new Date().getMonth()+1) + "-" + padTwo(new Date().getDate());
+	}
+}
+
+function calcTextDisplay() {
+	if (isNextDay) {
+                return "Mensaplan von MORGEN, dem  " + (padTwo(new Date().getDate() + 1)) +"."+ padTwo(new Date().getMonth()+1) +"."+ new Date().getFullYear();
+        } else {
+                return "Mensaplan von HEUTE, dem  " + padTwo(new Date().getDate()) +"."+ padTwo(new Date().getMonth()+1) +"."+ new Date().getFullYear();
+        }
+}
+
+function handleGericht(text) {
+	text = text.replace(/\([^\)]*\)/g, ""); // remove zusatzstoffe
+	text = text.replace(/\s+/g, " "); // fix double Whitespace
+	text = text.replace(/(\s,|,\s)/g, ","); // fix Komma
+	text = text.replace(/,/g, ", "); // fix Komma
+	text = text.replace(/,\sdazu\s\d\sBeilagen\snach\sWahl/g, " "); // remove Beilagen
+	text = text.replace(/\sund\s\d\sBeilagen\snach\sWahl/g, " "); // remove Beilagen
+	text = text.replace(/,\sdazu\s/g, " + "); // replace dazu
+	text = text.replace(/\sund\s/g, " & "); // replace und
+	return text
+}
+
 this.loaded = function(panel, config) {
 	// reload data
 	setInterval(function() {
@@ -39,7 +84,7 @@ this.loaded = function(panel, config) {
 	}, 30*60*1000);
 
 	function getMensaPlan() {
-		$.getJSON("tmp/mensaPlan.json?"+( new Date().getTime()) ).done(function(json) {
+		$.getJSON("https://mobil.itmc.tu-dortmund.de/canteen-menu/v1/canteens/341/"+calcDateAPI()).done(function(json) {
 			fillTable(json);
 		}).fail(function(jqxhr, textStatus, error) {
 			var err = textStatus + ", " + error;
@@ -48,95 +93,88 @@ this.loaded = function(panel, config) {
 	}
 
 	function fillTable(json) {
-		var date = new Date();
-		var next = 0;
-		if (date.getHours() >= 15) {
-			next = 1;
-		}
-		switch (date.getDay() + next) {
-		case 0:
-			var day = json.montag;
-			break;
-		case 1:
-			var day = json.montag;
-			break;
-		case 2:
-			var day = json.dienstag;
-			break;
-		case 3:
-			var day = json.mittwoch;
-			break;
-		case 4:
-			var day = json.donnerstag;
-			break;
-		case 5:
-			var day = json.freitag;
-			break;
-		case 6:
-			var day = json.montag;
-			break;
-		case 7:
-			var day = json.montag;
-			break;
-		}
-		if (next) {
-			document.getElementById("mensaPlanTitleBar").innerHTML = "Mensaplan von MORGEN, dem  "
-					+ day[0].date;
-		} else {
-			document.getElementById("mensaPlanTitleBar").innerHTML = "Mensaplan von HEUTE, dem  "
-					+ day[0].date;
-		}
+		document.getElementById("mensaPlanTitleBar").innerHTML = calcTextDisplay();
 		var tableBody1 = document.getElementById("mensaPlanTable1Body");
 		var tableBody2 = document.getElementById("mensaPlanTable2Body");
 		var tableBody3 = document.getElementById("mensaPlanTable3Body");
+		var tableBody4 = document.getElementById("mensaPlanTable4Body");
 		tableBody1.innerHTML = ""; // clear
 		tableBody2.innerHTML = ""; // clear
 		tableBody3.innerHTML = ""; // clear
+		tableBody4.innerHTML = ""; // clear
 		var a = 0;
 		var b = 0;
 		var c = 0;
-		for (var i = 0; i < day.length; i++) {
-			var gericht = day[i];
+		var d = 0;
+		for (var i = 0; i < json.length; i++) {
+			var gericht = json[i];
 			var row = "";
-			switch (gericht.counter) {
-			case 1:
+			switch (gericht.category) {
+			case "1": // Menu 1
 				var row = tableBody1.insertRow(a);
 				a++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 2:
+			case "2": // Menu 2
 				var row = tableBody1.insertRow(a);
 				a++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 3:
+			case "3": // Tagesgericht
 				var row = tableBody1.insertRow(a);
 				a++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 4:
+			case "4": // Vegetarisch
 				var row = tableBody3.insertRow(c);
 				c++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 5:
+			case "5": // Aktionsteller
 				var row = tableBody1.insertRow(a);
 				a++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 6:
-				var row = tableBody2.insertRow(b);
-				b++;
+			case "6": // Aktionsteller Fisch
+        var row = tableBody3.insertRow(c);
+      	c++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 7:
+			case "7": // Aktionsteller Vegan
 				var row = tableBody3.insertRow(c);
 				c++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 				break;
-			case 8:
-				var row = tableBody3.insertRow(c);
-				c++;
+			case "8": // Grillstation
+				var row = tableBody2.insertRow(b);
+				b++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
+				break;
+			case "16": // Beilagen
+				var beilagen = gericht.title.de.split(";");
+				for (var j = 0; j < beilagen.length; j++) {
+					if(beilagen[j] != "") {
+						var row = tableBody4.insertRow(d);
+						d++;
+						var cell = row.insertCell(0);
+						cell.innerHTML = handleGericht(beilagen[j]);
+					}
+				}
 				break;
 			default:
 				var row = tableBody3.insertRow(c);
 				c++;
+				var cell = row.insertCell(0);
+				cell.innerHTML = handleGericht(gericht.title.de);
 			}
-			var cell1 = row.insertCell(0);
-			cell1.innerHTML = gericht.shortText;
 		}
 	}
 
diff --git a/panels/mensaPlan/simple_html_dom.php b/panels/mensaPlan/simple_html_dom.php
deleted file mode 100755
index 93884dd8a395203cc6f2e20349b9127bd264de52..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/simple_html_dom.php
+++ /dev/null
@@ -1,1742 +0,0 @@
-<?php
-/**
- * Website: http://sourceforge.net/projects/simplehtmldom/
- * Additional projects that may be used: http://sourceforge.net/projects/debugobject/
- * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/)
- * Contributions by:
- *	 Yousuke Kumakura (Attribute filters)
- *	 Vadim Voituk (Negative indexes supports of "find" method)
- *	 Antcs (Constructor with automatically load contents either text or file/url)
- *
- * all affected sections have comments starting with "PaperG"
- *
- * Paperg - Added case insensitive testing of the value of the selector.
- * Paperg - Added tag_start for the starting index of tags - NOTE: This works but not accurately.
- *  This tag_start gets counted AFTER \r\n have been crushed out, and after the remove_noice calls so it will not reflect the REAL position of the tag in the source,
- *  it will almost always be smaller by some amount.
- *  We use this to determine how far into the file the tag in question is.  This "percentage will never be accurate as the $dom->size is the "real" number of bytes the dom was created from.
- *  but for most purposes, it's a really good estimation.
- * Paperg - Added the forceTagsClosed to the dom constructor.  Forcing tags closed is great for malformed html, but it CAN lead to parsing errors.
- * Allow the user to tell us how much they trust the html.
- * Paperg add the text and plaintext to the selectors for the find syntax.  plaintext implies text in the innertext of a node.  text implies that the tag is a text node.
- * This allows for us to find tags based on the text they contain.
- * Create find_ancestor_tag to see if a tag is - at any level - inside of another specific tag.
- * Paperg: added parse_charset so that we know about the character set of the source document.
- *  NOTE:  If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the
- *  last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection.
- *
- * Found infinite loop in the case of broken html in restore_noise.  Rewrote to protect from that.
- * PaperG (John Schlick) Added get_display_size for "IMG" tags.
- *
- * Licensed under The MIT License
- * Redistributions of files must retain the above copyright notice.
- *
- * @author S.C. Chen <me578022@gmail.com>
- * @author John Schlick
- * @author Rus Carroll
- * @version 1.5 ($Rev: 210 $)
- * @package PlaceLocalInclude
- * @subpackage simple_html_dom
- */
-
-/**
- * All of the Defines for the classes below.
- * @author S.C. Chen <me578022@gmail.com>
- */
-define('HDOM_TYPE_ELEMENT', 1);
-define('HDOM_TYPE_COMMENT', 2);
-define('HDOM_TYPE_TEXT',	3);
-define('HDOM_TYPE_ENDTAG',  4);
-define('HDOM_TYPE_ROOT',	5);
-define('HDOM_TYPE_UNKNOWN', 6);
-define('HDOM_QUOTE_DOUBLE', 0);
-define('HDOM_QUOTE_SINGLE', 1);
-define('HDOM_QUOTE_NO',	 3);
-define('HDOM_INFO_BEGIN',   0);
-define('HDOM_INFO_END',	 1);
-define('HDOM_INFO_QUOTE',   2);
-define('HDOM_INFO_SPACE',   3);
-define('HDOM_INFO_TEXT',	4);
-define('HDOM_INFO_INNER',   5);
-define('HDOM_INFO_OUTER',   6);
-define('HDOM_INFO_ENDSPACE',7);
-define('DEFAULT_TARGET_CHARSET', 'UTF-8');
-define('DEFAULT_BR_TEXT', "\r\n");
-define('DEFAULT_SPAN_TEXT', " ");
-define('MAX_FILE_SIZE', 600000);
-// helper functions
-// -----------------------------------------------------------------------------
-// get html dom from file
-// $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1.
-function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
-{
-	// We DO force the tags to be terminated.
-	$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
-	// For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
-	$contents = file_get_contents($url, $use_include_path, $context, $offset);
-	// Paperg - use our own mechanism for getting the contents as we want to control the timeout.
-	//$contents = retrieve_url_contents($url);
-	if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
-	{
-		return false;
-	}
-	// The second parameter can force the selectors to all be lowercase.
-	$dom->load($contents, $lowercase, $stripRN);
-	return $dom;
-}
-
-// get html dom from string
-function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
-{
-	$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
-	if (empty($str) || strlen($str) > MAX_FILE_SIZE)
-	{
-		$dom->clear();
-		return false;
-	}
-	$dom->load($str, $lowercase, $stripRN);
-	return $dom;
-}
-
-// dump html dom tree
-function dump_html_tree($node, $show_attr=true, $deep=0)
-{
-	$node->dump($node);
-}
-
-
-/**
- * simple html dom node
- * PaperG - added ability for "find" routine to lowercase the value of the selector.
- * PaperG - added $tag_start to track the start position of the tag in the total byte index
- *
- * @package PlaceLocalInclude
- */
-class simple_html_dom_node
-{
-	public $nodetype = HDOM_TYPE_TEXT;
-	public $tag = 'text';
-	public $attr = array();
-	public $children = array();
-	public $nodes = array();
-	public $parent = null;
-	// The "info" array - see HDOM_INFO_... for what each element contains.
-	public $_ = array();
-	public $tag_start = 0;
-	private $dom = null;
-
-	function __construct($dom)
-	{
-		$this->dom = $dom;
-		$dom->nodes[] = $this;
-	}
-
-	function __destruct()
-	{
-		$this->clear();
-	}
-
-	function __toString()
-	{
-		return $this->outertext();
-	}
-
-	// clean up memory due to php5 circular references memory leak...
-	function clear()
-	{
-		$this->dom = null;
-		$this->nodes = null;
-		$this->parent = null;
-		$this->children = null;
-	}
-
-	// dump node's tree
-	function dump($show_attr=true, $deep=0)
-	{
-		$lead = str_repeat('	', $deep);
-
-		echo $lead.$this->tag;
-		if ($show_attr && count($this->attr)>0)
-		{
-			echo '(';
-			foreach ($this->attr as $k=>$v)
-				echo "[$k]=>\"".$this->$k.'", ';
-			echo ')';
-		}
-		echo "\n";
-
-		if ($this->nodes)
-		{
-			foreach ($this->nodes as $c)
-			{
-				$c->dump($show_attr, $deep+1);
-			}
-		}
-	}
-
-
-	// Debugging function to dump a single dom node with a bunch of information about it.
-	function dump_node($echo=true)
-	{
-
-		$string = $this->tag;
-		if (count($this->attr)>0)
-		{
-			$string .= '(';
-			foreach ($this->attr as $k=>$v)
-			{
-				$string .= "[$k]=>\"".$this->$k.'", ';
-			}
-			$string .= ')';
-		}
-		if (count($this->_)>0)
-		{
-			$string .= ' $_ (';
-			foreach ($this->_ as $k=>$v)
-			{
-				if (is_array($v))
-				{
-					$string .= "[$k]=>(";
-					foreach ($v as $k2=>$v2)
-					{
-						$string .= "[$k2]=>\"".$v2.'", ';
-					}
-					$string .= ")";
-				} else {
-					$string .= "[$k]=>\"".$v.'", ';
-				}
-			}
-			$string .= ")";
-		}
-
-		if (isset($this->text))
-		{
-			$string .= " text: (" . $this->text . ")";
-		}
-
-		$string .= " HDOM_INNER_INFO: '";
-		if (isset($node->_[HDOM_INFO_INNER]))
-		{
-			$string .= $node->_[HDOM_INFO_INNER] . "'";
-		}
-		else
-		{
-			$string .= ' NULL ';
-		}
-
-		$string .= " children: " . count($this->children);
-		$string .= " nodes: " . count($this->nodes);
-		$string .= " tag_start: " . $this->tag_start;
-		$string .= "\n";
-
-		if ($echo)
-		{
-			echo $string;
-			return;
-		}
-		else
-		{
-			return $string;
-		}
-	}
-
-	// returns the parent of node
-	// If a node is passed in, it will reset the parent of the current node to that one.
-	function parent($parent=null)
-	{
-		// I am SURE that this doesn't work properly.
-		// It fails to unset the current node from it's current parents nodes or children list first.
-		if ($parent !== null)
-		{
-			$this->parent = $parent;
-			$this->parent->nodes[] = $this;
-			$this->parent->children[] = $this;
-		}
-
-		return $this->parent;
-	}
-
-	// verify that node has children
-	function has_child()
-	{
-		return !empty($this->children);
-	}
-
-	// returns children of node
-	function children($idx=-1)
-	{
-		if ($idx===-1)
-		{
-			return $this->children;
-		}
-		if (isset($this->children[$idx]))
-		{
-			return $this->children[$idx];
-		}
-		return null;
-	}
-
-	// returns the first child of node
-	function first_child()
-	{
-		if (count($this->children)>0)
-		{
-			return $this->children[0];
-		}
-		return null;
-	}
-
-	// returns the last child of node
-	function last_child()
-	{
-		if (($count=count($this->children))>0)
-		{
-			return $this->children[$count-1];
-		}
-		return null;
-	}
-
-	// returns the next sibling of node
-	function next_sibling()
-	{
-		if ($this->parent===null)
-		{
-			return null;
-		}
-
-		$idx = 0;
-		$count = count($this->parent->children);
-		while ($idx<$count && $this!==$this->parent->children[$idx])
-		{
-			++$idx;
-		}
-		if (++$idx>=$count)
-		{
-			return null;
-		}
-		return $this->parent->children[$idx];
-	}
-
-	// returns the previous sibling of node
-	function prev_sibling()
-	{
-		if ($this->parent===null) return null;
-		$idx = 0;
-		$count = count($this->parent->children);
-		while ($idx<$count && $this!==$this->parent->children[$idx])
-			++$idx;
-		if (--$idx<0) return null;
-		return $this->parent->children[$idx];
-	}
-
-	// function to locate a specific ancestor tag in the path to the root.
-	function find_ancestor_tag($tag)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
-
-		// Start by including ourselves in the comparison.
-		$returnDom = $this;
-
-		while (!is_null($returnDom))
-		{
-			if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); }
-
-			if ($returnDom->tag == $tag)
-			{
-				break;
-			}
-			$returnDom = $returnDom->parent;
-		}
-		return $returnDom;
-	}
-
-	// get dom node's inner html
-	function innertext()
-	{
-		if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
-		if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
-
-		$ret = '';
-		foreach ($this->nodes as $n)
-			$ret .= $n->outertext();
-		return $ret;
-	}
-
-	// get dom node's outer text (with tag)
-	function outertext()
-	{
-		global $debug_object;
-		if (is_object($debug_object))
-		{
-			$text = '';
-			if ($this->tag == 'text')
-			{
-				if (!empty($this->text))
-				{
-					$text = " with text: " . $this->text;
-				}
-			}
-			$debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text);
-		}
-
-		if ($this->tag==='root') return $this->innertext();
-
-		// trigger callback
-		if ($this->dom && $this->dom->callback!==null)
-		{
-			call_user_func_array($this->dom->callback, array($this));
-		}
-
-		if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
-		if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
-
-		// render begin tag
-		if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]])
-		{
-			$ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
-		} else {
-			$ret = "";
-		}
-
-		// render inner text
-		if (isset($this->_[HDOM_INFO_INNER]))
-		{
-			// If it's a br tag...  don't return the HDOM_INNER_INFO that we may or may not have added.
-			if ($this->tag != "br")
-			{
-				$ret .= $this->_[HDOM_INFO_INNER];
-			}
-		} else {
-			if ($this->nodes)
-			{
-				foreach ($this->nodes as $n)
-				{
-					$ret .= $this->convert_text($n->outertext());
-				}
-			}
-		}
-
-		// render end tag
-		if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
-			$ret .= '</'.$this->tag.'>';
-		return $ret;
-	}
-
-	// get dom node's plain text
-	function text()
-	{
-		if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
-		switch ($this->nodetype)
-		{
-			case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
-			case HDOM_TYPE_COMMENT: return '';
-			case HDOM_TYPE_UNKNOWN: return '';
-		}
-		if (strcasecmp($this->tag, 'script')===0) return '';
-		if (strcasecmp($this->tag, 'style')===0) return '';
-
-		$ret = '';
-		// In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL.
-		// NOTE: This indicates that there is a problem where it's set to NULL without a clear happening.
-		// WHY is this happening?
-		if (!is_null($this->nodes))
-		{
-			foreach ($this->nodes as $n)
-			{
-				$ret .= $this->convert_text($n->text());
-			}
-
-			// If this node is a span... add a space at the end of it so multiple spans don't run into each other.  This is plaintext after all.
-			if ($this->tag == "span")
-			{
-				$ret .= $this->dom->default_span_text;
-			}
-
-
-		}
-		return $ret;
-	}
-
-	function xmltext()
-	{
-		$ret = $this->innertext();
-		$ret = str_ireplace('<![CDATA[', '', $ret);
-		$ret = str_replace(']]>', '', $ret);
-		return $ret;
-	}
-
-	// build node's text with tag
-	function makeup()
-	{
-		// text, comment, unknown
-		if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
-
-		$ret = '<'.$this->tag;
-		$i = -1;
-
-		foreach ($this->attr as $key=>$val)
-		{
-			++$i;
-
-			// skip removed attribute
-			if ($val===null || $val===false)
-				continue;
-
-			$ret .= $this->_[HDOM_INFO_SPACE][$i][0];
-			//no value attr: nowrap, checked selected...
-			if ($val===true)
-				$ret .= $key;
-			else {
-				switch ($this->_[HDOM_INFO_QUOTE][$i])
-				{
-					case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
-					case HDOM_QUOTE_SINGLE: $quote = '\''; break;
-					default: $quote = '';
-				}
-				$ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
-			}
-		}
-		$ret = $this->dom->restore_noise($ret);
-		return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
-	}
-
-	// find elements by css selector
-	//PaperG - added ability for find to lowercase the value of the selector.
-	function find($selector, $idx=null, $lowercase=false)
-	{
-		$selectors = $this->parse_selector($selector);
-		if (($count=count($selectors))===0) return array();
-		$found_keys = array();
-
-		// find each selector
-		for ($c=0; $c<$count; ++$c)
-		{
-			// The change on the below line was documented on the sourceforge code tracker id 2788009
-			// used to be: if (($levle=count($selectors[0]))===0) return array();
-			if (($levle=count($selectors[$c]))===0) return array();
-			if (!isset($this->_[HDOM_INFO_BEGIN])) return array();
-
-			$head = array($this->_[HDOM_INFO_BEGIN]=>1);
-
-			// handle descendant selectors, no recursive!
-			for ($l=0; $l<$levle; ++$l)
-			{
-				$ret = array();
-				foreach ($head as $k=>$v)
-				{
-					$n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];
-					//PaperG - Pass this optional parameter on to the seek function.
-					$n->seek($selectors[$c][$l], $ret, $lowercase);
-				}
-				$head = $ret;
-			}
-
-			foreach ($head as $k=>$v)
-			{
-				if (!isset($found_keys[$k]))
-				{
-					$found_keys[$k] = 1;
-				}
-			}
-		}
-
-		// sort keys
-		ksort($found_keys);
-
-		$found = array();
-		foreach ($found_keys as $k=>$v)
-			$found[] = $this->dom->nodes[$k];
-
-		// return nth-element or array
-		if (is_null($idx)) return $found;
-		else if ($idx<0) $idx = count($found) + $idx;
-		return (isset($found[$idx])) ? $found[$idx] : null;
-	}
-
-	// seek for given conditions
-	// PaperG - added parameter to allow for case insensitive testing of the value of a selector.
-	protected function seek($selector, &$ret, $lowercase=false)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
-
-		list($tag, $key, $val, $exp, $no_key) = $selector;
-
-		// xpath index
-		if ($tag && $key && is_numeric($key))
-		{
-			$count = 0;
-			foreach ($this->children as $c)
-			{
-				if ($tag==='*' || $tag===$c->tag) {
-					if (++$count==$key) {
-						$ret[$c->_[HDOM_INFO_BEGIN]] = 1;
-						return;
-					}
-				}
-			}
-			return;
-		}
-
-		$end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
-		if ($end==0) {
-			$parent = $this->parent;
-			while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {
-				$end -= 1;
-				$parent = $parent->parent;
-			}
-			$end += $parent->_[HDOM_INFO_END];
-		}
-
-		for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) {
-			$node = $this->dom->nodes[$i];
-
-			$pass = true;
-
-			if ($tag==='*' && !$key) {
-				if (in_array($node, $this->children, true))
-					$ret[$i] = 1;
-				continue;
-			}
-
-			// compare tag
-			if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}
-			// compare key
-			if ($pass && $key) {
-				if ($no_key) {
-					if (isset($node->attr[$key])) $pass=false;
-				} else {
-					if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false;
-				}
-			}
-			// compare value
-			if ($pass && $key && $val  && $val!=='*') {
-				// If they have told us that this is a "plaintext" search then we want the plaintext of the node - right?
-				if ($key == "plaintext") {
-					// $node->plaintext actually returns $node->text();
-					$nodeKeyValue = $node->text();
-				} else {
-					// this is a normal search, we want the value of that attribute of the tag.
-					$nodeKeyValue = $node->attr[$key];
-				}
-				if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);}
-
-				//PaperG - If lowercase is set, do a case insensitive test of the value of the selector.
-				if ($lowercase) {
-					$check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue));
-				} else {
-					$check = $this->match($exp, $val, $nodeKeyValue);
-				}
-				if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));}
-
-				// handle multiple class
-				if (!$check && strcasecmp($key, 'class')===0) {
-					foreach (explode(' ',$node->attr[$key]) as $k) {
-						// Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form.
-						if (!empty($k)) {
-							if ($lowercase) {
-								$check = $this->match($exp, strtolower($val), strtolower($k));
-							} else {
-								$check = $this->match($exp, $val, $k);
-							}
-							if ($check) break;
-						}
-					}
-				}
-				if (!$check) $pass = false;
-			}
-			if ($pass) $ret[$i] = 1;
-			unset($node);
-		}
-		// It's passed by reference so this is actually what this function returns.
-		if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);}
-	}
-
-	protected function match($exp, $pattern, $value) {
-		global $debug_object;
-		if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
-
-		switch ($exp) {
-			case '=':
-				return ($value===$pattern);
-			case '!=':
-				return ($value!==$pattern);
-			case '^=':
-				return preg_match("/^".preg_quote($pattern,'/')."/", $value);
-			case '$=':
-				return preg_match("/".preg_quote($pattern,'/')."$/", $value);
-			case '*=':
-				if ($pattern[0]=='/') {
-					return preg_match($pattern, $value);
-				}
-				return preg_match("/".$pattern."/i", $value);
-		}
-		return false;
-	}
-
-	protected function parse_selector($selector_string) {
-		global $debug_object;
-		if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
-
-		// pattern of CSS selectors, modified from mootools
-		// Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does.
-		// Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check.
-// Notice the \[ starting the attbute?  and the @? following?  This implies that an attribute can begin with an @ sign that is not captured.
-// This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression.
-// farther study is required to determine of this should be documented or removed.
-//		$pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
-		$pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-:]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
-		preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);
-		if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);}
-
-		$selectors = array();
-		$result = array();
-		//print_r($matches);
-
-		foreach ($matches as $m) {
-			$m[0] = trim($m[0]);
-			if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;
-			// for browser generated xpath
-			if ($m[1]==='tbody') continue;
-
-			list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);
-			if (!empty($m[2])) {$key='id'; $val=$m[2];}
-			if (!empty($m[3])) {$key='class'; $val=$m[3];}
-			if (!empty($m[4])) {$key=$m[4];}
-			if (!empty($m[5])) {$exp=$m[5];}
-			if (!empty($m[6])) {$val=$m[6];}
-
-			// convert to lowercase
-			if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
-			//elements that do NOT have the specified attribute
-			if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}
-
-			$result[] = array($tag, $key, $val, $exp, $no_key);
-			if (trim($m[7])===',') {
-				$selectors[] = $result;
-				$result = array();
-			}
-		}
-		if (count($result)>0)
-			$selectors[] = $result;
-		return $selectors;
-	}
-
-	function __get($name)
-	{
-		if (isset($this->attr[$name]))
-		{
-			return $this->convert_text($this->attr[$name]);
-		}
-		switch ($name)
-		{
-			case 'outertext': return $this->outertext();
-			case 'innertext': return $this->innertext();
-			case 'plaintext': return $this->text();
-			case 'xmltext': return $this->xmltext();
-			default: return array_key_exists($name, $this->attr);
-		}
-	}
-
-	function __set($name, $value)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
-
-		switch ($name)
-		{
-			case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;
-			case 'innertext':
-				if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
-				return $this->_[HDOM_INFO_INNER] = $value;
-		}
-		if (!isset($this->attr[$name]))
-		{
-			$this->_[HDOM_INFO_SPACE][] = array(' ', '', '');
-			$this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
-		}
-		$this->attr[$name] = $value;
-	}
-
-	function __isset($name)
-	{
-		switch ($name)
-		{
-			case 'outertext': return true;
-			case 'innertext': return true;
-			case 'plaintext': return true;
-		}
-		//no value attr: nowrap, checked selected...
-		return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);
-	}
-
-	function __unset($name) {
-		if (isset($this->attr[$name]))
-			unset($this->attr[$name]);
-	}
-
-	// PaperG - Function to convert the text from one character set to another if the two sets are not the same.
-	function convert_text($text)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
-
-		$converted_text = $text;
-
-		$sourceCharset = "";
-		$targetCharset = "";
-
-		if ($this->dom)
-		{
-			$sourceCharset = strtoupper($this->dom->_charset);
-			$targetCharset = strtoupper($this->dom->_target_charset);
-		}
-		if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);}
-
-		if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0))
-		{
-			// Check if the reported encoding could have been incorrect and the text is actually already UTF-8
-			if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text)))
-			{
-				$converted_text = $text;
-			}
-			else
-			{
-				$converted_text = iconv($sourceCharset, $targetCharset, $text);
-			}
-		}
-
-		// Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output.
-		if ($targetCharset == 'UTF-8')
-		{
-			if (substr($converted_text, 0, 3) == "\xef\xbb\xbf")
-			{
-				$converted_text = substr($converted_text, 3);
-			}
-			if (substr($converted_text, -3) == "\xef\xbb\xbf")
-			{
-				$converted_text = substr($converted_text, 0, -3);
-			}
-		}
-
-		return $converted_text;
-	}
-
-	/**
-	* Returns true if $string is valid UTF-8 and false otherwise.
-	*
-	* @param mixed $str String to be tested
-	* @return boolean
-	*/
-	static function is_utf8($str)
-	{
-		$c=0; $b=0;
-		$bits=0;
-		$len=strlen($str);
-		for($i=0; $i<$len; $i++)
-		{
-			$c=ord($str[$i]);
-			if($c > 128)
-			{
-				if(($c >= 254)) return false;
-				elseif($c >= 252) $bits=6;
-				elseif($c >= 248) $bits=5;
-				elseif($c >= 240) $bits=4;
-				elseif($c >= 224) $bits=3;
-				elseif($c >= 192) $bits=2;
-				else return false;
-				if(($i+$bits) > $len) return false;
-				while($bits > 1)
-				{
-					$i++;
-					$b=ord($str[$i]);
-					if($b < 128 || $b > 191) return false;
-					$bits--;
-				}
-			}
-		}
-		return true;
-	}
-	/*
-	function is_utf8($string)
-	{
-		//this is buggy
-		return (utf8_encode(utf8_decode($string)) == $string);
-	}
-	*/
-
-	/**
-	 * Function to try a few tricks to determine the displayed size of an img on the page.
-	 * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types.
-	 *
-	 * @author John Schlick
-	 * @version April 19 2012
-	 * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out.
-	 */
-	function get_display_size()
-	{
-		global $debug_object;
-
-		$width = -1;
-		$height = -1;
-
-		if ($this->tag !== 'img')
-		{
-			return false;
-		}
-
-		// See if there is aheight or width attribute in the tag itself.
-		if (isset($this->attr['width']))
-		{
-			$width = $this->attr['width'];
-		}
-
-		if (isset($this->attr['height']))
-		{
-			$height = $this->attr['height'];
-		}
-
-		// Now look for an inline style.
-		if (isset($this->attr['style']))
-		{
-			// Thanks to user gnarf from stackoverflow for this regular expression.
-			$attributes = array();
-			preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER);
-			foreach ($matches as $match) {
-			  $attributes[$match[1]] = $match[2];
-			}
-
-			// If there is a width in the style attributes:
-			if (isset($attributes['width']) && $width == -1)
-			{
-				// check that the last two characters are px (pixels)
-				if (strtolower(substr($attributes['width'], -2)) == 'px')
-				{
-					$proposed_width = substr($attributes['width'], 0, -2);
-					// Now make sure that it's an integer and not something stupid.
-					if (filter_var($proposed_width, FILTER_VALIDATE_INT))
-					{
-						$width = $proposed_width;
-					}
-				}
-			}
-
-			// If there is a width in the style attributes:
-			if (isset($attributes['height']) && $height == -1)
-			{
-				// check that the last two characters are px (pixels)
-				if (strtolower(substr($attributes['height'], -2)) == 'px')
-				{
-					$proposed_height = substr($attributes['height'], 0, -2);
-					// Now make sure that it's an integer and not something stupid.
-					if (filter_var($proposed_height, FILTER_VALIDATE_INT))
-					{
-						$height = $proposed_height;
-					}
-				}
-			}
-
-		}
-
-		// Future enhancement:
-		// Look in the tag to see if there is a class or id specified that has a height or width attribute to it.
-
-		// Far future enhancement
-		// Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width
-		// Note that in this case, the class or id will have the img subselector for it to apply to the image.
-
-		// ridiculously far future development
-		// If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page.
-
-		$result = array('height' => $height,
-						'width' => $width);
-		return $result;
-	}
-
-	// camel naming conventions
-	function getAllAttributes() {return $this->attr;}
-	function getAttribute($name) {return $this->__get($name);}
-	function setAttribute($name, $value) {$this->__set($name, $value);}
-	function hasAttribute($name) {return $this->__isset($name);}
-	function removeAttribute($name) {$this->__set($name, null);}
-	function getElementById($id) {return $this->find("#$id", 0);}
-	function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
-	function getElementByTagName($name) {return $this->find($name, 0);}
-	function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}
-	function parentNode() {return $this->parent();}
-	function childNodes($idx=-1) {return $this->children($idx);}
-	function firstChild() {return $this->first_child();}
-	function lastChild() {return $this->last_child();}
-	function nextSibling() {return $this->next_sibling();}
-	function previousSibling() {return $this->prev_sibling();}
-	function hasChildNodes() {return $this->has_child();}
-	function nodeName() {return $this->tag;}
-	function appendChild($node) {$node->parent($this); return $node;}
-
-}
-
-/**
- * simple html dom parser
- * Paperg - in the find routine: allow us to specify that we want case insensitive testing of the value of the selector.
- * Paperg - change $size from protected to public so we can easily access it
- * Paperg - added ForceTagsClosed in the constructor which tells us whether we trust the html or not.  Default is to NOT trust it.
- *
- * @package PlaceLocalInclude
- */
-class simple_html_dom
-{
-	public $root = null;
-	public $nodes = array();
-	public $callback = null;
-	public $lowercase = false;
-	// Used to keep track of how large the text was when we started.
-	public $original_size;
-	public $size;
-	protected $pos;
-	protected $doc;
-	protected $char;
-	protected $cursor;
-	protected $parent;
-	protected $noise = array();
-	protected $token_blank = " \t\r\n";
-	protected $token_equal = ' =/>';
-	protected $token_slash = " />\r\n\t";
-	protected $token_attr = ' >';
-	// Note that this is referenced by a child node, and so it needs to be public for that node to see this information.
-	public $_charset = '';
-	public $_target_charset = '';
-	protected $default_br_text = "";
-	public $default_span_text = "";
-
-	// use isset instead of in_array, performance boost about 30%...
-	protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
-	protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
-	// Known sourceforge issue #2977341
-	// B tags that are not closed cause us to return everything to the end of the document.
-	protected $optional_closing_tags = array(
-		'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
-		'th'=>array('th'=>1),
-		'td'=>array('td'=>1),
-		'li'=>array('li'=>1),
-		'dt'=>array('dt'=>1, 'dd'=>1),
-		'dd'=>array('dd'=>1, 'dt'=>1),
-		'dl'=>array('dd'=>1, 'dt'=>1),
-		'p'=>array('p'=>1),
-		'nobr'=>array('nobr'=>1),
-		'b'=>array('b'=>1),
-		'option'=>array('option'=>1),
-	);
-
-	function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
-	{
-		if ($str)
-		{
-			if (preg_match("/^http:\/\//i",$str) || is_file($str))
-			{
-				$this->load_file($str);
-			}
-			else
-			{
-				$this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);
-			}
-		}
-		// Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html.
-		if (!$forceTagsClosed) {
-			$this->optional_closing_array=array();
-		}
-		$this->_target_charset = $target_charset;
-	}
-
-	function __destruct()
-	{
-		$this->clear();
-	}
-
-	// load html from string
-	function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
-	{
-		global $debug_object;
-
-		// prepare
-		$this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);
-		// strip out cdata
-		$this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
-		// strip out comments
-		$this->remove_noise("'<!--(.*?)-->'is");
-		// Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037
-		// Script tags removal now preceeds style tag removal.
-		// strip out <script> tags
-		$this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
-		$this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
-		// strip out <style> tags
-		$this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
-		$this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
-		// strip out preformatted tags
-		$this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
-		// strip out server side scripts
-		$this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
-		// strip smarty scripts
-		$this->remove_noise("'(\{\w)(.*?)(\})'s", true);
-
-		// parsing
-		while ($this->parse());
-		// end
-		$this->root->_[HDOM_INFO_END] = $this->cursor;
-		$this->parse_charset();
-
-		// make load function chainable
-		return $this;
-
-	}
-
-	// load html from file
-	function load_file()
-	{
-		$args = func_get_args();
-		$this->load(call_user_func_array('file_get_contents', $args), true);
-		// Throw an error if we can't properly load the dom.
-		if (($error=error_get_last())!==null) {
-			$this->clear();
-			return false;
-		}
-	}
-
-	// set callback function
-	function set_callback($function_name)
-	{
-		$this->callback = $function_name;
-	}
-
-	// remove callback function
-	function remove_callback()
-	{
-		$this->callback = null;
-	}
-
-	// save dom as string
-	function save($filepath='')
-	{
-		$ret = $this->root->innertext();
-		if ($filepath!=='') file_put_contents($filepath, $ret, LOCK_EX);
-		return $ret;
-	}
-
-	// find dom node by css selector
-	// Paperg - allow us to specify that we want case insensitive testing of the value of the selector.
-	function find($selector, $idx=null, $lowercase=false)
-	{
-		return $this->root->find($selector, $idx, $lowercase);
-	}
-
-	// clean up memory due to php5 circular references memory leak...
-	function clear()
-	{
-		foreach ($this->nodes as $n) {$n->clear(); $n = null;}
-		// This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear.
-		if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;}
-		if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}
-		if (isset($this->root)) {$this->root->clear(); unset($this->root);}
-		unset($this->doc);
-		unset($this->noise);
-	}
-
-	function dump($show_attr=true)
-	{
-		$this->root->dump($show_attr);
-	}
-
-	// prepare HTML data and init everything
-	protected function prepare($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
-	{
-		$this->clear();
-
-		// set the length of content before we do anything to it.
-		$this->size = strlen($str);
-		// Save the original size of the html that we got in.  It might be useful to someone.
-		$this->original_size = $this->size;
-
-		//before we save the string as the doc...  strip out the \r \n's if we are told to.
-		if ($stripRN) {
-			$str = str_replace("\r", " ", $str);
-			$str = str_replace("\n", " ", $str);
-
-			// set the length of content since we have changed it.
-			$this->size = strlen($str);
-		}
-
-		$this->doc = $str;
-		$this->pos = 0;
-		$this->cursor = 1;
-		$this->noise = array();
-		$this->nodes = array();
-		$this->lowercase = $lowercase;
-		$this->default_br_text = $defaultBRText;
-		$this->default_span_text = $defaultSpanText;
-		$this->root = new simple_html_dom_node($this);
-		$this->root->tag = 'root';
-		$this->root->_[HDOM_INFO_BEGIN] = -1;
-		$this->root->nodetype = HDOM_TYPE_ROOT;
-		$this->parent = $this->root;
-		if ($this->size>0) $this->char = $this->doc[0];
-	}
-
-	// parse html content
-	protected function parse()
-	{
-		if (($s = $this->copy_until_char('<'))==='')
-		{
-			return $this->read_tag();
-		}
-
-		// text
-		$node = new simple_html_dom_node($this);
-		++$this->cursor;
-		$node->_[HDOM_INFO_TEXT] = $s;
-		$this->link_nodes($node, false);
-		return true;
-	}
-
-	// PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later.
-	// NOTE:  IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE from the last curl_exec
-	// (or the content_type header from the last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism.
-	protected function parse_charset()
-	{
-		global $debug_object;
-
-		$charset = null;
-
-		if (function_exists('get_last_retrieve_url_contents_content_type'))
-		{
-			$contentTypeHeader = get_last_retrieve_url_contents_content_type();
-			$success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches);
-			if ($success)
-			{
-				$charset = $matches[1];
-				if (is_object($debug_object)) {$debug_object->debug_log(2, 'header content-type found charset of: ' . $charset);}
-			}
-
-		}
-
-		if (empty($charset))
-		{
-			$el = $this->root->find('meta[http-equiv=Content-Type]',0, true);
-			if (!empty($el))
-			{
-				$fullvalue = $el->content;
-				if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag found' . $fullvalue);}
-
-				if (!empty($fullvalue))
-				{
-					$success = preg_match('/charset=(.+)/i', $fullvalue, $matches);
-					if ($success)
-					{
-						$charset = $matches[1];
-					}
-					else
-					{
-						// If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1
-						if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');}
-						$charset = 'ISO-8859-1';
-					}
-				}
-			}
-		}
-
-		// If we couldn't find a charset above, then lets try to detect one based on the text we got...
-		if (empty($charset))
-		{
-			// Use this in case mb_detect_charset isn't installed/loaded on this machine.
-			$charset = false;
-			if (function_exists('mb_detect_encoding'))
-			{
-				// Have php try to detect the encoding from the text given to us.
-				$charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) );
-				if (is_object($debug_object)) {$debug_object->debug_log(2, 'mb_detect found: ' . $charset);}
-			}
-
-			// and if this doesn't work...  then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need...
-			if ($charset === false)
-			{
-				if (is_object($debug_object)) {$debug_object->debug_log(2, 'since mb_detect failed - using default of utf-8');}
-				$charset = 'UTF-8';
-			}
-		}
-
-		// Since CP1252 is a superset, if we get one of it's subsets, we want it instead.
-		if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1')))
-		{
-			if (is_object($debug_object)) {$debug_object->debug_log(2, 'replacing ' . $charset . ' with CP1252 as its a superset');}
-			$charset = 'CP1252';
-		}
-
-		if (is_object($debug_object)) {$debug_object->debug_log(1, 'EXIT - ' . $charset);}
-
-		return $this->_charset = $charset;
-	}
-
-	// read tag info
-	protected function read_tag()
-	{
-		if ($this->char!=='<')
-		{
-			$this->root->_[HDOM_INFO_END] = $this->cursor;
-			return false;
-		}
-		$begin_tag_pos = $this->pos;
-		$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-
-		// end tag
-		if ($this->char==='/')
-		{
-			$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-			// This represents the change in the simple_html_dom trunk from revision 180 to 181.
-			// $this->skip($this->token_blank_t);
-			$this->skip($this->token_blank);
-			$tag = $this->copy_until_char('>');
-
-			// skip attributes in end tag
-			if (($pos = strpos($tag, ' '))!==false)
-				$tag = substr($tag, 0, $pos);
-
-			$parent_lower = strtolower($this->parent->tag);
-			$tag_lower = strtolower($tag);
-
-			if ($parent_lower!==$tag_lower)
-			{
-				if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower]))
-				{
-					$this->parent->_[HDOM_INFO_END] = 0;
-					$org_parent = $this->parent;
-
-					while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
-						$this->parent = $this->parent->parent;
-
-					if (strtolower($this->parent->tag)!==$tag_lower) {
-						$this->parent = $org_parent; // restore origonal parent
-						if ($this->parent->parent) $this->parent = $this->parent->parent;
-						$this->parent->_[HDOM_INFO_END] = $this->cursor;
-						return $this->as_text_node($tag);
-					}
-				}
-				else if (($this->parent->parent) && isset($this->block_tags[$tag_lower]))
-				{
-					$this->parent->_[HDOM_INFO_END] = 0;
-					$org_parent = $this->parent;
-
-					while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)
-						$this->parent = $this->parent->parent;
-
-					if (strtolower($this->parent->tag)!==$tag_lower)
-					{
-						$this->parent = $org_parent; // restore origonal parent
-						$this->parent->_[HDOM_INFO_END] = $this->cursor;
-						return $this->as_text_node($tag);
-					}
-				}
-				else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower)
-				{
-					$this->parent->_[HDOM_INFO_END] = 0;
-					$this->parent = $this->parent->parent;
-				}
-				else
-					return $this->as_text_node($tag);
-			}
-
-			$this->parent->_[HDOM_INFO_END] = $this->cursor;
-			if ($this->parent->parent) $this->parent = $this->parent->parent;
-
-			$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-			return true;
-		}
-
-		$node = new simple_html_dom_node($this);
-		$node->_[HDOM_INFO_BEGIN] = $this->cursor;
-		++$this->cursor;
-		$tag = $this->copy_until($this->token_slash);
-		$node->tag_start = $begin_tag_pos;
-
-		// doctype, cdata & comments...
-		if (isset($tag[0]) && $tag[0]==='!') {
-			$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');
-
-			if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {
-				$node->nodetype = HDOM_TYPE_COMMENT;
-				$node->tag = 'comment';
-			} else {
-				$node->nodetype = HDOM_TYPE_UNKNOWN;
-				$node->tag = 'unknown';
-			}
-			if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
-			$this->link_nodes($node, true);
-			$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-			return true;
-		}
-
-		// text
-		if ($pos=strpos($tag, '<')!==false) {
-			$tag = '<' . substr($tag, 0, -1);
-			$node->_[HDOM_INFO_TEXT] = $tag;
-			$this->link_nodes($node, false);
-			$this->char = $this->doc[--$this->pos]; // prev
-			return true;
-		}
-
-		if (!preg_match("/^[\w-:]+$/", $tag)) {
-			$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');
-			if ($this->char==='<') {
-				$this->link_nodes($node, false);
-				return true;
-			}
-
-			if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';
-			$this->link_nodes($node, false);
-			$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-			return true;
-		}
-
-		// begin tag
-		$node->nodetype = HDOM_TYPE_ELEMENT;
-		$tag_lower = strtolower($tag);
-		$node->tag = ($this->lowercase) ? $tag_lower : $tag;
-
-		// handle optional closing tags
-		if (isset($this->optional_closing_tags[$tag_lower]) )
-		{
-			while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)]))
-			{
-				$this->parent->_[HDOM_INFO_END] = 0;
-				$this->parent = $this->parent->parent;
-			}
-			$node->parent = $this->parent;
-		}
-
-		$guard = 0; // prevent infinity loop
-		$space = array($this->copy_skip($this->token_blank), '', '');
-
-		// attributes
-		do
-		{
-			if ($this->char!==null && $space[0]==='')
-			{
-				break;
-			}
-			$name = $this->copy_until($this->token_equal);
-			if ($guard===$this->pos)
-			{
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				continue;
-			}
-			$guard = $this->pos;
-
-			// handle endless '<'
-			if ($this->pos>=$this->size-1 && $this->char!=='>') {
-				$node->nodetype = HDOM_TYPE_TEXT;
-				$node->_[HDOM_INFO_END] = 0;
-				$node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;
-				$node->tag = 'text';
-				$this->link_nodes($node, false);
-				return true;
-			}
-
-			// handle mismatch '<'
-			if ($this->doc[$this->pos-1]=='<') {
-				$node->nodetype = HDOM_TYPE_TEXT;
-				$node->tag = 'text';
-				$node->attr = array();
-				$node->_[HDOM_INFO_END] = 0;
-				$node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);
-				$this->pos -= 2;
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				$this->link_nodes($node, false);
-				return true;
-			}
-
-			if ($name!=='/' && $name!=='') {
-				$space[1] = $this->copy_skip($this->token_blank);
-				$name = $this->restore_noise($name);
-				if ($this->lowercase) $name = strtolower($name);
-				if ($this->char==='=') {
-					$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-					$this->parse_attr($node, $name, $space);
-				}
-				else {
-					//no value attr: nowrap, checked selected...
-					$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
-					$node->attr[$name] = true;
-					if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev
-				}
-				$node->_[HDOM_INFO_SPACE][] = $space;
-				$space = array($this->copy_skip($this->token_blank), '', '');
-			}
-			else
-				break;
-		} while ($this->char!=='>' && $this->char!=='/');
-
-		$this->link_nodes($node, true);
-		$node->_[HDOM_INFO_ENDSPACE] = $space[0];
-
-		// check self closing
-		if ($this->copy_until_char_escape('>')==='/')
-		{
-			$node->_[HDOM_INFO_ENDSPACE] .= '/';
-			$node->_[HDOM_INFO_END] = 0;
-		}
-		else
-		{
-			// reset parent
-			if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;
-		}
-		$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-
-		// If it's a BR tag, we need to set it's text to the default text.
-		// This way when we see it in plaintext, we can generate formatting that the user wants.
-		// since a br tag never has sub nodes, this works well.
-		if ($node->tag == "br")
-		{
-			$node->_[HDOM_INFO_INNER] = $this->default_br_text;
-		}
-
-		return true;
-	}
-
-	// parse attributes
-	protected function parse_attr($node, $name, &$space)
-	{
-		// Per sourceforge: http://sourceforge.net/tracker/?func=detail&aid=3061408&group_id=218559&atid=1044037
-		// If the attribute is already defined inside a tag, only pay atetntion to the first one as opposed to the last one.
-		if (isset($node->attr[$name]))
-		{
-			return;
-		}
-
-		$space[2] = $this->copy_skip($this->token_blank);
-		switch ($this->char) {
-			case '"':
-				$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				$node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				break;
-			case '\'':
-				$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				$node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\''));
-				$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-				break;
-			default:
-				$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;
-				$node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));
-		}
-		// PaperG: Attributes should not have \r or \n in them, that counts as html whitespace.
-		$node->attr[$name] = str_replace("\r", "", $node->attr[$name]);
-		$node->attr[$name] = str_replace("\n", "", $node->attr[$name]);
-		// PaperG: If this is a "class" selector, lets get rid of the preceeding and trailing space since some people leave it in the multi class case.
-		if ($name == "class") {
-			$node->attr[$name] = trim($node->attr[$name]);
-		}
-	}
-
-	// link node's parent
-	protected function link_nodes(&$node, $is_child)
-	{
-		$node->parent = $this->parent;
-		$this->parent->nodes[] = $node;
-		if ($is_child)
-		{
-			$this->parent->children[] = $node;
-		}
-	}
-
-	// as a text node
-	protected function as_text_node($tag)
-	{
-		$node = new simple_html_dom_node($this);
-		++$this->cursor;
-		$node->_[HDOM_INFO_TEXT] = '</' . $tag . '>';
-		$this->link_nodes($node, false);
-		$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-		return true;
-	}
-
-	protected function skip($chars)
-	{
-		$this->pos += strspn($this->doc, $chars, $this->pos);
-		$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-	}
-
-	protected function copy_skip($chars)
-	{
-		$pos = $this->pos;
-		$len = strspn($this->doc, $chars, $pos);
-		$this->pos += $len;
-		$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-		if ($len===0) return '';
-		return substr($this->doc, $pos, $len);
-	}
-
-	protected function copy_until($chars)
-	{
-		$pos = $this->pos;
-		$len = strcspn($this->doc, $chars, $pos);
-		$this->pos += $len;
-		$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next
-		return substr($this->doc, $pos, $len);
-	}
-
-	protected function copy_until_char($char)
-	{
-		if ($this->char===null) return '';
-
-		if (($pos = strpos($this->doc, $char, $this->pos))===false) {
-			$ret = substr($this->doc, $this->pos, $this->size-$this->pos);
-			$this->char = null;
-			$this->pos = $this->size;
-			return $ret;
-		}
-
-		if ($pos===$this->pos) return '';
-		$pos_old = $this->pos;
-		$this->char = $this->doc[$pos];
-		$this->pos = $pos;
-		return substr($this->doc, $pos_old, $pos-$pos_old);
-	}
-
-	protected function copy_until_char_escape($char)
-	{
-		if ($this->char===null) return '';
-
-		$start = $this->pos;
-		while (1)
-		{
-			if (($pos = strpos($this->doc, $char, $start))===false)
-			{
-				$ret = substr($this->doc, $this->pos, $this->size-$this->pos);
-				$this->char = null;
-				$this->pos = $this->size;
-				return $ret;
-			}
-
-			if ($pos===$this->pos) return '';
-
-			if ($this->doc[$pos-1]==='\\') {
-				$start = $pos+1;
-				continue;
-			}
-
-			$pos_old = $this->pos;
-			$this->char = $this->doc[$pos];
-			$this->pos = $pos;
-			return substr($this->doc, $pos_old, $pos-$pos_old);
-		}
-	}
-
-	// remove noise from html content
-	// save the noise in the $this->noise array.
-	protected function remove_noise($pattern, $remove_tag=false)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
-
-		$count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
-
-		for ($i=$count-1; $i>-1; --$i)
-		{
-			$key = '___noise___'.sprintf('% 5d', count($this->noise)+1000);
-			if (is_object($debug_object)) { $debug_object->debug_log(2, 'key is: ' . $key); }
-			$idx = ($remove_tag) ? 0 : 1;
-			$this->noise[$key] = $matches[$i][$idx][0];
-			$this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
-		}
-
-		// reset the length of content
-		$this->size = strlen($this->doc);
-		if ($this->size>0)
-		{
-			$this->char = $this->doc[0];
-		}
-	}
-
-	// restore noise to html content
-	function restore_noise($text)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
-
-		while (($pos=strpos($text, '___noise___'))!==false)
-		{
-			// Sometimes there is a broken piece of markup, and we don't GET the pos+11 etc... token which indicates a problem outside of us...
-			if (strlen($text) > $pos+15)
-			{
-				$key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13].$text[$pos+14].$text[$pos+15];
-				if (is_object($debug_object)) { $debug_object->debug_log(2, 'located key of: ' . $key); }
-
-				if (isset($this->noise[$key]))
-				{
-					$text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+16);
-				}
-				else
-				{
-					// do this to prevent an infinite loop.
-					$text = substr($text, 0, $pos).'UNDEFINED NOISE FOR KEY: '.$key . substr($text, $pos+16);
-				}
-			}
-			else
-			{
-				// There is no valid key being given back to us... We must get rid of the ___noise___ or we will have a problem.
-				$text = substr($text, 0, $pos).'NO NUMERIC NOISE KEY' . substr($text, $pos+11);
-			}
-		}
-		return $text;
-	}
-
-	// Sometimes we NEED one of the noise elements.
-	function search_noise($text)
-	{
-		global $debug_object;
-		if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
-
-		foreach($this->noise as $noiseElement)
-		{
-			if (strpos($noiseElement, $text)!==false)
-			{
-				return $noiseElement;
-			}
-		}
-	}
-	function __toString()
-	{
-		return $this->root->innertext();
-	}
-
-	function __get($name)
-	{
-		switch ($name)
-		{
-			case 'outertext':
-				return $this->root->innertext();
-			case 'innertext':
-				return $this->root->innertext();
-			case 'plaintext':
-				return $this->root->text();
-			case 'charset':
-				return $this->_charset;
-			case 'target_charset':
-				return $this->_target_charset;
-		}
-	}
-
-	// camel naming conventions
-	function childNodes($idx=-1) {return $this->root->childNodes($idx);}
-	function firstChild() {return $this->root->first_child();}
-	function lastChild() {return $this->root->last_child();}
-	function createElement($name, $value=null) {return @str_get_html("<$name>$value</$name>")->first_child();}
-	function createTextNode($value) {return @end(str_get_html($value)->nodes);}
-	function getElementById($id) {return $this->find("#$id", 0);}
-	function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
-	function getElementByTagName($name) {return $this->find($name, 0);}
-	function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}
-	function loadFile() {$args = func_get_args();$this->load_file($args);}
-}
-
-?>
\ No newline at end of file
diff --git a/panels/mensaPlan/tag.php b/panels/mensaPlan/tag.php
deleted file mode 100755
index 4bfc63ceae69d2a43475704343f93fc47396ce20..0000000000000000000000000000000000000000
--- a/panels/mensaPlan/tag.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-class TAG {
-	private $nr = 0;
-	private $name = 0;
-	private $gerichte = array ();
-	private $date = "";
-	function __construct($name, $date) {
-		$this->name = $name;
-		$this->date = $date;
-		switch ($name) {
-			case "montag" :
-				$this->nr = 1;
-				break;
-			case "dienstag" :
-				$this->nr = 2;
-				break;
-			case "mittwoch" :
-				$this->nr = 3;
-				break;
-			case "donnertag" :
-				$this->nr = 4;
-				break;
-			case "freitag" :
-				$this->nr = 5;
-				break;
-			case "samstag" :
-				$this->nr = 6;
-				break;
-			case "sonntag" :
-				$this->nr = 7;
-				breakM;
-		}
-	}
-	public function getNr() {
-		return $this->nr;
-	}
-	public function getName() {
-		return $this->name;
-	}
-	public function getGerichte() {
-		return $this->gerichte;
-	}
-	public function getDate() {
-		return $this->date;
-	}
-	public function setNr($nr) {
-		$this->nr = $nr;
-	}
-	public function setName($name) {
-		$this->name = $name;
-	}
-	public function setGerichte($gerichte) {
-		$this->gerichte = $gerichte;
-	}
-	public function setDate() {
-		$this->date = $date;
-	}
-	public function addGericht($gericht) {
-		array_push ( $this->gerichte, $gericht );
-	}
-	public function addGerichte($gerichte) {
-		foreach ( $gerichte as $gericht ) {
-			array_push ( $this->gerichte, $gericht );
-		}
-	}
-	public function toJson($inc_nr = true, $inc_original = true, $inc_short = true, $inc_art = true, $inc_kind = true, $inc_counter = true, $inc_stoffe = true, $inc_date = true) {
-		$kommata = false;
-		$json = '"' . $this->name . '":[';
-		foreach ( $this->gerichte as $gericht ) {
-			if ($kommata) {
-				$json .= ',';
-			} else {
-				$kommata = true;
-			}
-			$json .= $gericht->toJson ( $inc_nr,$inc_original, $inc_short, $inc_art, $inc_kind, $inc_counter, $inc_stoffe, $inc_date );
-		}
-		$json .= ']';
-		return $json;
-	}
-	public function __toString() {
-		$string = "Nr: " . $this->nr . ", Name: " . $this->name . ", Gerichte: ";
-		foreach ( $this->gerichte as $gericht ) {
-			$string .= $gericht;
-		}
-		$string .= ", Date: " . $this->date;
-		return $string;
-	}
-}
-?>
\ No newline at end of file
diff --git a/panels/mensaPlan/template.html b/panels/mensaPlan/template.html
index cae871626af3982e77d94ebd9b77961a9785f98f..ebfd6c2ca4b1cfa9a775946b11d842fd5320df33 100755
--- a/panels/mensaPlan/template.html
+++ b/panels/mensaPlan/template.html
@@ -4,6 +4,7 @@
 		<li><a href="#tab-1">Normale Counter</a></li>
 		<li><a href="#tab-2">Grill Counter</a></li>
 		<li><a href="#tab-3">Sonstige Counter</a></li>
+		<li><a href="#tab-4">Beilagen</a></li>
 	</ul>
 	<div id="tab-1">
 		<table id="mensaPlanTable1" style="width:100%;height:100%">
@@ -23,4 +24,10 @@
 			</tbody>
 		</table>
 	</div>
+	<div id="tab-4">
+		<table id="mensaPlanTable4" style="width:100%;height:100%">
+			<tbody id="mensaPlanTable4Body">
+			</tbody>
+		</table>
+	</div>
 </div>
diff --git a/panels/werbung/img/OpenSourceInfoscreen.jpg b/panels/werbung/img/OpenSourceInfoscreen.jpg
new file mode 100755
index 0000000000000000000000000000000000000000..7b7d5ed992b86e50ae5904a6150a5ee174332fd7
Binary files /dev/null and b/panels/werbung/img/OpenSourceInfoscreen.jpg differ
diff --git a/panels/werbung/script.js b/panels/werbung/script.js
index 2e98c0ede1d7fb55eb956150c9859f7fd78648e9..6f1beed5777be112c7829f512750be4408331ea1 100755
--- a/panels/werbung/script.js
+++ b/panels/werbung/script.js
@@ -2,15 +2,18 @@ var nextWerbung=0;
 var werbung_config = null;
 var werbung_img_display = null;
 var werbung_panel = null;
+
 this.loaded=function(panel,config) {
 	werbung_panel = panel;
-	werbung_config = config
+	werbung_config = config;
 }
 
 function setNextWerbung() {
 	if(nextWerbung+1<werbung_config.files.length) {
-		nextWerbung += 1; 
+		console.log("Werbung: SETNEXT - (" + nextWerbung + " + 1)");
+		nextWerbung += 1;
 	} else {
+		console.log("Werbung: SETNEXT - (0)");
 		nextWerbung = 0;
 	}
 }
@@ -26,23 +29,45 @@ this.resize=function() {
 this.hide = function() {
 }
 
-this.checkShowCondition = function() {
-	var werbungOriginalNext = nextWerbung;
-	var enddateEl = werbung_config.files[nextWerbung].enddate.split(".");
-	if(Date.now() <= Date.UTC(enddateEl[2], enddateEl[1], enddateEl[0])) {
-		return 20;
+function isOverDate(day, month, year){
+	console.log("DEBUG: input"+day +" "+ month+" "+year);
+
+
+	var d = new Date();
+	if((d.getFullYear() > year) || (d.getFullYear() == year && d.getMonth() > month) || (d.getFullYear() == year && d.getMonth() == month && d.getDate() > day)){
+		return true;
 	} else {
-		console.log("Werbung: Skipped - Out Of Date");
-		setNextWerbung()
+		return false;
 	}
-	while(nextWerbung != werbungOriginalNext){
-		enddateEl = werbung_config.files[nextWerbung].enddate.split(".");
-		if(Date.now() <= Date.UTC(enddateEl[2], enddateEl[1], enddateEl[0])) {
-			return 20;
+}
+
+this.checkShowCondition = function() {
+	var werbungOriginalNext = nextWerbung;
+	var firstNotDone = true
+	while(nextWerbung != werbungOriginalNext || firstNotDone){
+		if(werbung_config.files[nextWerbung].startdate == "NEVER") {
+			var skipStartTest = true;
+		} else {
+			var skipStartTest = false;
+		}
+		if(werbung_config.files[nextWerbung].enddate == "NEVER") {
+			var skipEndTest = true;
+		} else {
+			var skipEndTest = false;
+		}
+		if( skipStartTest || isOverDate(werbung_config.files[nextWerbung].startdate.split(".")[0], werbung_config.files[nextWerbung].startdate.split(".")[1], werbung_config.files[nextWerbung].startdate.split(".")[2])) { // did it start
+			if( skipEndTest || !isOverDate(werbung_config.files[nextWerbung].enddate.split(".")[0], werbung_config.files[nextWerbung].enddate.split(".")[1], werbung_config.files[nextWerbung].enddate.split(".")[2])) { // did it end
+				console.log("Werbung: CurrentWerbung = " + nextWerbung);
+				return 20;
+			} else {
+				console.log("Werbung: Skipped - Out Of Date - (" + nextWerbung + ")");
+				setNextWerbung();
+			}
 		} else {
-			console.log("Werbung: Skipped - Out Of Date");
-			setNextWerbung()
+			console.log("Werbung: Skipped - Not Started - (" + nextWerbung + ")");
+			setNextWerbung();
 		}
+		firstDone = false;
 	}
 	return 0;
 }
diff --git a/test b/test
old mode 100644
new mode 100755