<?php
	trait AdmDispatcher {
		/*---------------------------
			The AdminDispatcher trait provides functions to pass
			manipulation requests on to child nodes.

			Classes using this trait must be inherited from Parentum!

			The "path" is definded a an enumeration of id numbers along
			the structural path, seperated by ";",
			
			eg.: 1;2;5;18
			This will try to return the node with the id "18" that is a child
			of "5", which is child of "2", which is child of "1". "1" in this
			case is the first instance that calls getElementByPath() without
			arguments.
		---------------------------*/

		function insertNode($n) {
			$n->setParent($this);
			$n->insert();
			$this->addChild($n);
		}

		function removeNode($id) {
			$res = $this->getChildDataByID($id);
			if($res != null) {
				$res->delete_me();
				$this->removeChild($id);
			}
		}

		function updateNode($id) { // PROBABLY USELESS!
			$res = $this->getChildDataByID($id);
			if($res != null) {
				$res->update();
			}
		}

		function getPathID($path = "") {
			if($path != "") {
				$path = ";".$path;
			}
			$path = $this->getID().$path;
			if($this->parent != null) {
				return $this->parent->getPathID($path);
			}

			return $path;
		}

		function getElementByPath($pid) {
			$tmp = explode(";",$pid);
			if($tmp[0] == $this->getID()) {
				if(sizeof($tmp) > 1) {
					$c = $this->getChildDataByID($tmp[1]);
					if($c != null) {
						unset($tmp[0]);
						return $c->getElementByPath(implode(";",$tmp));
					}
					return null;
				}
				else {
					return $this;
				}
			}
			return null;
		}
	}
?>