Index: !install.txt
===================================================================
--- !install.txt	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ !install.txt	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -1,4 +1,5 @@
 requirements:
--rtorrent 0.7.7
+-rtorrent 0.7.8, compiled with "--with-xmlrpc-c"
+ -xmlrpc >= 1.07
 -some webserver
 -php5, with the following extensions:
@@ -8,21 +9,56 @@
 installation:
 
+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)
+of course, you can try any version, over 1.07
+follow the next steps, as root:
+	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
+
+to get the svn for libtorrent, and rtorrent, you have to previously installed svn (apt-get install svn, ford debian, ubuntu)
+to install libtorrent, follow the next steps, as a root:
+	mkdir /usr/src/libtorrent
+	svn co svn://rakshasa.no/libtorrent/trunk/libtorrent /usr/src/libtorrent
+	cd /usr/src/libtorrent
+	./autogen.sh
+	./configure
+	make
+	make install
+
+to install rtorrent, follow the next steps, as a root:
+	mkdir /usr/src/rtorrent
+	svn co svn://rakshasa.no/libtorrent/trunk/rtorrent /usr/src/rtorrent
+	cd /usr/src/rtorrent
+	./autogen.sh
+	./configure --with-xmlrpc-c
+	make
+	make install
+	
+now, after everything's done
+-extract the rtwi-xxxxxx.tar.gz to some place where your webserver can see it
 -open the includes/config.php.inc, and edit the next lines:
- -$abs_path
- -$domain
- -$subdomain
- -$site_path
- -$include_path (if you move the includes directory)
+ -$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
 
+-you can find an example .rtorrent.rc file here: http://libtorrent.rakshasa.no/browser/trunk/rtorrent/doc/rtorrent.rc?rev=latest
+-if you don't have a .rtorrent.rc file, create one in each user's home directory
 -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
+ -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)
 
 -adding users:
  -find row 44, and change it:
- -replace "username" with the actual linux username
- -replace "sha1has of the password" with thre hash of the choosen password for the webui (you can generate the sha1 hash here => http://www.johnmaguire.us/tools/hashcalc/index.php)
- -replace "36100", with the port, you've set in the .rtorrent.rc file
+ -replace "userX" with the actual linux username (keep the quotes)
+ -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 do these steps, for each one of them, sop you'll get something like this:
 	$users = array(
Index: includes/config.inc.php
===================================================================
--- includes/config.inc.php	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ includes/config.inc.php	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -9,13 +9,12 @@
 
 // paths
-$abs_path	= "/var/www";		// webroot (with heading slash)
-$domain		= "cyla.homelinux.net";	// site domain (or ip)
-$subdomain	= "rtwi";		// subdomain (if exists)
-$site_path	= "/";			// site path (with heading and trailing slash)
-$include_path	= "includes";		// include path (include files can be found here)
+$abs_path	= "/var/www";			// webroot (with heading slash) -- change this, if neccessary
+$domain		= "rtwi.cyla.homelinux.net";	// site domain (or ip) -- change this, if neccessary
+$site_path	= "/";				// site path (with heading and trailing slash) -- change this, if neccessary
+$include_path	= "includes";			// include path (include files can be found here)
 
 // URLs
 $url = array(
-	"base"	=> "http://{$subdomain}.{$domain}{$site_path}",	// base url (if you do not have a subdomain, you might want to edit this line)
+	"base"	=> "http://{$domain}{$site_path}",		// base url
 	"index"	=> "index.{$default_ext}",			// index page
 	"input"	=> "input.php",					// input file (for forms)
@@ -40,7 +39,8 @@
 $home_path = "/home/";
 
-// array of users, each, with the sha1 hash of the password, and the scgi port of the rtorrent
+// 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(
-	"username"		=> array( "pass" => "sha1has of the password", "port"	=> "36100" ),
+//	"username"		=> array( "pass" => "7e240de74fb1ed08fa08d38063f6a6a91462a815", "port"	=> "36100" ),
+	"cyla"		=> array( "pass" => "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "port"	=> "36100" ),
 );
 
Index: includes/messages.en.inc.php
===================================================================
--- includes/messages.en.inc.php	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ includes/messages.en.inc.php	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -5,4 +5,6 @@
 	"succlogin"				=> "You have been logged in successfully",
 	"succlogout"				=> "You have been logged out successfully",
+
+	"noconn"				=> "No connection",
 
 	"nohashfound"				=> "No torrents found for this hash",
@@ -62,4 +64,8 @@
 	"no"					=> "No",
 	"yes"					=> "Yes",
+	"disabled"				=> "Disabled",
+	"enabled"				=> "Enabled",
+	"notset"				=> "Not set",
+
 	"d_connection_current_leech"		=> "Leeching",
 	"d_connection_current_seed"		=> "Seeding",
@@ -91,6 +97,4 @@
 	"f_priority_1"				=> "Normal",
 	"f_priority_2"				=> "High",
-	"safe_sync_0"				=> "No",
-	"safe_sync_1"				=> "Yes",
 	"t_enabled_0"				=> "Disabled",
 	"t_enabled_1"				=> "Enabled",
@@ -99,4 +103,8 @@
 	"t_type_1"				=> "TCP",
 	"t_type_2"				=> "UDP",
+
+	"bind_0000"				=> "Not set",
+	"ip_0000"				=> "All IP addresses",
+	"proxy_address_000"			=> "Not set",
 
 	"pics"					=> "rTWi - The rTorrent Web interface",
@@ -146,10 +154,4 @@
 	"selectrefreshrate"			=> "Select refresh rate",
 
-
-
-
-
-
-
 );
 
Index: index.html
===================================================================
--- index.html	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ index.html	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -19,9 +19,12 @@
 }
 
-function prepare_r_responses( &$responses, &$message ) {
+function prepare_si_responses( &$responses, &$message ) {
 	$bytes_down_arr = switch_bytes( $responses["bytes_down"] );
 	$bytes_up_arr = switch_bytes( $responses["bytes_up"] );
 	$download_rate_arr = switch_bytes( $responses["download_rate"] );
+	$hash_read_ahead_arr = switch_bytes( $responses["hash_read_ahead"] );
 	$max_memory_usage_arr = switch_bytes( $responses["max_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"] );
@@ -34,14 +37,59 @@
 	$responses["download_rate_value"] = sprintf( "%.1f", $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["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( "%.1f", $upload_rate_arr[0] );
 	$responses["upload_rate_suffix"] = $upload_rate_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["safe_sync_value"] = $responses["safe_sync"] == 0 ? $message["safe_sync_0"] : $message["safe_sync_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["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"];
+
+
+	if ( substr( $responses["directory"], 0, 2 ) == "./" ) {
+		$responses["directory_value"] = substr( $responses["directory"], 2 );
+		$responses["directory_value"] = "{$home_path}{$_SESSION["rtwi_nick"]}/{$responses["directory_value"]}";
+	} else {
+		$responses["directory_value"] = $responses["directory"];
+	}
+
+	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 {
+		$max_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];
+	}
 
 	ksort( $responses );
@@ -106,5 +154,5 @@
 		$responses["d_base_path_value"] = "{$home_path}{$_SESSION["rtwi_nick"]}/{$responses["d_base_path_value"]}";
 	} else {
-		$responses["d_base_path_value"]= $responses["d_base_path"];
+		$responses["d_base_path_value"] = $responses["d_base_path"];
 	}
 	if ( substr( $responses["d_directory"], 0, 2 ) == "./" ) {
@@ -112,9 +160,9 @@
 		$responses["d_directory_value"] = "{$home_path}{$_SESSION["rtwi_nick"]}/{$responses["d_directory_value"]}";
 	} else {
-		$responses["d_directory_value"]= $responses["d_directory"];
+		$responses["d_directory_value"] = $responses["d_directory"];
 	}
 	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 ), $responses["d_estimated_time"] / 3600 % 24, $responses["d_estimated_time"] % 60 );
+		$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 );
@@ -172,5 +220,5 @@
 		$responses["f_frozen_path_value"] = "{$home_path}{$_SESSION["rtwi_nick"]}/{$responses["f_frozen_path_value"]}";
 	} else {
-		$responses["f_frozen_path_value"]= $responses["f_frozen_path"];
+		$responses["f_frozen_path_value"] = $responses["f_frozen_path"];
 	}
 	if ( $responses["f_size_chunks"] == 0 ) {
@@ -218,4 +266,5 @@
 	// adding viewtypes
 	$vcrnode = $node->appendChild( $xml->createElement( "viewtypes" ) );
+	$vcrnode->setAttribute( "value", $_SESSION["rtwi_view"] );
 	$vcnode = $vcrnode->appendChild( $xml->createElement( "viewtype" ) );
 	$vcnode->setAttribute( "value", "main" );
@@ -249,4 +298,5 @@
 	// adding refresh rates
 	$rrrnode = $node->appendChild( $xml->createElement( "refreshrates" ) );
+	$rrrnode->setAttribute( "value", $_SESSION["rtwi_refresh"] );
 	$rrnode = $rrrnode->appendChild( $xml->createElement( "refreshrate" ) );
 	$rrnode->setAttribute( "value", "0" );
@@ -310,9 +360,9 @@
 		$ret->setAttribute( "filename", $list[0] );
 	}
