Project

General

Profile

Download (19.7 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
    pkg.php
5
    Copyright (C) 2013-2015 Electric Sheep Fencing, LP
6
    Copyright (C) 2004-2012 Scott Ullrich <sullrich@gmail.com>
7
    All rights reserved.
8

    
9
    Redistribution and use in source and binary forms, with or without
10
    modification, are permitted provided that the following conditions are met:
11

    
12
    1. Redistributions of source code must retain the above copyright notice,
13
       this list of conditions and the following disclaimer.
14

    
15
    2. Redistributions in binary form must reproduce the above copyright
16
       notice, this list of conditions and the following disclaimer in the
17
       documentation and/or other materials provided with the distribution.
18

    
19
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
21
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
23
    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
    POSSIBILITY OF SUCH DAMAGE.
29
*/
30
/*
31
	pfSense_MODULE:	pkgs
32
*/
33

    
34
##|+PRIV
35
##|*IDENT=page-package-settings
36
##|*NAME=Package: Settings page
37
##|*DESCR=Allow access to the 'Package: Settings' page.
38
##|*MATCH=pkg.php*
39
##|-PRIV
40

    
41
require_once("guiconfig.inc");
42
require_once("pkg-utils.inc");
43

    
44
function gentitle_pkg($pgname) {
45
	global $config;
46
	return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
47
}
48

    
49
function domTT_title($title_msg){
50
	print "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '".gettext($title_msg)."', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
51
}
52

    
53
$xml = $_REQUEST['xml'];
54

    
55
if($xml == "") {
56
	print_info_box_np(gettext("ERROR: No package defined."));
57
	exit;
58
} else {
59
	if(file_exists("/usr/local/pkg/" . $xml))
60
		$pkg = parse_xml_config_pkg("/usr/local/pkg/" . $xml, "packagegui");
61
	else {
62
		echo "File not found " . htmlspecialchars($xml);
63
		exit;
64
	}
65
}
66

    
67
if($pkg['donotsave'] <> "") {
68
	header("Location: pkg_edit.php?xml=" . $xml);
69
	exit;
70
}
71

    
72
if ($pkg['include_file'] != "") {
73
	require_once($pkg['include_file']);
74
}
75

    
76
$package_name = $pkg['menu'][0]['name'];
77
$section      = $pkg['menu'][0]['section'];
78
$config_path  = $pkg['configpath'];
79
$title	      = $pkg['title'];
80

    
81
if($_REQUEST['startdisplayingat']) 
82
	$startdisplayingat = $_REQUEST['startdisplayingat'];
83

    
84
if($_REQUEST['display_maximum_rows']) 
85
	if($_REQUEST['display_maximum_rows'])
86
		$display_maximum_rows = $_REQUEST['display_maximum_rows'];
87

    
88
$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
89

    
90
if ($_GET['act'] == "update") {
91
		
92
		if(is_array($config['installedpackages'][$pkg['name']]) && $pkg['name'] != "" && $_REQUEST['ids'] !=""){
93
			#get current values
94
			$current_values=$config['installedpackages'][$pkg['name']]['config'];
95
			#get updated ids
96
			parse_str($_REQUEST['ids'], $update_list);
97
			#sort ids to know what to change
98
			#usefull to do not loose data when using sorting and paging
99
			$sort_list=$update_list['ids'];
100
			sort($sort_list);
101
			#apply updates
102
			foreach($update_list['ids'] as $key=> $value){
103
				$config['installedpackages'][$pkg['name']]['config'][$sort_list[$key]]=$current_values[$update_list['ids'][$key]];
104
				}
105
			#save current config
106
			write_config();
107
			#sync package
108
			eval ("{$pkg['custom_php_resync_config_command']}");
109
			}
110
		#function called via jquery, no need to continue after save changes.
111
		exit;
112
}
113
if ($_GET['act'] == "del") {
114
		// loop through our fieldnames and automatically setup the fieldnames
115
		// in the environment.  ie: a fieldname of username with a value of
116
		// testuser would automatically eval $username = "testuser";
117
		foreach ($evaledvar as $ip) {
118
			if($pkg['adddeleteeditpagefields']['columnitem'])
119
			  foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
120
				  ${xml_safe_fieldname($column['fielddescr'])} = $ip[xml_safe_fieldname($column['fieldname'])];
121
			  }
122
		}
123

    
124
		$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
125

    
126
		if ($a_pkg[$_GET['id']]) {
127
			unset($a_pkg[$_GET['id']]);
128
			write_config();
129
			if($pkg['custom_delete_php_command'] <> "") {
130
			    if($pkg['custom_php_command_before_form'] <> "")
131
					eval($pkg['custom_php_command_before_form']);
132
		    		eval($pkg['custom_delete_php_command']);
133
			}
134
			header("Location:  pkg.php?xml=" . $xml);
135
			exit;
136
	    }
137
}
138

    
139
ob_start();
140

    
141
$iflist = get_configured_interface_with_descr(false, true);
142
$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
143

    
144
if($pkg['custom_php_global_functions'] <> "")
145
	eval($pkg['custom_php_global_functions']);
