PageRenderTime 72ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/webserver/default/amuleweb-main-dload.php

https://bitbucket.org/gzf/umule
PHP | 518 lines | 518 code | 0 blank | 0 comment | 1 complexity | 9aed520d203beec0bcc9d8617cb7352b MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0, LGPL-2.0, LGPL-2.1
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>aMule control panel</title>
  5. <?php
  6. if ( $_SESSION["auto_refresh"] > 0 ) {
  7. echo "<meta http-equiv=\"refresh\" content=\"", $_SESSION["auto_refresh"], '">';
  8. }
  9. ?><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <script language="JavaScript" type="text/JavaScript">
  11. <!--
  12. function MM_swapImgRestore() { //v3.0
  13. var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
  14. }
  15. function MM_preloadImages() { //v3.0
  16. var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
  17. var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
  18. if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
  19. }
  20. function MM_findObj(n, d) { //v4.01
  21. var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
  22. d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  23. if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  24. for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  25. if(!x && d.getElementById) x=d.getElementById(n); return x;
  26. }
  27. function MM_swapImage() { //v3.0
  28. var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
  29. if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
  30. }
  31. function MM_nbGroup(event, grpName) { //v6.0
  32. var i,img,nbArr,args=MM_nbGroup.arguments;
  33. if (event == "init" && args.length > 2) {
  34. if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
  35. img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
  36. if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
  37. nbArr[nbArr.length] = img;
  38. for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
  39. if (!img.MM_up) img.MM_up = img.src;
  40. img.src = img.MM_dn = args[i+1];
  41. nbArr[nbArr.length] = img;
  42. } }
  43. } else if (event == "over") {
  44. document.MM_nbOver = nbArr = new Array();
  45. for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
  46. if (!img.MM_up) img.MM_up = img.src;
  47. img.src = (img.MM_dn && args[i+2]) ? args[i+2] : ((args[i+1])? args[i+1] : img.MM_up);
  48. nbArr[nbArr.length] = img;
  49. }
  50. } else if (event == "out" ) {
  51. for (i=0; i < document.MM_nbOver.length; i++) {
  52. img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  53. } else if (event == "down") {
  54. nbArr = document[grpName];
  55. if (nbArr)
  56. for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
  57. document[grpName] = nbArr = new Array();
  58. for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
  59. if (!img.MM_up) img.MM_up = img.src;
  60. img.src = img.MM_dn = (args[i+1])? args[i+1] : img.MM_up;
  61. nbArr[nbArr.length] = img;
  62. } }
  63. }
  64. //-->
  65. </script>
  66. <link href="style.css" rel="stylesheet" type="text/css">
  67. <style type="text/css">
  68. <!--
  69. caption {
  70. font-family: Helvetica;
  71. font-size: 18px;
  72. font-weight: bold;
  73. color: #003161;
  74. }
  75. th {
  76. font-family: Helvetica;
  77. font-size: 14px;
  78. font-height: 22px;
  79. font-weight: bold;
  80. color: #003161;
  81. }
  82. a:link {
  83. color: #003161;
  84. text-decoration: none;
  85. }
  86. a:active {
  87. color: #003161;
  88. text-decoration: none;
  89. }
  90. a:visited {
  91. color: #003161;
  92. text-decoration: none;
  93. }
  94. a:hover {
  95. color: #c0c0c0;
  96. text-decoration: underline;
  97. }
  98. td {
  99. font-family: Helvetica;
  100. font-size: 12px;
  101. font-weight: normal;
  102. }
  103. label {
  104. font-family: Helvetica;
  105. font-size: 14px;
  106. font-weight: bold;
  107. }
  108. .texte {
  109. font-family: Helvetica;
  110. font-size: 12px;
  111. font-weight: normal;
  112. }
  113. label {
  114. font-family:"trebuchet ms",sans-serif;
  115. font-size: 12px;
  116. font-weight:bold
  117. }
  118. input {
  119. border:1px solid #003161;
  120. background-color: white;
  121. font-family:"trebuchet ms",sans-serif;
  122. font-size: 12px;
  123. color: #003161;
  124. }
  125. select, option {
  126. background-color: white;
  127. font-size: 12px;
  128. color: #003161;
  129. }
  130. textarea {
  131. border:1px solid #003161;
  132. background-color: #90B6DB;
  133. font-family:"trebuchet ms",sans-serif;
  134. font-size: 12px;
  135. color: white;
  136. }
  137. -->
  138. </style>
  139. </head><script language="JavaScript" type="text/JavaScript">
  140. function formCommandSubmit(command)
  141. {
  142. if ( command == "cancel" ) {
  143. var res = confirm("Delete selected files ?")
  144. if ( res == false ) {
  145. return;
  146. }
  147. }
  148. if ( command != "filter" ) {
  149. <?php
  150. if ($_SESSION["guest_login"] != 0) {
  151. echo 'alert("You logged in as guest - commands are disabled");';
  152. echo "return;";
  153. }
  154. ?>
  155. }
  156. var frm=document.forms.mainform
  157. frm.command.value=command
  158. frm.submit()
  159. }
  160. </script>
  161. <body background="images/fond.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="MM_preloadImages('images/transf_1.png','images/shared_1.png','images/search_1.png','images/edkserv_1.png','images/sheserv_1.png','images/stats_1.png')">
  162. <table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
  163. <tr valign="top">
  164. <td width="143" height="64"><img src="images/logo.png" width="143" height="64"></td>
  165. <td width="100%" height="64" align="right" background="images/fond_haut.png"> <table border="0" cellspacing="0" cellpadding="0">
  166. <tr>
  167. <td><a href="amuleweb-main-dload.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('transfert','','images/transf_1.png',1)"><img src="images/transf_0.png" alt="transfert" name="transfert" width="52" height="50" border="0"></a></td>
  168. <td><a href="amuleweb-main-shared.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('shared','','images/shared_1.png',1)"><img src="images/shared_0.png" alt="shared" name="shared" width="52" height="50" border="0"></a></td>
  169. <td><a href="amuleweb-main-search.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('search','','images/search_1.png',1)"><img src="images/search_0.png" alt="search" name="search" width="52" height="50" border="0"></a></td>
  170. <td><a href="amuleweb-main-servers.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('edkserver','','images/edkserv_1.png',1)"><img src="images/edkserv_0.png" alt="edkserver" name="edkserver" width="52" height="50" border="0"></a></td>
  171. <td><a href="amuleweb-main-kad.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('sheserv','','images/sheserv_1.png',1)"><img src="images/sheserv_0.png" alt="sheserv" name="sheserv" width="52" height="50" border="0"></a></td>
  172. <td><a href="amuleweb-main-stats.php" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('statistiques','','images/stats_1.png',1)"><img src="images/stats_0.png" alt="statistiques" name="statistiques" width="52" height="50" border="0"></a></td>
  173. <td><img src="images/col.png"></td>
  174. <td width="10"></td>
  175. <td width="190" align="right" class="texteinv"><a href="login.php">exit</a><br>
  176. <a href="amuleweb-main-log.php">log &bull;</a> <a href="amuleweb-main-prefs.php">configuration</a>
  177. </td>
  178. <td width="10"></td>
  179. </tr>
  180. </table></td>
  181. </tr>
  182. <tr align="center" valign="top">
  183. <td colspan="2"><form action="amuleweb-main-dload.php" method="post" name="mainform">
  184. <table width="100%" border="0" cellpadding="0" cellspacing="0">
  185. <tr>
  186. <td align="center"><table border="0" cellpadding="0" cellspacing="0">
  187. <tr>
  188. <td><input type="hidden" name="command"></td>
  189. <td><a href="javascript:formCommandSubmit('pause');" onClick="MM_nbGroup('down','group1','pause','',1)" onMouseOver="MM_nbGroup('over','pause','','',1)" onMouseOut="MM_nbGroup('out')"><img name="pause" src="images/pause.png" alt="pause" border="0" onLoad=""></a></td>
  190. <td><a href="javascript:formCommandSubmit('resume');" onClick="MM_nbGroup('down','group1','resume','',1)" onMouseOver="MM_nbGroup('over','resume','','',1)" onMouseOut="MM_nbGroup('out')"><img img name="resume" src="images/play.png" alt="resume" border="0" onLoad=""></a></td>
  191. <td><a href="javascript:formCommandSubmit('prioup');" onClick="MM_nbGroup('down','group1','up','',1)" onMouseOver="MM_nbGroup('over','up','','',1)" onMouseOut="MM_nbGroup('out')"><img img name="prioup" src="images/up.png" alt="prioup" border="0" onLoad=""></a></td>
  192. <td><a href="javascript:formCommandSubmit('priodown');" onClick="MM_nbGroup('down','group1','down','',1)" onMouseOver="MM_nbGroup('over','down','','',1)" onMouseOut="MM_nbGroup('out')"><img img name="priodown" src="images/down.png" alt="priodown" border="0" onLoad=""></a></td>
  193. <td><a href="javascript:formCommandSubmit('cancel');" onClick="MM_nbGroup('down','group1','cancel','',1)" onMouseOver="MM_nbGroup('over','delete','','',1)" onMouseOut="MM_nbGroup('out')"><img img name="cancel" src="images/close.png" alt="cancel" border="0" onLoad=""></a></td>
  194. <td><table border="0" cellpadding="0" cellspacing="0">
  195. <tr>
  196. <td>
  197. <?php
  198. $all_status = array("all", "Waiting", "Paused", "Downloading");
  199. if ( $HTTP_GET_VARS["command"] == "filter") {
  200. $_SESSION["filter_status"] = $HTTP_GET_VARS["status"];
  201. $_SESSION["filter_cat"] = $HTTP_GET_VARS["category"];
  202. }
  203. if ( $_SESSION["filter_status"] == '') $_SESSION["filter_status"] = 'all';
  204. if ( $_SESSION["filter_cat"] == '') $_SESSION["filter_cat"] = 'all';
  205. echo '<select name="status"> ';
  206. foreach ($all_status as $s) {
  207. echo (($s == $_SESSION["filter_status"]) ? '<option selected>' : '<option>'), $s, '</option>';
  208. }
  209. echo '</select>';
  210. //var_dump($_SESSION["filter_cat"]);
  211. echo '<select name="category" id="category">';
  212. $cats = amule_get_categories();
  213. foreach($cats as $c) {
  214. echo (($c == $_SESSION["filter_cat"]) ? '<option selected>' : '<option>'), $c, '</option>';
  215. }
  216. echo '</select>';
  217. ?>
  218. </td>
  219. <td><a href="javascript:formCommandSubmit('filter');" onClick="MM_nbGroup('down','group1','resume','',1)" onMouseOver="MM_nbGroup('over','resume','','',1)" onMouseOut="MM_nbGroup('out')"><img src="images/filter.png" border="0" alt="Apply" name="resume" border="0" onload=""></a></td>
  220. <td>&nbsp;</td>
  221. <td>&nbsp;</td>
  222. <td>
  223. <?php
  224. if ($_SESSION["guest_login"] != 0) {
  225. echo "<b>&nbsp;You logged in as guest - commands are disabled</b>";
  226. }
  227. ?>
  228. </td>
  229. </tr>
  230. </table></td>
  231. </tr>
  232. </table></td>
  233. </tr>
  234. <tr>
  235. <td height="10" align="center"> </td>
  236. </tr>
  237. <tr>
  238. <td colspan="2"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <caption>
  239. DOWNLOAD
  240. </caption>
  241. <tr>
  242. <td width="24"><img src="images/tab_top_left.png" width="24" height="24"></td>
  243. <td background="images/tab_top.png">&nbsp;</td>
  244. <td width="24"><img src="images/tab_top_right.png" width="24" height="24"></td>
  245. </tr>
  246. <tr>
  247. <td width="24" background="images/tab_left.png">&nbsp;</td>
  248. <td bgcolor="#FFFFFF"><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
  249. <tr>
  250. <th>&nbsp;</th>
  251. <th><a href="amuleweb-main-dload.php?sort=name">File name</a></th>
  252. <th><a href="amuleweb-main-dload.php?sort=size">Size</a></th>
  253. <th><a href="amuleweb-main-dload.php?sort=size_done">Completed</a></th>
  254. <th><a href="amuleweb-main-dload.php?sort=speed">Download speed</a></th>
  255. <th><a href="amuleweb-main-dload.php?sort=progress">Progress</a></th>
  256. <th><a href="amuleweb-main-dload.php?sort=srccount">Sources</a></th>
  257. <th><a href="amuleweb-main-dload.php?sort=status">Status</a></th>
  258. <th><a href="amuleweb-main-dload.php?sort=prio">Priority</a></th>
  259. </tr><tr><td colspan="9" height="1" bgcolor="#000000"></td></tr>
  260. <?php
  261. function CastToXBytes($size)
  262. {
  263. if ( $size < 1024 ) {
  264. $result = $size . " b";
  265. } elseif ( $size < 1048576 ) {
  266. $result = ($size / 1024.0) . " kb";
  267. } elseif ( $size < 1073741824 ) {
  268. $result = ($size / 1048576.0) . " mb";
  269. } else {
  270. $result = ($size / 1073741824.0) . " gb";
  271. }
  272. return $result;
  273. }
  274. function StatusString($file)
  275. {
  276. if ( $file->status == 7 ) {
  277. return "Paused";
  278. } elseif ( $file->src_count_xfer > 0 ) {
  279. return "Downloading";
  280. } else {
  281. return "Waiting";
  282. }
  283. }
  284. function PrioString($file)
  285. {
  286. $prionames = array(0 => "Low", 1 => "Normal", 2 => "High",
  287. 3 => "Very high", 4 => "Very low", 5=> "Auto", 6 => "Release");
  288. $result = $prionames[$file->prio];
  289. if ( $file->prio_auto == 1) {
  290. $result = $result . "(auto)";
  291. }
  292. return $result;
  293. }
  294. //
  295. // declare it here, before any function reffered it in "global"
  296. //
  297. $sort_order;$sort_reverse;
  298. function my_cmp($a, $b)
  299. {
  300. global $sort_order, $sort_reverse;
  301. switch ( $sort_order) {
  302. case "size": $result = $a->size > $b->size; break;
  303. case "size_done": $result = $a->size_done > $b->size_done; break;
  304. case "progress": $result = (((float)$a->size_done)/((float)$a->size)) > (((float)$b->size_done)/((float)$b->size)); break;
  305. case "name": $result = $a->name > $b->name; break;
  306. case "speed": $result = $a->speed > $b->speed; break;
  307. case "scrcount": $result = $a->src_count > $b->src_count; break;
  308. case "status": $result = StatusString($a) > StatusString($b); break;
  309. case "prio": $result = $a->prio < $b->prio; break;
  310. }
  311. if ( $sort_reverse ) {
  312. $result = !$result;
  313. }
  314. //var_dump($sort_reverse);
  315. return $result;
  316. }
  317. //
  318. // perform command before processing content
  319. if ( ($HTTP_GET_VARS["command"] != "") && ($_SESSION["guest_login"] == 0) ) {
  320. foreach ( $HTTP_GET_VARS as $name => $val) {
  321. // this is file checkboxes
  322. if ( (strlen($name) == 32) and ($val == "on") ) {
  323. //var_dump($name);
  324. amule_do_download_cmd($name, $HTTP_GET_VARS["command"]);
  325. }
  326. }
  327. //
  328. // check "filter-by-status" settings
  329. //
  330. if ( $HTTP_GET_VARS["command"] == "filter") {
  331. //var_dump($_SESSION);
  332. $_SESSION["filter_status"] = $HTTP_GET_VARS["status"];
  333. $_SESSION["filter_cat"] = $HTTP_GET_VARS["category"];
  334. }
  335. }
  336. if ( $_SESSION["filter_status"] == "") $_SESSION["filter_status"] = "all";
  337. if ( $_SESSION["filter_cat"] == "") $_SESSION["filter_cat"] = "all";
  338. $downloads = amule_load_vars("downloads");
  339. $sort_order = $HTTP_GET_VARS["sort"];
  340. if ( $sort_order == "" ) {
  341. $sort_order = $_SESSION["download_sort"];
  342. } else {
  343. if ( $_SESSION["download_sort_reverse"] == "" ) {
  344. $_SESSION["download_sort_reverse"] = 0;
  345. } else {
  346. if ( $HTTP_GET_VARS["sort"] != '') {
  347. $_SESSION["download_sort_reverse"] = !$_SESSION["download_sort_reverse"];
  348. }
  349. }
  350. }
  351. //var_dump($_SESSION);
  352. $sort_reverse = $_SESSION["download_sort_reverse"];
  353. if ( $sort_order != "" ) {
  354. $_SESSION["download_sort"] = $sort_order;
  355. usort(&$downloads, "my_cmp");
  356. }
  357. //
  358. // Prepare categories index array
  359. $cats = amule_get_categories();
  360. foreach($cats as $i => $c) {
  361. $cat_idx[$c] = $i;
  362. }
  363. foreach ($downloads as $file) {
  364. $filter_status_result = ($_SESSION["filter_status"] == "all") or
  365. ($_SESSION["filter_status"] == StatusString($file));
  366. $filter_cat_result = ($_SESSION["filter_cat"] == "all") or
  367. ($cat_idx[ $_SESSION["filter_cat"] ] == $file->category);
  368. if ( $filter_status_result and $filter_cat_result) {
  369. print "<tr>";
  370. echo "<td class='texte' height='22'>", '<input type="checkbox" name="', $file->hash, '" >', "</td>";
  371. echo "<td class='texte' height='22'>", $file->short_name, "</td>";
  372. echo "<td class='texte' height='22' align='center'>", CastToXBytes($file->size), "</td>";
  373. echo "<td class='texte' height='22' align='center'>", CastToXBytes($file->size_done), "&nbsp;(",
  374. ((float)$file->size_done*100)/((float)$file->size), "%)</td>";
  375. echo "<td class='texte' height='22' align='center'>", ($file->speed > 0) ? (CastToXBytes($file->speed) . "/s") : "-", "</td>";
  376. echo "<td class='texte' height='22' align='center' align='center'>", $file->progress, "</td>";
  377. echo "<td class='texte' height='22' align='center'>";
  378. if ( $file->src_count_not_curr != 0 ) {
  379. echo $file->src_count - $file->src_count_not_curr, " / ";
  380. }
  381. echo $file->src_count, " ( ", $file->src_count_xfer, " ) ";
  382. if ( $file->src_count_a4af != 0 ) {
  383. echo "+ ", $file->src_count_a4af;
  384. }
  385. echo "</td>";
  386. echo "<td class='texte' height='22' align='center'>", StatusString($file), "</td>";
  387. echo "<td class='texte' height='22' align='center'>", PrioString($file), "</td>";
  388. print "</tr><tr><td colspan='9' height='1' bgcolor='#c0c0c0'></td></tr>";
  389. }
  390. }
  391. ?>
  392. </table></td>
  393. <td width="24" background="images/tab_right.png">&nbsp;</td>
  394. </tr>
  395. <tr>
  396. <td width="24"><img src="images/tab_bottom_left.png" width="24" height="24"></td>
  397. <td background="images/tab_bottom.png">&nbsp;</td>
  398. <td width="24"><img src="images/tab_bottom_right.png" width="24" height="24"></td>
  399. </tr>
  400. </table></td>
  401. </tr>
  402. </table>
  403. </form>
  404. <table width="100%" border="0" cellspacing="0" cellpadding="0"><caption>
  405. UPLOAD
  406. </caption>
  407. <tr>
  408. <td width="24"><img src="images/tab_top_left.png" width="24" height="24"></td>
  409. <td background="images/tab_top.png">&nbsp;</td>
  410. <td width="24"><img src="images/tab_top_right.png" width="24" height="24"></td>
  411. </tr>
  412. <tr>
  413. <td width="24" background="images/tab_left.png">&nbsp;</td>
  414. <td bgcolor="#FFFFFF"><table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" class="doad-table">
  415. <tr>
  416. <td>&nbsp;</td>
  417. <th>File Name</th>
  418. <th>Username</th>
  419. <th>Up</th>
  420. <th>Down</th>
  421. <th>&nbsp;</th>
  422. <th>&nbsp;</th>
  423. <th>Speed</th>
  424. <td>&nbsp;</td>
  425. </tr><tr><td colspan="9" height="1" bgcolor="#000000"></td></tr>
  426. <?php
  427. function CastToXBytes($size)
  428. {
  429. if ( $size < 1024 ) {
  430. $result = $size . " b";
  431. } elseif ( $size < 1048576 ) {
  432. $result = ($size / 1024.0) . " kb";
  433. } elseif ( $size < 1073741824 ) {
  434. $result = ($size / 1048576.0) . " mb";
  435. } else {
  436. $result = ($size / 1073741824.0) . " gb";
  437. }
  438. return $result;
  439. }
  440. $uploads = amule_load_vars("uploads");
  441. foreach ($uploads as $file) {
  442. echo "<tr>";
  443. echo "<td class='texte' height='22' align='center'>", "</td>";
  444. echo "<td class='texte' height='22'>", $file->short_name, "</td>";
  445. echo "<td class='texte' height='22' align='center'>", $file->user_name, "</td>";
  446. echo "<td class='texte' height='22' align='center'>", CastToXBytes($file->xfer_up), "</td>";
  447. echo "<td class='texte' height='22' align='center'>", CastToXBytes($file->xfer_down), "</td>";
  448. echo "<td class='texte' height='22' align='center'>", "</td>";
  449. echo "<td class='texte' height='22' align='center'>", "</td>";
  450. echo "<td class='texte' height='22' align='center'>", ($file->xfer_speed > 0) ? (CastToXBytes($file->xfer_speed) . "/s") : "-", "</td>";
  451. echo "<td class='texte' height='22' align='center'>", "</td>";
  452. echo "</tr><tr><td colspan='9' height='1' bgcolor='#c0c0c0'></td></tr>";
  453. }
  454. ?>
  455. </table></td>
  456. <td width="24" background="images/tab_right.png">&nbsp;</td>
  457. </tr>
  458. <tr>
  459. <td width="24"><img src="images/tab_bottom_left.png" width="24" height="24"></td>
  460. <td background="images/tab_bottom.png">&nbsp;</td>
  461. <td width="24"><img src="images/tab_bottom_right.png" width="24" height="24"></td>
  462. </tr>
  463. </table>
  464. </td>
  465. </tr>
  466. <tr valign="bottom">
  467. <td height="25" colspan="2"> <table width="100%" height="40" border="0" cellpadding="0" cellspacing="0">
  468. <tr align="center" valign="middle">
  469. <td width="50%"> <iframe name="stats" src="footer.php" height="35" width="100%" scrolling="no" frameborder="0">ed2klink</iframe>
  470. </td>
  471. <td width="50%"> <iframe name="stats" src="stats.php" height="35" width="100%" scrolling="no" frameborder="0">connection</iframe>
  472. </td>
  473. </tr>
  474. </table></td>
  475. </tr>
  476. </table>
  477. </body>
  478. </html>