+
 	return $ret;
 }
 
 function xmlrpc_call( &$xmlrpc_array, &$request ) {
-//print ".";
 	$len = strlen( $request );
 	$headers = "CONTENT_LENGTH\0{$len}\0";
@@ -321,5 +371,5 @@
 	$out = "{$len}:{$headers},{$request}";
 
-	$fp = fsockopen( $xmlrpc_array["host"], $xmlrpc_array["port"], $errno, $errstr, $xmlrpc_array["timeout"] );
+	$fp = @fsockopen( $xmlrpc_array["host"], $xmlrpc_array["port"], $errno, $errstr, $xmlrpc_array["timeout"] );
 	if ( $fp ) {
 		fwrite( $fp, $out );
@@ -330,4 +380,5 @@
 		$ret = stream_get_contents( $fp );
 	} else {
+		$_SESSION["rtwi_err"] = "noconn";
 		$ret = $errno;
 	}
@@ -337,5 +388,4 @@
 
 function xmlrpc_multicall( &$xmlrpc_array, &$methodlist, $params = array() ) {
-//print "|";
 	$request = array();
 	foreach ( $methodlist as $methodkey => $methodval ) {
@@ -366,4 +416,5 @@
 	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 ) );
@@ -386,5 +437,5 @@
 
 error_reporting( E_ALL );
-//error_reporting( E_ALL && ~E_NOTICE );
+error_reporting( E_ALL ^ E_NOTICE );
 
 session_start();
@@ -455,5 +506,5 @@
 }
 