146

    
147
if($pkg['custom_php_command_before_form'] <> "")
148
	eval($pkg['custom_php_command_before_form']);
149

    
150
$pgtitle = array($title);
151
include("head.inc");
152

    
153
?>
154

    
155
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
156
<?php include("fbegin.inc"); ?>
157
<script type="text/javascript" src="javascript/domTT/domLib.js"></script>
158
<script type="text/javascript" src="javascript/domTT/domTT.js"></script>
159
<script type="text/javascript" src="javascript/domTT/behaviour.js"></script>
160
<script type="text/javascript" src="javascript/domTT/fadomatic.js"></script>
161
<script type="text/javascript">
162
//<![CDATA[
163
	function setFilter(filtertext) {
164
		jQuery('#pkg_filter').val(filtertext);
165
		document.pkgform.submit();
166
    }
167

    
168
	<?php
169
		if($pkg['adddeleteeditpagefields']['movable']){
170
	?>
171
			jQuery(document).ready(function(){
172
				jQuery('#mainarea table tbody').sortable({
173
					items: 'tr.sortable',
174
					cursor: 'move',
175
					distance: 10,
176
					opacity: 0.8,
177
					helper: function(e,ui){  
178
						ui.children().each(function(){  
179
							jQuery(this).width(jQuery(this).width());  
180
						});
181
					return ui;  
182
					},
183
				});
184
			});
185
			function save_changes_to_xml(xml) {
186
					var ids=jQuery('#mainarea table tbody').sortable('serialize',{key:"ids[]"});
187
					var strloading="<img src='/themes/<?= $g['theme']; ?>/images/misc/loader.gif' alt='loader' /> " +  "<?=gettext('Saving changes...');?>";
188
					if(confirm("<?=gettext("Do you really want to save changes?");?>")){
189
						jQuery.ajax({
190
							type: 'get',
191
							cache: false,
192
							url: "<?=$_SERVER['SCRIPT_NAME'];?>",
193
							data: {xml:'<?=$xml?>', act:'update', ids: ids},
194
							beforeSend: function(){
195
						        jQuery('#savemsg').empty().html(strloading);
196
							},
197
							error: function(data){
198
        						jQuery('#savemsg').empty().html('Error:' + data);
199
   							 },
200
							success: function(data){
201
        						jQuery('#savemsg').empty().html(data);
202
   							 }
203
						});
204
					}
205
			}
206
	<?php 
207
		}
208
	?>
209
//]]>
210
</script>
211
<form action="pkg.php" name="pkgform" method="get">
212
<input type='hidden' name='xml' value='<?=$_REQUEST['xml']?>' />
213
<?php if($_GET['savemsg'] <> "") $savemsg = htmlspecialchars($_GET['savemsg']); ?>
214
<div id="savemsg"></div>
215
<?php if ($savemsg) print_info_box($savemsg); ?>
216
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="package settings">
217
<?php
218
if ($pkg['tabs'] <> "") {
219
    $tab_array = array();
220
    foreach($pkg['tabs']['tab'] as $tab) {
221
        if($tab['tab_level'])
222
            $tab_level = $tab['tab_level'];
223
        else
224
            $tab_level = 1;
225
        if(isset($tab['active'])) {
226
            $active = true;
227
        } else {
228
            $active = false;
229
        }
230
		if(isset($tab['no_drop_down']))
231
			$no_drop_down = true;
232
        $urltmp = "";
233
        if($tab['url'] <> "") $urltmp = $tab['url'];
234
        if($tab['xml'] <> "") $urltmp = "pkg_edit.php?xml=" . $tab['xml'];
235

    
236
        $addresswithport = getenv("HTTP_HOST");
237
        $colonpos = strpos($addresswithport, ":");
238
        if ($colonpos !== False) {
239
            //my url is actually just the IP address of the pfsense box
240
            $myurl = substr($addresswithport, 0, $colonpos);
241
        } else {
242
            $myurl = $addresswithport;
243
        }
244
        // eval url so that above $myurl item can be processed if need be.
245
        $url = str_replace('$myurl', $myurl, $urltmp);
246

    
247
        $tab_array[$tab_level][] = array(
248
                        $tab['text'],
249
                        $active,
250
                        $url
251
                    );
252
    }
253

    
254
    ksort($tab_array);
255
    foreach($tab_array as $tab) {
256
		echo '<tr><td>';
257
		display_top_tabs($tab, $no_drop_down);
258
        echo '</td></tr>';
259
    }
260
}
261
?>
262
<tr><td><div id="mainarea"><table width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
263
	<tr>
