function setSetting($name, $value, $theme = "")
{
	clearSettingsCache();
	
	$table = new mTable("settings");
	
	if (empty($theme))
		$theme = $_SESSION['murrix']['theme'];
			
	$settings = $table->get("`name`='$name' AND (`theme`='any' OR `theme`='$theme')");
	
	if (count($settings) > 0)
	{
		$settings[0]['value'] = $value;
		
		if (empty($value))
		{
			if (!$table->remove($settings[0]['id']))
				return $table->error;
			else
				return true;
		}
		else
		{
			if (!$table->update($settings[0]['id'], $settings[0]))
				return $table->error;
			else
				return true;
		}
	}
	else if (!empty($value))
	{
		$setting = array("name" => $name, "value" => $value, "theme" => $theme);
		
		if (!$table->insert($setting))
			return $table->error;
		else
			return true;
	}
	
	return ucf(i18n("no such setting"));
}
function getInitialMetadata()
{
	$table = new mTable("initial_meta");
	
	return $table->get();
}
	function remove()
	{
		return parent::remove($this->id);
	}
	function outputFeed($id)
	{
		$table = new mTable("rssexports");
		$feeds = $table->get("`id`='$id'");
		
		if (count($feeds) == 0)
		{
			echo "No such feed found";
			return;
		}
		
		$feed = $feeds[0];
		
		// An array of serializer options
		$serializer_options = array(	"addDecl" => true,
						"encoding" => "ISO-8859-1",
						"indent" => "  ",
						"rootName" => "rss",
						"rootAttributes"  => array("version" => "2"),
						"defaultTagName" => "item");
		
		// Instantiate the serializer with the options
		$Serializer = &new XML_Serializer($serializer_options);
		
		$children = fetch($feed['fetch']);
		
		$list = array();
		
		$list['channel']['title'] = $feed['title'];
		$list['channel']['link'] = "http://".$_SERVER["HTTP_HOST"];
		$list['channel']['description'] = $feed['description'];
		$list['channel']['language'] = "sv";
		$list['channel']['webMaster'] = $feed['admin'];
		
		foreach ($children as $child)
		{
			$object = array();
		
			$object['guid'] = $list['channel']['link']."/rssbackend.php?node_id=".$child->getNodeId();
			$object['title'] = $child->getName();
			$object['link'] = $list['channel']['link']."/rssbackend.php?node_id=".$child->getNodeId();
			$object['pubDate'] = date("r", strtotime($child->getCreated()));
			$author = $child->getUser();
			$object['author'] = "email@email.com (".$author->name.")";
			
			$text = $child->getVarValue("text");
			if (empty($text))
				$text = $child->getVarValue("description");
			
			$object['description'] = strip_tags($text);
		
			$list['channel'][] = $object;
		}
		
		// Serialize the data structure
		$status = $Serializer->serialize($list);
		
		// Check whether serialization worked
		if (PEAR::isError($status))
			die($status->getMessage());
		
		// Display the XML document
		header("Content-type: application/xml");
		echo $Serializer->getSerializedData();
	}