- if ( isset( $_REQUEST["ajax"] ) && isset( $_REQUEST["ajax"] ) == "true" ) {
+if ( isset( $_REQUEST["ajax"] ) && isset( $_REQUEST["ajax"] ) == "true" ) {
 	$ajax = true;
 } else {
@@ -586,19 +637,32 @@
 	}
 	case "torrent" : { // torrent
-		// sha1 hash
-		$request = xmlrpc_encode_request( "download_list", array( $_SESSION["rtwi_view"] ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request );
-		$response = str_replace( "i8", "double", $response );
-		$torrents = xmlrpc_decode( $response );
-
 		// creating torrents node
 		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
 		addrefresh( $xml, $tnode, $message );
 
-		if ( in_array( $hash, $torrents ) ) {
-			$methodlist = 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_directory", "d.get_down_rate", "d.get_down_total", "d.get_free_diskspace", "d.get_hashing", "d.get_ignore_commands", "d.get_is_active", "d.get_is_hash_checked", "d.get_is_hash_checking", "d.get_is_multi_file", "d.get_is_open", "d.get_left_bytes", "d.get_max_file_size", "d.get_max_peers", "d.get_max_uploads", "d.get_min_peers", "d.get_name", "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_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" );
-			$responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, array( $hash ) );
-
-			prepare_d_responses( $responses, $message, $home_path );
+		$methodlist = 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_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_is_active=", "d.get_is_hash_checked=", "d.get_is_hash_checking=", "d.get_is_multi_file=", "d.get_is_open=", "d.get_left_bytes=", "d.get_max_file_size=", "d.get_max_peers=", "d.get_max_uploads=", "d.get_min_peers=", "d.get_name=", "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_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=" );
+		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
+		$response = xmlrpc_call( $xmlrpc_array, $request );
+		$response = str_replace( "i8", "double", $response );
+		$response = xmlrpc_decode( $response );
+
+		$bytes_down = 0;
+		$bytes_up = 0;
+		$torrent = false;
+		for ( $i = 0; $i < count( $response ); $i++ ) {
+			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
+				$responses[$i][$methodval] = $response[$i][$r];
+			}
+			$bytes_down += $responses[$i]["d_down_rate"];
+			$bytes_up += $responses[$i]["d_up_rate"];
+			if ( $responses[$i]["d_hash"] == $hash ) {
+				$torrent = $responses[$i];
+			}
+		}
+		unset( $responses );
+
+		if ( is_array( $torrent ) ) {
+			prepare_d_responses( $torrent, $message, $home_path );
 
 			switch ( $page ) {
@@ -621,17 +685,47 @@
 					$node = $node->appendChild( $xml->createElement( "files_root" ) );
 					$node = $node->appendChild( $xml->createElement( "directory" ) );
-					$node->setAttribute( "dirname", $responses["d_directory_value"] );
-
-					$methodlist = array( "f.get_completed_chunks", "f.get_frozen_path", "f.get_is_created", "f.get_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" );
-					for ( $i = 0; $i < $responses["d_size_files"]; $i++ ) {
-						$f_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, array( $hash, $i ) );
-
-						prepare_f_responses( $f_responses, $message, $home_path );
-
-						$fnode = build_xmltree( $f_responses["f_path_components"], $node, $xml );
+					$node->setAttribute( "dirname", $torrent["d_directory_value"] );
+
+					$methodlist = array( "f.get_completed_chunks=", "f.get_frozen_path=", "f.get_is_created=", "f.get_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=" );
+					$request = xmlrpc_encode_request( "f.multicall", array_merge( array( $torrent["d_hash"], 0 ), $methodlist ) );
+					$response = xmlrpc_call( $xmlrpc_array, $request );
+					$response = str_replace( "i8", "double", $response );
+					$response = xmlrpc_decode( $response );
+					for ( $i = 0; $i < count( $response ); $i++ ) {
+						for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+							$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
+							$responses[$i][$methodval] = $response[$i][$r];
+						}
+					}
+$st0 = getmicrotime();
+					for ( $i = 0; $i < $torrent["d_size_files"]; $i++ ) {
+$st1 = getmicrotime();
+						prepare_f_responses( $responses[$i], $message, $home_path );
+$tt1 = getmicrotime();
+$st2 = getmicrotime();
+//						$fnode = build_xmltree( $responses[$i]["f_path_components"], $node, $xml );
+$fnode = $node->appendChild( $xml->createElement( "file" ) );
+$fnode->setAttribute( "filename", $responses[$i]["f_path"] );
+$tt2 = getmicrotime();
+$st3 = getmicrotime();
 						$fnode->setAttribute( "id", $i );
-
-						xmlrpc_multiappend( $xml, $fnode, $f_responses );
+$tt3 = getmicrotime();
+$st4 = getmicrotime();
+						xmlrpc_multiappend( $xml, $fnode, $responses[$i] );
+$tt4 = getmicrotime();
+
+$time1 += $tt1 - $st1;
+$time2 += $tt2 - $st2;
+$time3 += $tt3 - $st3;
+$time4 += $tt4 - $st4;
 					}
+$tt0 = getmicrotime();
+$time0 += $tt0 - $st0;
+
+//printf( "\r\n0 time: %0.6f sec<br />\r\n", $time0 );
+//printf( "\r\n1 time: %0.6f sec<br />\r\n", $time1 );
+//printf( "\r\n2 time: %0.6f sec<br />\r\n", $time2 );
+//printf( "\r\n3 time: %0.6f sec<br />\r\n", $time3 );
+//printf( "\r\n4 time: %0.6f sec<br />\r\n", $time4 );
 
 					break;
@@ -642,14 +736,20 @@
 					$node = $node->appendChild( $xml->createElement( "torrent_trackers" ) );
 
-					$methodlist = array( "t.get_enabled", "t.get_group", "t.get_id", "t.get_is_open", "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" );
-					for ( $i = 0; $i < $responses["d_tracker_size"]; $i++ ) {
-						$t_responses = xmlrpc_multicall( $xmlrpc_array, $methodlist, array( $hash, $i ) );
-
+					$methodlist = array( "t.get_enabled=", "t.get_group=", "t.get_id=", "t.get_is_open=", "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=" );
+					$request = xmlrpc_encode_request( "t.multicall", array_merge( array( $torrent["d_hash"], 0 ), $methodlist ) );
+					$response = xmlrpc_call( $xmlrpc_array, $request );
+					$response = str_replace( "i8", "double", $response );
+					$response = xmlrpc_decode( $response );
+					for ( $i = 0; $i < count( $response ); $i++ ) {
+						for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+							$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$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 );
-
-						prepare_trac_responses( $t_responses, $message );
-
-						xmlrpc_multiappend( $xml, $tracnode, $t_responses );
+						xmlrpc_multiappend( $xml, $tracnode, $responses[$i] );
 					}
 
@@ -670,36 +770,28 @@
 			}
 
-			$node->appendChild( $xml->createElement( "sha1_hash", $hash ) );
-
-			xmlrpc_multiappend( $xml, $node, $responses );
+			xmlrpc_multiappend( $xml, $node, $torrent );
 		} else {
 			$_SESSION["rtwi_err"] = "nohashfound";
 		}
 
-		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
-		$request = xmlrpc_encode_request( "call_download", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-		$response = xmlrpc_call( $xmlrpc_array, $request );
-		$response = str_replace( "i8", "double", $response );
-		$response = xmlrpc_decode( $response );
-
-		$bytes_down = 0;
-		$bytes_up = 0;
-		for ( $i = 0; $i < count( $torrents ); $i++ ) {
-			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
-				$responses[$i][$methodval] = $response[$i][$r];
-			}
-			$bytes_down += $responses[$i]["d_down_rate"];
-			$bytes_up += $responses[$i]["d_up_rate"];
-		}
-
-		$methodlist = array( "get_bind", "get_check_hash", "get_client_version", "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_library_version", "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_min_peers", "get_min_peers_seed", "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_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_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_umask", "get_upload_rate", "get_use_udp_trackers", "get_working_directory" );
+		$methodlist = array( "get_bind", "get_check_hash", "get_client_version", "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_hostname", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_library_version", "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_min_peers", "get_min_peers_seed", "get_name", "get_pid", "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_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_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_umask", "get_upload_rate", "get_use_udp_trackers", "get_working_directory" );
 		$responses = xmlrpc_multicall( $xmlrpc_array, $methodlist );
 		$responses["bytes_down"] = $bytes_down;
 		$responses["bytes_up"] = $bytes_up;
 
-		prepare_r_responses( $responses, $message );
-
-		xmlrpc_multiappend( $xml, $tnode, $responses );
+		prepare_si_responses( $responses, $message );
+
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $responses["upload_rate_value"] );
 
 		if ( $ajax === true ) {
@@ -711,5 +803,5 @@
 		break;
 	}
-	case "getfile" : {
+	case "getfile" : { // download a file
 		if ( $id >= 0 ) {
 		// sha1 hash
@@ -767,11 +859,54 @@
 		break;
 	}
-	default : { // torrents
-		// sha1 hash
-		$request = xmlrpc_encode_request( "download_list", array( $_SESSION["rtwi_view"] ) );
+	case "serverinfo" : { // server info
+		// creating torrents node
+		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
+		addrefresh( $xml, $tnode, $message );
+
+		$methodlist = array( "d.get_down_rate=", "d.get_up_rate=" );
+		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
 		$response = xmlrpc_call( $xmlrpc_array, $request );
 		$response = str_replace( "i8", "double", $response );
-		$torrents = xmlrpc_decode( $response );
-
+		$response = xmlrpc_decode( $response );
+
+		$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] );
+				$responses[$i][$methodval] = $response[$i][$r];
+			}
+			$bytes_down += $responses[$i]["d_down_rate"];
+			$bytes_up += $responses[$i]["d_up_rate"];
+		}
+
+		$methodlist = array( "get_bind", "get_check_hash", "get_client_version", "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_hostname", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_library_version", "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_min_peers", "get_min_peers_seed", "get_name", "get_pid", "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_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_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_umask", "get_upload_rate", "get_use_udp_trackers", "get_working_directory" );
+		$responses = xmlrpc_multicall( $xmlrpc_array, $methodlist );
+		$responses["bytes_down"] = $bytes_down;
+		$responses["bytes_up"] = $bytes_up;
+
+		prepare_si_responses( $responses, $message );
+
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $responses["upload_rate_value"] );
+
+		$inode = $tnode->appendChild( $xml->createElement( "server_info" ) );
+		xmlrpc_multiappend( $xml, $inode, $responses );
+
+		$layout_file = "layout.main.index.xsl";
+
+		break;
+	}
+	default : { // torrents
 		// creating torrents node
 		$tnode = $root->appendChild( $xml->createElement( "torrents" ) );
@@ -779,38 +914,46 @@
 		addrefresh( $xml, $tnode, $message );
 
+		$methodlist = 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_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_is_active=", "d.get_is_hash_checked=", "d.get_is_hash_checking=", "d.get_is_multi_file=", "d.get_is_open=", "d.get_left_bytes=", "d.get_max_file_size=", "d.get_max_peers=", "d.get_max_uploads=", "d.get_min_peers=", "d.get_name=", "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_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=" );
+		$request = xmlrpc_encode_request( "d.multicall", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
+		$response = xmlrpc_call( $xmlrpc_array, $request );
+		$response = str_replace( "i8", "double", $response );
+		$response = xmlrpc_decode( $response );
+
 		$bytes_down = 0;
 		$bytes_up = 0;
-		if ( is_array( $torrents ) ) {
-			$methodlist = 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_directory=", "d.get_down_rate=", "d.get_down_total=", "d.get_free_diskspace=", "d.get_hashing=", "d.get_ignore_commands=", "d.get_is_active=", "d.get_is_hash_checked=", "d.get_is_hash_checking=", "d.get_is_multi_file=", "d.get_is_open=", "d.get_left_bytes=", "d.get_max_file_size=", "d.get_max_peers=", "d.get_max_uploads=", "d.get_min_peers=", "d.get_name=", "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_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=" );
-			$request = xmlrpc_encode_request( "call_download", array_merge( array( $_SESSION["rtwi_view"] ), $methodlist ) );
-			$response = xmlrpc_call( $xmlrpc_array, $request );
-			$response = str_replace( "i8", "double", $response );
-			$response = xmlrpc_decode( $response );
-
-			for ( $i = 0; $i < count( $torrents ); $i++ ) {
-				for ( $r = 0; $r < count( $methodlist ); $r++ ) {
-					$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
-					$responses[$i][$methodval] = $response[$i][$r];
-				}
-				$bytes_down += $responses[$i]["d_down_rate"];
-				$bytes_up += $responses[$i]["d_up_rate"];
-
-				prepare_d_responses( $responses[$i], $message, $home_path );
-
-				$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
-				$ttnode->appendChild( $xml->createElement( "sha1_hash", $torrents[$i] ) );
-
-				xmlrpc_multiappend( $xml, $ttnode, $responses[$i] );
+		for ( $i = 0; $i < count( $response ); $i++ ) {
+			for ( $r = 0; $r < count( $methodlist ); $r++ ) {
+				$methodval = preg_replace( "/(.)\.get_(.*)=/", "$1_$2", $methodlist[$r] );
+				$responses[$i][$methodval] = $response[$i][$r];
 			}
-		}
-
-		$methodlist = array( "get_bind", "get_check_hash", "get_client_version", "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_library_version", "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_min_peers", "get_min_peers_seed", "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_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_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_umask", "get_upload_rate", "get_use_udp_trackers", "get_working_directory" );
+			$bytes_down += $responses[$i]["d_down_rate"];
+			$bytes_up += $responses[$i]["d_up_rate"];
+
+			prepare_d_responses( $responses[$i], $message, $home_path );
+
+			$ttnode = $tnode->appendChild( $xml->createElement( "torrent" ) );
+
+			xmlrpc_multiappend( $xml, $ttnode, $responses[$i] );
+		}
+
+		$methodlist = array( "get_bind", "get_check_hash", "get_client_version", "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_hostname", "get_http_cacert", "get_http_capath", "get_http_proxy", "get_ip", "get_key_layout", "get_library_version", "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_min_peers", "get_min_peers_seed", "get_name", "get_pid", "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_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_timeout_safe_sync", "get_timeout_sync", "get_tracker_dump", "get_tracker_numwant", "get_umask", "get_upload_rate", "get_use_udp_trackers", "get_working_directory" );
 		$responses = xmlrpc_multicall( $xmlrpc_array, $methodlist );
 		$responses["bytes_down"] = $bytes_down;
 		$responses["bytes_up"] = $bytes_up;
 
-		prepare_r_responses( $responses, $message );
-
-		xmlrpc_multiappend( $xml, $tnode, $responses );
+		prepare_si_responses( $responses, $message );
+
+		$node = $tnode->appendChild( $xml->createElement( "bytes_down", $responses["bytes_down"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_down_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_down_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "bytes_up", $responses["bytes_up"] ) );
+		$node->setAttribute( "suffix", $responses["bytes_up_suffix"] );
+		$node->setAttribute( "value", $responses["bytes_up_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "download_rate", $responses["download_rate"] ) );
+		$node->setAttribute( "suffix", $responses["download_rate_suffix"] );
+		$node->setAttribute( "value", $responses["download_rate_value"] );
+		$node = $tnode->appendChild( $xml->createElement( "upload_rate", $responses["upload_rate"] ) );
+		$node->setAttribute( "suffix", $responses["upload_rate_suffix"] );
+		$node->setAttribute( "value", $responses["upload_rate_value"] );
 
 		$layout_file = "layout.main.index.xsl";
@@ -826,5 +969,8 @@
 	$_SESSION["rtwi_err"] = "";
 }
-$_SESSION["rtwi_lastpage"] = $_SERVER["REQUEST_URI"];
+
+if ( $ajax === false && $mod != "getfile" ) {
+	$_SESSION["rtwi_lastpage"] = $_SERVER["REQUEST_URI"];
+}
 
 $tt = getmicrotime();
@@ -849,4 +995,5 @@
 	print $text;
 } else {
+	set_time_limit( 0 );
 	$path = "{$d_directory_value}/{$f_path}";
 	$filesize = filesize( $path );
Index: input.php
===================================================================
--- input.php	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ input.php	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -24,5 +24,5 @@
 
 error_reporting( E_ALL );
-//error_reporting( E_ALL && ~E_NOTICE );
+//error_reporting( E_ALL ^ E_NOTICE );
 
 session_start();
@@ -597,4 +597,7 @@
 		$response = xmlrpc_call( $xmlrpc_array, $request );
 
+		$request = xmlrpc_encode_request( "d.update_priorities ", array( $hash ) );
+		$response = xmlrpc_call( $xmlrpc_array, $request );
+
 		sleep( 1 );
 
Index: themes/default_ajax/inc/style.css
===================================================================
--- themes/default_ajax/inc/style.css	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ themes/default_ajax/inc/style.css	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -344,5 +344,5 @@
 .fchunks {
 		float: right;
-		width: 5.5em;
+		width: 6.5em;
 		margin: 0 0 0 .5em;
 		text-align: right;
Index: themes/default_ajax/layout.ajax.index.xsl
===================================================================
--- themes/default_ajax/layout.ajax.index.xsl	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ themes/default_ajax/layout.ajax.index.xsl	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -46,5 +46,5 @@
    </div>
    <div class="inforight">
-    <xsl:value-of select="sha1_hash" />
+    <xsl:value-of select="d_hash" />
    </div>
    <div class="clr"></div>
@@ -100,5 +100,7 @@
     <xsl:value-of select="d_chunks_hashed" />
     <xsl:text> * </xsl:text>
-    <xsl:value-of select="d_chunk_size" />
+    <xsl:value-of select="d_chunk_size/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="d_chunk_size/@suffix" />
    </div>
    <div class="clr"></div>
@@ -122,15 +124,4 @@
    <div class="clr"></div>
   </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Max memory usage:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/max_memory_usage/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/max_memory_usage/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
   <li class="line spacer">
    <div class="infoleft">
@@ -162,5 +153,5 @@
    <div class="clr"></div>
   </li>
-  <li class="line">
+  <li class="line spacer">
    <div class="infoleft">
     <xsl:text>Seeders:</xsl:text>
@@ -201,5 +192,5 @@
    <div class="clr"></div>
   </li>
-  <li class="line spacer">
+  <li class="line">
    <div class="infoleft">
     <xsl:text>Skipped:</xsl:text>
@@ -213,35 +204,4 @@
     <xsl:text> </xsl:text>
     <xsl:value-of select="d_skip_total/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Safe sync:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/safe_sync/@value" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Send buffer:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Receive buffer:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@suffix" />
    </div>
    <div class="clr"></div>
@@ -281,5 +241,5 @@
 
  <xsl:template match="file">
-  <li>
+  <li onmouseover="this.style.background='#eeeeee';" onmouseout="this.style.background='';">
    <div class="fname">
     <span title="Last touched: {f_last_touched}">
Index: themes/default_ajax/layout.main.index.xsl
===================================================================
--- themes/default_ajax/layout.main.index.xsl	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ themes/default_ajax/layout.main.index.xsl	(revision 241bedb6f1d6449ffdb439e34e3e516aece75b5e)
@@ -22,7 +22,7 @@
      </xsl:when>
     </xsl:choose>
-    <meta name="author" content="{/root/label/author}" />
-    <meta name="description" content="{/root/label/description}" />
-    <meta name="keywords" content="{/root/label/keywords}" />
+    <meta name="author" content="{/root/labels/author}" />
+    <meta name="description" content="{/root/labels/description}" />
+    <meta name="keywords" content="{/root/labels/keywords}" />
     <meta name="doc-type" content="web page" />
     <meta name="rating" content="general" />
@@ -31,5 +31,5 @@
     <script type="text/javascript" src="themes/default_ajax/inc/afunc.js"></script>
     <script type="text/javascript" src="themes/default_ajax/inc/hfunc.js"></script>
-    <title><xsl:value-of select="/root/label/title" /></title>
+    <title><xsl:value-of select="/root/labels/title" /></title>
    </head>
    <body onload="toggle( '{/root/mod}_{/root/page}' );">
@@ -64,4 +64,5 @@
         </xsl:choose>
         <li><a href="?mod=addtorrent" title="Add torrent">Add torrent</a></li>
+        <li><a href="?mod=serverinfo" title="Server info">Server info</a></li>
         <li><a href="{/root/iurl}?mod=logout" title="Logout">Logout</a></li>
        </ul>
@@ -127,5 +128,5 @@
       <input type="hidden" name="dlpath" value="{@path}" />
       <ul class="tufupload">
-       <li>
+       <li onmouseover="this.style.background='#eeeeee';" onmouseout="this.style.background='';">
         <div class="tufpath">
          <a href="?mod=addtorrent&amp;path={@ppath}">..</a>
@@ -161,4 +162,5 @@
    <xsl:apply-templates select="torrent_files_root" />
    <xsl:apply-templates select="torrent_trackers_root" />
+   <xsl:apply-templates select="server_info" />
    <li class="tline last">
     <div class="tthrottle">
@@ -276,5 +278,5 @@
      </xsl:otherwise>
     </xsl:choose>
-    <a href="?mod=torrent&amp;hash={sha1_hash}" title="Details" onclick="if ( document.getElementById( 'torrent_{sha1_hash}' ).style.display == '' ) {{ document.getElementById( 'torrent_{sha1_hash}' ).style.display = 'none' }} else {{ document.getElementById( 'torrent_{sha1_hash}' ).style.display = ''}} return false;"><xsl:value-of select="d_name" /></a>
+    <a href="?mod=torrent&amp;hash={d_hash}" title="Details" onclick="if ( document.getElementById( 'torrent_{d_hash}' ).style.display == '' ) {{ document.getElementById( 'torrent_{d_hash}' ).style.display = 'none' }} else {{ document.getElementById( 'torrent_{d_hash}' ).style.display = ''}} return false;"><xsl:value-of select="d_name" /></a>
    </div>
    <div class="tops">
@@ -284,18 +286,18 @@
      </xsl:when>
      <xsl:otherwise>
-      <a href="{/root/iurl}?mod=torrentcheckhash&amp;hash={sha1_hash}" title="Check hash">Check hash</a>
+      <a href="{/root/iurl}?mod=torrentcheckhash&amp;hash={d_hash}" title="Check hash">Check hash</a>
      </xsl:otherwise>
     </xsl:choose>
     <xsl:choose>
      <xsl:when test="d_is_active != 0">
-      <a href="{/root/iurl}?mod=torrentstop&amp;hash={sha1_hash}" title="Stop">Stop</a>
+      <a href="{/root/iurl}?mod=torrentstop&amp;hash={d_hash}" title="Stop">Stop</a>
      </xsl:when>
      <xsl:otherwise>
       <xsl:choose>
        <xsl:when test="d_hashing != 0">
-        <a href="{/root/iurl}?mod=torrentstop&amp;hash={sha1_hash}" title="Stop">Stop</a>
+        <a href="{/root/iurl}?mod=torrentstop&amp;hash={d_hash}" title="Stop">Stop</a>
        </xsl:when>
        <xsl:otherwise>
-        <a href="{/root/iurl}?mod=torrentstart&amp;hash={sha1_hash}" title="Start">Start</a>
+        <a href="{/root/iurl}?mod=torrentstart&amp;hash={d_hash}" title="Start">Start</a>
        </xsl:otherwise>
       </xsl:choose>
@@ -304,11 +306,11 @@
     <xsl:choose>
      <xsl:when test="d_is_open = 0">
-      <a href="{/root/iurl}?mod=torrentopen&amp;hash={sha1_hash}" title="Open">Open</a>
+      <a href="{/root/iurl}?mod=torrentopen&amp;hash={d_hash}" title="Open">Open</a>
      </xsl:when>
      <xsl:otherwise>
-      <a href="{/root/iurl}?mod=torrentclose&amp;hash={sha1_hash}" title="Close">Close</a>
+      <a href="{/root/iurl}?mod=torrentclose&amp;hash={d_hash}" title="Close">Close</a>
      </xsl:otherwise>
     </xsl:choose>
-    <a href="{/root/iurl}?mod=torrenterase&amp;hash={sha1_hash}" title="Erase" onclick="var answer = confirm( 'Are you sure?' ); if ( !answer ) return false;">Erase</a>
+    <a href="{/root/iurl}?mod=torrenterase&amp;hash={d_hash}" title="Erase" onclick="var answer = confirm( 'Are you sure?' ); if ( !answer ) return false;">Erase</a>
    </div>
    <div class="clr"></div>
@@ -394,7 +396,7 @@
    </div>
    <div class="tpriority">
-    <form class="changepriorityform" name="changepriorityform_{sha1_hash}" method="post" action="{/root/iurl}?mod=changepriority&amp;hash={sha1_hash}">
+    <form class="changepriorityform" name="changepriorityform_{d_hash}" method="post" action="{/root/iurl}?mod=changepriority&amp;hash={d_hash}">
      <xsl:text>[</xsl:text>
-     <select class="whiteselect" name="priority" title="Select priority" onchange="window.location='{/root/iurl}?mod=changepriority&amp;hash={sha1_hash}&amp;priority='+this.value;">
+     <select class="whiteselect" name="priority" title="Select priority" onchange="window.location='{/root/iurl}?mod=changepriority&amp;hash={d_hash}&amp;priority='+this.value;">
       <xsl:choose>
        <xsl:when test="d_priority = 0">
@@ -431,10 +433,10 @@
    </div>
    <div class="clr"></div>
-   <div class="tcontainer" id="torrent_{sha1_hash}" style="display: none;">
-    <a class="info" href="?mod=torrent&amp;hash={sha1_hash}&amp;page=info" title="Info" onclick="loadcontent( '{sha1_hash}', 'info' ); return false;">Info</a>
-    <a class="files" href="?mod=torrent&amp;hash={sha1_hash}&amp;page=files" title="File list" onclick="loadcontent( '{sha1_hash}', 'files' ); return false;">File list</a>
-    <a class="trackers" href="?mod=torrent&amp;hash={sha1_hash}&amp;page=trackers" title="Tracker list" onclick="loadcontent( '{sha1_hash}', 'trackers' ); return false;">Tracker list</a>
+   <div class="tcontainer" id="torrent_{d_hash}" style="display: none;">
+    <a class="info" href="?mod=torrent&amp;hash={d_hash}&amp;page=info" title="Info" onclick="loadcontent( '{d_hash}', 'info' ); return false;">Info</a>
+    <a class="files" href="?mod=torrent&amp;hash={d_hash}&amp;page=files" title="File list" onclick="loadcontent( '{d_hash}', 'files' ); return false;">File list</a>
+    <a class="trackers" href="?mod=torrent&amp;hash={d_hash}&amp;page=trackers" title="Tracker list" onclick="loadcontent( '{d_hash}', 'trackers' ); return false;">Tracker list</a>
     <div class="clr"></div>
-    <div class="tcontent" id="torrent_{sha1_hash}_content"></div>
+    <div class="tcontent" id="torrent_{d_hash}_content"></div>
    </div>
    <div class="clr"></div>
@@ -461,5 +463,5 @@
    </div>
    <div class="inforight">
-    <xsl:value-of select="sha1_hash" />
+    <xsl:value-of select="d_hash" />
    </div>
    <div class="clr"></div>
@@ -515,5 +517,7 @@
     <xsl:value-of select="d_chunks_hashed" />
     <xsl:text> * </xsl:text>
-    <xsl:value-of select="d_chunk_size" />
+    <xsl:value-of select="d_chunk_size/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="d_chunk_size/@suffix" />
    </div>
    <div class="clr"></div>
@@ -537,15 +541,4 @@
    <div class="clr"></div>
   </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Max memory usage:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/max_memory_usage/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/max_memory_usage/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
   <li class="line spacer">
    <div class="infoleft">
@@ -577,5 +570,5 @@
    <div class="clr"></div>
   </li>
-  <li class="line">
+  <li class="line spacer">
    <div class="infoleft">
     <xsl:text>Seeders:</xsl:text>
@@ -616,5 +609,5 @@
    <div class="clr"></div>
   </li>
-  <li class="line spacer">
+  <li class="line">
    <div class="infoleft">
     <xsl:text>Skipped:</xsl:text>
@@ -631,35 +624,4 @@
    <div class="clr"></div>
   </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Safe sync:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/safe_sync/@value" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Send buffer:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
-  <li class="line">
-   <div class="infoleft">
-    <xsl:text>Receive buffer:</xsl:text>
-   </div>
-   <div class="inforight">
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@value" />
-    <xsl:text> </xsl:text>
-    <xsl:value-of select="/root/torrents/receive_buffer_size/@suffix" />
-   </div>
-   <div class="clr"></div>
-  </li>
  </xsl:template>
 
@@ -678,4 +640,166 @@
  <xsl:template match="torrent_trackers">
   <xsl:apply-templates select="tracker" />
+ </xsl:template>
+
+ <xsl:template match="server_info">
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Client version:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="client_version" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Library version:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="library_version" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line spacer">
+   <div class="infoleft">
+    <xsl:text>Directory:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="directory/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Hostname:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="hostname" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Listening IP address:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="ip/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>IP address reported to the tracker:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="bind/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Port opened:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="port_open/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Random port:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="port_random/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line spacer">
+   <div class="infoleft">
+    <xsl:text>Port range:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="port_range/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Maximum number of uploads:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="max_uploads/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Minimum number of peers:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="min_peers/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Maximum number of peers:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="max_peers/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line spacer">
+   <div class="infoleft">
+    <xsl:text>Max memory usage:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="max_memory_usage/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="max_memory_usage/@suffix" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Check hash:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="check_hash/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Safe sync:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="safe_sync/@value" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Send buffer:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="receive_buffer_size/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="receive_buffer_size/@suffix" />
+   </div>
+   <div class="clr"></div>
+  </li>
+  <li class="line">
+   <div class="infoleft">
+    <xsl:text>Receive buffer:</xsl:text>
+   </div>
+   <div class="inforight">
+    <xsl:value-of select="receive_buffer_size/@value" />
+    <xsl:text> </xsl:text>
+    <xsl:value-of select="receive_buffer_size/@suffix" />
+   </div>
+   <div class="clr"></div>
+  </li>
  </xsl:template>
 
@@ -696,5 +820,5 @@
 
  <xsl:template match="file">
-  <li>
+  <li onmouseover="this.style.background='#eeeeee';" onmouseout="this.style.background='';">
    <div class="fname">
     <span title="Last touched: {f_last_touched}">
@@ -770,5 +894,5 @@
 
  <xsl:template match="dlpath">
-  <li>
+  <li onmouseover="this.style.background='#eeeeee';" onmouseout="this.style.background='';">
    <div class="tufpath">
     <a href="?mod=addtorrent&amp;path={@path}">
Index: emes/default_ajax/layout.main.pics.xsl
===================================================================
--- themes/default_ajax/layout.main.pics.xsl	(revision 80375943887b81466b712c3282096edfb72c3124)
+++ 	(revision )
@@ -1,52 +1,0 @@
-﻿<xsl:stylesheet version="1.1"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                lang="hu">
- <xsl:output method="xml"
-             indent="no"
-             encoding="utf-8"
-             doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
-             doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
-
- <xsl:template match="root">
-  <html lang="hu">
-   <head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-    <meta http-equiv="content-language" content="hu" />
-    <meta http-equiv="cache-control" content="no-store, no-cache, must-revalidate, post-check=0, pre-check=0" />
-    <meta http-equiv="pragma" content="no-cache" />
-    <meta http-equiv="expires" content="thu, 1 jan 1970 00:00:00 gmt" />
-    <meta http-equiv="imagetoolbar" content="no" />  
-    <meta name="author" content="{/root/author}" />
-    <meta name="description" content="{/root/description}" />
-    <meta name="keywords" content="{/root/keywords}" />
-    <meta name="doc-type" content="web page" />
-    <meta name="rating" content="general" />
-    <meta name="robots" content="all" />
-    <link rel="stylesheet" type="text/css" href="themes/default_ajax/inc/style.css" />
-    <title><xsl:value-of select="/root/title" /></title>
-   </head>
-   <body>
-    <div id="top">
-    </div>
-    <div id="pics" style="width: 600px; margin: auto; text-align: center;">
-     <xsl:apply-templates select="err" />
-     <a href="http://img462.imageshack.us/img462/6941/rtwi_01.png" target="_blank"><img src="http://img462.imageshack.us/img462/6941/rtwi_01.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/5564/rtwi_02.png" target="_blank"><img src="http://img462.imageshack.us/img462/5564/rtwi_02.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/5006/rtwi_03.png" target="_blank"><img src="http://img462.imageshack.us/img462/5006/rtwi_03.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/5406/rtwi_04.png" target="_blank"><img src="http://img462.imageshack.us/img462/5406/rtwi_04.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/6782/rtwi_05.png" target="_blank"><img src="http://img462.imageshack.us/img462/6782/rtwi_05.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/2640/rtwi_06.png" target="_blank"><img src="http://img462.imageshack.us/img462/2640/rtwi_06.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/7933/rtwi_07.png" target="_blank"><img src="http://img462.imageshack.us/img462/7933/rtwi_07.th.png" alt="screenshot" /></a>
-     <a href="http://img462.imageshack.us/img462/331/rtwi_08.png" target="_blank"><img src="http://img462.imageshack.us/img462/331/rtwi_08.th.png" alt="screenshot" /></a>
-     <br />
-     <br />
-     <a href="rtwi-070820.tar.gz" title="Download now">Download</a>
-    </div>
-   </body>
-  </html>
- </xsl:template>
-
- <xsl:template match="err">
-  <div id="err"><xsl:value-of select="errmsg" /></div>
- </xsl:template>
-</xsl:stylesheet>