264
		<td class="tabcont">
265
			<table width="100%" border="0" cellpadding="6" cellspacing="0" summary="tabs">
266
<?php
267
				/* Handle filtering bar A-Z */				
268
				$include_filtering_inputbox = false;
269
				$colspan = 0;
270
				if($pkg['adddeleteeditpagefields']['columnitem'] <> "") 
271
					foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column)
272
						$colspan++;
273
				if($pkg['fields']['field']) {
274
					// First find the sorting type field if it exists
275
					foreach($pkg['fields']['field'] as $field) {
276
						if($field['type'] == "sorting") {
277
							if(isset($field['include_filtering_inputbox'])) 
278
								$include_filtering_inputbox = true;
279
							if($display_maximum_rows < 1) 
280
								if($field['display_maximum_rows']) 
281
									$display_maximum_rows = $field['display_maximum_rows'];
282
							echo "<tr><td class='listhdrr' colspan='$colspan' align='center'>";
283
							echo "Filter by: ";
284
							$isfirst = true;
285
							for($char = 65; $char < 91; $char++) {
286
								if(!$isfirst) 
287
									echo " | ";
288
								echo "<a href=\"#\" onclick=\"setFilter('" . chr($char) . "');\">" . chr($char) . "</a>";
289
								$isfirst = false;
290
							}
291
							echo "</td></tr>";
292
							echo "<tr><td class='listhdrr' colspan='$colspan' align='center'>";
293
							if($field['sortablefields']) {
294
								echo "Filter field: <select name='pkg_filter_type'>";
295
								foreach($field['sortablefields']['item'] as $si) {
296
									if($si['name'] == $_REQUEST['pkg_filter_type']) 
297
										$SELECTED = "selected=\"selected\"";
298
									else 
299
										$SELECTED = "";
300
									echo "<option value='{$si['name']}' {$SELECTED}>{$si['name']}</option>";
301
								}
302
								echo "</select>";
303
							}
304
							if($include_filtering_inputbox) 
305
								echo "&nbsp;&nbsp;Filter text: <input id='pkg_filter' name='pkg_filter' value='" . $_REQUEST['pkg_filter'] . "' /> <input type='submit' value='Filter' />";
306
							echo "</td></tr><tr><td><font size='-3'>&nbsp;</font></td></tr>";
307
						}
308
					}
309
				}
310
?>
311
				<tr>
312
<?php
313
				if($display_maximum_rows) {
314
					$totalpages = ceil(round((count($evaledvar) / $display_maximum_rows),9));
315
					$page = 1;
316
					$tmpcount = 0;
317
					$tmppp = 0;
318
					if(is_array($evaledvar)) {
319
						foreach ($evaledvar as $ipa) {
320
							if($tmpcount == $display_maximum_rows) {
321
								$page++;
322
								$tmpcount = 0;
323
							}
324
							if($tmppp == $startdisplayingat)
325
						 		break;
326
							$tmpcount++;
327
							$tmppp++;
328
						}
329
					}
330
					echo "<tr><td colspan='" . count($pkg['adddeleteeditpagefields']['columnitem']) . "'>";
331
					echo "<table width='100%' summary=''>";
332
					echo "<tr>";
333
					echo "<td align='left'>Displaying page $page of $totalpages</b></td>";
334
					echo "<td align='right'>Rows per page: <select onchange='document.pkgform.submit();' name='display_maximum_rows'>";
335
					for($x=0; $x<250; $x++) {
336
						if($x == $display_maximum_rows)
337
							$SELECTED = "selected=\"selected\"";
338
						else 
339
							$SELECTED = "";
340
						echo "<option value='$x' $SELECTED>$x</option>\n";
341
						$x=$x+4;
342
					}
343
					echo "</select></td></tr>";
344
					echo "</table>";
345
					echo "</td></tr>";
346
				}