function getNodeIdTree($root_id)
{
	$node_ids = array($root_id);
	
	$table = new mTable("links");
	
	$links = $table->get("`type`='sub' AND `node_top`='$root_id'");
	
	foreach ($links as $link)
		$node_ids = array_merge($node_ids, getNodeIdTree($link['node_bottom']));
	
	return $node_ids;
}
	function execute(&$system, $args)
	{
		global $abspath, $wwwpath, $db_prefix;

		if ($args['action'] == "import" && isAdmin())
		{
			if (empty($args['node_id']))
			{
				$system->addAlert(ucf(i18n("you must specifiy a node")));
				return;
			}
			
			if (empty($args['file']))
			{
				$system->addAlert(ucf(i18n("you must upload a file to import")));
				return;
			}
			
			list($filename, $full_filename) = explode(":", $args['file']);
			
			ob_start();
			
			$xml = new mXml();
			
			echo ucf(i18n("log"))."<br/><hr/>";
			
			$data = "";
			
			$extension = pathinfo($filename, PATHINFO_EXTENSION);
			if ($extension == "bz2")
			{
				echo "Found bz2-compressed file.<br/>";
				$bz = bzopen($full_filename, "r");
				while (!feof($bz))
					$data .= bzread($bz, 4096);
				bzclose($bz);
			}
			else
			{
				echo "Found uncompressed file.<br/>";
				$bz = fopen($full_filename, "r");
				while (!feof($bz))
					$data .= fread($bz, 4096);
				fclose($bz);
			}
			
			$import_data = $xml->parseBackupXML($data);
			
			
			
			if (isset($import_data['verion']))
				echo "Version: ".$import_data['verion']."<br/>";
			
			if (isset($import_data['name']))
				echo "Created: ".$import_data['created']."<br/>";
			
			if (isset($import_data['name']))
				echo "Name: ".$import_data['name']."<br/>";
				
			if (isset($import_data['description']))
				echo "Description: ".$import_data['description']."<br/>";
			
			$this->imported_classes = array();
			$this->imported_nodes = array();
			$this->imported_links = array();
			
			//PrintPre($import_data['container']);
			
			foreach ($import_data['container'] as $container)
			{
				$xmldata = $container['xmldata'];
				unset($container['xmldata']);
				//PrintPre($container);
				//echo "<hr/>";
				switch ($xmldata)
				{
					case "node":
					$this->imported_nodes[] = $container;
					break;
					
					case "class":
					$this->imported_classes[] = $container;
					break;
					
					case "link":
					$this->imported_links[] = $container;
					break;
				}
			}
			
			$class_table = new mTable("classes");
			$vars_table = new mTable("vars");
			
			foreach ($this->imported_classes as $class)
			{
				echo "Checking database for existing class ".$class['name']."<br/>";
				
				$existing_class = $class_table->get("`name`='".$class['name']."'");
				
				if (count($existing_class) == 0)
				{
					echo "<span style=\"color:red\">No existing class named ".$class['name']." found</span><br/>";
					continue;
				}
				else
					echo "<span style=\"color:green\">Class named ".$class['name']." found, checking variables</span><br/>";
				
				$existing_vars = $vars_table->get("`class_name`='".$class['name']."'");
				
				foreach ($class['vars'] as $varname => $properties)
				{
					$found = false;
					foreach ($existing_vars as $existing_var)
					{
						if ($existing_var['name'] == $varname)
						{
							$found = true;
							break;
						}
					}
					
					if ($found)
						echo "<span style=\"color:green\">Found matching var named $varname, type ".$properties['type']."</span><br/>";
					else
						echo "<span style=\"color:red\">No matching var named $varname, type ".$properties['type']." found</span><br/>";
				}
			}
			
			$nodes_to_link = array();
			$id_conversion = array();
			$added_node_ids = array();
			$linked_node_ids = array();
			
			$node_table = new mTable("nodes");
			
			foreach ($this->imported_nodes as $container)
			{
				if (!isset($container['created']))
					$container['created'] = date("Y-m-d H:i:s");
							
				$node_id = $node_table->insert(array("created" => $container['created']));
				
				$node = new mObject();
				$node->node_id = $node_id;
				
				$id_conversion[$container['id']] = $node_id;
				$added_node_ids[] = $node_id;
				
				if (is_array($container['metadata']))
				{
					foreach ($container['metadata']['container'] as $metadata)
					{
						$node->setMeta($metadata['name'], $metadata['value']);
						echo "Created metadata name=".$metadata['name'].", value=".$metadata['value'].", node_id=".$node_id."<br/>";
					}
				}
				
				foreach ($container['objects'] as $objcontainer)
				{
					if (isset($objcontainer['xmldata']) && $objcontainer['xmldata'] == "object")
						$objects = array($objcontainer);
					else
						$objects = $objcontainer;
						
					usort(&$objects, array($this, "SortByVersion"));
					
					foreach ($objects as $object_array)
					{
						$object = new mObject();
						$object->setClassName($object_array['class_name']);
						$object->loadVars();
						
						if (!isset($object_array['created']))
							$object_array['created'] = date("Y-m-d H:i:s");
						
						$object->node_id = $node_id;
						$object->created = $object_array['created'];
						$object->version = $object_array['version'];
						$object->class_name = $object_array['class_name'];
						$object->name = $object_array['name'];
						$object->icon = $object_array['icon'];
						$object->language = $object_array['language'];
						
						if (isset($object_array['right']))
							$object->rights = $object_array['rights'];
						else
							$object->rights = "";
						
						if (isset($object_array['user']))
						{
							$user = new mUser();
							$user->setByUsername($object_array['user']);
							$object->user_id = $user->id;
						}
						else
							$object->user_id = $_SESSION['murrix']['user']->id;
						
						if (is_array($object_array['vars']))
						{
							foreach ($object_array['vars'] as $key => $value)
							{
								if ($object->checkVarExistance($key) == 0)
								{
									echo "<span style=\"color:red\">Could not resolve - $key, skipping<br/></span>";
									continue;
								}
								if (!is_array($value['value']))
									$value['value'] = html_entity_decode($value['value']);
									
								if ($value['type'] == "file")
								{
									$extension = strtolower(pathinfo($value['value'], PATHINFO_EXTENSION));
									$oldfile = $args['filepath']."/".$value['file_id'].".$extension";
									
									if (!file_exists($oldfile))
										echo "<span style=\"color:red\">Could not find file - $oldfile, skipping<br/></span>";
									else
										$object->setVarValue($key, $value['value'].":$oldfile");
								}
								else if ($value['type'] == "thumbnail")
								{
									if (!empty($value['thumb_id']))
									{
										$oldfile = $args['thumbpath']."/".$value['thumb_id'].".jpg";
										
										if (!file_exists($oldfile))
											echo "<span style=\"color:red\">Could not find thumbfile - $oldfile, skipping<br/></span>";
										else
											$object->setVarValue($key, $value['thumb_id'].".jpg:$oldfile");
									}
								}
								else
									$object->setVarValue($key, $value['value']);
							}
						}
						
						$object->save(true);
						guessObjectType($object);
						echo "Created object name=".$object->name.", node_id=$node_id, id=".$object->id.",version=".$object->version.",language=".$object->language."<br/>";
					}
				}
			}
			
			$link_table = new mTable("links");
			
			foreach ($this->imported_links as $container)
			{
				$link_array = array();
				$link_array['node_top'] = $id_conversion[$container['node_top']];
				$link_array['node_bottom'] = $id_conversion[$container['node_bottom']];
				$link_array['type'] = $container['type'];
				
				$link_table->insert($link_array);
				echo "Linked node_top=".$link_array['node_top']." to node_bottom=".$link_array['node_bottom'].", type=".$link_array['type']."<br/>";
				
				if ($link_array['type'] == "sub")
					$linked_node_ids[] = $id_conversion[$container['node_bottom']];
			}
			
			$added_node_ids = array_unique($added_node_ids);
			$linked_node_ids = array_unique($linked_node_ids);
			
			$node_ids_to_link = array_diff($added_node_ids, $linked_node_ids);
			
			foreach ($node_ids_to_link as $node_id)
			{
				$link_array = array();
				$link_array['node_top'] = $args['node_id'];
				$link_array['node_bottom'] = $node_id;
				$link_array['type'] = "sub";
				
				$link_table->insert($link_array);
				echo "Linked node_top=".$link_array['node_top']." to node_bottom=".$link_array['node_bottom'].", type=".$link_array['type']."<br/>";
			}
			
			//print_r($import_data);
			$system->setZoneData("zone_import_log", utf8e("<br/>".ob_get_end()));
			return;
		}
		
		$this->draw($system, $args);
	}