1<?php
2/*
3 +-------------------------------------------------------------------------+
4 | Copyright (C) 2004-2021 The Cacti Group                                 |
5 |                                                                         |
6 | This program is free software; you can redistribute it and/or           |
7 | modify it under the terms of the GNU General Public License             |
8 | as published by the Free Software Foundation; either version 2          |
9 | of the License, or (at your option) any later version.                  |
10 |                                                                         |
11 | This program is distributed in the hope that it will be useful,         |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of          |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           |
14 | GNU General Public License for more details.                            |
15 +-------------------------------------------------------------------------+
16 | Cacti: The Complete RRDtool-based Graphing Solution                     |
17 +-------------------------------------------------------------------------+
18 | This code is designed, written, and maintained by the Cacti Group. See  |
19 | about.php and/or the AUTHORS file for specific developer information.   |
20 +-------------------------------------------------------------------------+
21 | http://www.cacti.net/                                                   |
22 +-------------------------------------------------------------------------+
23*/
24
25include('./include/auth.php');
26include_once('./lib/vdef.php');
27
28$vdef_actions = array(
29	'1' => __('Delete'),
30	'2' => __('Duplicate')
31);
32
33set_default_action();
34
35switch (get_request_var('action')) {
36	case 'save':
37		vdef_form_save();
38
39		break;
40	case 'actions':
41		vdef_form_actions();
42
43		break;
44	case 'item_remove_confirm':
45		vdef_item_remove_confirm();
46
47		break;
48	case 'item_remove':
49		vdef_item_remove();
50
51		break;
52	case 'item_movedown':
53		get_filter_request_var('vdef_id');
54
55		item_movedown();
56
57		header('Location: vdef.php?header=false&action=edit&id=' . get_request_var('vdef_id'));
58		break;
59	case 'item_moveup':
60		get_filter_request_var('vdef_id');
61
62		item_moveup();
63
64		header('Location: vdef.php?header=false&action=edit&id=' . get_request_var('vdef_id'));
65		break;
66	case 'item_edit':
67		top_header();
68		vdef_item_edit();
69		bottom_footer();
70
71		break;
72	case 'edit':
73		top_header();
74
75		vdef_edit();
76
77		bottom_footer();
78
79		break;
80	case 'ajax_dnd':
81		vdef_item_dnd();
82
83		break;
84	default:
85		top_header();
86
87		vdef();
88
89		bottom_footer();
90
91		break;
92}
93
94/* --------------------------
95    Global Form Functions
96   -------------------------- */
97
98function draw_vdef_preview($vdef_id) {
99	?>
100	<tr class='even'>
101		<td style='padding:4px'>
102			<pre>vdef=<?php print html_escape(get_vdef($vdef_id, true));?></pre>
103		</td>
104	</tr>
105	<?php
106}
107
108/* --------------------------
109    The Save Function
110   -------------------------- */
111
112function vdef_form_save() {
113	if (isset_request_var('save_component_vdef')) {
114		$save['id']   = get_filter_request_var('id');
115		$save['hash'] = get_hash_vdef(get_request_var('id'));
116		$save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3);
117
118		if (!is_error_message()) {
119			$vdef_id = sql_save($save, 'vdef');
120
121			if ($vdef_id) {
122				raise_message(1);
123			} else {
124				raise_message(2);
125			}
126		}
127
128		header('Location: vdef.php?action=edit&header=false&id=' . (empty($vdef_id) ? get_request_var('id') : $vdef_id));
129	} elseif (isset_request_var('save_component_item')) {
130		$sequence = get_sequence(get_filter_request_var('id'), 'sequence', 'vdef_items', 'vdef_id=' . get_filter_request_var('vdef_id'));
131
132		$save['id']       = get_filter_request_var('id');
133		$save['hash']     = get_hash_vdef(get_request_var('id'), 'vdef_item');
134		$save['vdef_id']  = get_filter_request_var('vdef_id');
135		$save['sequence'] = $sequence;
136		$save['type']     = get_nfilter_request_var('type');
137		$save['value']    = get_nfilter_request_var('value');
138
139		if (!is_error_message()) {
140			$vdef_item_id = sql_save($save, 'vdef_items');
141
142			if ($vdef_item_id) {
143				raise_message(1);
144			} else {
145				raise_message(2);
146			}
147		}
148
149		if (is_error_message()) {
150			header('Location: vdef.php?action=item_edit&header=false&vdef_id=' . get_request_var('vdef_id') . '&id=' . (empty($vdef_item_id) ? get_request_var('id') : $vdef_item_id));
151		} else {
152			header('Location: vdef.php?action=edit&header=false&id=' . get_request_var('vdef_id'));
153		}
154	}
155}
156
157function duplicate_vdef($_vdef_id, $vdef_title) {
158	global $fields_vdef_edit;
159
160	$vdef       = db_fetch_row_prepared('SELECT * FROM vdef WHERE id = ?', array($_vdef_id));
161	$vdef_items = db_fetch_assoc_prepared('SELECT * FROM vdef_items WHERE vdef_id = ?', array($_vdef_id));
162
163	/* substitute the title variable */
164	$vdef['name'] = str_replace('<vdef_title>', $vdef['name'], $vdef_title);
165
166	/* create new entry: device_template */
167	$save['id']   = 0;
168	$save['hash'] = get_hash_vdef(0);
169
170	$fields_vdef_edit = preset_vdef_form_list();
171	foreach ($fields_vdef_edit as $field => $array) {
172		if (!preg_match('/^hidden/', $array['method'])) {
173			$save[$field] = $vdef[$field];
174		}
175	}
176
177	$vdef_id = sql_save($save, 'vdef');
178
179	/* create new entry(s): vdef_items */
180	if (cacti_sizeof($vdef_items) > 0) {
181		foreach ($vdef_items as $vdef_item) {
182			unset($save);
183
184			$save['id']       = 0;
185			$save['hash']     = get_hash_vdef(0, 'vdef_item');
186			$save['vdef_id']  = $vdef_id;
187			$save['sequence'] = $vdef_item['sequence'];
188			$save['type']     = $vdef_item['type'];
189			$save['value']    = $vdef_item['value'];
190
191			sql_save($save, 'vdef_items');
192		}
193	}
194}
195
196/* ------------------------
197    The 'actions' function
198   ------------------------ */
199
200function vdef_form_actions() {
201	global $vdef_actions;
202
203	/* if we are to save this form, instead of display it */
204	if (isset_request_var('selected_items')) {
205		$selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items'));
206
207		if ($selected_items != false) {
208			if (get_nfilter_request_var('drp_action') === '1') { // delete
209				/* do a referential integrity check */
210				if (cacti_sizeof($selected_items)) {
211				foreach($selected_items as $vdef_id) {
212					/* ================= input validation ================= */
213					input_validate_input_number($vdef_id);
214					/* ==================================================== */
215
216					$vdef_ids[] = $vdef_id;
217				}
218				}
219
220				if (isset($vdef_ids)) {
221					db_execute('DELETE FROM vdef WHERE ' . array_to_sql_or($vdef_ids, 'id'));
222					db_execute('DELETE FROM vdef_items WHERE ' . array_to_sql_or($vdef_ids, 'vdef_id'));
223				}
224			} elseif (get_nfilter_request_var('drp_action') === '2') { // duplicate
225				for ($i=0;($i<cacti_count($selected_items));$i++) {
226					/* ================= input validation ================= */
227					input_validate_input_number($selected_items[$i]);
228					/* ==================================================== */
229
230					duplicate_vdef($selected_items[$i], get_nfilter_request_var('title_format'));
231				}
232			}
233		}
234
235		header('Location: vdef.php?header=false');
236
237		exit;
238	}
239
240	/* setup some variables */
241	$vdef_list = '';
242
243	/* loop through each of the graphs selected on the previous page and get more info about them */
244	foreach ($_POST as $var => $val) {
245		if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) {
246			/* ================= input validation ================= */
247			input_validate_input_number($matches[1]);
248			/* ==================================================== */
249
250			$vdef_list .= '<li>' . html_escape(db_fetch_cell_prepared('SELECT name FROM vdef WHERE id = ?', array($matches[1]))) . '</li>';
251			$vdef_array[] = $matches[1];
252		}
253	}
254
255	top_header();
256
257	form_start('vdef.php', 'vdef_actions');
258
259	html_start_box($vdef_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', '');
260
261	if (isset($vdef_array)) {
262		if (get_nfilter_request_var('drp_action') === '1') { // delete
263			print "	<tr>
264					<td class='topBoxAlt'>
265						<p>" . __n('Click \'Continue\' to delete the following VDEF.', 'Click \'Continue\' to delete following VDEFs.', cacti_sizeof($vdef_array)) . "</p>
266						<div class='itemlist'><ul>$vdef_list</ul></div>
267					</td>
268				</tr>\n";
269
270			$save_html = "<input type='button' class='ui-button ui-corner-all ui-widget' value='" . __esc('Cancel') . "' onClick='cactiReturnTo()'>&nbsp;<input type='submit' class='ui-button ui-corner-all ui-widget' value='" . __esc('Continue') . "' title='" . __esc_n('Delete VDEF', 'Delete VDEFs', cacti_sizeof($vdef_array)) . "'>";
271		} elseif (get_nfilter_request_var('drp_action') === '2') { // duplicate
272			print "	<tr>
273					<td class='topBoxAlt'>
274						<p>" . __n('Click \'Continue\' to duplicate the following VDEF. You can optionally change the title format for the new VDEF.', 'Click \'Continue\' to duplicate following VDEFs. You can optionally change the title format for the new VDEFs.', cacti_sizeof($vdef_array)) . "</p>
275						<div class='itemlist'><ul>$vdef_list</ul></div>
276						<p><strong>" . __('Title Format:') . "</strong><br>"; form_text_box('title_format', '<vdef_title> (1)', '', '255', '30', 'text'); print "</p>
277					</td>
278				</tr>\n";
279
280			$save_html = "<input type='button' class='ui-button ui-corner-all ui-widget' value='" . __esc('Cancel') . "' onClick='cactiReturnTo()'>&nbsp;<input type='submit' class='ui-button ui-corner-all ui-widget' value='" . __esc('Continue') . "' title='" . __esc_n('Duplicate VDEF', 'Duplicate VDEFs', cacti_sizeof($vdef_array)) . "'>";
281		}
282	} else {
283		raise_message(40);
284		header('Location: vdef.php?header=false');
285		exit;
286	}
287
288    print "<tr>
289        <td class='saveRow'>
290            <input type='hidden' name='action' value='actions'>
291            <input type='hidden' name='selected_items' value='" . (isset($vdef_array) ? serialize($vdef_array) : '') . "'>
292            <input type='hidden' name='drp_action' value='" . html_escape(get_nfilter_request_var('drp_action')) . "'>
293            $save_html
294        </td>
295    </tr>\n";
296
297	html_end_box();
298
299	form_end();
300
301	bottom_footer();
302}
303
304/* --------------------------
305    VDEF Item Functions
306   -------------------------- */
307
308function vdef_item_remove_confirm() {
309	global $vdef_functions, $vdef_item_types, $custom_vdef_data_source_types;
310
311	/* ================= input validation ================= */
312	get_filter_request_var('id');
313	get_filter_request_var('vdef_id');
314	/* ==================================================== */
315
316	/* sort the vdef functions */
317	asort($vdef_functions);
318
319	form_start('vdef.php');
320
321	html_start_box('', '100%', '', '3', 'center', '');
322
323	$vdef       = db_fetch_row_prepared('SELECT * FROM vdef WHERE id = ?', array(get_request_var('id')));
324	$vdef_item  = db_fetch_row_prepared('SELECT * FROM vdef_items WHERE id = ?', array(get_request_var('vdef_id')));
325
326	?>
327	<tr>
328		<td class='topBoxAlt'>
329			<p><?php print __('Click \'Continue\' to delete the following VDEF\'s.'); ?></p>
330			<p><?php print __esc('VDEF Name: %s', $vdef['name']);?><br>
331			<em><?php $vdef_item_type = $vdef_item['type']; print $vdef_item_types[$vdef_item_type];?></em>: <strong><?php print html_escape(get_vdef_item_name($vdef_item['id']));?></strong></p>
332		</td>
333	</tr>
334	<tr>
335		<td class='right'>
336			<input type='button' class='ui-button ui-corner-all ui-widget' id='cancel' value='<?php print __esc('Cancel');?>' onClick='$("#cdialog").dialog("close");' name='cancel'>
337			<input type='button' class='ui-button ui-corner-all ui-widget' id='continue' value='<?php print __esc('Continue');?>' name='continue' title='<?php print __esc('Remove VDEF Item');?>'>
338		</td>
339	</tr>
340	<?php
341
342	html_end_box();
343
344	form_end();
345}
346
347function vdef_item_remove() {
348	/* ================= input validation ================= */
349	get_filter_request_var('vdef_id');
350	/* ==================================================== */
351
352	db_execute_prepared('DELETE FROM vdef_items WHERE id = ?', array(get_request_var('vdef_id')));
353}
354
355function vdef_item_edit() {
356	global $vdef_functions, $vdef_item_types, $custom_vdef_data_source_types;
357
358	/* ================= input validation ================= */
359	get_filter_request_var('id');
360	get_filter_request_var('vdef_id');
361	get_filter_request_var('type_select');
362	/* ==================================================== */
363
364	/* sort the vdef functions */
365	asort($vdef_functions);
366
367	if (!isempty_request_var('id')) {
368		$vdef = db_fetch_row_prepared('SELECT *
369			FROM vdef_items
370			WHERE id = ?',
371			array(get_request_var('id')));
372
373		if (cacti_sizeof($vdef)) {
374			$current_type = $vdef['type'];
375			$values[$current_type] = $vdef['value'];
376		}
377	} else {
378		$vdef = array();
379	}
380
381	html_start_box(__('VDEF Preview'), '100%', '', '3', 'center', '');
382	draw_vdef_preview(get_request_var('vdef_id'));
383	html_end_box();
384
385	if (!isempty_request_var('vdef_id')) {
386		$name = db_fetch_cell_prepared('SELECT name
387			FROM vdef
388			WHERE id = ?',
389			array(get_request_var('vdef_id')));
390
391		$header_label = __esc('VDEF Items [edit: %s]', $name);
392	}else {
393		$header_label = __('VDEF Items [new]');
394	}
395
396	form_start('vdef.php', 'chk');
397
398	html_start_box($header_label, '100%', '', '3', 'center', '');
399
400	if (isset_request_var('type_select')) {
401		$current_type = get_request_var('type_select');
402	} elseif (isset($vdef['type'])) {
403		$current_type = $vdef['type'];
404	} else {
405		$current_type = CVDEF_ITEM_TYPE_FUNCTION;
406	}
407
408	$form_vdef = array(
409		'type_select' => array(
410			'method'        => 'drop_array',
411			'friendly_name' => __('VDEF Item Type'),
412			'description'   => __('Choose what type of VDEF item this is.'),
413			'value'         => $current_type,
414			'array'         => $vdef_item_types
415		),
416		'value' => array(
417			'method'        => 'drop_array',
418			'friendly_name' => __('VDEF Item Value'),
419			'description'   => __('Enter a value for this VDEF item.'),
420			'value'         => (isset($vdef['value']) ? $vdef['value']:'')
421		),
422		'id' => array(
423			'method'        => 'hidden',
424			'value'         => isset_request_var('id') ?  get_request_var('id') : '0',
425		),
426		'type' => array(
427			'method'        => 'hidden',
428			'value'         => $current_type
429		),
430		'vdef_id' => array(
431			'method'        => 'hidden',
432			'value'         => get_request_var('vdef_id')
433		),
434		'save_component_item' => array(
435			'method'        => 'hidden',
436			'value'         => '1'
437		)
438	);
439
440	switch ($current_type) {
441	case '1':
442		$form_vdef['value']['array'] = $vdef_functions;
443
444		break;
445	case '4':
446		$form_vdef['value']['array'] = $custom_vdef_data_source_types;
447
448		break;
449	case '6':
450		$form_vdef['value']['method']     = 'textbox';
451		$form_vdef['value']['max_length'] = '255';
452		$form_vdef['value']['size']       = '30';
453
454		break;
455	}
456
457	draw_edit_form(
458		array(
459			'config' => array('no_form_tag' => true),
460			'fields' => inject_form_variables($form_vdef, $vdef)
461		)
462	);
463
464	?>
465	<script type='text/javascript'>
466	$(function() {
467		$('#type_select').unbind().change(function() {
468			strURL  = 'vdef.php?action=item_edit';
469			strURL += '&id=' + $('#id').val();
470			strURL += '&vdef_id=' + $('#vdef_id').val();
471			strURL += '&type_select=' + $('#type_select').val();
472			strURL += '&header=false';
473			loadPageNoHeader(strURL);
474		});
475	});
476	</script>
477	<?php
478
479	html_end_box();
480
481	form_save_button('vdef.php?action=edit&id=' . get_request_var('vdef_id'));
482}
483
484/* ---------------------
485    VDEF Functions
486   --------------------- */
487
488function item_movedown() {
489	/* ================= input validation ================= */
490	get_filter_request_var('id');
491	get_filter_request_var('vdef_id');
492	/* ==================================================== */
493
494	move_item_down('vdef_items', get_request_var('id'), 'vdef_id=' . get_request_var('vdef_id'));
495}
496
497function item_moveup() {
498	/* ================= input validation ================= */
499	get_filter_request_var('id');
500	get_filter_request_var('vdef_id');
501	/* ==================================================== */
502
503	move_item_up('vdef_items', get_request_var('id'), 'vdef_id=' . get_request_var('vdef_id'));
504}
505
506function vdef_item_dnd() {
507	/* ================= Input validation ================= */
508	get_filter_request_var('id');
509	/* ================= Input validation ================= */
510
511	$continue = true;
512
513	if (isset_request_var('vdef_item') && is_array(get_nfilter_request_var('vdef_item'))) {
514		$vdef_ids = get_nfilter_request_var('vdef_item');
515
516		if (cacti_sizeof($vdef_ids)) {
517			$sequence = 1;
518			foreach($vdef_ids as $vdef_id) {
519				$vdef_id = str_replace('line', '', $vdef_id);
520				input_validate_input_number($vdef_id);
521
522				db_execute_prepared('UPDATE vdef_items
523					SET sequence = ?
524					WHERE id = ?',
525					array($sequence, $vdef_id));
526
527				$sequence++;
528			}
529		}
530	}
531
532	header('Location: vdef.php?action=edit&header=false&id=' . get_request_var('id'));
533}
534
535function vdef_edit() {
536	global $vdef_item_types;
537
538	/* ================= input validation ================= */
539	get_filter_request_var('id');
540	/* ==================================================== */
541
542	if (!isempty_request_var('id')) {
543		$vdef = db_fetch_row_prepared('SELECT *
544			FROM vdef
545			WHERE id = ?',
546			array(get_request_var('id')));
547
548		$header_label = __esc('VDEFs [edit: %s]', $vdef['name']);
549	} else {
550		$header_label = __('VDEFs [new]');
551	}
552
553	form_start('vdef.php', 'vdef_edit');
554
555	html_start_box($header_label, '100%', true, '3', 'center', '');
556
557	$preset_vdef_form_list = preset_vdef_form_list();
558	draw_edit_form(
559		array(
560			'config' => array('no_form_tag' => true),
561			'fields' => inject_form_variables($preset_vdef_form_list, (isset($vdef) ? $vdef : array()))
562		)
563	);
564
565	html_end_box(true, true);
566
567	form_hidden_box('id', (isset($vdef['id']) ? $vdef['id'] : '0'), '');
568	form_hidden_box('save_component_vdef', '1', '');
569
570	if (!isempty_request_var('id')) {
571		html_start_box('', '100%', '', '3', 'center', '');
572		draw_vdef_preview(get_request_var('id'));
573		html_end_box();
574
575		html_start_box(__('VDEF Items'), '100%', '', '3', 'center', 'vdef.php?action=item_edit&vdef_id=' . $vdef['id']);
576
577		$header_items = array(
578			array('display' => __('Item'), 'align' => 'left'),
579			array('display' => __('Item Value'), 'align' => 'left')
580		);
581
582		html_header($header_items, 2);
583
584		$vdef_items = db_fetch_assoc_prepared('SELECT *
585			FROM vdef_items
586			WHERE vdef_id = ?
587			ORDER BY sequence',
588			array(get_request_var('id')));
589
590		$i = 1;
591		$total_items = cacti_sizeof($vdef_items);
592
593		if (cacti_sizeof($vdef_items)) {
594			foreach ($vdef_items as $vdef_item) {
595				form_alternate_row('line' . $vdef_item['id'], true, true);
596				?>
597				<td>
598					<a class='linkEditMain' href='<?php print html_escape('vdef.php?action=item_edit&id=' . $vdef_item['id'] . '&vdef_id=' . $vdef['id']);?>'><?php print __('Item #%d', $i);?></a>
599				</td>
600				<td>
601					<em><?php $vdef_item_type = $vdef_item['type']; print $vdef_item_types[$vdef_item_type];?></em>: <strong><?php print html_escape(get_vdef_item_name($vdef_item['id']));?></strong>
602				</td>
603				<td class='right'>
604					<?php
605					if (read_config_option('drag_and_drop') == '') {
606						if ($i < $total_items && $total_items > 1) {
607							echo '<a class="pic fa fa-caret-down moveArrow" href="' . html_escape('vdef.php?action=item_movedown&id=' . $vdef_item['id'] . '&vdef_id=' . $vdef_item['vdef_id']) . '" title="' . __esc('Move Down') . '"></a>';
608						} else {
609							echo '<span class="moveArrowNone"></span>';
610						}
611
612						if ($i > 1 && $i <= $total_items) {
613							echo '<a class="pic fa fa-caret-up moveArrow" href="' . html_escape('vdef.php?action=item_moveup&id=' . $vdef_item['id'] .	'&vdef_id=' . $vdef_item['vdef_id']) . '" title="' . __esc('Move Up') . '"></a>';
614						} else {
615							echo '<span class="moveArrowNone"></span>';
616						}
617					}
618					?>
619					<a id='<?php print $vdef['id'] . '_' . $vdef_item['id'];?>' class='delete deleteMarker fa fa-times' title='<?php print __esc('Delete VDEF Item');?>'></a>
620				</td>
621				<?php
622
623				form_end_row();
624
625				$i++;
626			}
627		}
628
629		html_end_box();
630	}
631
632	form_save_button('vdef.php', 'return');
633
634	?>
635	<script type='text/javascript'>
636
637	$(function() {
638		$('#vdef_edit3').find('.cactiTable').attr('id', 'vdef_item');
639		$('.cdialog').remove();
640		$('#main').append("<div class='cdialog' id='cdialog'></div>");
641
642		<?php if (read_config_option('drag_and_drop') == 'on') { ?>
643		$('#vdef_item').unbind().tableDnD({
644			onDrop: function(table, row) {
645				loadPageNoHeader('vdef.php?action=ajax_dnd&id=<?php isset_request_var('id') ? print get_request_var('id') : print 0;?>&'+$.tableDnD.serialize());
646			}
647		});
648		<?php } ?>
649
650		$('.delete').unbind().click(function (event) {
651			event.preventDefault();
652
653			id = $(this).attr('id').split('_');
654			request = 'vdef.php?action=item_remove_confirm&id='+id[0]+'&vdef_id='+id[1];
655			$.get(request)
656				.done(function(data) {
657					$('#cdialog').html(data);
658
659					applySkin();
660
661					$('#continue').off('click').on('click', function(data) {
662						$.post('vdef.php?action=item_remove', {
663							__csrf_magic: csrfMagicToken,
664							vdef_id: id[1],
665							id: id[0]
666						}).done(function(data) {
667							$('#cdialog').dialog('close');
668							loadPageNoHeader('vdef.php?action=edit&header=false&id='+id[0]);
669						});
670					});
671
672					$('#cdialog').dialog({
673						title: '<?php print __esc('Delete VDEF Item');?>',
674						close: function () { $('.delete').blur(); $('.selectable').removeClass('selected'); },
675						minHeight: 80,
676						minWidth: 500
677					});
678				})
679				.fail(function(data) {
680					getPresentHTTPError(data);
681				});
682		}).css('cursor', 'pointer');
683	});
684
685	</script>
686	<?php
687}
688
689function vdef_filter() {
690	global $item_rows;
691
692	html_start_box( __('VDEFs'), '100%', '', '3', 'center', 'vdef.php?action=edit');
693	?>
694	<tr class='even'>
695		<td>
696			<form id='form_vdef' action='vdef.php'>
697			<table class='filterTable'>
698				<tr>
699					<td>
700						<?php print __('Search');?>
701					</td>
702					<td>
703						<input type='text' class='ui-state-default ui-corner-all' id='filter' size='25' value='<?php print html_escape_request_var('filter');?>'>
704					</td>
705					<td>
706						<?php print __('VDEFs');?>
707					</td>
708					<td>
709						<select id='rows' onChange='applyFilter()'>
710							<option value='-1'<?php print (get_request_var('rows') == '-1' ? ' selected>':'>') . __('Default');?></option>
711							<?php
712							if (cacti_sizeof($item_rows)) {
713								foreach ($item_rows as $key => $value) {
714									print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . "</option>\n";
715								}
716							}
717							?>
718						</select>
719					</td>
720                    <td>
721						<span>
722							<input type='checkbox' id='has_graphs' <?php print (get_request_var('has_graphs') == 'true' ? 'checked':'');?>>
723                        	<label for='has_graphs'><?php print __('Has Graphs');?></label>
724						</span>
725                    </td>
726					<td>
727						<span>
728							<input type='button' class='ui-button ui-corner-all ui-widget' value='<?php print __esc_x('Button: use filter settings', 'Go');?>' id='refresh'>
729							<input type='button' class='ui-button ui-corner-all ui-widget' value='<?php print __esc_x('Button: reset filter settings', 'Clear');?>' id='clear'>
730						</span>
731					</td>
732				</tr>
733			</table>
734			</form>
735			<script type='text/javascript'>
736
737			function applyFilter() {
738				strURL  = 'vdef.php?header=false';
739				strURL += '&filter='+$('#filter').val();
740				strURL += '&rows='+$('#rows').val();
741				strURL += '&has_graphs='+$('#has_graphs').is(':checked');
742				loadPageNoHeader(strURL);
743			}
744
745			function clearFilter() {
746				strURL = 'vdef.php?clear=1&header=false';
747				loadPageNoHeader(strURL);
748			}
749
750			$(function() {
751				$('#refresh').click(function() {
752					applyFilter();
753				});
754
755				$('#has_graphs').click(function() {
756					applyFilter();
757				});
758
759				$('#clear').click(function() {
760					clearFilter();
761				});
762
763				$('#form_vdef').submit(function(event) {
764					event.preventDefault();
765					applyFilter();
766				});
767			});
768
769			</script>
770		</td>
771	</tr>
772	<?php
773
774	html_end_box();
775}
776
777function get_vdef_records(&$total_rows, &$rows) {
778	/* form the 'where' clause for our main sql query */
779	if (get_request_var('filter') != '') {
780		$sql_where = 'WHERE rs.name LIKE ' . db_qstr('%' . get_request_var('filter') . '%');
781	} else {
782		$sql_where = '';
783	}
784
785	if (get_request_var('has_graphs') == 'true') {
786		$sql_having = 'HAVING graphs>0';
787	} else {
788		$sql_having = '';
789	}
790
791	$total_rows = db_fetch_cell("SELECT
792		COUNT(`rows`)
793        FROM (
794            SELECT vd.id AS `rows`, vd.name,
795            SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs
796            FROM vdef AS vd
797            LEFT JOIN graph_templates_item AS gti
798            ON gti.vdef_id=vd.id
799            GROUP BY vd.id
800			$sql_having
801        ) AS rs
802        $sql_where");
803
804	$sql_order = get_order_string();
805	$sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows;
806
807	return db_fetch_assoc("SELECT rs.*,
808		SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates,
809        SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs
810        FROM (
811            SELECT vd.*, gti.local_graph_id
812            FROM vdef AS vd
813            LEFT JOIN graph_templates_item AS gti
814            ON gti.vdef_id=vd.id
815            GROUP BY vd.id, gti.graph_template_id, gti.local_graph_id
816        ) AS rs
817		$sql_where
818		GROUP BY rs.id
819		$sql_having
820		$sql_order
821		$sql_limit");
822}
823
824function vdef($refresh = true) {
825	global $vdef_actions;
826
827    /* ================= input validation and session storage ================= */
828    $filters = array(
829		'rows' => array(
830			'filter' => FILTER_VALIDATE_INT,
831			'pageset' => true,
832			'default' => '-1'
833			),
834		'page' => array(
835			'filter' => FILTER_VALIDATE_INT,
836			'default' => '1'
837			),
838		'filter' => array(
839			'filter' => FILTER_DEFAULT,
840			'pageset' => true,
841			'default' => ''
842			),
843		'sort_column' => array(
844			'filter' => FILTER_CALLBACK,
845			'default' => 'name',
846			'options' => array('options' => 'sanitize_search_string')
847			),
848		'sort_direction' => array(
849			'filter' => FILTER_CALLBACK,
850			'default' => 'ASC',
851			'options' => array('options' => 'sanitize_search_string')
852			),
853		'has_graphs' => array(
854			'filter' => FILTER_VALIDATE_REGEXP,
855			'options' => array('options' => array('regexp' => '(true|false)')),
856			'pageset' => true,
857			'default' => read_config_option('default_has') == 'on' ? 'true':'false'
858			)
859	);
860
861	validate_store_request_vars($filters, 'sess_vdef');
862	/* ================= input validation ================= */
863
864	vdef_filter();
865
866	$total_rows = 0;
867	$vdefs = array();
868
869	if (get_request_var('rows') == '-1') {
870		$rows = read_config_option('num_rows_table');
871	} else {
872		$rows = get_request_var('rows');
873	}
874
875	$vdefs = get_vdef_records($total_rows, $rows);
876
877	$nav = html_nav_bar('vdef.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('VDEFs'), 'page', 'main');
878
879	form_start('vdef.php', 'chk');
880
881    print $nav;
882
883	html_start_box('', '100%', '', '3', 'center', '');
884
885    $display_text = array(
886        'name'      => array('display' => __('VDEF Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __esc('The name of this VDEF.') ),
887        'nosort'    => array('display' => __('Deletable'), 'align' => 'right', 'tip' => __esc('VDEFs that are in use cannot be Deleted. In use is defined as being referenced by a Graph or a Graph Template.') ),
888        'graphs'    => array('display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __esc('The number of Graphs using this VDEF.') ),
889        'templates' => array('display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __esc('The number of Graphs Templates using this VDEF.') )
890	);
891
892    html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false);
893
894    $i = 0;
895    if (cacti_sizeof($vdefs)) {
896        foreach ($vdefs as $vdef) {
897            if ($vdef['graphs'] == 0 && $vdef['templates'] == 0) {
898                $disabled = false;
899            } else {
900                $disabled = true;
901            }
902
903            form_alternate_row('line' . $vdef['id'], false, $disabled);
904			form_selectable_cell(filter_value($vdef['name'], get_request_var('filter'), 'vdef.php?action=edit&id=' . $vdef['id']), $vdef['id']);
905            form_selectable_cell($disabled ? __('No'):__('Yes'), $vdef['id'], '', 'right');
906            form_selectable_cell(number_format_i18n($vdef['graphs'], '-1'), $vdef['id'], '', 'right');
907            form_selectable_cell(number_format_i18n($vdef['templates'], '-1'), $vdef['id'], '', 'right');
908            form_checkbox_cell($vdef['name'], $vdef['id'], $disabled);
909            form_end_row();
910        }
911    } else {
912        print "<tr class='tableRow'><td colspan='" . (cacti_sizeof($display_text)+1) . "'><em>" . __('No VDEFs') . "</em></td></tr>\n";
913    }
914
915    html_end_box(false);
916
917    if (cacti_sizeof($vdefs)) {
918        print $nav;
919	}
920
921    /* draw the dropdown containing a list of available actions for this form */
922    draw_actions_dropdown($vdef_actions);
923
924    form_end();
925}
926