347
				$cols = 0;
348
				if($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
349
				    foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
350
						echo "<td class=\"listhdrr\">" . $column['fielddescr'] . "</td>";
351
						$cols++;
352
				    }
353
				}
354
				echo "</tr>";
355
				$i=0;
356
				$pagination_startingrow=0;
357
				$pagination_counter=0;
358
			    if($evaledvar)
359
			    foreach ($evaledvar as $ip) {
360
				if($startdisplayingat) {
361
					if($i < $startdisplayingat) {
362
						$i++;
363
						continue;
364
					}
365
				}
366
				if($_REQUEST['pkg_filter']) {
367
					// Handle filterered items
368
					if($pkg['fields']['field'] && !$filter_regex) {
369
						// First find the sorting type field if it exists
370
						foreach($pkg['fields']['field'] as $field) {
371
							if($field['type'] == "sorting") {
372
								if($field['sortablefields']['item']) {
373
									foreach($field['sortablefields']['item'] as $sf) {
374
										if($sf['name'] == $_REQUEST['pkg_filter_type']) {
375
											$filter_fieldname = $sf['fieldname'];
376
											#Use a default regex on sortable fields when none is declared
377
											if($sf['regex'])
378
												$filter_regex = str_replace("%FILTERTEXT%", $_REQUEST['pkg_filter'], trim($sf['regex']));
379
											else
380
												$filter_regex = "/{$_REQUEST['pkg_filter']}/i";
381
										}
382
									}
383
								}
384
							}
385
						}
386
					}
387
					// Do we have something to filter on?
388
					unset($filter_matches);
389
					if($pkg['adddeleteeditpagefields']['columnitem'] <> "") {
390
						foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
391
							$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
392
							if($column['fieldname'] == $filter_fieldname) {
393
								if($filter_regex) {
394
									//echo "$filter_regex - $fieldname<p/>";
395
									preg_match($filter_regex, $fieldname, $filter_matches);
396
									break;
397
								}
398
							}
399
						}
400
					}
401
					if(!$filter_matches) {
402
						$i++;
403
						continue;
404
					}
405
				}
406
				if($pkg['adddeleteeditpagefields']['movable'])
407
					echo "<tr valign=\"top\" class=\"sortable\" id=\"id_{$i}\">\n";
408
				else
409
					echo "<tr valign=\"top\">\n";
410
				if($pkg['adddeleteeditpagefields']['columnitem'] <> "")
411
					foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
412
						if ($column['fieldname'] == "description")
413
							$class = "listbg";
414
						else
415
							$class = "listlr";
416
?>
417
						<td class="<?=$class;?>" ondblclick="document.location='pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i;?>';">
418
							<?php
419
								$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
420
								#Check if columnitem has a type field declared
421
							    if($column['type'] == "checkbox") {
422
									if($fieldname == "") {
423
								    	echo gettext("No");
424
									} else {
425
								    	echo gettext("Yes");
426
									}
427
							    } else if ($column['type'] == "interface") {
428
									echo  $column['prefix'] . $iflist[$fieldname] . $column['suffix'];
429
							    } else {
430
							    	#Check if columnitem has an encoding field declared
431
							    	if ($column['encoding'] == "base64")
432
										echo  $column['prefix'] . base64_decode($fieldname) . $column['suffix'];
433
									#Check if there is a custom info to show when $fieldname is not empty
434
									else if($column['listmodeon'] && $fieldname != "")
435
								   		echo $column['prefix'] . gettext($column['listmodeon']). $column['suffix'];
436
								   	#Check if there is a custom info to show when $fieldname is empty	
437
								   	else if($column['listmodeoff'] && $fieldname == "")
438
								    	echo $column['prefix'] .gettext($column['listmodeoff']). $column['suffix'];
439
									else
440
										echo $column['prefix'] . $fieldname ." ". $column['suffix'];
441
							    }
442
							?>
443
						</td>
444
<?php
445
					}
446
?>
447
				<td valign="middle" class="list nowrap">
448
				<table border="0" cellspacing="0" cellpadding="1" summary="icons">
449
				<tr>
450
				<?php
451
				#Show custom description to edit button if defined
452
				$edit_msg=($pkg['adddeleteeditpagefields']['edittext']?$pkg['adddeleteeditpagefields']['edittext']:"Edit this item");?>
