Index: !install.txt
===================================================================
--- !install.txt	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ !install.txt	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -1,115 +1,192 @@
-requirements:
--rtorrent 0.8.0, compiled with "--with-xmlrpc-c"
- -xmlrpc >= 1.07
--some webserver
--php5, with the following extensions:
- -xsl (libxslt1.1)
- -xmlrpc
+= Installation guide =
 
-installation:
+ * Prerequisites
+ * Installation
+ * Troubleshooting
 
-you might need the following packages: make, libcurl-openssl-dev, pkg-config, sigc++-2.0-dev, libncurses-dev
+== Prerequisites ==
 
-to install xmlrpc, get the source from here: http://sourceforge.net/project/showfiles.php?group_id=16847
-in my case, i could only compile the 1.11.00 version (due to a known bug, you may try to configure with --disable-cplusplus, if the compiling stops with some syntax error)
-of course, you can try any version, over 1.07 (or any version over 1.00, but you'll get incorrect data for values bigger than 2^31-1, since it does not support 64bit integers)
-follow the next steps, as root (this step is not needed, if you're upgrading from a pervious version):
-	cd /usr/src
-	wget http://dfn.dl.sourceforge.net/sourceforge/xmlrpc-c/xmlrpc-c-1.11.00.tgz
-	tar xvf xmlrpc-c-1.11.00.tgz
-	cd xmlrpc-c-1.11.00
-	./configure --disable-cplusplus
-	make
-	make install
+ * rTorrent 0.8.0
+  * compiled with "--with-xmlrpc-c"
+  * sigc++-2.0
+ * XMLRPC-C >= 1.00 ( >= 1.07 recommended)
+ * some webserver
+  * php5, with the following extensions:
+   * curl (when using an SCGI gateway)
+   * xml
+   * xsl (libxslt1.1)
+   * xmlrpc
 
-to install libtorrent, follow the next steps, as root:
-	mkdir /usr/src/libtorrent
-	wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.0.tar.gz
-	tar xvf libtorrent-0.12.0.tar.gz
-	cd /usr/src/libtorrent-0.12.0
-	./configure
-	make
-	make install
+== Installation ==
 
-to install rtorrent, follow the next steps, as root:
-	mkdir /usr/src/rtorrent
-	wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.0.tar.gz
-	tar xvf rtorrent-0.8.0.tar.gz
-	cd /usr/src/rtorrent-0.8.0
-	./configure --with-xmlrpc-c
-	make
-	make install
-	
--if you don't have a .rtorrent.rc file, create one into your home directory
--you can find an example .rtorrent.rc file here: http://libtorrent.rakshasa.no/browser/trunk/rtorrent/doc/rtorrent.rc?rev=latest
--open .rtorrent.rc, and edit them (for each user)
- -add this line to your .rtorrent.rc "scgi_port = 127.0.0.1:12345" where 12345 can be replaced by your choice, and restart rtorrent
- -if you have more than one user, set a different port for each user's .rtorrent.rc file (be aware, to set different session directories for the users)
- -set your download directory
- -make sure, you have your session directory set and it exists, so rtorrent can continue will remember your torrents after it's restarted
+ * rTorrent side
+  * Preparing the system
+  * Installing XMLRPC-C
+  * Installing libTorrent
+  * Installing rTorrent
+  * Setting up rTorrent
+ * rTWi side
+  * Installing rTWi
+  * Adding users
+  * GeoIP support (optional)
+
+=== rTorrent side ===
+
+==== Preparing the system ====
+
+You'll need the following packages to install xmlrpc-c, libtorrent and rtorrent
+ * make
+ * pkg-config
+ * sigc++-2.0-dev
+ * libncurses-dev
+ * libcurl-openssl-dev
+
+==== Installing XMLRPC-C ====
+
+To install xmlrpc, get the source from The XMLRPC-C page at http://sourceforge.net/project/showfiles.php?group_id=16847
+In my case, i could only compile the 1.11.00 version (due to a known bug, you may try to configure with --disable-cplusplus, if the compiling stops with some syntax error)
+Of course, you can try any version, over 1.07 (or any version over 1.00, but you'll get incorrect data for values bigger than 2^31^-1, since it does not support 64bit integers)
+
+Follow the next steps:
+
+cd /usr/src
+wget http://dfn.dl.sourceforge.net/sourceforge/xmlrpc-c/xmlrpc-c-1.11.00.tgz
+tar xvf xmlrpc-c-1.11.00.tgz
+cd xmlrpc-c-1.11.00
+./configure
+make
+make install
+
+
+==== Installing libTorrent ====
+
+To install libtorrent, follow the next steps:
+
+mkdir /usr/src/libtorrent
+wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.0.tar.gz
+tar xvf libtorrent-0.12.0.tar.gz
+cd /usr/src/libtorrent-0.12.0
+./configure
+make
+make install
+
+
+==== Installing rTorrent ====
+
+To install rtorrent, follow the next steps:
+
+mkdir /usr/src/rtorrent
+wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.0.tar.gz
+tar xvf rtorrent-0.8.0.tar.gz
+cd /usr/src/rtorrent-0.8.0
+./configure --with-xmlrpc-c
+make
+make install
+
+
+==== Setting up rTorrent ====
+
+If you don't have a .rtorrent.rc file, create one into your home directory.
+You can find an example .rtorrent.rc] file on the rTorrent page at http://libtorrent.rakshasa.no/browser/trunk/rtorrent/doc/rtorrent.rc?rev=latest
+Edit your .rtorrent.rc (create on into your home directory, if it's a fresh install):
+ * set up how rtorrent should listen for connections (there are 3 ways to do this)
+  * to use a unix socket, add the line ''scgi_local = ~/torrent/.socket/rpc.socket'' (this is the recommended way)
+  * to listen for connections from localhost on port 12345 add the line ''scgi_port = :12345''
+  * to listen for connections from a specific interface on port 12345 add the line ''scgi_port = 123.123.123.123:12345''
+ * if you have more than one user, set a different scgi_port/scgi_local value in each user's .rtorrent.rc file
+ * set your download directory ''directory = ~/torrent/''
+ * absolute paths are always welcome, however rTWi should handle relative paths, like above (if it does not, submit a ticket
+ * make sure, you have your session directory set and it exists, so rtorrent will remember your torrents after it's restarted ''session = ~/torrent/.session'' (be aware to set different session directories for the users)
  
-now, you can start rtorrent, and on the bottom, you should see something like this: "(20:55:52) XMLRPC initialized with 346 functions."
+Now, you can start rTorrent. On the bottom, you should see something like this:
 
-if everything went fine, extract the rtwi-xxxxxx.tar.gz to some place where your webserver can see it
-in case, it's your first install, open the freshly extracted includes/config.php.inc, and edit the next lines:
--$abs_path (the absolute path of your webroot, i.e.: "/var/www")
--$domain (your domain, i.e.: "example.com")
--$site_path (the relative path of the rtwi-xxxx directory, or whatever you renamed it, within your webroot, i.e.: "/rtwi/", if it's absolute path is /var/www/rtwi/)
--$include_path (if you move the includes directory, or eave it untouched, i.e.: "/includes")
--if your php interpreter does not handle .html files (only .php) set the $default_ext variable to "php", and rename the index.html to index.php
+(20:55:52) XMLRPC initialized with 356 functions.
 
-adding users:
- -find row 32, and change it:
- -replace "userX" with the actual linux username
- -replace "1234567890abcdef1234567890abcdef12345678" with the sha1 hash of the choosen password for the webui (you can generate the sha1 hash here => http://www.johnmaguire.us/tools/hashcalc/index.php)
- -replace "12345", with the port, you've set in the user's .rtorrent.rc file
- -keep the quotes in the last three steps
- -if you have more than one user, you have to repeat these steps, for each one of them, so you'll get something like this:
-	$users = array(
-		"user1"		=> array( "pass" => "1234567890abcdef1234567890abcdef12345678", "port"	=> "12345" ),
-		"user2"		=> array( "pass" => "1234567890abcdef1234567890abcdef12345678", "port"	=> "12346" ),
-		"user3"		=> array( "pass" => "1234567890abcdef1234567890abcdef12345678", "port"	=> "12347" ),
-	);
 
-troubleshooting:
+=== rTWi side ===
 
--xmlrpc 1.11 compilation stops with some syntax error
--try to configure with --disable-cplusplus
+==== Installing and setting up rTWi ====
 
--rtorrent compilation stops with an errer, which says, i have no libtorrent installed (No package 'libtorrent' found)
--find your libtorrent.pc file (try /usr/local/lib/pkgconfig), and set the PKG_CONFIG_PATH environmental variable to it's path (export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig)
+Download the latest rTWi at http://projects.cyla.homeip.net/rtwi/downloads/rtwi-latest.tar.gz and extract it to some place where your webserver can see it.
+Edit your configuration file (includes/rtwi.conf):
+ * set the ''base'' variable to your rTWi installation's URL (without index file, and with a trailing slash) ''base = "http://example.com/"''
+ * set the ''user_conf'' variable to the path of your user.conf file (it's always safe, to keep it outside your webroot)
+ * if your want to rename your index.php and/or input.php you need to set the ''index'' and/or ''input'' variable(s)
+ * If a value in the conf file contains any non-alphanumeric characters it needs to be enclosed in double-quotes (")
 
--rtorrent compilation stops with an error, which says, my libtorrent's version is an empty string (Requested 'libtorrent >= 0.11.8' but version of libtorrent is)
--upgrade you automake (you need 1.5+)
+==== Adding users ====
 
--i can see the php code in the browser
--you php settings does not allows you to to have a php file named .html - change these settings, or rename the index.html to index.php, and set the $default_ext variable to "php" in rtwi's /includes/config.inc.php
--php modul is not loaded by the webserver, take a look at your webserver's manual, to find out, how to enable it
+Edit your users.conf file:
+ * create a new section for every user ''[user1]'' (this will be your login name - this must be the *nix username)
+ * set the address rTWi can connect to the user's rTorrent (there are 3 ways to do it)
+  * if you're using a unix socket enter ''address = "!unix://~/torrent/.socket/rpc.socket"''
+  * if you're using scgi_port enter ''address = "123.123.123.123:12345"'' (''address = ":12345"'' works for localhost)
+  * if you're using an SCGI gateway enter ''address = "!http://example.com/RPC2"'' (also works when Basic HTTP Authentication is on for the URL)
+ * enter ''pass = "1234567890abcdef1234567890abcdef12345678"'' where the right side is the sha1 hash of the choosen password for the user (you can generate the sha1 hash online at http://www.johnmaguire.us/tools/hashcalc/index.php)
+ * if a value in the conf file contains any non-alphanumeric characters it needs to be enclosed in double-quotes (")
+ * if you have more than one user, you have to repeat these steps for each one of them, so you'll get something like this:
 
--i get some php errors about xsl...
--install (or if it's installed, than enable) the xsl php extension
+[user1]
+address =  "unix://~/torrent/.socket/rpc.socket"
+pass =     "1234567890abcdef1234567890abcdef12345678"
 
--i get some php errors about xmlrpc...
--install (or if it's installed, than enable) the xmlrpc php extension
+[user2]
+address =  "123.123.123.123:12345"
+pass =     "1234567890abcdef1234567890abcdef12345678"
 
--i've set my username and my password in the config.inc.php, ut i cannot log in
--did you use the password?> you need to use the password's sha1 hash (you can generate one here =>you can generate the sha1 hash here => http://www.johnmaguire.us/tools/hashcalc/index.php)
--enable cookies (or at least session cookies)
+[user3]
+address =  "http://example.com/RPC2"
+pass =     "1234567890abcdef1234567890abcdef12345678"
 
--i get the "No connection" message in rtwi
--set the same port in your .rtorrent.rc file, at the scgi_port=, and in the rtwi's /includes/config.inc.php at your user's line
--check, if rtottent is listening on the port, you've set (netstat -na | grep 12345)
- -if it is
-  -check your firewall
-  -recheck the port set in rtwi's incudes/config.inc.php
- -if it is not
-  -recheck your .rtorrent.rc - it should have a line like this: scgi_port = 127.0.0.1:12345
-  -try to set the scgi port in runtime (ctrl+x, then entre "scgi_port = 127.0.0.1:12345")
-   -if rtorrent stops with an error, that says xmlrpc is not supported, configure xmlrpc-c with --with-xmlrpc-c, and recompile
 
--the add torrent menu does not work (at all - it shows me an empty page)
--your download directory should be in your home directory
+==== GeoIP support (optional) ====
 
-bug reports, whishlist, suggestions, anything: ghudiczius@gmail.com
+You need to install the GeoIP c library (http://www.maxmind.com/app/c), and the GeoIP PECL module (http://pecl.php.net/package/geoip)
+You'll need the following packages to to add GeoIP support to rTWi
+ * libgeoip-dev
+ * php-pear
+ * php5-dev
 
-p.s.: sorry, for the lot's of typo, this loosy manual, and my even worse english :)
+If you have the packages installed, type
+
+pecl install geoip
+
+
+After you finished, you might want to add "extension=geoip.so" to php.ini
+
+== Troubleshooting ==
+
+XMLRPC-C 1.11 compilation stops with some syntax error
+ * Configure with --disable-cplusplus
+ * Check the XMLRPC-C site at http://xmlrpc-c.sourceforge.net/ 
+
+rTorrent compilation stops with an errer, which says, i have no libtorrent installed (No package 'libtorrent' found), but i'm sure, i do
+ * Find your libtorrent.pc file (try /usr/local/lib/pkgconfig), and set the PKG_CONFIG_PATH environmental variable to it's path (export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig)
+
+rTorrent compilation stops with an error, which says, my libTorrent's version is an empty string (Requested 'libtorrent >= 0.11.8' but version of libtorrent is )
+ * Upgrade you automake (you need 1.5 at least)
+
+I can see the php code in the browser
+ * Your php settings does not allows you to to have a php file named .html - change these settings, or rename the index.html to index.php, and set the $default_ext variable to "php" in rtwi's /includes/config.inc.php
+ * Php modul is not loaded by the webserver, take a look at your webserver's manual, to find out, how to enable it
+
+I get some php errors about XSL, or XSLT...
+ * Install (or if it's installed, than enable) the xsl php extension
+
+I get some php errors about XMLRPC-C...
+ * Install (or if it's installed, than enable) the xmlrpc php extension
+
+I've set my username and my password in the config.inc.php, but i cannot log in
+ * Did you use the password? You should use the sha1 hash of the password (you can generate the sha1 hash online at http://www.johnmaguire.us/tools/hashcalc/index.php)
+ * Enable cookies (or at least session cookies)
+
+I get the "No connection" message in rTWi
+ * Set the same port in your .rtorrent.rc file, at the scgi_port=, and in the rTWi's /includes/config.inc.php at your user's line
+ * Check, if rTottent is listening on the port, you've set (netstat -na | grep 12345)
+  It is
+   * Check your firewall
+   * Recheck the port set in rtwi's incudes/config.inc.php
+  It is not
+   * Recheck your .rtorrent.rc - it should have a line like this: scgi_port = 127.0.0.1:12345
+   * Try to set the scgi port in runtime (Ctrl+X, then entre "scgi_port = 127.0.0.1:12345")
+   * If rtorrent stops with an error, that says xmlrpc is not supported, configure xmlrpc-c with --with-xmlrpc-c, and recompile
Index: includes/classes/bittorrent_handler.inc.php
===================================================================
--- includes/classes/bittorrent_handler.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/classes/bittorrent_handler.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: includes/classes/xmlrpc_handler.inc.php
===================================================================
--- includes/classes/xmlrpc_handler.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/classes/xmlrpc_handler.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -2,5 +2,5 @@
 
 class xmlrpc_handler {
-	var $socket;
+	var $conntype;
 	var $host;
 	var $port;
@@ -12,13 +12,67 @@
 	var $times;
 	var $mtimes;
-
-	function __construct( $xmlrpc_array ) {
-		if ( isset( $xmlrpc_array["socket"] ) ) {
-			$this->socket	= $xmlrpc_array["socket"];
+	var $user;
+	var $password;
+
+	function __construct( $address, $timeout ) {
+		if ( preg_match( "|^unix://(.+)$|", $address, $match ) ) {
+			$this->conntype = "socket";
+			$this->host = $match[1];
+			$this->port = 0;
+			if ( ( $perms = @fileperms( $this->host ) ) === false ) {
+				$this->conntype = "";
+				$this->host = "";
+			} else {
+				if ( ( fileperms( $this->host ) & 0xC000 ) !== 0xC000 ) {
+					$this->conntype = "";
+					$this->host = "";
+				} elseif ( !is_writable( $this->host ) ) {
+					$this->conntype = "";
+					$this->host = "";
+				} else {
+					$this->host = $match[0];
+				}
+			}
+		} elseif ( preg_match( "<^(http|https)://(.*)$>", $address, $match ) ) {
+			$this->conntype = "http";
+			$this->host = $match[0];
+			$this->port = 0;
+		} elseif ( preg_match( "|^:(\d{1,5})$|", $address, $match ) ) {
+			$this->conntype = "localport";
+			$this->port = $match[1];
+			settype( $this->port, "int" );
+			if ( $this->port < 1 || $this->port > 65535 ) {
+				$this->conntype = "";
+				$this->host = "";
+				$this->port = 0;
+			} else {
+				$this->host = "127.0.0.1";
+			}
+		} elseif ( preg_match( "|^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d{1,5})$|", $address, $match ) ) {
+			$this->conntype = "port";
+			$this->host = "{$match[1]}.{$match[2]}.{$match[3]}.{$match[4]}";
+			$this->port = $match[5];
+			settype( $this->port, "int" );
+			if ( ip2long( $this->host ) === false ) {
+				$this->conntype = "";
+				$this->host = "";
+				$this->port = 0;
+			} elseif ( $this->host != long2ip( ip2long( $this->host ) ) ) {
+				$this->conntype = "";
+				$this->host = "";
+				$this->port = 0;
+			}
+			if ( $this->port < 1 || $this->port > 65535 ) {
+				$this->conntype = "";
+				$this->host = "";
+				$this->port = 0;
+			}
 		} else {
-			$this->host		= $xmlrpc_array["host"];
-			$this->port		= $xmlrpc_array["port"];
-		}
-		$this->timeout	= $xmlrpc_array["timeout"];
+			$this->conntype = "";
+			$this->host = "";
+			$this->port = 0;
+		}
+
+		$this->timeout	= $timeout;
 		$this->request	= null;
 		$this->response	= null;
@@ -27,4 +81,13 @@
 	}
 
+	function getconntype() {
+		return $this->conntype;
+	}
+
+	function setaccount( $user, $password ) {
+		$this->user = $user;
+		$this->password = $password;
+	}
+
 	function setmrequest( $methods, $params = array() ) {
 		$this->request = array();
@@ -35,9 +98,18 @@
 	}
 
+	function setumrequest( $methods, $params ) {
+		$this->request = array();
+		$num = count( $methods );
+		for ( $i = 0; $i < $num; $i++ ) {
+			$this->request[] = array( "methodName" => $methods[$i], "params" => $params[$i] );
+		}
+		$this->request = xmlrpc_encode_request( "system.multicall", array( $this->request ) );
+	}
+
 	function setrequest( $method, $attributes ) {
 		$this->request = xmlrpc_encode_request( $method, $attributes );
 	}
 
-	function call() {
+	function scgi_call() {
 		$st = getmicrotime();
 
@@ -48,9 +120,5 @@
 		$out = "{$len}:{$headers},{$this->request}";
 
-		if ( isset( $this->socket ) ) {
-			$fp = fsockopen( "unix://{$this->socket}", $this->port, $errno, $errstr, $this->timeout );
-		} else {
-			$fp = fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );
-		}
+		$fp = fsockopen( $this->host, $this->port, $errno, $errstr, $this->timeout );
 		if ( $fp ) {
 			fwrite( $fp, $out );
@@ -78,4 +146,54 @@
 
 			return false;
+		}
+	}
+
+	function gw_call() {
+		$st = getmicrotime();
+
+		$len = strlen( $this->request );
+		$headers = "CONTENT_LENGTH\0{$len}\0";
+		$headers .= "SCGI\01\0";
+		$len = strlen( $headers );
+		$out = "{$len}:{$headers},{$this->request}";
+
+		$ch = curl_init( $this->host );
+		//curl_setopt( $ch, CURLOPT_HEADER, true );
+		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
+		curl_setopt( $ch, CURLOPT_POST, true );
+		curl_setopt( $ch, CURLOPT_POSTFIELDS, $this->request );
+		curl_setopt( $ch, CURLOPT_USERPWD, "{$this->user}:{$this->password}" );
+		$this->response = curl_exec( $ch ); 
+		$tt = getmicrotime();
+		$this->calls++;
+		$this->times = $this->times + $tt - $st;
+
+		return true;
+	}
+
+	function call(){
+		switch ( $this->conntype ) {
+			case "" : {
+				return false;
+
+				break;
+			}
+			case "http" : {
+				return $this->gw_call();
+
+				break;
+			}
+			case "port" :
+			case "localport" :
+			case "socket" : {
+				return $this->scgi_call();
+
+				break;
+			}
+			default : {
+				return false;
+
+				break;
+			}
 		}
 	}
Index: includes/classes/xsl_handler.inc.php
===================================================================
--- includes/classes/xsl_handler.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/classes/xsl_handler.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: cludes/config.inc.php.sample
===================================================================
--- includes/config.inc.php.sample	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ 	(revision )
@@ -1,76 +1,0 @@
-<?php
-
-/*******************************
-* path settings
-*******************************/
-
-// URLs
-$url["base"]	= "http://rtwi.cyla.homelinux.net/";	// base url
-$url["index"]	= "index.html";				// index page
-$url["input"]	= "input.php";				// input file (for forms)
-$url["full"]	= "{$url["base"]}/{$url["index"]}";	// absolute url of the index page
-
-/*******************************
-* xmlrpc settings
-*******************************/
-
-$xmlrpc_array = array(
-	"host"		=> "127.0.0.1",	// ip address of rtorrent
-	"port"		=> 0,		// scgi port - we will set this depending on the user's settings
-	"timeout"	=> 10,		// connection timeout
-);
-
-/*******************************
-* user settings
-*******************************/
-
-// home directories (with heading and trailing slash)
-$home_path = "/home/";
-
-// array of users, each, with the sha1 hash of the password, and the scgi port of the rtorrent -- you can add users here
-$users = array(
-	"user1"	=> array( "pass" => "7e240de74fb1ed08fa08d38063f6a6a91462a815", "port"	=> "36100" ),
-);
-
-/*******************************
-* other settings
-*******************************/
-
-// do a directory tree - set to "false" (witouth the quotes), if your webserver is running on a slow machine, and you have torrents with a lots of files (a few hundreds)
-$config["dodirtree"] = true;
-
-// true if ajax is allowed
-$config["allow"]["ajax"] = true;
-
-// true if dht is enabled
-$config["allow"]["dht"] = false;
-
-// true if users are allowed to download finished files from the webui
-$config["allow"]["download"] = true;
-
-// true if users are allowed to erase downloaded data from the webui
-$config["allow"]["erase"] = true;
-
-// true if hiding the filelist is allowed
-$config["allow"]["hidedirtree"] = true;
-
-// true if users are allowed to set the language of the web interface
-$config["allow"]["language"] = true;
-
-// true if users are allowed to set a meta-refresh interval
-$config["allow"]["refresh"] = true;
-
-// true if users are allowed to set throttle
-$config["allow"]["throttle"] = true;
-
-/*******************************
-* theme and lingual settings
-*******************************/
-
-// language (only english is available atm)
-$lang = "en";
-
-// site theme (look for themes in the "themes" directory)
-$site_theme = "default_ajax";
-
-?>
Index: includes/messages.en.inc.php
===================================================================
--- includes/messages.en.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/messages.en.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -74,4 +74,5 @@
 	"downloadnotallowed"			=> "You are not allowed to download torrents from the webui",
 	"erasenotallowed"			=> "You are not allowed to erase downloaded data from the webui",
+	"languagenotallowed"			=> "You are not allowed to set the language of the page",
 	"refreshnotallowed"			=> "You are not allowed to set a meta-refresh interval",
 	"throttlenotallowed"			=> "You are not allowed to set throttle",
@@ -130,4 +131,6 @@
 	"ip_0000"				=> "Not set",
 	"proxy_address_0000"			=> "Not set",
+
+	"unknown"				=> "Unknown",
 );
 
@@ -161,8 +164,8 @@
 $label = array(
 	// html head
-	"title"					=> "rTWi - The rTorrent Web interface",
-	"description"				=> "rTWi - The rTorrent Web interface",
+	"title"					=> "rTWi - an rTorrent Web interface",
+	"description"				=> "rTWi - an rTorrent Web interface",
 	"author"				=> "Gabor Hudiczius",
-	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - The rTorrent Web interface",
+	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - an rTorrent Web interface",
 
 	// login
Index: includes/messages.hu.inc.php
===================================================================
--- includes/messages.hu.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/messages.hu.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -74,4 +74,5 @@
 	"downloadnotallowed"			=> "Nem vagy jogosult torrentek letöltésére a web-es felületről",
 	"erasenotallowed"			=> "Nem vagy jogosult torrentek törlésére a web-es felületen",
+	"languagenotallowed"			=> "Nem vagy jogosult nyelv beállítására",
 	"refreshnotallowed"			=> "Nem vagy jogosult frissítés beállítására",
 	"throttlenotallowed"			=> "Nem vagy jogosult sebességkorlát beállítására",
@@ -130,4 +131,6 @@
 	"ip_0000"				=> "Nincs beállítva",
 	"proxy_address_0000"			=> "Nincs beállítva",
+
+	"unknown"				=> "Ismeretlen",
 );
 
@@ -161,8 +164,8 @@
 $label = array(
 	// html head
-	"title"					=> "rTWi - Az rTorrent Web interfész",
-	"description"				=> "rTWi - Az rTorrent Web interfész",
+	"title"					=> "rTWi - egy rTorrent Web interfész",
+	"description"				=> "rTWi - egy rTorrent Web interfész",
 	"author"				=> "Hudiczius Gábor",
-	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - Az rTorrent Web interfész",
+	"mailto"				=> "ghudiczius@gmail.com?subject=rTWi - egy rTorrent Web interfész",
 
 	// login
Index: includes/rtwi.conf.sample
===================================================================
--- includes/rtwi.conf.sample	(revision b804c919f8493f5a45f01334128a0f17daad4565)
+++ includes/rtwi.conf.sample	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -0,0 +1,54 @@
+; full url of the rTWi (with a trailing slash)
+base =		http://example.com/
+
+; change, if you've renamed the index.html file
+index =		index.php
+
+; change, if you've renamed the input.php file
+input =		input.php
+
+; path to home directory of users (with heading and trailing slash)
+home_path =	/home/
+
+; path to the file which keeps the user related informations
+user_conf =	/etc/rtorrent/users.conf
+
+; language (english and hungarian is available)
+lang =		en
+
+; site theme (look for themes in the "themes" directory)
+site_theme = 	default_ajax
+
+; do a directory tree, which can be expanded/collapsed
+; set to "false" (without the quotes),
+; if your webserver is running on a slow machine
+; and you have torrents with a lots of files
+; (a few hundreds of files in a single torrent, and more)
+dodirtree =	true
+
+; true if ajax is allowed
+ajax =		true
+
+; true if dht is enabled
+dht =		true
+
+; true if users are allowed to download finished files from the webui
+download =	true
+
+; true if users are allowed to erase downloaded data from the webui
+erase =		true
+
+; true if flags are allowed in peers page
+flags =		false
+
+; true if hiding the filelist is allowed
+hidedirtree =	true
+
+; true if users are allowed to set the language of the web interface
+language =	true
+
+; true if users are allowed to set a meta-refresh interval
+refresh =	true
+
+; true if users are allowed to set throttle
+throttle =	true
Index: includes/tools/functions.time.inc.php
===================================================================
--- includes/tools/functions.time.inc.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ includes/tools/functions.time.inc.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: includes/users.conf.sample
===================================================================
--- includes/users.conf.sample	(revision b804c919f8493f5a45f01334128a0f17daad4565)
+++ includes/users.conf.sample	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -0,0 +1,15 @@
+[user1]
+address =	unix:///home/user1/rpc.socket
+pass =		7e240de74fb1ed08fa08d38063f6a6a91462a815
+
+[user1]
+address =	http://example.com/RPC2
+pass =		7e240de74fb1ed08fa08d38063f6a6a91462a815
+
+[user1]
+address =	:12345
+pass =		7e240de74fb1ed08fa08d38063f6a6a91462a815
+
+[user1]
+address =	123.123.123.123:123456
+pass =		7e240de74fb1ed08fa08d38063f6a6a91462a815
Index: dex.html
===================================================================
--- index.html	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ 	(revision )
@@ -1,1071 +1,0 @@
-<?php
-
-function make_abs_path( &$rel_path, &$cwd, $home ) {
-	if ( substr( $rel_path, 0, 2 ) == "./" ) {
-		$ret = substr( $rel_path, 2 );
-		$ret = "{$cwd}/{$ret}";
-	} elseif ( substr( $rel_path, 0, 2 ) == "~/" ) {
-		$ret = substr( $rel_path, 2 );
-		$ret = "{$home}/{$ret}";
-	} else {
-		$ret = $rel_path;
-	}
-	$ret = str_replace( "//", "/", $ret );
-	return $ret;
-}
-
-function switch_bytes( $bytes, $d_suffix = "" ) {
-	switch ( $d_suffix ) {
-		case "GB" : {
-			$ret = $bytes / 1024 / 1024 / 1024;
-			$suffix = "GB";
-			break;
-		}
-		case "MB" : {
-			$ret = $bytes / 1024 / 1024;
-			$suffix = "MB";
-			break;
-		}
-		case "KB" : {
-			$ret = $bytes / 1024;
-			$suffix = "KB";
-			break;
-		}
-		default : {
-			if ( $bytes >= 1024 * 1024 * 1024 ) {
-				$ret = $bytes / 1024 / 1024 / 1024;
-				$suffix = "GB";
-			} elseif ( $bytes >= 1024 * 1024 ) {
-				$ret = $bytes / 1024 / 1024;
-				$suffix = "MB";
-			} elseif ( $bytes >= 1024 ) {
-				$ret = $bytes / 1024;
-				$suffix = "KB";
-			} else {
-				$ret = $bytes;
-				$suffix = "B";
-			}
-		}
-	}
-
-	return array( $ret, $suffix );
-}
-
-function prepare_si_responses( &$responses, &$message, &$home_path, &$config = array() ) {
-	$bytes_down_arr = switch_bytes( $responses["bytes_down"] );
-	$bytes_up_arr = switch_bytes( $responses["bytes_up"] );
-	$download_rate_arr = switch_bytes( $responses["download_rate"], "KB" );
-	$hash_read_ahead_arr = switch_bytes( $responses["hash_read_ahead"] );
-	$max_memory_usage_arr = switch_bytes( $responses["max_memory_usage"] );
-	$memory_usage_arr = switch_bytes( $responses["memory_usage"] );
-	$preload_min_size_arr = switch_bytes( $responses["preload_min_size"] );
-	$preload_required_rate_arr = switch_bytes( $responses["preload_required_rate"] );
-	$receive_buffer_size_arr = switch_bytes( $responses["receive_buffer_size"] );
-	$send_buffer_size_arr = switch_bytes( $responses["send_buffer_size"] );
-	$upload_rate_arr = switch_bytes( $responses["upload_rate"], "KB" );
-
-	$responses["bytes_down_value"] = sprintf( "%.1f", $bytes_down_arr[0] );
-	$responses["bytes_down_suffix"] = $bytes_down_arr[1];
-	$responses["bytes_up_value"] = sprintf( "%.1f", $bytes_up_arr[0] );
-	$responses["bytes_up_suffix"] = $bytes_up_arr[1];
-	$responses["download_rate_value"] = sprintf( "%.0f", $download_rate_arr[0] );
-	$responses["download_rate_suffix"] = $download_rate_arr[1];
-	$responses["hash_read_ahead_value"] = sprintf( "%.1f", $hash_read_ahead_arr[0] );
-	$responses["hash_read_ahead_suffix"] = $hash_read_ahead_arr[1];
-	$responses["max_memory_usage_value"] = sprintf( "%.1f", $max_memory_usage_arr[0] );
-	$responses["max_memory_usage_suffix"] = $max_memory_usage_arr[1];
-	$responses["memory_usage_value"] = sprintf( "%.1f", $memory_usage_arr[0] );
-	$responses["memory_usage_suffix"] = $memory_usage_arr[1];
-	$responses["preload_min_size_value"] = sprintf( "%.1f", $preload_min_size_arr[0] );
-	$responses["preload_min_size_suffix"] = $preload_min_size_arr[1];
-	$responses["preload_required_rate_value"] = sprintf( "%.1f", $preload_required_rate_arr[0] );
-	$responses["preload_required_rate_suffix"] = $preload_required_rate_arr[1];
-	$responses["receive_buffer_size_value"] = sprintf( "%.1f", $receive_buffer_size_arr[0] );
-	$responses["receive_buffer_size_suffix"] = $receive_buffer_size_arr[1];
-	$responses["send_buffer_size_value"] = sprintf( "%.1f", $send_buffer_size_arr[0] );
-	$responses["send_buffer_size_suffix"] = $send_buffer_size_arr[1];
-	$responses["upload_rate_value"] = sprintf( "%.0f", $upload_rate_arr[0] );
-	$responses["upload_rate_suffix"] = $upload_rate_arr[1];
-
-	$responses["check_hash_value"] = $responses["check_hash"] == 0 ? $message["no"] : $message["yes"];
-	$responses["handshake_log_value"] = $responses["handshake_log"] == 0 ? $message["no"] : $message["yes"];
-	$responses["safe_sync_value"] = $responses["safe_sync"] == 0 ? $message["no"] : $message["yes"];
-	$responses["use_udp_trackers_value"] = $responses["use_udp_trackers"] == 0 ? $message["no"] : $message["yes"];
-
-	$responses["bind_value"] = $responses["bind"] == "0.0.0.0" ? $message["bind_0000"] : $responses["bind"];
-	$responses["ip_value"] = $responses["ip"] == "0.0.0.0" ? $message["ip_0000"] : $responses["ip"];
-	$responses["max_peers_value"] = $responses["max_peers"] == -1 ? $message["disabled"] : $responses["max_peers"];
-	$responses["max_peers_seed_value"] = $responses["max_peers_seed"] == -1 ? $message["disabled"] : $responses["max_peers_seed"];
-	$responses["max_uploads_value"] = $responses["max_uploads"] == -1 ? $message["disabled"] : $responses["max_uploads"];
-	$responses["min_peers_value"] = $responses["min_peers"] == -1 ? $message["disabled"] : $responses["min_peers"];
-	$responses["min_peers_seed_value"] = $responses["min_peers_seed"] == -1 ? $message["disabled"] : $responses["min_peers_seed"];
-	$responses["port_open_value"] = $responses["port_open"] == -1 ? $message["no"] : $message["yes"];
-	$responses["port_random_value"] = $responses["port_random"] == -1 ? $message["no"] : $message["yes"];
-	$responses["port_range_value"] = $responses["port_range"] == -1 ? $message["disabled"] : $responses["port_range"];
-	$responses["proxy_address_value"] = $responses["proxy_address"] == "0.0.0.0" ? $message["proxy_address_0000"] : $responses["proxy_address"];
-	$responses["tracker_numwant_value"] = $responses["tracker_numwant"] == -1 ? $message["disabled"] : $responses["tracker_numwant"];
-
-	$responses["directory_value"] = make_abs_path( $responses["directory"], $responses["get_cwd"], "{$home_path}{$_SESSION["rtwi_nick"]}" );
-	$responses["session_value"] = make_abs_path( $responses["session"], $responses["get_cwd"], "{$home_path}{$_SESSION["rtwi_nick"]}" );
-
-	if ( $responses["max_file_size"] == -1 ) {
-		$responses["max_file_size_value"] = $message["disabled"];
-	} else {
-		$max_file_size_arr = switch_bytes( $responses["max_file_size"] );
-		$responses["max_file_size_value"] = sprintf( "%.1f", $max_file_size_arr[0] );
-		$responses["max_file_size_suffix"] = $max_file_size_arr[1];
-	}
-
-	if ( $responses["split_file_size"] == -1 ) {
-		$responses["split_file_size_value"] = $message["disabled"];
-	} else {
-		$split_file_size_arr = switch_bytes( $responses["split_file_size"] );
-		$responses["split_file_size_value"] = sprintf( "%.1f", $split_file_size_arr[0] );
-		$responses["split_file_size_suffix"] = $split_file_size_arr[1];
-	}
-
-	if ( $config["allow"]["dht"] == true ) {
-		if ( $responses["dht_statistics_active"] != 0 ) {
-			$dht_statistics_bytes_read_arr = switch_bytes( $responses["dht_statistics_bytes_read"] );
-			$dht_statistics_bytes_written_arr = switch_bytes( $responses["dht_statistics_bytes_written"] );
-
-			$responses["dht_statistics_bytes_read_value"] = sprintf( "%.1f", $dht_statistics_bytes_read_arr[0] );
-			$responses["dht_statistics_bytes_read_suffix"] = $bytes_up_arr[1];
-			$responses["dht_statistics_bytes_written_value"] = sprintf( "%.1f", $dht_statistics_bytes_written_arr[0] );
-			$responses["dht_statistics_bytes_written_suffix"] = $dht_statistics_bytes_written_arr[1];
-		}
-
-		$responses["dht_statistics_active_value"] = $responses["dht_statistics_active"] == 0 ? $message["dht_0"] : $message["dht_1"];
-	}
-
-	ksort( $responses );
-
-	return true;
-}
-
-function prepare_d_responses( &$responses, &$message, &$home_path, &$cwd ) {
-	$d_bytes_done_arr = switch_bytes( $responses["d_bytes_done"] );
-	$d_chunk_size_arr = switch_bytes( $responses["d_chunk_size"] );
-	$d_completed_bytes_arr = switch_bytes( $responses["d_completed_bytes"] );
-	$d_down_rate_arr = switch_bytes( $responses["d_down_rate"] );
-	$d_down_total_arr = switch_bytes( $responses["d_down_total"] );
-	$d_free_diskspace_arr = switch_bytes( $responses["d_free_diskspace"] );
-	$d_left_bytes_arr = switch_bytes( $responses["d_left_bytes"] );
-	$d_max_file_size_arr = switch_bytes( $responses["d_max_file_size"] );
-	$d_size_bytes_arr = switch_bytes( $responses["d_size_bytes"] );
-	$d_skip_rate_arr = switch_bytes( $responses["d_skip_rate"] );
-	$d_skip_total_arr = switch_bytes( $responses["d_skip_total"] );
-	$d_up_rate_arr = switch_bytes( $responses["d_up_rate"] );
-	$d_up_total_arr = switch_bytes( $responses["d_up_total"] );
-
-	$responses["d_bytes_done_value"] = sprintf( "%.1f", $d_bytes_done_arr[0] );
-	$responses["d_bytes_done_suffix"] = $d_bytes_done_arr[1];
-	$responses["d_chunk_size_value"] = sprintf( "%.1f", $d_chunk_size_arr[0] );
-	$responses["d_chunk_size_suffix"] = $d_chunk_size_arr[1];
-	$responses["d_completed_bytes_value"] = sprintf( "%.1f", $d_completed_bytes_arr[0] );
-	$responses["d_completed_bytes_suffix"] = $d_completed_bytes_arr[1];
-	$responses["d_down_rate_value"] = sprintf( "%.1f", $d_down_rate_arr[0] );
-	$responses["d_down_rate_suffix"] = $d_down_rate_arr[1];
-	$responses["d_down_total_value"] = sprintf( "%.1f", $d_down_total_arr[0] );
-	$responses["d_down_total_suffix"] = $d_down_total_arr[1];
-	$responses["d_free_diskspace_value"] = sprintf( "%.1f", $d_free_diskspace_arr[0] );
-	$responses["d_free_diskspace_suffix"] = $d_free_diskspace_arr[1];
-	$responses["d_left_bytes_value"] = sprintf( "%.1f", $d_left_bytes_arr[0] );
-	$responses["d_left_bytes_suffix"] = $d_left_bytes_arr[1];
-	$responses["d_max_file_size_value"] = sprintf( "%.1f", $d_max_file_size_arr[0] );
-	$responses["d_max_file_size_suffix"] = $d_max_file_size_arr[1];
-	$responses["d_size_bytes_value"] = sprintf( "%.1f", $d_size_bytes_arr[0] );
-	$responses["d_size_bytes_suffix"] = $d_size_bytes_arr[1];
-	$responses["d_skip_rate_value"] = sprintf( "%.1f", $d_skip_rate_arr[0] );
-	$responses["d_skip_rate_suffix"] = $d_skip_rate_arr[1];
-	$responses["d_skip_total_value"] = sprintf( "%.1f", $d_skip_total_arr[0] );
-	$responses["d_skip_total_suffix"] = $d_skip_total_arr[1];
-	$responses["d_up_rate_value"] = sprintf( "%.1f", $d_up_rate_arr[0] );
-	$responses["d_up_rate_suffix"] = $d_up_rate_arr[1];
-	$responses["d_up_total_value"] = sprintf( "%.1f", $d_up_total_arr[0] );
-	$responses["d_up_total_suffix"] = $d_up_total_arr[1];
-
-	$responses["d_active_value"] = $responses["d_active"] == 1 ? $message["d_active_1"] : $message["d_active_0"];
-	$responses["d_complete_value"] = $responses["d_complete"] == 1 ? $message["d_complete_1"] : $message["d_complete_0"];
-	$responses["d_connection_current_value"] = $responses["d_connection_current"] == "seed" ? $message["d_connection_current_seed"] : $message["d_connection_current_leech"];
-	$responses["d_creation_date_value"] = date( "Y-m-d H:i:s", $responses["d_creation_date"] );
-	$responses["d_ignore_commands_value"] = $responses["d_ignore_commands"] == 1 ? $message["d_ignore_commands_1"] : $message["d_ignore_commands_0"];
-	$responses["d_hash_checked_value"] = $responses["d_hash_checked"] == 1 ? $message["d_hash_checked_1"] : $message["d_hash_checked_0"];
-	$responses["d_hash_checking_value"] = $responses["d_hash_checking"] == 1 ? $message["d_hash_checking_1"] : $message["d_hash_checking_0"];
-	$responses["d_multi_file_value"] = $responses["d_multi_file"] == 1 ? $message["d_multi_file_multi"] : $message["d_multi_file_single"];
-	$responses["d_open_value"] = $responses["d_open"] == 1 ? $message["d_open_1"] : $message["d_open_0"];
-	$responses["d_peer_exchange_value"] = $responses["d_peer_exchange"] == 0 ? $message["disabled"] : $message["enabled"];
-	$responses["d_peers_max_value"] = $responses["d_peers_max"] == -1 ? $message["disabled"] : $responses["d_peers_max"];
-	$responses["d_peers_min_value"] = $responses["d_peers_min"] == -1 ? $message["disabled"] : $responses["d_peers_min"];
-	$responses["d_pex_active_value"] = $responses["d_pex_active"] == 1 ? $message["yes"] : $message["no"];
-	$responses["d_private_value"] = $responses["d_private"] == 1 ? $message["yes"] : $message["no"];
-	$responses["d_state_value"] = $responses["d_state"] == 1 ? $message["d_state_1"] : $message["d_state_0"];
-	$responses["d_state_changed_value"] = date( "Y-m-d H:i:s", $responses["d_state_changed"] );
-	$responses["d_tracker_numwant_value"] = $responses["d_tracker_numwant"] == -1 ? $message["disabled"] : $responses["d_tracker_numwant"];
-	$responses["d_uploads_max_value"] = $responses["d_uploads_max"] == -1 ? $message["disabled"] : $responses["d_uploads_max"];
-
-	$responses["d_base_path_value"] = make_abs_path( $responses["d_base_path"], $cwd, "{$home_path}{$_SESSION["rtwi_nick"]}" );
-	$responses["d_directory_value"] = make_abs_path( $responses["d_directory"], $cwd, "{$home_path}{$_SESSION["rtwi_nick"]}" );
-	$responses["d_tied_to_file_value"] = make_abs_path( $responses["d_tied_to_file"], $cwd, "{$home_path}{$_SESSION["rtwi_nick"]}" );
-
-	if ( $responses["d_down_rate"] > 0 ) {
-		$responses["d_estimated_time"] = $responses["d_left_bytes"] / $responses["d_down_rate"];
-		$responses["d_estimated_time_value"] = sprintf( "%dd %02d:%02d", floor( $responses["d_estimated_time"] / 86400 ), floor( $responses["d_estimated_time"] / 3600 ) % 24, floor( $responses["d_estimated_time"] / 60 ) % 60 );
-		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
-		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
-	} elseif ( $responses["d_hashing"] != 0 ) {
-		$responses["d_estimated_time"] = "";
-		$responses["d_estimated_time_value"] = "";
-		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
-		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
-		$responses["d_hpercentage"] = $responses["d_chunks_hashed"] / $responses["d_size_chunks"];
-		$responses["d_hpercentage_value"] = floor( $responses["d_chunks_hashed"] / $responses["d_size_chunks"] * 100 );
-	} elseif ( $responses["d_complete"] != 1 ) {
-		$responses["d_estimated_time"] = "";
-		$responses["d_estimated_time_value"] = "";
-		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
-		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
-	} else {
-		$responses["d_estimated_time"] = "";
-		$responses["d_estimated_time_value"] = "";
-		$responses["d_percentage"] = 1;
-		$responses["d_percentage_value"] = 100;
-	}
-
-	switch ( $responses["d_hashing"] ) {
-		case 1 : $responses["d_hashing_value"] = $message["d_hashing_1"]; break;
-		case 2 : $responses["d_hashing_value"] = $message["d_hashing_2"]; break;
-		case 3 : $responses["d_hashing_value"] = $message["d_hashing_3"]; break;
-		default : $responses["d_hashing_value"] = $message["d_hashing_0"]; break;
-	}
-	switch ( $responses["d_priority"] ) {
-		case 1 : $responses["d_priority_value"] = $message["d_priority_1"]; break;
-		case 2 : $responses["d_priority_value"] = $message["d_priority_2"]; break;
-		case 3 : $responses["d_priority_value"] = $message["d_priority_3"]; break;
-		default : $responses["d_priority_value"] = $message["d_priority_0"]; break;
-	}
-
-	$responses["d_ratio_value"] = sprintf( "%.3f", $responses["d_ratio"] / 1000 );
-
-	ksort( $responses );
-
-	return true;
-}
-
-function prepare_f_responses( &$responses, &$message, &$home_path, &$cwd ) {
-	$responses["f_last_touched"] = sprintf( "%.0f", $responses["f_last_touched"] );
-	$responses["f_range_first"] += 1;
-
-	$f_size_bytes_arr = switch_bytes( $responses["f_size_bytes"] );
-
-	$responses["f_size_bytes_value"] = sprintf( "%.1f", $f_size_bytes_arr[0] );
-	$responses["f_size_bytes_suffix"] = $f_size_bytes_arr[1];
-
-	$responses["f_open_value"] = $responses["f_open"] == 1 ? $message["f_open_1"] : $message["f_open_0"];
-	$responses["f_last_touched_value"] = date( "Y-m-d H:i:s", substr( $responses["f_last_touched"], 0, -6 ) );
-
-	$responses["f_frozen_path_value"] = make_abs_path( $responses["f_frozen_path"], $cwd, "{$home_path}{$_SESSION["rtwi_nick"]}" );
-
-	if ( $responses["f_size_chunks"] == 0 ) {
-		$responses["f_percentage"] = 1;
-		$responses["f_percentage_value"] = 100;
-	} else {
-		$responses["f_percentage"] = $responses["f_completed_chunks"] / $responses["f_size_chunks"];
-		$responses["f_percentage_value"] = floor( $responses["f_completed_chunks"] / $responses["f_size_chunks"] * 100 );
-	}
-
-	switch ( $responses["f_priority"] ) {
-		case 1 : $responses["f_priority_value"] = $message["f_priority_1"]; break;
-		case 2 : $responses["f_priority_value"] = $message["f_priority_2"]; break;
-		default : $responses["f_priority_value"] = $message["f_priority_0"]; break;
-	}
-
-	ksort( $responses );
-
-	return true;
-}
-
-function prepare_p_responses( &$responses, &$message ) {
-	$p_down_rate_arr = switch_bytes( $responses["p_down_rate"] );
-	$p_down_total_arr = switch_bytes( $responses["p_down_total"] );
-	$p_peer_rate_arr = switch_bytes( $responses["p_peer_rate"] );
-	$p_peer_total_arr = switch_bytes( $responses["p_peer_total"] );
-	$p_up_rate_arr = switch_bytes( $responses["p_up_rate"] );
-	$p_up_total_arr = switch_bytes( $responses["p_up_total"] );
-
-	$responses["p_down_rate_value"] = sprintf( "%.1f", $p_down_rate_arr[0] );
-	$responses["p_down_rate_suffix"] = $p_down_rate_arr[1];
-	$responses["p_down_total_value"] = sprintf( "%.1f", $p_down_total_arr[0] );
-	$responses["p_down_total_suffix"] = $p_down_total_arr[1];
-	$responses["p_peer_rate_value"] = sprintf( "%.1f", $p_peer_rate_arr[0] );
-	$responses["p_peer_rate_suffix"] = $p_peer_rate_arr[1];
-	$responses["p_peer_total_value"] = sprintf( "%.1f", $p_peer_total_arr[0] );
-	$responses["p_peer_total_suffix"] = $p_peer_total_arr[1];
-	$responses["p_up_rate_value"] = sprintf( "%.1f", $p_up_rate_arr[0] );
-	$responses["p_up_rate_suffix"] = $p_up_rate_arr[1];
-	$responses["p_up_total_value"] = sprintf( "%.1f", $p_up_total_arr[0] );
-	$responses["p_up_total_suffix"] = $p_up_total_arr[1];
-
-	$responses["p_encrypted_value"] = $responses["p_encrypted"] == 1 ? $message["p_encrypted_1"] : $message["p_encrypted_0"];
-	$responses["p_incoming_value"] = $responses["p_incoming"] == 1 ? $message["p_incoming_1"] : $message["p_incoming_0"];
-
-	ksort( $responses );
-
-	return true;
-}
-
-function prepare_trac_responses( &$responses, &$message ) {
-	$t_scrape_downloaded_arr = switch_bytes( $responses["t_scrape_downloaded"] );
-
-	$responses["t_scrape_time_last"] = sprintf( "%.0f", $responses["t_scrape_time_last"] );
-
-	$responses["t_enabled_value"] = $responses["t_enabled"] == 1 ? $message["t_enabled_1"] : $message["t_enabled_0"];
-	$responses["t_open_value"] = $responses["t_open"] == 1 ? $message["t_open_1"] : $message["t_open_0"];
-	$responses["t_min_interval_value"] = sprintf( "%02d:%02d:%02d", floor( $responses["t_min_interval"] / 3600 ), $responses["t_min_interval"] / 60 % 60, $responses["t_min_interval"] % 60 );
-	$responses["t_normal_interval_value"] = sprintf( "%02d:%02d:%02d", floor( $responses["t_normal_interval"] / 3600 ), $responses["t_normal_interval"] / 60 % 60, $responses["t_normal_interval"] % 60 );
-
-	if ( $responses["t_scrape_time_last"] == 0 ) {
-		$responses["t_scrape_time_last_value"] = date( "Y-m-d H:i:s", $responses["t_scrape_time_last"] );
-	} else {
-		$responses["t_scrape_time_last_value"] = date( "Y-m-d H:i:s", substr( $responses["t_scrape_time_last"], 0, -6 ) );
-	}
-	$responses["t_type_value"] = $responses["t_type"] == 1 ? $message["t_type_1"] : $message["t_type_2"];
-
-	ksort( $responses );
-
-	return true;
-}
-
-function addlanguages( &$xml, &$root, &$node, &$languages ) {
-	$root->setAttribute( "language", $_SESSION["rtwi_language"] );
-
-	// adding languages
-	$rrrnode = $node->appendChild( $xml->createElement( "languages" ) );
-	$rrrnode->setAttribute( "value", $_SESSION["rtwi_language"] );
-	foreach ( $languages as $key => $val ) {
-		$rrnode = $rrrnode->appendChild( $xml->createElement( "language" ) );
-		$rrnode->setAttribute( "value", $key );
-		$rrnode->setAttribute( "title", $val );
-	}
-}
-
-function addrefreshrates( &$xml, &$root, &$node, &$refreshrates ) {
-	$root->setAttribute( "refreshrate", $_SESSION["rtwi_refresh"] );
-
-	// adding refresh rates
-	$rrrnode = $node->appendChild( $xml->createElement( "refreshrates" ) );
-	$rrrnode->setAttribute( "value", $_SESSION["rtwi_refresh"] );
-	foreach ( $refreshrates as $key => $val ) {
-		$rrnode = $rrrnode->appendChild( $xml->createElement( "refreshrate" ) );
-		$rrnode->setAttribute( "value", substr( $key, 12 ) );
-		$rrnode->setAttribute( "title", $val );
-	}
-}
-
-function addviewtypes( &$xml, &$root, &$node, &$view_list, &$viewtypes ) {
-	$root->setAttribute( "viewtype", $_SESSION["rtwi_view"] );
-
-	// adding viewtypes
-	$vcrnode = $node->appendChild( $xml->createElement( "viewtypes" ) );
-	$vcrnode->setAttribute( "value", $_SESSION["rtwi_view"] );
-	foreach ( $view_list as $key => $val ) {
-		$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
-		$vcnode->setAttribute( "value", $val );
-		$vcnode->setAttribute( "title", isset( $viewtypes["viewtype_{$val}"] ) ? $viewtypes["viewtype_{$val}"] : $val );
-	}
-}
-
-function build_xmltree( &$dstruct, &$tree, &$xml, $fullpath, $responses ) {
-	foreach ( $dstruct as $key => $val ) {
-		if ( is_array( $val ) ) {
-			$subtree = $tree->appendChild( $xml->createElement( "directory" ) );
-			$subtree->setAttribute( "id", sha1( mt_rand() ) );
-			$subtree->setAttribute( "dirname", $key );
-			$subtree->setAttribute( "dirpath", urlencode( "{$fullpath}/{$key}" ) );
-			$ret = build_xmltree( $val, $subtree, $xml, "{$fullpath}/{$key}", $responses );
-		} else {
-			$ret = $tree->appendChild( $xml->createElement( "file" ) );
-			$ret->setAttribute( "id", $key );
-			$ret->setAttribute( "filename", $val );
-			xmlrpc_multiappend( $xml, $ret, $responses[$key] );
-		}
-	}
-
-	return $ret;
-}
-
-function xmlrpc_multiappend( &$xml, &$dnode, &$responses ) {
-	$keys = array_keys( $responses );
-	reset( $responses );
-	while ( list( $rkey, $rval ) = each( $responses ) ) {
-		$rval = str_replace( "&", "&amp;", $rval );
-		if ( array_key_exists( "{$rkey}_suffix", $responses ) ) {
-			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
-			$node->setAttribute( "suffix", $responses["{$rkey}_suffix"] );
-			$node->setAttribute( "value", $responses["{$rkey}_value"] );
-			unset( $responses["{$rkey}_suffix"] );
-			unset( $responses["{$rkey}_value"] );
-		} elseif ( array_key_exists( "{$rkey}_value", $responses ) ) {
-			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
-			$node->setAttribute( "value", $responses["{$rkey}_value"] );
-			unset( $responses["{$rkey}_value"] );
-		} elseif ( is_array( $rval ) ) {
-		} else {
-			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
-		}
-	}
-
-	return true;
-}
-
-error_reporting( E_ALL );
-//error_reporting( E_ALL ^ E_NOTICE );
-
-set_time_limit( 10 );
-
-session_start();
-if ( !isset( $_SESSION["rtwi_rights"] ) ) {
-	$_SESSION["rtwi_rights"] = 0;
-};
-
-require_once( "includes/config.inc.php" );
-
-if ( !isset( $_SESSION["rtwi_language"] ) ) {
-	if ( !isset( $_COOKIE["rtwi_language"] ) ) {
-		$_SESSION["rtwi_language"] = $lang;
-	} elseif ( !isset( $_SESSION["rtwi_view"] ) ) {
-		$_SESSION["rtwi_language"] = $_COOKIE["rtwi_language"];
-	}
-}
-
-require_once( "includes/classes/xmlrpc_handler.inc.php" );
-require_once( "includes/messages.{$_SESSION["rtwi_language"]}.inc.php" );
-require_once( "includes/tools/functions.time.inc.php" );
-
-$st = getmicrotime();
-$callnum = 0;
-$calltime = 0;
-$multicallnum = 0;
-
-$xmlrpc_methods = array(
-	"si"	=> $config["allow"]["dht"] == true ? 
-			array( "dht_statistics", "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_dht_port", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ) :
-			array( "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ),
-	"d"	=> array( "d.get_base_filename=", "d.get_base_path=", "d.get_bytes_done=", "d.get_chunk_size=", "d.get_chunks_hashed=", "d.get_complete=", "d.get_completed_bytes=", "d.get_completed_chunks=", "d.get_connection_current=", "d.get_connection_leech=", "d.get_connection_seed=", "d.get_creation_date=", "d.get_custom1=", "d.get_custom2=", "d.get_custom3=", "d.get_custom4=", "d.get_custom5=", "d.get_directory=", "d.get_down_rate=", "d.get_down_total=", "d.get_free_diskspace=", "d.get_hash=", "d.get_hashing=", "d.get_ignore_commands=", "d.get_left_bytes=", "d.get_local_id=", "d.get_local_id_html=", "d.get_max_file_size=", "d.get_max_size_pex=", "d.get_message=", "d.get_name=", "d.get_peer_exchange=", "d.get_peers_accounted=", "d.get_peers_complete=", "d.get_peers_connected=", "d.get_peers_max=", "d.get_peers_min=", "d.get_peers_not_connected=", "d.get_priority=", "d.get_priority_str=", "d.get_ratio=", "d.get_size_bytes=", "d.get_size_chunks=", "d.get_size_files=", "d.get_size_pex=", "d.get_skip_rate=", "d.get_skip_total=", "d.get_state=", "d.get_state_changed=", "d.get_tied_to_file=", "d.get_tracker_focus=", "d.get_tracker_numwant=", "d.get_tracker_size=", "d.get_up_rate=", "d.get_up_total=", "d.get_uploads_max=", "d.is_active=", "d.is_hash_checked=", "d.is_hash_checking=", "d.is_multi_file=", "d.is_open=", "d.is_pex_active=", "d.is_private=" ),
-	"f"	=> array( "f.get_completed_chunks=", "f.get_frozen_path=", "f.is_created=", "f.is_open=", "f.get_last_touched=", "f.get_match_depth_next=", "f.get_match_depth_prev=", "f.get_offset=", "f.get_path=", "f.get_path_components=", "f.get_path_depth=", "f.get_priority=", "f.get_range_first=", "f.get_range_second=", "f.get_size_bytes=", "f.get_size_chunks=" ),
-	"p"	=> array( "p.get_address=", "p.get_client_version=", "p.get_completed_percent=", "p.get_down_rate=", "p.get_down_total=", "p.get_id=", "p.get_id_html=", "p.get_options_str=", "p.get_peer_rate=", "p.get_peer_total=", "p.get_port=", "p.get_up_rate=", "p.get_up_total=", "p.is_encrypted=", "p.is_incoming=", "p.is_obfuscated=", "p.is_snubbed=" ),
-	"t"	=> array( "t.get_group=", "t.get_id=", "t.get_min_interval=", "t.get_normal_interval=", "t.get_scrape_complete=", "t.get_scrape_downloaded=", "t.get_scrape_incomplete=", "t.get_scrape_time_last=", "t.get_type=", "t.get_url=", "t.is_enabled=", "t.is_open=" ),
-	"g"	=> array( "d.get_name", "d.get_directory", "f.get_path", "f.get_frozen_path", "f.get_size_bytes" ),
-);
-
-if ( isset( $_REQUEST["mod"] ) ) {
-	$mod = $_REQUEST["mod"];
-} else {
-	$mod = "";
-}
-
-if ( isset( $_REQUEST["hash"] ) ) {
-	$hash = $_REQUEST["hash"];
-} else {
-	$hash = "";
-}
-
-if ( isset( $_REQUEST["page"] ) ) {
-	switch ( $_REQUEST["page"] ) {
-		case "transfers" : {
-			$page = "transfers";
-			break;
-		}
-		case "chunks" : {
-			$page = "chunks";
-			break;
-		}
-		case "trackers" : {
-			$page = "trackers";
-			break;
-		}
-		case "files" : {
-			$page = "files";
-			break;
-		}
-		case "peers" : {
-			$page = "peers";
-			break;
-		}
-		default : {
-			$page = "info";
-			break;
-		}
-	}
-} else {
-	$page = "info";
-}
-
-if ( isset( $_REQUEST["id"] ) ) {
-	$id = $_REQUEST["id"];
-	settype( $id, "int" );
-} else {
-	$id = 0;
-}
-
-if ( isset( $_REQUEST["path"] ) ) {
-	$path = $_REQUEST["path"];
-} else {
-	$path = "";
-}
-
-if ( isset( $_REQUEST["ajax"] ) && isset( $_REQUEST["ajax"] ) == "true" ) {
-	$ajax = true;
-} else {
-	$ajax = false;
-}
-
-//print_r( $_COOKIE );
-
-if ( ( isset( $_SESSION["rtwi_auth"] ) && $_SESSION["rtwi_auth"] === 1 ) || ( isset( $_COOKIE["rtwi_auth"] ) && $_COOKIE["rtwi_auth"] == 1 && isset( $_COOKIE["rtwi_nick"] ) && array_key_exists( $_COOKIE["rtwi_nick"], $users ) ) ) {
-	if ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) {
-		$_SESSION["rtwi_auth"] = 1;
-		$_SESSION["rtwi_nick"] = $_COOKIE["rtwi_nick"];
-		$_SESSION["rtwi_port"] = $users[$_COOKIE["rtwi_nick"]];
-
-		settype( $_SESSION["rtwi_port"], "int" );
-
-		$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
-	}
-
-	$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
-	$xmlrpc = new xmlrpc_handler( $xmlrpc_array );
-
-	if ( !isset( $_SESSION["rtwi_view"] ) ) {
-		if ( !isset( $_COOKIE["rtwi_view"] ) ) {
-			$_SESSION["rtwi_view"] = "default";
-		} elseif ( !isset( $_SESSION["rtwi_view"] ) ) {
-			$_SESSION["rtwi_view"] = $_COOKIE["rtwi_view"];
-		}
-	}
-	if ( !isset( $_SESSION["rtwi_refresh"] ) ) {
-		if ( !isset( $_COOKIE["rtwi_refresh"] ) ) {
-			$_SESSION["rtwi_refresh"] = 0;
-		} elseif ( !isset( $_SESSION["rtwi_refresh"] ) ) {
-			$_SESSION["rtwi_refresh"] = $_COOKIE["rtwi_refresh"];
-		}
-	}
-} else {
-	$mod = "login";
-}
-
-$xml = new DOMDocument( "1.0", "utf-8" );
-$xml->formatOutput = true;
-
-$root = $xml->appendChild( $xml->createElement( "root" ) );
-$root->appendChild( $xml->createElement( "mod", $mod ) );
-$root->appendChild( $xml->createElement( "hash", $hash ) );
-$root->appendChild( $xml->createElement( "page", $page ) );
-$root->appendChild( $xml->createElement( "id", $id ) );
-$root->appendChild( $xml->createElement( "burl", $url["base"] ) );
-$root->appendChild( $xml->createElement( "url", $url["index"] ) );
-$root->appendChild( $xml->createElement( "iurl", $url["input"] ) );
-$root->appendChild( $xml->createElement( "curl", str_replace( "&", "&amp;", $_SERVER["REQUEST_URI"] ) ) );
-$root->appendChild( $xml->createElement( "purl", isset( $_SESSION["rtwi_lastpage"] ) ? str_replace( "&", "&amp;", $_SESSION["rtwi_lastpage"] ) : "" ) );
-$root->appendChild( $xml->createElement( "datetime", date( "Y. m. d. H:i:s", time() ) ) );
-$root->appendChild( $xml->createElement( "language", $_SESSION["rtwi_language"] ) );
-
-foreach ( $config["allow"] as $key => $val ) {
-	if ( $val == true ) {
-		$root->appendChild( $xml->createElement( "allow_{$key}", "true" ) );
-	}
-}
-
-$labels = $root->appendChild( $xml->createElement( "labels" ) );
-foreach ( $label as $key => $val ) {
-	$labels->appendChild( $xml->createElement( $key, $val ) );
-}
-$labels->getElementsByTagName( "mailto" )->item( 0 )->nodeValue = str_rot13( base64_encode( str_rot13( $labels->getElementsByTagName( "mailto" )->item( 0 )->nodeValue ) ) );
-
-//print_r( $_SESSION );
-//print_r( $_REQUEST );
-
-if ( isset( $_SESSION["rtwi_lastpost"] ) && is_array( $_SESSION["rtwi_lastpost"] ) ) {
-	$lproot = $root->appendChild( $xml->createElement( "lastpost" ) );
-	foreach ( $_SESSION["rtwi_lastpost"] as $key => $val ) {
-		$node = $lproot->appendChild( $xml->createElement( $key, $val ) );
-	}
-	unset( $_SESSION["rtwi_lastpost"] );
-}
-
-switch ( $mod ) {
-	case "login" : { // login
-		if ( $config["allow"]["language"] ) {
-			addlanguages( $xml, $root, $root, $languages );
-		}
-		$layout_file = "layout.main.login.xsl";
-
-		break;
-	}
-	case "serverinfo" : { // server info
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		if ( $config["allow"]["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		if ( $config["allow"]["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		if ( !$xmlrpc->call() || !$xmlrpc->parse() ) {
-		}
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-//print_r( $si_responses );
-		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-
-		$bytes_down = 0;
-		$bytes_up = 0;
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-		}
-
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		prepare_si_responses( $si_responses, $message, $home_path, $config );
-
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
-		$inode = $tnode->appendChild( $xml->createElement( "server_info" ) );
-		xmlrpc_multiappend( $xml, $inode, $si_responses );
-
-		$layout_file = "layout.main.index.xsl";
-
-		break;
-	}
-	case "addtorrent" : { // add a new torrent
-		$xmlrpc->setrequest( "get_directory", "" );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$directory = $xmlrpc->fetch();
-
-		if ( substr( $directory, -1 ) == "/" ) {
-			$directory = substr( $directory, 0, -1 );
-		}
-		if ( in_array( "..", split( "/", $directory ) ) || in_array( ".", split( "/", $directory ) ) ) {
-			$_SESSION["rtwi_err"] = "badrtdirectory";
-			header( "location: {$url["index"]}" );
-			exit;
-		} elseif ( substr( $directory, 0, 2 ) == "~/" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$home_path}{$_SESSION["rtwi_nick"]}/{$directory}";
-		} elseif ( substr( $directory, 0, 2 ) == "./" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$si_responses["get_cwd"]}/{$directory}";
-		}
-		$directory = str_replace( "//", "/", $directory );
-
-		if ( substr( $path, 0, 1 ) == "/" ) {
-			$path = substr( $path, 1 );
-		}
-		if ( substr( $path, -1 ) == "/" ) {
-			$path = substr( $path, 0, -1 );
-		}
-		if ( in_array( "..", split( "/", $path ) ) || in_array( ".", split( "/", $path ) ) ) {
-			$_SESSION["rtwi_err"] = "badatpath";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$ppath = substr( $path, 0, strrpos( $path, "/" ) );
-		$scan = scandir( "{$directory}/{$path}" );
-		$freespace = switch_bytes( disk_free_space( "{$directory}/{$ppath}" ) );
-
-		$atnode = $root->appendChild( $xml->createElement( "addtorrent" ) );
-		$atnode->setAttribute( "name", $ppath );
-		$atnode->setAttribute( "path", $path );
-		$atnode->setAttribute( "ppath", urlencode( $ppath ) );
-		$atnode->setAttribute( "freespace", disk_free_space( "{$directory}/{$ppath}" ) );
-		$atnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
-		$atnode->setAttribute( "freespace_suffix", $freespace[1] );
-		if ( $config["allow"]["language"] ) {
-			addlanguages( $xml, $root, $atnode, $languages );
-		}
-		foreach( $scan as $key => $val ) {
-			$dpath = str_replace( "//", "/", "{$path}/{$val}" );
-			$fdpath = str_replace( "//", "/", "{$directory}/{$dpath}" );
-			if ( ( is_dir( $fdpath ) || ( is_link( $fdpath ) && is_dir( readlink( $fdpath ) ) ) ) && substr( $val, 0, 1 ) != "."  ) {
-				$freespace = switch_bytes( disk_free_space( $fdpath ) );
-
-				$dnode = $atnode->appendChild( $xml->createElement( "dlpath" ) );
-				$dnode->setAttribute( "name", $val );
-				$dnode->setAttribute( "path", urlencode( $dpath ) );
-				$dnode->setAttribute( "freespace", disk_free_space( $fdpath ) );
-				$dnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
-				$dnode->setAttribute( "freespace_suffix", $freespace[1] );
-			}
-		}
-
-		$layout_file = "layout.main.index.xsl";
-
-		break;
-	}
-	case "torrent" : { // torrent
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		if ( $config["allow"]["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		if ( $config["allow"]["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-
-		$bytes_down = 0;
-		$bytes_up = 0;
-		$torrent = false;
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-
-			if ( $d_responses[$i]["d_hash"] == $hash ) {
-				$torrent = $d_responses[$i];
-			}
-		}
-		unset( $d_responses );
-
-		if ( is_array( $torrent ) ) {
-			prepare_d_responses( $torrent, $message, $home_path, $si_responses["get_cwd"] );
-			switch ( $page ) {
-				case "peers" : {
-					$node = $tnode->appendChild( $xml->createElement( "torrent_peers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_peers" ) );
-
-					$xmlrpc->setrequest( "p.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["p"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["p"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["p"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
-						}
-					}
-					for ( $i = 0; $i < $torrent["d_peers_connected"]; $i++ ) {
-						prepare_p_responses( $responses[$i], $message, $home_path );
-						$pnode = $node->appendChild( $xml->createElement( "peer" ) );
-						$pnode->setAttribute( "id", $i );
-						xmlrpc_multiappend( $xml, $pnode, $responses[$i] );
-					}
-
-
-					break;
-				}
-				case "info" : {
-					$node = $tnode->appendChild( $xml->createElement( "torrent_info_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_info" ) );
-
-					break;
-				}
-				case "files" : {
-					$node = $tnode->appendChild( $xml->createElement( "torrent_files_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_files" ) );
-
-					$node = $node->appendChild( $xml->createElement( "files_root" ) );
-					$node = $node->appendChild( $xml->createElement( "directory" ) );
-					$node->setAttribute( "dirname", $torrent["d_directory_value"] );
-
-					$fst = getmicrotime();
-
-					$xmlrpc->setrequest( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["f"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-//					print_r( $response );
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["f"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["f"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
-						}
-					}
-
-					$dstruct = array();
-					for ( $i = 0; $i < $torrent["d_size_files"]; $i++ ) {
-						prepare_f_responses( $responses[$i], $message, $home_path, $si_response["get_cwd"] );
-
-						$n = 0;
-						$tmp = &$dstruct;
-						foreach ( $responses[$i]["f_path_components"] as $key => $val ) {
-							if ( count( $responses[$i]["f_path_components"] ) == ++$n ) {
-								$tmp[$i] = $val;
-							} else {
-								if ( !isset( $tmp[$val] ) ) {
-									$tmp[$val] = array();
-								}
-								$tmp = &$tmp[$val];
-							}
-						}
-
-					}
-					$fnode = build_xmltree( $dstruct, $node, $xml, $torrent["d_directory_value"], $responses );
-
-
-					$ftt = getmicrotime();
-
-					break;
-				}
-				case "trackers" : {
-					// creating  trackers node
-					$node = $tnode->appendChild( $xml->createElement( "torrent_trackers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
-
-					$xmlrpc->setrequest( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["t"] ) );
-					$xmlrpc->call();
-					$xmlrpc->parse();
-					$response = $xmlrpc->fetch();
-					for ( $i = 0; $i < count( $response ); $i++ ) {
-						for ( $r = 0; $r < count( $xmlrpc_methods["t"] ); $r++ ) {
-							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["t"][$r] );
-							$responses[$i][$methodval] = $response[$i][$r];
-						}
-					}
-					for ( $i = 0; $i < $torrent["d_tracker_size"]; $i++ ) {
-						prepare_trac_responses( $responses[$i], $message, $home_path );
-						$tracnode = $node->appendChild( $xml->createElement( "tracker" ) );
-						$tracnode->setAttribute( "id", $i );
-						xmlrpc_multiappend( $xml, $tracnode, $responses[$i] );
-					}
-
-					break;
-				}
-				case "chunks" : {
-					$node = $tnode->appendChild( $xml->createElement( "torrent_chunks_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_chunks" ) );
-
-					break;
-				}
-				case "transfers" : {
-					$node = $tnode->appendChild( $xml->createElement( "torrent_transfers_root" ) );
-					$node = $node->appendChild( $xml->createElement( "torrent_transfers" ) );
-
-					break;
-				}
-			}
-			xmlrpc_multiappend( $xml, $node, $torrent );
-		} else {
-			$_SESSION["rtwi_err"] = "nohashfound";
-		}
-
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		prepare_si_responses( $si_responses, $message, $home_path, $config );
-
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
-		if ( $ajax === true ) {
-			$layout_file = "layout.ajax.index.xsl";
-		} else {
-			$layout_file = "layout.main.index.xsl";
-		}
-
-		break;
-	}
-	case "getfile" : { // download a file
-		if ( !$config["allow"]["download"] ) {
-			$_SESSION["rtwi_err"] = "downloadnotallowed";
-			header( "location: {$url["index"]}" );
-			exit;
-		} elseif ( $id < 0 ) {
-			$_SESSION["rtwi_err"] = "noidfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		} else {
-			// retrieving server info
-			$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-			$xmlrpc->call();
-			$xmlrpc->parse();
-			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-
-			$xmlrpc->setrequest( "download_list", array( $_SESSION["rtwi_view"] ) );
-			$xmlrpc->call();
-			$xmlrpc->parse();
-			$torrents = $xmlrpc->fetch();
-
-			if ( in_array( $hash, $torrents ) ) {
-				// getting name
-				$xmlrpc->setmrequest( $xmlrpc_methods["g"], array( $hash, $id ) );
-				$xmlrpc->call();
-				$xmlrpc->parse();
-				$response = $xmlrpc->mfetch( $xmlrpc_methods["g"] );
-
-				$d_directory_value = make_abs_path( $response["d_directory"], $si_responses["get_cwd"], "{$home_path}{$_SESSION["rtwi_nick"]}" );
-			} else {
-				$_SESSION["rtwi_err"] = "nohashfound";
-				$layout_file = "layout.main.index.xsl";
-			}
-		}
-
-		break;
-	}
-	default : { // torrents
-		// retrieving server info
-		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
-//print_r( $si_responses );
-
-		// creating torrents node
-		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
-		addviewtypes( $xml, $root, $tnode, $si_responses["view_list"], $viewtypes );
-		if ( $config["allow"]["refresh"] ) {
-			addrefreshrates( $xml, $root, $tnode, $refreshrates );
-		}
-		if ( $config["allow"]["language"] ) {
-			addlanguages( $xml, $root, $tnode, $languages );
-		}
-
-		// retrieving download info
-		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
-		$xmlrpc->call();
-		$xmlrpc->parse();
-		$response = $xmlrpc->fetch();
-//print_r( $response );
-
-		$bytes_down = 0;
-		$bytes_up = 0;
-		for ( $i = 0; $i < count( $response ); $i++ ) {
-			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
-				$d_responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $d_responses[$i]["d_down_rate"];
-			$bytes_up += $d_responses[$i]["d_up_rate"];
-
-			prepare_d_responses( $d_responses[$i], $message, $home_path, $si_responses["get_cwd"] );
-			$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
-			xmlrpc_multiappend( $xml, $ttnode, $d_responses[$i] );
-		}
-
-		$si_responses["bytes_down"] = $bytes_down;
-		$si_responses["bytes_up"] = $bytes_up;
-
-		prepare_si_responses( $si_responses, $message, $home_path, $config );
-
-		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
-		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
-		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["download_rate_value"] );
-		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
-		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
-		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
-
-		$layout_file = "layout.main.index.xsl";
-
-		break;
-	}
-}
-
-if ( isset( $_SESSION["rtwi_err"] ) && $_SESSION["rtwi_err"] != "" ) {
-	$node = $root->appendChild( $xml->createElement( "err" ) );
-	$node = $node->appendChild( $xml->createElement( "errmsg", $message[$_SESSION["rtwi_err"]] ) );
-
-	$_SESSION["rtwi_err"] = "";
-}
-
-if ( $ajax === false && $mod != "getfile" ) {
-	$_SESSION["rtwi_lastpage"] = $_SERVER["REQUEST_URI"];
-}
-
-
-$tt = getmicrotime();
-//printf( "Total time: %0.6f sec\r\n", $tt - $st );
-
-//print $xml->saveXML();exit;
-
-if ( $mod != "getfile" ) {
-	require_once( "includes/classes/xsl_handler.inc.php" );
-	$page = new page_handler( $site_theme, $layout_file, $xml );
-	$page->parse();
-	$text = $page->fetch();
-	$len = strlen( $text );
-
-//	@header( "content-length: {$len}" );
-	@header( "content-type: text/html; charset=utf-8" );
-	@header( "content-language: hu" );
-	@header( "cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
-	@header( "pragma: no-cache" );
-	@header( "expires: thu, 1 jan 1970 00:00:00 gmt" );
-	@header( "imagetoolbar: no" );
-	print $text;
-} else {
-	set_time_limit( 0 );
-	$path = "{$d_directory_value}/{$response["f_path"]}";
-	$filesize = filesize( $path );
-
-	@header( "Content-Description: File Transfer" );
-	@header( "Content-Type: image/jpeg" );
-	@header( "Content-Type: application/force-download" );
-	@header( "Content-Length: {$filesize}" );
-	@header( "Content-Disposition: attachment; filename={$response["f_path"]}" );
-	readfile( $path );
-}
-
-$tt = getmicrotime();
-/*
-printf( "<br />\r\nXMLRPC calls: %d", $callnum );
-printf( "<br />\r\nXMLRPC time: %0.6f sec", $calltime );
-if( isset( $fst ) && isset( $ftt ) ) {
-	printf( "<br />\r\nFiles time: %0.6f sec", $ftt - $fst );
-}
-printf( "<br />\r\nTotal time: %0.6f sec", $tt - $st );
-*/
-?>
Index: index.php
===================================================================
--- index.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
+++ index.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -0,0 +1,1128 @@
+<?php
+
+function myrealpath( $path, $home, $cwd ) {
+	if ( substr( $path, 0, 2 ) == "~/" ) {
+		$path = substr( $path, 2 );
+		$path = "{$home}{$_SESSION["rtwi_nick"]}/{$path}";
+	}
+
+	$oldcwd = getcwd();
+	chdir( $cwd );
+	$newpath = realpath( $path );
+	chdir( $oldcwd );
+
+	return $newpath;
+}
+
+function switch_bytes( $bytes, $d_suffix = "" ) {
+	switch ( $d_suffix ) {
+		case "GB" : {
+			$ret = $bytes / 1024 / 1024 / 1024;
+			$suffix = "GB";
+			break;
+		}
+		case "MB" : {
+			$ret = $bytes / 1024 / 1024;
+			$suffix = "MB";
+			break;
+		}
+		case "KB" : {
+			$ret = $bytes / 1024;
+			$suffix = "KB";
+			break;
+		}
+		default : {
+			if ( $bytes >= 1024 * 1024 * 1024 ) {
+				$ret = $bytes / 1024 / 1024 / 1024;
+				$suffix = "GB";
+			} elseif ( $bytes >= 1024 * 1024 ) {
+				$ret = $bytes / 1024 / 1024;
+				$suffix = "MB";
+			} elseif ( $bytes >= 1024 ) {
+				$ret = $bytes / 1024;
+				$suffix = "KB";
+			} else {
+				$ret = $bytes;
+				$suffix = "B";
+			}
+		}
+	}
+
+	return array( $ret, $suffix );
+}
+
+function prepare_serverinfo_responses( &$responses, &$message, &$config ) {
+	$bytes_down_arr = switch_bytes( $responses["bytes_down"] );
+	$bytes_up_arr = switch_bytes( $responses["bytes_up"] );
+	$download_rate_arr = switch_bytes( $responses["download_rate"], "KB" );
+	$hash_read_ahead_arr = switch_bytes( $responses["hash_read_ahead"] );
+	$max_memory_usage_arr = switch_bytes( $responses["max_memory_usage"] );
+	$memory_usage_arr = switch_bytes( $responses["memory_usage"] );
+	$preload_min_size_arr = switch_bytes( $responses["preload_min_size"] );
+	$preload_required_rate_arr = switch_bytes( $responses["preload_required_rate"] );
+	$receive_buffer_size_arr = switch_bytes( $responses["receive_buffer_size"] );
+	$send_buffer_size_arr = switch_bytes( $responses["send_buffer_size"] );
+	$upload_rate_arr = switch_bytes( $responses["upload_rate"], "KB" );
+
+	$responses["bytes_down_value"] = sprintf( "%.1f", $bytes_down_arr[0] );
+	$responses["bytes_down_suffix"] = $bytes_down_arr[1];
+	$responses["bytes_up_value"] = sprintf( "%.1f", $bytes_up_arr[0] );
+	$responses["bytes_up_suffix"] = $bytes_up_arr[1];
+	$responses["download_rate_value"] = sprintf( "%.0f", $download_rate_arr[0] );
+	$responses["download_rate_suffix"] = $download_rate_arr[1];
+	$responses["hash_read_ahead_value"] = sprintf( "%.1f", $hash_read_ahead_arr[0] );
+	$responses["hash_read_ahead_suffix"] = $hash_read_ahead_arr[1];
+	$responses["max_memory_usage_value"] = sprintf( "%.1f", $max_memory_usage_arr[0] );
+	$responses["max_memory_usage_suffix"] = $max_memory_usage_arr[1];
+	$responses["memory_usage_value"] = sprintf( "%.1f", $memory_usage_arr[0] );
+	$responses["memory_usage_suffix"] = $memory_usage_arr[1];
+	$responses["preload_min_size_value"] = sprintf( "%.1f", $preload_min_size_arr[0] );
+	$responses["preload_min_size_suffix"] = $preload_min_size_arr[1];
+	$responses["preload_required_rate_value"] = sprintf( "%.1f", $preload_required_rate_arr[0] );
+	$responses["preload_required_rate_suffix"] = $preload_required_rate_arr[1];
+	$responses["receive_buffer_size_value"] = sprintf( "%.1f", $receive_buffer_size_arr[0] );
+	$responses["receive_buffer_size_suffix"] = $receive_buffer_size_arr[1];
+	$responses["send_buffer_size_value"] = sprintf( "%.1f", $send_buffer_size_arr[0] );
+	$responses["send_buffer_size_suffix"] = $send_buffer_size_arr[1];
+	$responses["upload_rate_value"] = sprintf( "%.0f", $upload_rate_arr[0] );
+	$responses["upload_rate_suffix"] = $upload_rate_arr[1];
+
+	$responses["check_hash_value"] = $responses["check_hash"] == 0 ? $message["no"] : $message["yes"];
+	$responses["handshake_log_value"] = $responses["handshake_log"] == 0 ? $message["no"] : $message["yes"];
+	$responses["safe_sync_value"] = $responses["safe_sync"] == 0 ? $message["no"] : $message["yes"];
+	$responses["use_udp_trackers_value"] = $responses["use_udp_trackers"] == 0 ? $message["no"] : $message["yes"];
+
+	$responses["bind_value"] = $responses["bind"] == "0.0.0.0" ? $message["bind_0000"] : $responses["bind"];
+	$responses["ip_value"] = $responses["ip"] == "0.0.0.0" ? $message["ip_0000"] : $responses["ip"];
+	$responses["max_peers_value"] = $responses["max_peers"] == -1 ? $message["disabled"] : $responses["max_peers"];
+	$responses["max_peers_seed_value"] = $responses["max_peers_seed"] == -1 ? $message["disabled"] : $responses["max_peers_seed"];
+	$responses["max_uploads_value"] = $responses["max_uploads"] == -1 ? $message["disabled"] : $responses["max_uploads"];
+	$responses["min_peers_value"] = $responses["min_peers"] == -1 ? $message["disabled"] : $responses["min_peers"];
+	$responses["min_peers_seed_value"] = $responses["min_peers_seed"] == -1 ? $message["disabled"] : $responses["min_peers_seed"];
+	$responses["port_open_value"] = $responses["port_open"] == -1 ? $message["no"] : $message["yes"];
+	$responses["port_random_value"] = $responses["port_random"] == -1 ? $message["no"] : $message["yes"];
+	$responses["port_range_value"] = $responses["port_range"] == -1 ? $message["disabled"] : $responses["port_range"];
+	$responses["proxy_address_value"] = $responses["proxy_address"] == "0.0.0.0" ? $message["proxy_address_0000"] : $responses["proxy_address"];
+	$responses["tracker_numwant_value"] = $responses["tracker_numwant"] == -1 ? $message["disabled"] : $responses["tracker_numwant"];
+
+	$responses["directory_value"] = myrealpath( $responses["directory"], $config["home_path"], $responses["get_cwd"] );
+	$responses["session_value"] = myrealpath( $responses["session"], $config["home_path"], $responses["get_cwd"] );
+
+	if ( $responses["max_file_size"] == -1 ) {
+		$responses["max_file_size_value"] = $message["disabled"];
+	} else {
+		$max_file_size_arr = switch_bytes( $responses["max_file_size"] );
+		$responses["max_file_size_value"] = sprintf( "%.1f", $max_file_size_arr[0] );
+		$responses["max_file_size_suffix"] = $max_file_size_arr[1];
+	}
+
+	if ( $responses["split_file_size"] == -1 ) {
+		$responses["split_file_size_value"] = $message["disabled"];
+	} else {
+		$split_file_size_arr = switch_bytes( $responses["split_file_size"] );
+		$responses["split_file_size_value"] = sprintf( "%.1f", $split_file_size_arr[0] );
+		$responses["split_file_size_suffix"] = $split_file_size_arr[1];
+	}
+
+	if ( $config["dht"] === "1" ) {
+		if ( $responses["dht_statistics_active"] != 0 ) {
+			$dht_statistics_bytes_read_arr = switch_bytes( $responses["dht_statistics_bytes_read"] );
+			$dht_statistics_bytes_written_arr = switch_bytes( $responses["dht_statistics_bytes_written"] );
+
+			$responses["dht_statistics_bytes_read_value"] = sprintf( "%.1f", $dht_statistics_bytes_read_arr[0] );
+			$responses["dht_statistics_bytes_read_suffix"] = $bytes_up_arr[1];
+			$responses["dht_statistics_bytes_written_value"] = sprintf( "%.1f", $dht_statistics_bytes_written_arr[0] );
+			$responses["dht_statistics_bytes_written_suffix"] = $dht_statistics_bytes_written_arr[1];
+		}
+
+		$responses["dht_statistics_active_value"] = $responses["dht_statistics_active"] == 0 ? $message["dht_0"] : $message["dht_1"];
+	}
+
+	ksort( $responses );
+
+	return true;
+}
+
+function prepare_downloadlist_responses( &$responses, &$message, &$home_path, &$cwd ) {
+	$d_bytes_done_arr = switch_bytes( $responses["d_bytes_done"] );
+	$d_chunk_size_arr = switch_bytes( $responses["d_chunk_size"] );
+	$d_completed_bytes_arr = switch_bytes( $responses["d_completed_bytes"] );
+	$d_down_rate_arr = switch_bytes( $responses["d_down_rate"] );
+	$d_down_total_arr = switch_bytes( $responses["d_down_total"] );
+	$d_free_diskspace_arr = switch_bytes( $responses["d_free_diskspace"] );
+	$d_left_bytes_arr = switch_bytes( $responses["d_left_bytes"] );
+	$d_max_file_size_arr = switch_bytes( $responses["d_max_file_size"] );
+	$d_size_bytes_arr = switch_bytes( $responses["d_size_bytes"] );
+	$d_skip_rate_arr = switch_bytes( $responses["d_skip_rate"] );
+	$d_skip_total_arr = switch_bytes( $responses["d_skip_total"] );
+	$d_up_rate_arr = switch_bytes( $responses["d_up_rate"] );
+	$d_up_total_arr = switch_bytes( $responses["d_up_total"] );
+
+	$responses["d_bytes_done_value"] = sprintf( "%.1f", $d_bytes_done_arr[0] );
+	$responses["d_bytes_done_suffix"] = $d_bytes_done_arr[1];
+	$responses["d_chunk_size_value"] = sprintf( "%.1f", $d_chunk_size_arr[0] );
+	$responses["d_chunk_size_suffix"] = $d_chunk_size_arr[1];
+	$responses["d_completed_bytes_value"] = sprintf( "%.1f", $d_completed_bytes_arr[0] );
+	$responses["d_completed_bytes_suffix"] = $d_completed_bytes_arr[1];
+	$responses["d_down_rate_value"] = sprintf( "%.1f", $d_down_rate_arr[0] );
+	$responses["d_down_rate_suffix"] = $d_down_rate_arr[1];
+	$responses["d_down_total_value"] = sprintf( "%.1f", $d_down_total_arr[0] );
+	$responses["d_down_total_suffix"] = $d_down_total_arr[1];
+	$responses["d_free_diskspace_value"] = sprintf( "%.1f", $d_free_diskspace_arr[0] );
+	$responses["d_free_diskspace_suffix"] = $d_free_diskspace_arr[1];
+	$responses["d_left_bytes_value"] = sprintf( "%.1f", $d_left_bytes_arr[0] );
+	$responses["d_left_bytes_suffix"] = $d_left_bytes_arr[1];
+	$responses["d_max_file_size_value"] = sprintf( "%.1f", $d_max_file_size_arr[0] );
+	$responses["d_max_file_size_suffix"] = $d_max_file_size_arr[1];
+	$responses["d_size_bytes_value"] = sprintf( "%.1f", $d_size_bytes_arr[0] );
+	$responses["d_size_bytes_suffix"] = $d_size_bytes_arr[1];
+	$responses["d_skip_rate_value"] = sprintf( "%.1f", $d_skip_rate_arr[0] );
+	$responses["d_skip_rate_suffix"] = $d_skip_rate_arr[1];
+	$responses["d_skip_total_value"] = sprintf( "%.1f", $d_skip_total_arr[0] );
+	$responses["d_skip_total_suffix"] = $d_skip_total_arr[1];
+	$responses["d_up_rate_value"] = sprintf( "%.1f", $d_up_rate_arr[0] );
+	$responses["d_up_rate_suffix"] = $d_up_rate_arr[1];
+	$responses["d_up_total_value"] = sprintf( "%.1f", $d_up_total_arr[0] );
+	$responses["d_up_total_suffix"] = $d_up_total_arr[1];
+
+	$responses["d_active_value"] = $responses["d_active"] == 1 ? $message["d_active_1"] : $message["d_active_0"];
+	$responses["d_complete_value"] = $responses["d_complete"] == 1 ? $message["d_complete_1"] : $message["d_complete_0"];
+	$responses["d_connection_current_value"] = $responses["d_connection_current"] == "seed" ? $message["d_connection_current_seed"] : $message["d_connection_current_leech"];
+	$responses["d_creation_date_value"] = date( "Y-m-d H:i:s", $responses["d_creation_date"] );
+	$responses["d_ignore_commands_value"] = $responses["d_ignore_commands"] == 1 ? $message["d_ignore_commands_1"] : $message["d_ignore_commands_0"];
+	$responses["d_hash_checked_value"] = $responses["d_hash_checked"] == 1 ? $message["d_hash_checked_1"] : $message["d_hash_checked_0"];
+	$responses["d_hash_checking_value"] = $responses["d_hash_checking"] == 1 ? $message["d_hash_checking_1"] : $message["d_hash_checking_0"];
+	$responses["d_multi_file_value"] = $responses["d_multi_file"] == 1 ? $message["d_multi_file_multi"] : $message["d_multi_file_single"];
+	$responses["d_open_value"] = $responses["d_open"] == 1 ? $message["d_open_1"] : $message["d_open_0"];
+	$responses["d_peer_exchange_value"] = $responses["d_peer_exchange"] == 0 ? $message["disabled"] : $message["enabled"];
+	$responses["d_peers_max_value"] = $responses["d_peers_max"] == -1 ? $message["disabled"] : $responses["d_peers_max"];
+	$responses["d_peers_min_value"] = $responses["d_peers_min"] == -1 ? $message["disabled"] : $responses["d_peers_min"];
+	$responses["d_pex_active_value"] = $responses["d_pex_active"] == 1 ? $message["yes"] : $message["no"];
+	$responses["d_private_value"] = $responses["d_private"] == 1 ? $message["yes"] : $message["no"];
+	$responses["d_state_value"] = $responses["d_state"] == 1 ? $message["d_state_1"] : $message["d_state_0"];
+	$responses["d_state_changed_value"] = date( "Y-m-d H:i:s", $responses["d_state_changed"] );
+	$responses["d_tracker_numwant_value"] = $responses["d_tracker_numwant"] == -1 ? $message["disabled"] : $responses["d_tracker_numwant"];
+	$responses["d_uploads_max_value"] = $responses["d_uploads_max"] == -1 ? $message["disabled"] : $responses["d_uploads_max"];
+
+	$responses["d_base_path_value"] = myrealpath( $responses["d_base_path"], $config["home_path"], $cwd );
+	$responses["d_directory_value"] = myrealpath( $responses["d_directory"], $config["home_path"], $cwd );
+	$responses["d_tied_to_file_value"] = myrealpath( $responses["d_tied_to_file"], $config["home_path"], $cwd );
+
+	if ( $responses["d_down_rate"] > 0 ) {
+		$responses["d_estimated_time"] = $responses["d_left_bytes"] / $responses["d_down_rate"];
+		$responses["d_estimated_time_value"] = sprintf( "%dd %02d:%02d", floor( $responses["d_estimated_time"] / 86400 ), floor( $responses["d_estimated_time"] / 3600 ) % 24, floor( $responses["d_estimated_time"] / 60 ) % 60 );
+		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
+		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
+	} elseif ( $responses["d_hashing"] != 0 ) {
+		$responses["d_estimated_time"] = "";
+		$responses["d_estimated_time_value"] = "";
+		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
+		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
+		$responses["d_hpercentage"] = $responses["d_chunks_hashed"] / $responses["d_size_chunks"];
+		$responses["d_hpercentage_value"] = floor( $responses["d_chunks_hashed"] / $responses["d_size_chunks"] * 100 );
+	} elseif ( $responses["d_complete"] != 1 ) {
+		$responses["d_estimated_time"] = "";
+		$responses["d_estimated_time_value"] = "";
+		$responses["d_percentage"] = $responses["d_completed_bytes"] / $responses["d_size_bytes"];
+		$responses["d_percentage_value"] = floor( $responses["d_completed_bytes"] / $responses["d_size_bytes"] * 100 );
+	} else {
+		$responses["d_estimated_time"] = "";
+		$responses["d_estimated_time_value"] = "";
+		$responses["d_percentage"] = 1;
+		$responses["d_percentage_value"] = 100;
+	}
+
+	switch ( $responses["d_hashing"] ) {
+		case 1 : $responses["d_hashing_value"] = $message["d_hashing_1"]; break;
+		case 2 : $responses["d_hashing_value"] = $message["d_hashing_2"]; break;
+		case 3 : $responses["d_hashing_value"] = $message["d_hashing_3"]; break;
+		default : $responses["d_hashing_value"] = $message["d_hashing_0"]; break;
+	}
+	switch ( $responses["d_priority"] ) {
+		case 1 : $responses["d_priority_value"] = $message["d_priority_1"]; break;
+		case 2 : $responses["d_priority_value"] = $message["d_priority_2"]; break;
+		case 3 : $responses["d_priority_value"] = $message["d_priority_3"]; break;
+		default : $responses["d_priority_value"] = $message["d_priority_0"]; break;
+	}
+
+	$responses["d_ratio_value"] = sprintf( "%.3f", $responses["d_ratio"] / 1000 );
+
+	ksort( $responses );
+
+	return true;
+}
+
+function prepare_filelist_responses( &$responses, &$message, &$home_path, &$cwd ) {
+	$responses["f_last_touched"] = sprintf( "%.0f", $responses["f_last_touched"] );
+	$responses["f_range_first"] += 1;
+
+	$f_size_bytes_arr = switch_bytes( $responses["f_size_bytes"] );
+
+	$responses["f_size_bytes_value"] = sprintf( "%.1f", $f_size_bytes_arr[0] );
+	$responses["f_size_bytes_suffix"] = $f_size_bytes_arr[1];
+
+	$responses["f_open_value"] = $responses["f_open"] == 1 ? $message["f_open_1"] : $message["f_open_0"];
+	$responses["f_last_touched_value"] = date( "Y-m-d H:i:s", substr( $responses["f_last_touched"], 0, -6 ) );
+
+	$responses["f_frozen_path_value"] = myrealpath( $responses["f_frozen_path"], $config["home_path"], $cwd );
+
+	if ( $responses["f_size_chunks"] == 0 ) {
+		$responses["f_percentage"] = 1;
+		$responses["f_percentage_value"] = 100;
+	} else {
+		$responses["f_percentage"] = $responses["f_completed_chunks"] / $responses["f_size_chunks"];
+		$responses["f_percentage_value"] = floor( $responses["f_completed_chunks"] / $responses["f_size_chunks"] * 100 );
+	}
+
+	switch ( $responses["f_priority"] ) {
+		case 1 : $responses["f_priority_value"] = $message["f_priority_1"]; break;
+		case 2 : $responses["f_priority_value"] = $message["f_priority_2"]; break;
+		default : $responses["f_priority_value"] = $message["f_priority_0"]; break;
+	}
+
+	ksort( $responses );
+
+	return true;
+}
+
+function prepare_peerlist_responses( &$responses, &$message, &$config = array() ) {
+	if ( $config["flags"] === "1" ) {
+		$responses["p_country"] = strtolower( geoip_country_code_by_name( $responses["p_address"] ) );
+		if ( $responses["p_country"] == "" ) {
+			$responses["p_country"] = "unknown";
+			$responses["p_country_value"] = $message["unknown"];
+		} else {
+			$responses["p_country_value"] = @geoip_country_name_by_name( $responses["p_address"] );
+		}
+	}
+	
+	$p_down_rate_arr = switch_bytes( $responses["p_down_rate"] );
+	$p_down_total_arr = switch_bytes( $responses["p_down_total"] );
+	$p_peer_rate_arr = switch_bytes( $responses["p_peer_rate"] );
+	$p_peer_total_arr = switch_bytes( $responses["p_peer_total"] );
+	$p_up_rate_arr = switch_bytes( $responses["p_up_rate"] );
+	$p_up_total_arr = switch_bytes( $responses["p_up_total"] );
+
+	$responses["p_down_rate_value"] = sprintf( "%.1f", $p_down_rate_arr[0] );
+	$responses["p_down_rate_suffix"] = $p_down_rate_arr[1];
+	$responses["p_down_total_value"] = sprintf( "%.1f", $p_down_total_arr[0] );
+	$responses["p_down_total_suffix"] = $p_down_total_arr[1];
+	$responses["p_peer_rate_value"] = sprintf( "%.1f", $p_peer_rate_arr[0] );
+	$responses["p_peer_rate_suffix"] = $p_peer_rate_arr[1];
+	$responses["p_peer_total_value"] = sprintf( "%.1f", $p_peer_total_arr[0] );
+	$responses["p_peer_total_suffix"] = $p_peer_total_arr[1];
+	$responses["p_up_rate_value"] = sprintf( "%.1f", $p_up_rate_arr[0] );
+	$responses["p_up_rate_suffix"] = $p_up_rate_arr[1];
+	$responses["p_up_total_value"] = sprintf( "%.1f", $p_up_total_arr[0] );
+	$responses["p_up_total_suffix"] = $p_up_total_arr[1];
+
+	$responses["p_encrypted_value"] = $responses["p_encrypted"] == 1 ? $message["p_encrypted_1"] : $message["p_encrypted_0"];
+	$responses["p_incoming_value"] = $responses["p_incoming"] == 1 ? $message["p_incoming_1"] : $message["p_incoming_0"];
+
+	ksort( $responses );
+
+	return true;
+}
+
+function prepare_trackerlist_responses( &$responses, &$message ) {
+	$t_scrape_downloaded_arr = switch_bytes( $responses["t_scrape_downloaded"] );
+
+	$responses["t_scrape_time_last"] = sprintf( "%.0f", $responses["t_scrape_time_last"] );
+
+	$responses["t_enabled_value"] = $responses["t_enabled"] == 1 ? $message["t_enabled_1"] : $message["t_enabled_0"];
+	$responses["t_open_value"] = $responses["t_open"] == 1 ? $message["t_open_1"] : $message["t_open_0"];
+	$responses["t_min_interval_value"] = sprintf( "%02d:%02d:%02d", floor( $responses["t_min_interval"] / 3600 ), $responses["t_min_interval"] / 60 % 60, $responses["t_min_interval"] % 60 );
+	$responses["t_normal_interval_value"] = sprintf( "%02d:%02d:%02d", floor( $responses["t_normal_interval"] / 3600 ), $responses["t_normal_interval"] / 60 % 60, $responses["t_normal_interval"] % 60 );
+
+	if ( $responses["t_scrape_time_last"] == 0 ) {
+		$responses["t_scrape_time_last_value"] = date( "Y-m-d H:i:s", $responses["t_scrape_time_last"] );
+	} else {
+		$responses["t_scrape_time_last_value"] = date( "Y-m-d H:i:s", substr( $responses["t_scrape_time_last"], 0, -6 ) );
+	}
+	$responses["t_type_value"] = $responses["t_type"] == 1 ? $message["t_type_1"] : $message["t_type_2"];
+
+	ksort( $responses );
+
+	return true;
+}
+
+function addlanguages( &$xml, &$root, &$node, &$languages ) {
+	$root->setAttribute( "language", $_SESSION["rtwi_language"] );
+
+	// adding languages
+	$rrrnode = $node->appendChild( $xml->createElement( "languages" ) );
+	$rrrnode->setAttribute( "value", $_SESSION["rtwi_language"] );
+	foreach ( $languages as $key => $val ) {
+		$rrnode = $rrrnode->appendChild( $xml->createElement( "language" ) );
+		$rrnode->setAttribute( "value", $key );
+		$rrnode->setAttribute( "title", $val );
+	}
+}
+
+function addrefreshrates( &$xml, &$root, &$node, &$refreshrates ) {
+	$root->setAttribute( "refreshrate", $_SESSION["rtwi_refresh"] );
+
+	// adding refresh rates
+	$rrrnode = $node->appendChild( $xml->createElement( "refreshrates" ) );
+	$rrrnode->setAttribute( "value", $_SESSION["rtwi_refresh"] );
+	foreach ( $refreshrates as $key => $val ) {
+		$rrnode = $rrrnode->appendChild( $xml->createElement( "refreshrate" ) );
+		$rrnode->setAttribute( "value", substr( $key, 12 ) );
+		$rrnode->setAttribute( "title", $val );
+	}
+}
+
+function addviewtypes( &$xml, &$root, &$node, &$view_list, &$viewtypes ) {
+	$root->setAttribute( "viewtype", $_SESSION["rtwi_view"] );
+
+	// adding viewtypes
+	$vcrnode = $node->appendChild( $xml->createElement( "viewtypes" ) );
+	$vcrnode->setAttribute( "value", $_SESSION["rtwi_view"] );
+	foreach ( $view_list as $key => $val ) {
+		$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
+		$vcnode->setAttribute( "value", $val );
+		$vcnode->setAttribute( "title", isset( $viewtypes["viewtype_{$val}"] ) ? $viewtypes["viewtype_{$val}"] : $val );
+	}
+}
+
+function build_xmltree( &$dstruct, &$tree, &$xml, $fullpath, $responses ) {
+	foreach ( $dstruct as $key => $val ) {
+		if ( is_array( $val ) ) {
+			$subtree = $tree->appendChild( $xml->createElement( "directory" ) );
+			$subtree->setAttribute( "id", sha1( mt_rand() ) );
+			$subtree->setAttribute( "dirname", $key );
+			$subtree->setAttribute( "dirpath", urlencode( "{$fullpath}/{$key}" ) );
+			$ret = build_xmltree( $val, $subtree, $xml, "{$fullpath}/{$key}", $responses );
+		} else {
+			$ret = $tree->appendChild( $xml->createElement( "file" ) );
+			$ret->setAttribute( "id", $key );
+			$ret->setAttribute( "filename", $val );
+			xmlrpc_multiappend( $xml, $ret, $responses[$key] );
+		}
+	}
+
+	return $ret;
+}
+
+function xmlrpc_multiappend( &$xml, &$dnode, &$responses ) {
+	$keys = array_keys( $responses );
+	reset( $responses );
+	while ( list( $rkey, $rval ) = each( $responses ) ) {
+		$rval = str_replace( "&", "&amp;", $rval );
+		if ( array_key_exists( "{$rkey}_suffix", $responses ) ) {
+			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
+			$node->setAttribute( "suffix", $responses["{$rkey}_suffix"] );
+			$node->setAttribute( "value", $responses["{$rkey}_value"] );
+			unset( $responses["{$rkey}_suffix"] );
+			unset( $responses["{$rkey}_value"] );
+		} elseif ( array_key_exists( "{$rkey}_value", $responses ) ) {
+			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
+			$node->setAttribute( "value", $responses["{$rkey}_value"] );
+			unset( $responses["{$rkey}_value"] );
+		} elseif ( is_array( $rval ) ) {
+		} else {
+			$node = $dnode->appendChild( $xml->createElement( $rkey, $rval ) );
+		}
+	}
+
+	return true;
+}
+
+error_reporting( E_ALL );
+error_reporting( E_ALL ^ E_NOTICE );
+
+set_time_limit( 10 );
+
+// setting default
+session_start();
+
+// reading config files
+$config = parse_ini_file( "includes/rtwi.conf", true );
+$users = parse_ini_file( $config["user_conf"], true );
+
+// set language from cookie if exists
+if ( !isset( $_SESSION["rtwi_language"] ) ) {
+	$_SESSION["rtwi_language"] = isset( $_COOKIE["rtwi_language"] ) ? $_COOKIE["rtwi_language"] : $config["lang"];
+}
+
+/*
+$lang = parse_ini_file( "includes/{$_SESSION["rtwi_language"]}.lang", true );
+print "<pre>";
+print_r( $lang );
+print "</pre>";
+*/
+
+// including neccessary files
+require_once( "includes/classes/xmlrpc_handler.inc.php" );
+require_once( "includes/messages.{$_SESSION["rtwi_language"]}.inc.php" );
+require_once( "includes/tools/functions.time.inc.php" );
+
+$st = getmicrotime();
+$callnum = 0;
+$calltime = 0;
+$multicallnum = 0;
+
+// initializing xmlrpc methods
+$xmlrpc_methods = array(
+	"si"	=> $config["dht"] === "1" ? 
+			array( "dht_statistics", "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_dht_port", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ) :
+			array( "get_bind", "get_check_hash", "get_connection_leech", "get_connection_seed", "get_directory", "get_download_rate", "get_handshake_log", "get_hash_interval", "get_hash_max_tries", "get_hash_read_ahead", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_max_downloads_div", "get_max_downloads_global", "get_max_file_size", "get_max_memory_usage", "get_max_open_files", "get_max_open_http", "get_max_open_sockets", "get_max_peers", "get_max_peers_seed", "get_max_uploads", "get_max_uploads_div", "get_max_uploads_global", "get_memory_usage", "get_min_peers", "get_min_peers_seed", "get_name", "get_peer_exchange", "get_port_open", "get_port_random", "get_port_range", "get_preload_min_size", "get_preload_required_rate", "get_preload_type", "get_proxy_address", "get_receive_buffer_size", "get_safe_free_diskspace", "get_safe_sync", "get_scgi_dont_route", "get_send_buffer_size", "get_session", "get_session_lock", "get_session_on_completion", "get_split_file_size", "get_split_suffix", "get_stats_not_preloaded", "get_stats_preloaded", "get_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_upload_rate", "get_use_udp_trackers", "system.client_version", "system.get_cwd", "system.hostname", "system.library_version", "system.pid", "view_list" ),
+	"d"	=> array( "d.get_base_filename=", "d.get_base_path=", "d.get_bytes_done=", "d.get_chunk_size=", "d.get_chunks_hashed=", "d.get_complete=", "d.get_completed_bytes=", "d.get_completed_chunks=", "d.get_connection_current=", "d.get_connection_leech=", "d.get_connection_seed=", "d.get_creation_date=", "d.get_custom1=", "d.get_custom2=", "d.get_custom3=", "d.get_custom4=", "d.get_custom5=", "d.get_directory=", "d.get_down_rate=", "d.get_down_total=", "d.get_free_diskspace=", "d.get_hash=", "d.get_hashing=", "d.get_ignore_commands=", "d.get_left_bytes=", "d.get_local_id=", "d.get_local_id_html=", "d.get_max_file_size=", "d.get_max_size_pex=", "d.get_message=", "d.get_name=", "d.get_peer_exchange=", "d.get_peers_accounted=", "d.get_peers_complete=", "d.get_peers_connected=", "d.get_peers_max=", "d.get_peers_min=", "d.get_peers_not_connected=", "d.get_priority=", "d.get_priority_str=", "d.get_ratio=", "d.get_size_bytes=", "d.get_size_chunks=", "d.get_size_files=", "d.get_size_pex=", "d.get_skip_rate=", "d.get_skip_total=", "d.get_state=", "d.get_state_changed=", "d.get_tied_to_file=", "d.get_tracker_focus=", "d.get_tracker_numwant=", "d.get_tracker_size=", "d.get_up_rate=", "d.get_up_total=", "d.get_uploads_max=", "d.is_active=", "d.is_hash_checked=", "d.is_hash_checking=", "d.is_multi_file=", "d.is_open=", "d.is_pex_active=", "d.is_private=" ),
+	"f"	=> array( "f.get_completed_chunks=", "f.get_frozen_path=", "f.is_created=", "f.is_open=", "f.get_last_touched=", "f.get_match_depth_next=", "f.get_match_depth_prev=", "f.get_offset=", "f.get_path=", "f.get_path_components=", "f.get_path_depth=", "f.get_priority=", "f.get_range_first=", "f.get_range_second=", "f.get_size_bytes=", "f.get_size_chunks=" ),
+	"p"	=> array( "p.get_address=", "p.get_client_version=", "p.get_completed_percent=", "p.get_down_rate=", "p.get_down_total=", "p.get_id=", "p.get_id_html=", "p.get_options_str=", "p.get_peer_rate=", "p.get_peer_total=", "p.get_port=", "p.get_up_rate=", "p.get_up_total=", "p.is_encrypted=", "p.is_incoming=", "p.is_obfuscated=", "p.is_snubbed=" ),
+	"t"	=> array( "t.get_group=", "t.get_id=", "t.get_min_interval=", "t.get_normal_interval=", "t.get_scrape_complete=", "t.get_scrape_downloaded=", "t.get_scrape_incomplete=", "t.get_scrape_time_last=", "t.get_type=", "t.get_url=", "t.is_enabled=", "t.is_open=" ),
+	"g"	=> array( "d.get_name", "d.get_directory", "f.get_path", "f.get_frozen_path", "f.get_size_bytes" ),
+);
+
+// getting request values
+if ( isset( $_REQUEST["mod"] ) ) {
+	$mod = $_REQUEST["mod"];
+} else {
+	$mod = "";
+}
+
+if ( isset( $_REQUEST["hash"] ) ) {
+	$hash = $_REQUEST["hash"];
+} else {
+	$hash = "";
+}
+
+if ( isset( $_REQUEST["page"] ) ) {
+	switch ( $_REQUEST["page"] ) {
+		case "transfers" : {
+			$page = "transfers";
+			break;
+		}
+		case "chunks" : {
+			$page = "chunks";
+			break;
+		}
+		case "trackers" : {
+			$page = "trackers";
+			break;
+		}
+		case "files" : {
+			$page = "files";
+			break;
+		}
+		case "peers" : {
+			$page = "peers";
+			break;
+		}
+		default : {
+			$page = "info";
+			break;
+		}
+	}
+} else {
+	$page = "info";
+}
+
+if ( isset( $_REQUEST["id"] ) ) {
+	$id = $_REQUEST["id"];
+	settype( $id, "int" );
+} else {
+	$id = -1;
+}
+
+if ( isset( $_REQUEST["path"] ) ) {
+	$path = $_REQUEST["path"];
+} else {
+	$path = "";
+}
+
+if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] === "true" && $config["ajax"] === "1" ) {
+	$ajax = true;
+} else {
+	$ajax = false;
+}
+
+//print_r( $_COOKIE );
+
+// checking if user is logged in
+if ( ( isset( $_SESSION["rtwi_auth"] ) && $_SESSION["rtwi_auth"] === 1 ) || ( isset( $_COOKIE["rtwi_auth"] ) && $_COOKIE["rtwi_auth"] == 1 && isset( $_COOKIE["rtwi_nick"] ) && array_key_exists( $_COOKIE["rtwi_nick"], $users ) ) ) {
+	// setting values from cookie if exists
+	if ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) {
+		$_SESSION["rtwi_auth"] = 1;
+		$_SESSION["rtwi_nick"] = $_COOKIE["rtwi_nick"];
+		$_SESSION["rtwi_cadr"] = $users[$_COOKIE["rtwi_nick"]]["address"];
+
+		// setting rtorrent's connection address
+		if ( substr( $_SESSION["rtwi_cadr"], 0, 7 ) === "unix://" ) {
+			$_SESSION["rtwi_cadr"] = myrealpath( substr( $_SESSION["rtwi_cadr"], 7 ), $config["home_path"], "{$config["home_path"]}{$_SESSION["rtwi_nick"]}" );
+			$_SESSION["rtwi_cadr"] = "unix://{$_SESSION["rtwi_cadr"]}";
+		}
+	}
+
+	// initializing rtorrent connection
+	$xmlrpc = new xmlrpc_handler( $_SESSION["rtwi_cadr"], 10 );
+
+	if ( $xmlrpc->getconntype() == "http" ) {
+		$xmlrpc->setaccount( $_SESSION["rtwi_nick"], $_SESSION["rtwi_password"] );
+	}
+
+	// setting sort view mode from cookie if exists
+	if ( !isset( $_SESSION["rtwi_view"] ) ) {
+		$_SESSION["rtwi_view"] = isset( $_COOKIE["rtwi_view"] ) ? $_COOKIE["rtwi_view"] : "default";
+	}
+	// setting auto-refresh rate from cookie if exists
+	if ( !isset( $_SESSION["rtwi_refresh"] ) ) {
+		$_SESSION["rtwi_refresh"] = isset( $_COOKIE["rtwi_refresh"] ) ? $_COOKIE["rtwi_refresh"] : 0;
+	}
+} else {
+	// show login page if not logged in
+	$mod = "login";
+}
+
+// initializing xml
+$xml = new DOMDocument( "1.0", "utf-8" );
+$xml->formatOutput = true;
+
+$root = $xml->appendChild( $xml->createElement( "root" ) );
+
+$root->appendChild( $xml->createElement( "mod", $mod ) );
+$root->appendChild( $xml->createElement( "hash", $hash ) );
+$root->appendChild( $xml->createElement( "page", $page ) );
+$root->appendChild( $xml->createElement( "id", $id ) );
+$root->appendChild( $xml->createElement( "burl", $config["base"] ) );
+$root->appendChild( $xml->createElement( "url", $config["index"] ) );
+$root->appendChild( $xml->createElement( "iurl", $config["input"] ) );
+$root->appendChild( $xml->createElement( "curl", str_replace( "&", "&amp;", $_SERVER["REQUEST_URI"] ) ) );
+$root->appendChild( $xml->createElement( "purl", isset( $_SESSION["rtwi_lastpage"] ) ? str_replace( "&", "&amp;", $_SESSION["rtwi_lastpage"] ) : "" ) );
+$root->appendChild( $xml->createElement( "datetime", date( "Y. m. d. H:i:s", time() ) ) );
+$root->appendChild( $xml->createElement( "language", $_SESSION["rtwi_language"] ) );
+
+// adding allowed settings in xml
+foreach ( $config as $key => $val ) {
+	if ( $val === "1" ) {
+		$root->appendChild( $xml->createElement( "allow_{$key}", "true" ) );
+	}
+}
+
+// adding translation to xml
+$labels = $root->appendChild( $xml->createElement( "labels" ) );
+foreach ( $label as $key => $val ) {
+	$labels->appendChild( $xml->createElement( $key, $val ) );
+}
+$labels->getElementsByTagName( "mailto" )->item( 0 )->nodeValue = str_rot13( base64_encode( str_rot13( $labels->getElementsByTagName( "mailto" )->item( 0 )->nodeValue ) ) );
+
+//print_r( $_SESSION );
+//print_r( $_REQUEST );
+
+// deciding what to do
+switch ( $mod ) {
+	case "login" : { // login
+		// adding language select
+		if ( $config["language"] ) {
+			addlanguages( $xml, $root, $root, $languages );
+		}
+
+		$layout_file = "layout.main.login.xsl";
+
+		break;
+	}
+	case "serverinfo" : { // server info
+		// creating torrents node
+		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+		// adding auto-refresh select
+		if ( $config["refresh"] ) {
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		// adding language select
+		if ( $config["language"] ) {
+			addlanguages( $xml, $root, $tnode, $languages );
+		}
+
+		// retrieving server info
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		if ( !$xmlrpc->call() || !$xmlrpc->parse() ) {
+		}
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+		// getting up/down rates for totals
+		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
+		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
+
+		// counting totals
+		$bytes_down = 0;
+		$bytes_up = 0;
+		for ( $i = 0; $i < count( $response ); $i++ ) {
+			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
+				$d_responses[$i][$methodval] = $response[$i][$r];
+			}
+			$bytes_down += $d_responses[$i]["d_down_rate"];
+			$bytes_up += $d_responses[$i]["d_up_rate"];
+		}
+
+		$si_responses["bytes_down"] = $bytes_down;
+		$si_responses["bytes_up"] = $bytes_up;
+
+		// preparing values
+		prepare_serverinfo_responses( $si_responses, $message, $config );
+
+		// addng some more values to xml (total up/down rate, limits)
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
+		// addng some more values to xml (total up/down rate, limits)
+		$inode = $tnode->appendChild( $xml->createElement( "server_info" ) );
+		xmlrpc_multiappend( $xml, $inode, $si_responses );
+
+		$layout_file = "layout.main.index.xsl";
+
+		break;
+	}
+	case "addtorrent" : { // add a new torrent
+		// getting download directory
+		$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$directories = $xmlrpc->fetch();
+		$directory = $directories[0];
+		$cwd = $directories[1];
+
+		// full download directory path
+		$directory = myrealpath( $directories[0][0], $config["home_path"], $directories[1][0] );
+
+		$ppath = substr( $path, 0, strrpos( $path, "/" ) );
+		// scanning for subdirectories
+		$scan = scandir( myrealpath( "{$directory}/{$path}", $config["home_path"], $directories[1][0] ) );
+		// checking free space
+		$freespace = switch_bytes( disk_free_space( myrealpath( "{$directory}/{$ppath}", $config["home_path"], $directories[1][0] ) ) );
+
+		// adding values to xml
+		$atnode = $root->appendChild( $xml->createElement( "addtorrent" ) );
+		$atnode->setAttribute( "name", $ppath );
+		$atnode->setAttribute( "path", $path );
+		$atnode->setAttribute( "ppath", urlencode( $ppath ) );
+		$atnode->setAttribute( "freespace", disk_free_space( "{$directory}/{$ppath}" ) );
+		$atnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
+		$atnode->setAttribute( "freespace_suffix", $freespace[1] );
+
+		// adding language select
+		if ( $config["language"] === "1" ) {
+			addlanguages( $xml, $root, $atnode, $languages );
+		}
+
+		// checking subdirectories for free space
+		foreach( $scan as $key => $val ) {
+			$dpath = str_replace( "//", "/", "{$path}/{$val}" );
+			$fdpath = str_replace( "//", "/", "{$directory}/{$dpath}" );
+			if ( ( is_dir( $fdpath ) || ( is_link( $fdpath ) && is_dir( readlink( $fdpath ) ) ) ) && substr( $val, 0, 1 ) != "."  ) {
+				$freespace = switch_bytes( disk_free_space( $fdpath ) );
+
+				$dnode = $atnode->appendChild( $xml->createElement( "dlpath" ) );
+				$dnode->setAttribute( "name", $val );
+				$dnode->setAttribute( "path", urlencode( $dpath ) );
+				$dnode->setAttribute( "freespace", disk_free_space( $fdpath ) );
+				$dnode->setAttribute( "freespace_value", sprintf( "%.1f", $freespace[0] ) );
+				$dnode->setAttribute( "freespace_suffix", $freespace[1] );
+			}
+		}
+
+		$layout_file = "layout.main.index.xsl";
+
+		break;
+	}
+	case "torrent" : { // torrent
+		// creating torrents node
+		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+		// adding auto-refresh select
+		if ( $config["refresh"] ) {
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		// adding language select
+		if ( $config["language"] ) {
+			addlanguages( $xml, $root, $tnode, $languages );
+		}
+
+		// retrieving server info
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+		// retrieving download info
+		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
+
+		// counting totals
+		$bytes_down = 0;
+		$bytes_up = 0;
+		$torrent = false;
+		for ( $i = 0; $i < count( $response ); $i++ ) {
+			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
+				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
+				$d_responses[$i][$methodval] = $response[$i][$r];
+			}
+			$bytes_down += $d_responses[$i]["d_down_rate"];
+			$bytes_up += $d_responses[$i]["d_up_rate"];
+
+			// if hash matches save the download data
+			if ( $d_responses[$i]["d_hash"] == $hash ) {
+				$torrent = $d_responses[$i];
+			}
+		}
+		unset( $d_responses );
+
+		// when we have a match
+		if ( is_array( $torrent ) ) {
+			// prepare download variables
+			prepare_downloadlist_responses( $torrent, $message, $home_path, $si_responses["get_cwd"] );
+			// decide what to do
+			switch ( $page ) {
+				case "peers" : { // peer list page
+					// create peer nodes
+					$node = $tnode->appendChild( $xml->createElement( "torrent_peers_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_peers" ) );
+
+					// retrieve peer list info
+					$xmlrpc->setrequest( "p.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["p"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
+					
+					// process the peer info
+					for ( $i = 0; $i < count( $response ); $i++ ) {
+						for ( $r = 0; $r < count( $xmlrpc_methods["p"] ); $r++ ) {
+							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["p"][$r] );
+							$responses[$i][$methodval] = $response[$i][$r];
+						}
+					}
+					// adding an ID to each peer in the list
+					for ( $i = 0; $i < $torrent["d_peers_connected"]; $i++ ) {
+						prepare_peerlist_responses( $responses[$i], $message, $config );
+						$pnode = $node->appendChild( $xml->createElement( "peer" ) );
+						$pnode->setAttribute( "id", $i );
+						xmlrpc_multiappend( $xml, $pnode, $responses[$i] );
+					}
+
+
+					break;
+				}
+				case "info" : {
+					// crate info nodes
+					$node = $tnode->appendChild( $xml->createElement( "torrent_info_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_info" ) );
+
+					break;
+				}
+				case "files" : {
+					// create file list nodes
+					$node = $tnode->appendChild( $xml->createElement( "torrent_files_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_files" ) );
+
+					// create downloads root direcrory node
+					$node = $node->appendChild( $xml->createElement( "files_root" ) );
+					$node = $node->appendChild( $xml->createElement( "directory" ) );
+					$node->setAttribute( "dirname", $torrent["d_directory_value"] );
+
+					$fst = getmicrotime();
+
+					// retreive file list info
+					$xmlrpc->setrequest( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["f"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
+					// process the file info
+					for ( $i = 0; $i < count( $response ); $i++ ) {
+						for ( $r = 0; $r < count( $xmlrpc_methods["f"] ); $r++ ) {
+							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["f"][$r] );
+							$responses[$i][$methodval] = $response[$i][$r];
+						}
+					}
+
+					// build som kind of struct
+					$dstruct = array();
+					for ( $i = 0; $i < $torrent["d_size_files"]; $i++ ) {
+						prepare_filelist_responses( $responses[$i], $message, $home_path, $si_responses["get_cwd"] );
+
+						$n = 0;
+						$tmp = &$dstruct;
+						foreach ( $responses[$i]["f_path_components"] as $key => $val ) {
+							if ( count( $responses[$i]["f_path_components"] ) == ++$n ) {
+								$tmp[$i] = $val;
+							} else {
+								if ( !isset( $tmp[$val] ) ) {
+									$tmp[$val] = array();
+								}
+								$tmp = &$tmp[$val];
+							}
+						}
+
+					}
+					// build an xml tree of the files
+					$fnode = build_xmltree( $dstruct, $node, $xml, $torrent["d_directory_value"], $responses );
+
+					$ftt = getmicrotime();
+
+					break;
+				}
+				case "trackers" : {
+					// creating tracker list nodes
+					$node = $tnode->appendChild( $xml->createElement( "torrent_trackers_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
+
+					// retrieving tracker list info
+					$xmlrpc->setrequest( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $xmlrpc_methods["t"] ) );
+					$xmlrpc->call();
+					$xmlrpc->parse();
+					$response = $xmlrpc->fetch();
+					// processing the tracker info
+					for ( $i = 0; $i < count( $response ); $i++ ) {
+						for ( $r = 0; $r < count( $xmlrpc_methods["t"] ); $r++ ) {
+							$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["t"][$r] );
+							$responses[$i][$methodval] = $response[$i][$r];
+						}
+					}
+					// adding an ID to each tracker in the list
+					for ( $i = 0; $i < $torrent["d_tracker_size"]; $i++ ) {
+						prepare_trackerlist_responses( $responses[$i], $message, $home_path );
+						$tracnode = $node->appendChild( $xml->createElement( "tracker" ) );
+						$tracnode->setAttribute( "id", $i );
+						xmlrpc_multiappend( $xml, $tracnode, $responses[$i] );
+					}
+
+					break;
+				}
+				case "chunks" : { // unimplemented
+					$node = $tnode->appendChild( $xml->createElement( "torrent_chunks_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_chunks" ) );
+
+					break;
+				}
+				case "transfers" : { // unimplemented
+					$node = $tnode->appendChild( $xml->createElement( "torrent_transfers_root" ) );
+					$node = $node->appendChild( $xml->createElement( "torrent_transfers" ) );
+
+					break;
+				}
+			}
+			// adding the download info to the xml
+			xmlrpc_multiappend( $xml, $node, $torrent );
+		} else {
+			$_SESSION["rtwi_err"] = "nohashfound";
+		}
+
+		$si_responses["bytes_down"] = $bytes_down;
+		$si_responses["bytes_up"] = $bytes_up;
+
+		// adding values to xml
+		prepare_serverinfo_responses( $si_responses, $message, $home_path, $config );
+
+		// addng some more values to xml (total up/down rate, limits)
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
+		// decide what to send back to the browser
+		if ( $ajax === true ) {
+			$layout_file = "layout.ajax.index.xsl";
+		} else {
+			$layout_file = "layout.main.index.xsl";
+		}
+
+		break;
+	}
+	case "getfile" : { // download a file
+		// checking if users are allowed to download
+		if ( !$config["download"] ) {
+			$_SESSION["rtwi_err"] = "downloadnotallowed";
+			header( "location: {$url["index"]}" );
+			exit;
+		} elseif ( $id < 0 ) { // checking if the file id is given and is valid
+			$_SESSION["rtwi_err"] = "noidfound";
+			header( "location: {$url["index"]}" );
+			exit;
+		} else {
+			// retrieving server info
+			$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+			$xmlrpc->call();
+			$xmlrpc->parse();
+			$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+			// retrieving download info
+			$xmlrpc->setrequest( "download_list", array( $_SESSION["rtwi_view"] ) );
+			$xmlrpc->call();
+			$xmlrpc->parse();
+			$torrents = $xmlrpc->fetch();
+
+			// checking if we've found the torrent
+			if ( in_array( $hash, $torrents ) ) {
+				// getting the filename
+				$xmlrpc->setmrequest( $xmlrpc_methods["g"], array( $hash, $id ) );
+				$xmlrpc->call();
+				$xmlrpc->parse();
+				$response = $xmlrpc->mfetch( $xmlrpc_methods["g"] );
+
+				// getting the absolute path of the download's directory
+				$d_directory_value = myrealpath( $response["d_directory"], $home_path, $si_responses["get_cwd"] );
+			} else {
+				$_SESSION["rtwi_err"] = "nohashfound";
+				$layout_file = "layout.main.index.xsl";
+			}
+		}
+
+		break;
+	}
+	default : { // torrents
+		// retrieving server info
+		$xmlrpc->setmrequest( $xmlrpc_methods["si"] );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$si_responses = $xmlrpc->mfetch( $xmlrpc_methods["si"] );
+
+		// creating torrents node
+		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+		// adding sort view select
+		addviewtypes( $xml, $root, $tnode, $si_responses["view_list"], $viewtypes );
+		// adding auto-refresh select
+		if ( $config["refresh"] ) {
+			addrefreshrates( $xml, $root, $tnode, $refreshrates );
+		}
+		// adding language select
+		if ( $config["language"] ) {
+			addlanguages( $xml, $root, $tnode, $languages );
+		}
+
+		// retrieving download info
+		$xmlrpc->setrequest( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $xmlrpc_methods["d"] ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
+
+		// valirables for counting total up/down rate
+		$bytes_down = 0;
+		$bytes_up = 0;
+		// process the download info
+		for ( $i = 0; $i < count( $response ); $i++ ) {
+			for ( $r = 0; $r < count( $xmlrpc_methods["d"] ); $r++ ) {
+				$methodval = preg_replace( "/(.)\.(get|is)_(.*)=/", "$1_$3", $xmlrpc_methods["d"][$r] );
+				$d_responses[$i][$methodval] = $response[$i][$r];
+			}
+			// oincreasing total up/down rate with the current download's rates
+			$bytes_down += $d_responses[$i]["d_down_rate"];
+			$bytes_up += $d_responses[$i]["d_up_rate"];
+
+			// formatting and inserting values to xml
+			prepare_downloadlist_responses( $d_responses[$i], $message, $home_path, $si_responses["get_cwd"] );
+			$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
+			xmlrpc_multiappend( $xml, $ttnode, $d_responses[$i] );
+		}
+
+		// setting total up/down rate
+		$si_responses["bytes_down"] = $bytes_down;
+		$si_responses["bytes_up"] = $bytes_up;
+
+		// adding values to xml
+		prepare_serverinfo_responses( $si_responses, $message, $config );
+
+		// addng some more values to xml (total up/down rate, limits)
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $si_responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $si_responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $si_responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $si_responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $si_responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $si_responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $si_responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $si_responses["upload_rate_value"] );
+
+		$layout_file = "layout.main.index.xsl";
+
+		break;
+	}
+}
+
+// adding (error) message to xml
+if ( isset( $_SESSION["rtwi_err"] ) && $_SESSION["rtwi_err"] != "" ) {
+	$node = $root->appendChild( $xml->createElement( "err" ) );
+	$node = $node->appendChild( $xml->createElement( "errmsg", $message[$_SESSION["rtwi_err"]] ) );
+
+	$_SESSION["rtwi_err"] = "";
+	unset( $_SESSION["rtwi_err"] );
+}
+
+// setting referrer
+if ( $ajax === false && $mod != "getfile" ) {
+	$_SESSION["rtwi_lastpage"] = $_SERVER["REQUEST_URI"];
+}
+
+$tt = getmicrotime();
+//printf( "Total time: %0.6f sec\r\n", $tt - $st );
+
+//print $xml->saveXML();exit;
+
+// displaying the page
+if ( $mod != "getfile" ) {
+	require_once( "includes/classes/xsl_handler.inc.php" );
+	$page = new page_handler( $config["site_theme"], $layout_file, $xml );
+	$page->parse();
+	$text = $page->fetch();
+	$len = strlen( $text );
+
+//	@header( "content-length: {$len}" );
+	@header( "content-type: text/html; charset=utf-8" );
+	@header( "content-language: hu" );
+	@header( "cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
+	@header( "pragma: no-cache" );
+	@header( "expires: thu, 1 jan 1970 00:00:00 gmt" );
+	@header( "imagetoolbar: no" );
+	print $text;
+} else { // sending file to download
+	// getting the filename
+	$path = "{$d_directory_value}/{$response["f_path"]}";
+	$filesize = filesize( $path );
+
+	// set time limit to 0, so the user actually can download the whole file
+	set_time_limit( 0 );
+
+	// sending headers
+	//@header( "Content-Description: File Transfer" );
+	//@header( "Content-Type: application/force-download" );
+	//@header( "Content-Length: {$filesize}" );
+	//@header( "Content-Disposition: attachment; filename={$response["f_path"]}" );
+	
+	// sending the file
+	readfile( $path );
+}
+
+$tt = getmicrotime();
+/*
+printf( "<br />\r\nXMLRPC calls: %d", $callnum );
+printf( "<br />\r\nXMLRPC time: %0.6f sec", $calltime );
+if( isset( $fst ) && isset( $ftt ) ) {
+	printf( "<br />\r\nFiles time: %0.6f sec", $ftt - $fst );
+}
+printf( "<br />\r\nTotal time: %0.6f sec", $tt - $st );
+*/
+
+?>
Index: input.php
===================================================================
--- input.php	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ input.php	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -1,48 +1,36 @@
 <?php
 
-function xmlrpc_call( &$xmlrpc_array, &$request, &$callnum, &$calltime ) {
-	$st = getmicrotime();
-
-	$len = strlen( $request );
-	$headers = "CONTENT_LENGTH\0{$len}\0";
-	$headers .= "SCGI\01\0";
-	$len = strlen( $headers );
-	$out = "{$len}:{$headers},{$request}";
-
-	$fp = fsockopen( $xmlrpc_array["host"], $xmlrpc_array["port"], $errno, $errstr, $xmlrpc_array["timeout"] );
-	if ( $fp ) {
-		fwrite( $fp, $out );
-		do {
-			$line = fgets( $fp );
-		} while ( trim( $line ) != "" );
-		
-		$ret = stream_get_contents( $fp );
-	} else {
-		$_SESSION["rtwi_err"] = "noconn";
-		$ret = $errno;
-	}
-
-	$tt = getmicrotime();
-	$callnum++;
-	$calltime += $tt - $st;
-
-	return $ret;
+function myrealpath( $path, $home, $cwd ) {
+	if ( substr( $path, 0, 2 ) == "~/" ) {
+		$path = substr( $path, 2 );
+		$path = "{$home}{$_SESSION["rtwi_nick"]}/{$path}";
+	}
+
+	$oldcwd = getcwd();
+	chdir( $cwd );
+	$newpath = realpath( $path );
+	chdir( $oldcwd );
+
+	return $newpath;
 }
 
 error_reporting( E_ALL );
-//error_reporting( E_ALL ^ E_NOTICE );
+error_reporting( E_ALL ^ E_NOTICE );
+
+set_time_limit( 10 );
 
 session_start();
-if ( !isset( $_SESSION["rtwi_rights"] ) ) {
-	$_SESSION["rtwi_rights"] = 0;
-}
-
-require_once( "includes/config.inc.php" );
+
+$config = parse_ini_file( "includes/rtwi.conf", true );
+$users = parse_ini_file( $config["user_conf"], true );
+
+require_once( "includes/classes/xmlrpc_handler.inc.php" );
+require_once( "includes/classes/bittorrent_handler.inc.php" );
 require_once( "includes/tools/functions.time.inc.php" );
-require_once( "includes/classes/bittorrent_handler.inc.php" );
 
 $st = getmicrotime();
 $callnum = 0;
 $calltime = 0;
+$multicallnum = 0;
 
 if ( isset( $_REQUEST["mod"] ) ) {
@@ -58,11 +46,9 @@
 }
 
-if ( ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) ) {
-	if ( $_REQUEST["mod"] != "login" && $_REQUEST["mod"] != "changelanguage" ) {
-		header( "location: {$url["index"]}" );
-		exit;
-	}
+if ( ( !isset( $_SESSION["rtwi_auth"] ) || $_SESSION["rtwi_auth"] !== 1 ) && !in_array( $_REQUEST["mod"], array( "login", "changelanguage" ) ) ) {
+	header( "location: {$config["index"]}" );
+	exit;
 } else {
-	$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
+	$xmlrpc = new xmlrpc_handler( $_SESSION["rtwi_cadr"], 10 );
 }
 
@@ -80,9 +66,14 @@
 			$_SESSION["rtwi_auth"] = 1;
 			$_SESSION["rtwi_nick"] = $_REQUEST["loginname"];
-			$_SESSION["rtwi_port"] = $users[$_REQUEST["loginname"]];
-
-			settype( $_SESSION["rtwi_port"], "int" );
-
-			$xmlrpc_array["port"] = $users[$_SESSION["rtwi_nick"]]["port"];
+			$_SESSION["rtwi_cadr"] = $users[$_REQUEST["loginname"]]["address"];
+
+			// setting rtorrent's connection address
+			if ( preg_match( "|^unix://(.+)$|", $_SESSION["rtwi_cadr"], $match ) ) {
+				$_SESSION["rtwi_cadr"] = myrealpath( substr( $_SESSION["rtwi_cadr"], 7 ), $config["home_path"], "{$config["home_path"]}{$_SESSION["rtwi_nick"]}" );
+				$_SESSION["rtwi_cadr"] = "unix://{$_SESSION["rtwi_cadr"]}";
+			} elseif ( preg_match( "<^(http|https)://(.*)$>", $_SESSION["rtwi_cadr"], $match ) ) {
+				$_SESSION["rtwi_password"] = $_REQUEST["loginpass"];
+			}
+
 
 			if ( isset( $_REQUEST["rememberme"] ) && $_REQUEST["rememberme"] == "on" ) {
@@ -92,9 +83,9 @@
 
 			$_SESSION["rtwi_err"] = "succlogin";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		} else {
 			$_SESSION["rtwi_err"] = "badlogin";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -105,15 +96,18 @@
 		$_SESSION["rtwi_auth"] = 0;
 		$_SESSION["rtwi_nick"] = "";
-		$_SESSION["rtwi_port"] = 0;
+		$_SESSION["rtwi_cadr"] = "";
 		$_SESSION["rtwi_view"] = "";
 		$_SESSION["rtwi_refresh"] = 0;
 		$_SESSION["rtwi_language"] = "";
+		$_SESSION["rtwi_password"] = "";
 
 		unset( $_SESSION["rtwi_auth"] );
 		unset( $_SESSION["rtwi_nick"] );
-		unset( $_SESSION["rtwi_port"] );
+		unset( $_SESSION["rtwi_cadr"] );
+		unset( $_SESSION["rtwi_scgi"] );
 		unset( $_SESSION["rtwi_view"] );
 		unset( $_SESSION["rtwi_refresh"] );
 		unset( $_SESSION["rtwi_language"] );
+		unset( $_SESSION["rtwi_password"] );
 
 		setcookie( "rtwi_auth", 0 );
@@ -121,5 +115,5 @@
 
 		$_SESSION["rtwi_err"] = "succlogout";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -128,8 +122,8 @@
 	case "changeview" : { // change view
 		if ( isset( $_REQUEST["viewtype"] ) && $_REQUEST["viewtype"] != "" ) {
-			$request = xmlrpc_encode_request( "view_list", array() );
-			$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-			$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-			$viewtypes = xmlrpc_decode( $response );
+			$xmlrpc->setrequest( "view_list", "" );
+			$xmlrpc->call();
+			$xmlrpc->parse();
+			$viewtypes = $xmlrpc->fetch();
 
 			if ( in_array( $_REQUEST["viewtype"], $viewtypes ) ) {
@@ -137,5 +131,5 @@
 			} else {
 				$_SESSION["rtwi_err"] = "badviewtype";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 			}
@@ -144,9 +138,9 @@
 
 			$_SESSION["rtwi_err"] = "succviewchange";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		} else {
 			$_SESSION["rtwi_err"] = "noviewtype";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -155,7 +149,7 @@
 	}
 	case "changerefresh" : { // change view
-		if ( !$config["allow"]["refresh"] ) {
+		if ( $config["refresh"] !== "1" ) {
 			$_SESSION["rtwi_err"] = "refreshnotallowed";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -183,7 +177,7 @@
 	}
 	case "changelanguage" : { // change language
-		if ( !$config["allow"]["language"] ) {
+		if ( $config["language"] !== "1" ) {
 			$_SESSION["rtwi_err"] = "languagenotallowed";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -212,7 +206,7 @@
 	}
 	case "changethrottle" : { // change view
-		if ( !$config["allow"]["throttle"] ) {
+		if ( $config["throttle"] !== "1" ) {
 			$_SESSION["rtwi_err"] = "throttlenotallowed";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -229,8 +223,8 @@
 			}
 
-			$request = xmlrpc_encode_request( "set_upload_rate", array( $upspeed * 1024 ) );
-			$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-			$request = xmlrpc_encode_request( "set_download_rate", array( $downspeed * 1024 ) );
-			$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+			$xmlrpc->setrequest( "set_upload_rate", $upspeed * 1024 );
+			$xmlrpc->call();
+			$xmlrpc->setrequest( "set_download_rate", $downspeed * 1024 );
+			$xmlrpc->call();
 
 			$_SESSION["rtwi_err"] = "succthrottlechange";
@@ -248,39 +242,30 @@
 		if ( !isset( $_REQUEST["tfmethod"] ) || !in_array( $_REQUEST["tfmethod"], array( "url", "file" ) ) ) {
 			$_SESSION["rtwi_err"] = "badtfmethod";
-			header( "location: {$url["index"]}?mod=addtorrent" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "get_directory", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$directory = xmlrpc_decode( $response );
-		$request = xmlrpc_encode_request( "system.get_cwd", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$cwd = xmlrpc_decode( $response );
-
-		if ( substr( $directory, -1 ) == "/" ) {
-			$directory = substr( $directory, 0, -1 );
-		}
-		if ( in_array( "..", split( "/", $directory ) ) ) {
-			$_SESSION["rtwi_err"] = "badrtdirectory";
-			header( "location: {$url["index"]}?mod=addtorrent" );
-			exit;
-		} elseif ( substr( $directory, 0, 2 ) == "./" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$cwd}/{$directory}";
-		} elseif ( substr( $directory, 0, 2 ) == "~/" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$home_path}{$_SESSION["rtwi_nick"]}/{$directory}";
-		}
-		$directory = str_replace( "//", "/", $directory );
+			header( "location: {$config["index"]}?mod=addtorrent" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$directories = $xmlrpc->fetch();
+		$directory = $directories[0][0];
+		$cwd = $directories[1][0];
+
+		$directory = myrealpath( $directory, $config["home_path"], $cwd );
 
 		if ( $_REQUEST["tfmethod"] == "url" ) {
 			if ( !isset( $_REQUEST["torrenturl"] ) || $_REQUEST["torrenturl"] == "" ) {
 				$_SESSION["rtwi_err"] = "notorrenturl";
-				header( "location: {$url["index"]}?mod=addtorrent" );
+				header( "location: {$config["index"]}?mod=addtorrent" );
 				exit;
 			} elseif ( substr( $_REQUEST["torrenturl"], 0, 7 ) != "http://" ) {
 				$_SESSION["rtwi_err"] = "notanurl";
-				header( "location: {$url["index"]}?mod=addtorrent" );
+				header( "location: {$config["index"]}?mod=addtorrent" );
 				exit;
 			}
@@ -289,5 +274,5 @@
 			if ( !isset( $_FILES ) || !is_array( $_FILES ) ) {
 				$_SESSION["rtwi_err"] = "notorrentfileuploaded";
-				header( "location: {$url["index"]}?mod=addtorrent" );
+				header( "location: {$config["index"]}?mod=addtorrent" );
 				exit;
 			}
@@ -299,5 +284,5 @@
 					} else {
 						$_SESSION["rtwi_err"] = "rtfileattack";
-						header( "location: {$url["index"]}?mod=addtorrent" );
+						header( "location: {$config["index"]}?mod=addtorrent" );
 						exit;
 					}
@@ -307,5 +292,5 @@
 				case 1 : {
 					$_SESSION["rtwi_err"] = "rtfileinisize";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -314,5 +299,5 @@
 				case 2 : {
 					$_SESSION["rtwi_err"] = "rtfileformsize";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -321,5 +306,5 @@
 				case 3 : {
 					$_SESSION["rtwi_err"] = "rtfilepartial";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -328,5 +313,5 @@
 				case 4 : {
 					$_SESSION["rtwi_err"] = "rtfilenofile";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -335,5 +320,5 @@
 				case 6 : {
 					$_SESSION["rtwi_err"] = "rtfilenotmpdir";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -342,5 +327,5 @@
 				case 7 : {
 					$_SESSION["rtwi_err"] = "rtfilenowrite";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -349,5 +334,5 @@
 				default : {
 					$_SESSION["rtwi_err"] = "rtfileother";
-					header( "location: {$url["index"]}?mod=addtorrent" );
+					header( "location: {$config["index"]}?mod=addtorrent" );
 					exit;
 				
@@ -358,35 +343,23 @@
 
 		$dlpath = $_REQUEST["dlpath"];
-		if ( substr( $dlpath, 0, 1 ) == "/" ) {
-			$dlpath = substr( $dlpath, 1 );
-		}
-		if ( substr( $dlpath, -1 ) == "/" ) {
-			$dlpath = substr( $dlpath, 0, -1 );
-		}
-		if ( in_array( "..", split( "/", $dlpath ) ) ) {
-			$_SESSION["rtwi_err"] = "badatpath";
-			header( "location: {$url["index"]}?mod=addtorrent" );
-			exit;
-		}
-
+		$dlpath = myrealpath( "{$directory}/{$dlpath}", $config["home_path"], $cwd );
+
+		$param = array( $torrent );
+		if ( $dlpath != "" ) {
+			$param[] = "d.set_directory={$dlpath}";
+		}
 		if ( isset( $_REQUEST["torrentstart"] ) && $_REQUEST["torrentstart"] == "start" ) {
-			$param = array( $torrent, "d.start=" );
-		} else {
-			$param = array( $torrent );
-		}
-		if ( $dlpath != "" ) {
-			$dlpath = "{$directory}/{$dlpath}";
-			$param[] = ( "d.set_directory={$dlpath}" );
+			$param[] = "d.start=";
 		}
 
 		if ( $_REQUEST["tfmethod"] == "url" || isset( $_REQUEST["keeptorrentfile"] ) && $_REQUEST["keeptorrentfile"] == "on"  ) {
-			$request = xmlrpc_encode_request( "load_verbose", $param );
-		} else {
-			$request = xmlrpc_encode_request( "load_raw_verbose", $param );
-		}
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+			$xmlrpc->setrequest( "load_verbose", $param );
+		} else {
+			$xmlrpc->setrequest( "load_raw_verbose", $param );
+		}
+		$xmlrpc->call();
 
 		$_SESSION["rtwi_err"] = "succtorrentload";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -394,22 +367,22 @@
 	}
 	case "torrentstart" : { // start a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.start", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.start", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentstart";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -417,22 +390,22 @@
 	}
 	case "torrentopen" : { // open a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.open", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.open", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentopen";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -440,22 +413,22 @@
 	}
 	case "torrentstop" : { // stop a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.stop", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.stop", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentstop";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -463,22 +436,22 @@
 	}
 	case "torrentclose" : { // close a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.close", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.close", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentclose";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -486,22 +459,22 @@
 	}
 	case "torrentcheckhash" : { // check hash for a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.check_hash", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.check_hash", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentcheckhash";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -509,22 +482,22 @@
 	}
 	case "torrentremove" : { // remove a torrent
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.erase", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.erase", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succtorrentremove";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -532,24 +505,24 @@
 	}
 	case "torrenterase" : { // erase a torrent and delete the data
-		if ( !$config["allow"]["erase"] ) {
+		if ( $config["erase"] !== "1" ) {
 			$_SESSION["rtwi_err"] = "erasenotallowed";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.multicall", array( "", "d.get_hash=", "d.get_directory=", "d.get_size_files=" ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.multicall", array( "", "d.get_hash=", "d.get_directory=", "d.get_size_files=" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
 		foreach ( $response as $key => $val ) {
 			if ( $val[0] == $hash ) {
@@ -560,48 +533,18 @@
 		$size_files = $response[2];
 
-		$request = xmlrpc_encode_request( "system.get_cwd", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$cwd = xmlrpc_decode( $response );
-		$request = xmlrpc_encode_request( "get_directory", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$dd = xmlrpc_decode( $response );
-
-		if ( substr( $directory, -1 ) == "/" ) {
-			$directory = substr( $directory, 0, -1 );
-		}
-
-		if ( in_array( "..", split( "/", $directory ) ) ) {
-			$_SESSION["rtwi_err"] = "badrtdirectory";
-			header( "location: {$url["index"]}" );
-			exit;
-		} elseif ( substr( $directory, 0, 2 ) == "./" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$cwd}/{$directory}";
-		} elseif ( substr( $directory, 0, 2 ) == "~/" ) {
-			$directory = substr( $directory, 2 );
-			$directory = "{$home_path}{$_SESSION["rtwi_nick"]}/{$directory}";
-		}
-		$directory = str_replace( "//", "/", $directory );
-
-		if ( substr( $dd, -1 ) == "/" ) {
-			$dd = substr( $dd, 0, -1 );
-		}
-		if ( in_array( "..", split( "/", $dd ) ) ) {
-			$_SESSION["rtwi_err"] = "badrtdirectory";
-			header( "location: {$url["index"]}" );
-			exit;
-		} elseif ( substr( $dd, 0, 2 ) == "./" ) {
-			$dd = substr( $dd, 2 );
-			$dd = "{$cwd}/{$dd}";
-		} elseif ( substr( $dd, 0, 2 ) == "~/" ) {
-			$dd = substr( $dd, 2 );
-			$dd = "{$home_path}{$_SESSION["rtwi_nick"]}/{$dd}";
-		}
-		$dd = str_replace( "//", "/", $dd );
-
-		$request = xmlrpc_encode_request( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$files = xmlrpc_decode( $response );
+		$xmlrpc->setmrequest( array( "get_directory", "system.get_cwd" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$directories = $xmlrpc->fetch();
+		$dd = $directories[0][0];
+		$cwd = $directories[1][0];
+
+		$directory = myrealpath( $directory, $config["home_path"], $cwd );
+		$dd = myrealpath( $dd, $config["home_path"], $cwd );
+
+		$xmlrpc->setrequest( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$files = $xmlrpc->fetch();
 
 		$unlink_num = 0;
@@ -641,6 +584,6 @@
 		}
 
-		$request = xmlrpc_encode_request( "d.erase", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "d.erase", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
@@ -648,9 +591,9 @@
 		if ( $unlink_num != $size_files || $rmdir_num != $size_dirs ) {
 			$_SESSION["rtwi_err"] = "warntorrenterase";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		} else {
 			$_SESSION["rtwi_err"] = "succtorrenterase";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -661,11 +604,11 @@
 		switch ( $_REQUEST["task"] ) {
 			case "start" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.start=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.start=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentsstart";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -673,11 +616,11 @@
 			}
 			case "stop" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.stop=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.stop=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentsstop";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -685,11 +628,11 @@
 			}
 			case "open" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.open=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.open=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentsopen";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -697,11 +640,11 @@
 			}
 			case "close" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.close=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.close=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentsclose";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -709,11 +652,11 @@
 			}
 			case "checkhash" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.check_hash=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.check_hash=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentscheckhash";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -721,11 +664,11 @@
 			}
 			case "remove" : {
-				$request = xmlrpc_encode_request( "d.multicall", array( "", "d.erase=" ) );
-				$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+				$xmlrpc->setrequest( "d.multicall", array( "", "d.erase=" ) );
+				$xmlrpc->call();
 
 				sleep( 1 );
 
 				$_SESSION["rtwi_err"] = "succtorrentsremove";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -734,5 +677,5 @@
 			default : {
 				$_SESSION["rtwi_err"] = "nooponalltorrent";
-				header( "location: {$url["index"]}" );
+				header( "location: {$config["index"]}" );
 				exit;
 
@@ -744,12 +687,12 @@
 	}
 	case "changepriority" : { // set priority
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
-
-		if ( !in_array( $hash, $torrents ) ) {
-			$_SESSION["rtwi_err"] = "nohashfound";
-			header( "location: {$url["index"]}" );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		if ( !in_array( $hash, $torrents ) ) {
+			$_SESSION["rtwi_err"] = "nohashfound";
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -759,5 +702,5 @@
 		} else {
 			$_SESSION["rtwi_err"] = "nopriorityfound";
-			header( "location: {$url["index"]}" );
+			header( "location: {$config["index"]}" );
 			exit;
 		}
@@ -765,15 +708,15 @@
 		if ( !in_array( $priority, array( 0, 1, 2, 3 ) ) ) {
 			$_SESSION["rtwi_err"] = "badpriorityfoiund";
-			header( "location: {$url["index"]}" );
-			exit;
-		}
-
-		$request = xmlrpc_encode_request( "d.set_priority", array( $hash, $priority ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+			header( "location: {$config["index"]}" );
+			exit;
+		}
+
+		$xmlrpc->setrequest( "d.set_priority", array( $hash, $priority ) );
+		$xmlrpc->call();
 
 		sleep( 1 );
 
 		$_SESSION["rtwi_err"] = "succprioritychange";
-		header( "location: {$url["index"]}" );
+		header( "location: {$config["index"]}" );
 		exit;
 
@@ -781,13 +724,13 @@
 	}
 	case "changefilepriority" : { // set file priority
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
 
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
-		} else {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=files";
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
+		} else {
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files";
 		}
 
@@ -807,8 +750,8 @@
 		}
 
-		$request = xmlrpc_encode_request( "d.get_size_files", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "d.get_size_files", $hash );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
 
 		if ( $id < 0 || $id > $response ) {
@@ -833,9 +776,11 @@
 		}
 
-		$request = xmlrpc_encode_request( "f.set_priority", array( $hash, $id, $filepriority ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-
-		$request = xmlrpc_encode_request( "d.update_priorities ", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "f.set_priority", array( $hash, $id, $filepriority ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		$xmlrpc->setrequest( "d.update_priorities", $hash );
+		$xmlrpc->call();
 
 		sleep( 1 );
@@ -848,13 +793,13 @@
 	}
 	case "changedirpriority" : { // set file priority
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
 
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
-		} else {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=files";
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files&ajax=true";
+		} else {
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=files";
 		}
 
@@ -893,14 +838,16 @@
 		$len = strlen( $dir );
 
-		$request = xmlrpc_encode_request( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$files = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "f.multicall", array( $hash, 0, "f.get_frozen_path=" ) );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$files = $xmlrpc->fetch();
 
 		$badpath = true;
 		$request = array();
+		$params = array();
 		foreach ( $files as $key => $val ) {
 			if ( strpos( $val[0], $dir ) === 0 ) {
-				$request[] = array( "methodName" => "f.set_priority", "params" => array( $hash, $key, $dirpriority ) );
+				$request[] = "f.set_priority";
+				$params[] = array( $hash, $key, $dirpriority );
 				$filestochange[] = array( $key, $val[0] );
 				if ( $badpath == true ) {
@@ -916,11 +863,13 @@
 		}
 
-
-		$request = xmlrpc_encode_request( "system.multicall", array( $request ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-
-		$request = xmlrpc_encode_request( "d.update_priorities ", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-
+		$xmlrpc->setumrequest( $request, $params );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
+
+		$xmlrpc->setrequest( "d.update_priorities", $hash );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
 
 		sleep( 1 );
@@ -933,13 +882,13 @@
 	}
 	case "changetrackerenabled" : { // set if tracker is enabled
-		$request = xmlrpc_encode_request( "download_list", array() );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$torrents = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "download_list", "" );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$torrents = $xmlrpc->fetch();
 
 		if ( isset( $_REQUEST["ajax"] ) && $_REQUEST["ajax"] == "true" ) {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=trackers&ajax=true";
-		} else {
-			$tourl = "{$url["index"]}?mod=torrent&hash={$hash}&page=trackers";
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=trackers&ajax=true";
+		} else {
+			$tourl = "{$config["index"]}?mod=torrent&hash={$hash}&page=trackers";
 		}
 
@@ -959,8 +908,8 @@
 		}
 
-		$request = xmlrpc_encode_request( "d.get_size_trackers", array( $hash ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
-		$response = preg_replace( "/i8|ex\.i8/", "string", $response );
-		$response = xmlrpc_decode( $response );
+		$xmlrpc->setrequest( "d.get_size_trackers", $hash );
+		$xmlrpc->call();
+		$xmlrpc->parse();
+		$response = $xmlrpc->fetch();
 
 		if ( $id < 0 || $id > $response ) {
@@ -985,6 +934,6 @@
 		}
 
-		$request = xmlrpc_encode_request( "t.set_enabled", array( $hash, $id, $trackerenabled ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "t.set_enabled", array( $hash, $id, $trackerenabled ) );
+		$xmlrpc->call();
 
 		sleep( 1 );
@@ -999,5 +948,5 @@
 		if ( !isset( $_REQUEST["dhtstatus"] ) || $_REQUEST["dhtstatus"] == "" ) {
 			$_SESSION["rtwi_err"] = "novaluefound";
-			header( "location: {$url["index"]}?mod=serverinfo" );
+			header( "location: {$config["index"]}?mod=serverinfo" );
 			exit;
 		}
@@ -1007,5 +956,5 @@
 		if ( $dhtstatus != 0 && $dhtstatus != 1 ) {
 			$_SESSION["rtwi_err"] = "badvaluefound";
-			header( "location: {$url["index"]}?mod=serverinfo" );
+			header( "location: {$config["index"]}?mod=serverinfo" );
 			exit;
 		}
@@ -1013,6 +962,6 @@
 		$dhtstatus = $dhtstatus == 1 ? "on" : "off";
 
-		$request = xmlrpc_encode_request( "dht", array( $dhtstatus ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request, $callnum, $calltime );
+		$xmlrpc->setrequest( "dht", $dhtstatus );
+		$xmlrpc->call();
 
 		$_SESSION["rtwi_err"] = $dhtstatus == "on" ? "succdhtstart" : "succdhtstop";
@@ -1020,5 +969,5 @@
 		sleep( 1 );
 
-		header( "location: {$url["index"]}?mod=serverinfo" );
+		header( "location: {$config["index"]}?mod=serverinfo" );
 		exit;
 
Index: themes/default_ajax/inc/afunc.js
===================================================================
--- themes/default_ajax/inc/afunc.js	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/inc/afunc.js	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: themes/default_ajax/inc/hfunc.js
===================================================================
--- themes/default_ajax/inc/hfunc.js	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/inc/hfunc.js	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: themes/default_ajax/inc/style.css
===================================================================
--- themes/default_ajax/inc/style.css	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/inc/style.css	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -297,5 +297,5 @@
 .tratio {
 		float: right;
-		width: 6em;
+		width: 6.5em;
 		margin: 0 0 0 .5em;
 		background: #eeeeee;
@@ -522,5 +522,9 @@
 .paddress {
 		float: left;
-		width: 8em;
+		width: 10em;
+}
+
+.paddress img {
+		margin: 0 .5em 0 0;
 }
 
Index: themes/default_ajax/layout.ajax.index.xsl
===================================================================
--- themes/default_ajax/layout.ajax.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/layout.ajax.index.xsl	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -517,4 +517,9 @@
   <li>
    <div class="paddress">
+    <xsl:choose>
+     <xsl:when test="p_country != ''">
+      <img src="flags/{p_country}.gif" alt="flag" title="{p_country/@value}" />
+     </xsl:when>
+    </xsl:choose>
     <xsl:value-of select="p_address" />
    </div>
Index: themes/default_ajax/layout.editor.index.xsl
===================================================================
--- themes/default_ajax/layout.editor.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/layout.editor.index.xsl	(revision b804c919f8493f5a45f01334128a0f17daad4565)
Index: themes/default_ajax/layout.main.index.xsl
===================================================================
--- themes/default_ajax/layout.main.index.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/layout.main.index.xsl	(revision b804c919f8493f5a45f01334128a0f17daad4565)
@@ -173,5 +173,4 @@
         <option value="checkhash" title="{/root/labels/checkall}"><xsl:value-of select="/root/labels/checkall" /></option>
         <option value="remove" title="{/root/labels/removeall}"><xsl:value-of select="/root/labels/removeall" /></option>
-        <option value="erase" title="{/root/labels/eraseall}"><xsl:value-of select="/root/labels/eraseall" /></option>
        </select>
        <noscript>
@@ -1439,4 +1438,9 @@
   <li>
    <div class="paddress">
+    <xsl:choose>
+     <xsl:when test="p_country != ''">
+      <img src="flags/{p_country}.gif" alt="flag" title="{p_country/@value}" />
+     </xsl:when>
+    </xsl:choose>
     <xsl:value-of select="p_address" />
    </div>
Index: themes/default_ajax/layout.main.login.xsl
===================================================================
--- themes/default_ajax/layout.main.login.xsl	(revision a7a1edb651c11ad353d1b55d5bc20b8dc8f70284)
+++ themes/default_ajax/layout.main.login.xsl	(revision b804c919f8493f5a45f01334128a0f17daad4565)