453
				<td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" <?=domTT_title($edit_msg)?> alt="edit" /></a></td>
454
				<?php
455
				#Show custom description to delete button if defined
456
				$delete_msg=($pkg['adddeleteeditpagefields']['deletetext']?$pkg['adddeleteeditpagefields']['deletetext']:"Delete this item");?>
457
				<td valign="middle"><a href="pkg.php?xml=<?=$xml?>&amp;act=del&amp;id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this item?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" <?=domTT_title($delete_msg)?> alt="delete" /></a></td>
458
				</tr>
459
				</table>
460
				</td>
461
<?php
462
				echo "</tr>\n";
463
				// Handle pagination and display_maximum_rows
464
				if($display_maximum_rows) {
465
					if($pagination_counter == ($display_maximum_rows-1) or 
466
					   $i ==  (count($evaledvar)-1)) {
467
						$colcount = count($pkg['adddeleteeditpagefields']['columnitem']);
468
						$final_footer = "";
469
						$final_footer .= "<tr><td colspan='$colcount'>";
470
						$final_footer .=  "<table width='100%' summary=''><tr>";
471
						$final_footer .=  "<td align='left'>";
472
						$startingat = $startdisplayingat - $display_maximum_rows;
473
						if($startingat > -1) {
474
							$final_footer .=  "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat={$startingat}&amp;display_maximum_rows={$display_maximum_rows}'>";
475
						} else {
476
							if($startingnat > 1) 
477
								$final_footer .=  "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=0&amp;display_maximum_rows={$display_maximum_rows}'>";
478
						}
479
						$final_footer .=  "<font size='2'><< Previous page</font></a>";
480
						if($tmppp + $display_maximum_rows > count($evaledvar)) 
481
							$endingrecord = count($evaledvar);
482
						else 
483
							$endingrecord = $tmppp + $display_maximum_rows;
484
						$final_footer .=  "</td><td align='center'>";
485
						$tmppp++;
486
						$final_footer .=  "<font size='2'>Displaying {$tmppp} - {$endingrecord} / " . count($evaledvar) . " records";
487
						$final_footer .=  "</font></td><td align='right'>&nbsp;";
488
						if(($i+1) < count($evaledvar))
489
							$final_footer .=  "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=" . ($startdisplayingat + $display_maximum_rows) . "&amp;display_maximum_rows={$display_maximum_rows}'>";
490
						$final_footer .=  "<font size='2'>Next page >></font></a>";	
491
						$final_footer .=  "</td></tr></table></td></tr>";
492
						$i = count($evaledvar);
493
						break;
494
					}
495
				}
496
				$i++;
497
				$pagination_counter++;
498
			    }
499
?>
500
				<tr>
501
					<td colspan="<?=$cols?>"></td>
502
					<td>
503
						<table border="0" cellspacing="0" cellpadding="1" summary="icons">
504
							<tr>
505
								<?php
506
								#Show custom description to add button if defined
507
								$add_msg=($pkg['adddeleteeditpagefields']['addtext']?$pkg['adddeleteeditpagefields']['addtext']:"Add a new item");?>
508
								<td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;id=<?=$i?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" <?=domTT_title($add_msg)?> alt="add" /></a></td>
509
								<?php
510
								#Show description button and info if defined
511
								if($pkg['adddeleteeditpagefields']['description']){?>
512
								<td valign="middle"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_info_pkg.gif" width="17" height="17" border="0" <?=domTT_title($pkg['adddeleteeditpagefields']['description'])?> alt="info" /></td>
513
								<?php }?>
514
							</tr>
515
						</table>
516
					</td>
517
				</tr>
518
				<?=$final_footer?>
519
				<?php
520
				#Show save button only when movable is defined
521
				if($pkg['adddeleteeditpagefields']['movable']){?>
522
				<tr><td><input class="formbtn" type="button" value="Save" name="Submit" onclick="save_changes_to_xml('<?=$xml?>')" /></td></tr>
523
				<?php }?>
524
		</table>
525
	</td>
526
</tr>
527
</table>
528
</div></td></tr></table>
529

    
530
</form>
531
<?php include("fend.inc"); ?>
532

    
533
<?php
534
	echo "<!-- filter_fieldname: {$filter_fieldname} -->";
535
	echo "<!-- filter_regex: {$filter_regex} -->";
536
?>
537

    
538
</body>
539
</html>
(116-116/241)