Example #1
0
function wikiplugin_fitnesse($data, $params)
{
    $runner = Tracker_Field_Math::getRunner();
    $mock = new FixtureMockTrackerField();
    $runner->mockFunction('tracker-field', $mock);
    $fixtures = array('trackermath' => 'wp_fixture_tracker_math', 'trackerdata' => function ($data, $params) use($mock) {
        return wp_fixture_tracker_data($data, $params, $mock);
    });
    $matches = WikiParser_PluginMatcher::match($data);
    $argParser = new WikiParser_PluginArgumentParser();
    foreach ($matches as $table) {
        $fixture = $table->getName();
        $arguments = $table->getArguments();
        $arguments = $argParser->parse($arguments);
        $body = trim($table->getBody());
        if (isset($fixtures[$fixture])) {
            $replace = call_user_func($fixtures[$fixture], $body, new JitFilter($arguments));
            $table->replaceWith($replace);
        } else {
            $data = new FixtureTable($body);
            $table->replaceWith('__' . tr('Fixture not found: %0', $fixture) . "__\n{$data}");
        }
    }
    Tracker_Field_Math::resetRunner();
    return $matches->getText();
}
Example #2
0
function wikiplugin_map($data, $params)
{
    global $tikilib, $prefs;
    if (isset($params['mapfile'])) {
        return wp_map_mapserver($params);
    }
    $smarty = TikiLib::lib('smarty');
    $smarty->loadPlugin('smarty_modifier_escape');
    $width = '100%';
    if (isset($params['width'])) {
        $width = intval($params['width']) . 'px';
    }
    $height = '100%';
    if (isset($params['height'])) {
        $height = intval($params['height']) . 'px';
    }
    if (!isset($params['controls'])) {
        $params['controls'] = wp_map_default_controls();
    }
    if (!is_array($params['controls'])) {
        $params['controls'] = explode(',', $params['controls']);
    }
    if (!isset($params['popupstyle'])) {
        $params['popupstyle'] = 'bubble';
    }
    if (!empty($params['tooltips']) && $params['tooltips'] === 'y') {
        $tooltips = ' data-tooltips="1"';
    } else {
        $tooltips = '';
    }
    $popupStyle = smarty_modifier_escape($params['popupstyle']);
    $controls = array_intersect($params['controls'], wp_map_available_controls());
    $controls = array_intersect($params['controls'], wp_map_available_controls());
    $controls = implode(',', $controls);
    $center = null;
    $geolib = TikiLib::lib('geo');
    if (isset($params['center'])) {
        if ($coords = $geolib->parse_coordinates($params['center'])) {
            $center = ' data-geo-center="' . smarty_modifier_escape($geolib->build_location_string($coords)) . '" ';
        }
    } else {
        $center = $geolib->get_default_center();
    }
    TikiLib::lib('header')->add_map();
    $scope = smarty_modifier_escape(wp_map_getscope($params));
    $output = "<div class=\"map-container\" data-marker-filter=\"{$scope}\" data-map-controls=\"{$controls}\" data-popup-style=\"{$popupStyle}\" style=\"width: {$width}; height: {$height};\" {$center}{$tooltips}>";
    $argumentParser = new WikiParser_PluginArgumentParser();
    $matches = WikiParser_PluginMatcher::match($data);
    foreach ($matches as $match) {
        $name = $match->getName();
        $arguments = $argumentParser->parse($match->getArguments());
        $function = 'wp_map_plugin_' . $name;
        if (function_exists($function)) {
            $output .= $function($match->getBody(), new JitFilter($arguments));
        }
    }
    $output .= "</div>";
    return $output;
}
Example #3
0
/**
 * Apply tablesorter is enabled
 *
 * @param WikiParser_PluginMatcher $matches
 * @param Search_Query $query
 * @return array
 */
function applyTablesorter(WikiParser_PluginMatcher $matches, Search_Query $query)
{
    $ret = ['max' => false, 'tsOn' => false];
    $parser = new WikiParser_PluginArgumentParser();
    foreach ($matches as $match) {
        $name = $match->getName();
        if ($name == 'tablesorter') {
            $tsargs = $parser->parse($match->getArguments());
            $ajax = !empty($tsargs['server']) && $tsargs['server'] === 'y';
            $ret['tsOn'] = Table_Check::isEnabled($ajax);
            if (!$ret['tsOn']) {
                TikiLib::lib('errorreport')->report(tra('List plugin: Feature "jQuery Sortable Tables" (tablesorter) is not enabled'));
                return $ret;
            }
            if (isset($tsargs['tsortcolumns'])) {
                $tsc = Table_Check::parseParam($tsargs['tsortcolumns']);
            }
            if (isset($tsargs['tspaginate'])) {
                $tsp = Table_Check::parseParam($tsargs['tspaginate']);
                if (isset($tsp[0]['max']) && $ajax) {
                    $ret['max'] = (int) $tsp[0]['max'];
                }
            }
        }
    }
    foreach ($matches as $match) {
        $name = $match->getName();
        if ($name == 'column') {
            $cols[] = $match;
            $args[] = $parser->parse($match->getArguments());
        }
    }
    if (Table_Check::isSort()) {
        foreach ($_GET['sort'] as $key => $dir) {
            $n = '';
            switch ($tsc[$key]['type']) {
                case 'digit':
                case 'currency':
                case 'percent':
                case 'time':
                case strpos($tsc[$key]['type'], 'date') !== false:
                    $n = 'n';
                    break;
            }
            $query->setOrder($args[$key]['field'] . '_' . $n . Table_Check::$dir[$dir]);
        }
    }
    if (Table_Check::isFilter()) {
        foreach ($_GET['filter'] as $key => $filter) {
            $query->filterContent($filter, $args[$key]['field']);
        }
    }
    return $ret;
}
Example #4
0
 function fromMatch($match)
 {
     $parser = new WikiParser_PluginArgumentParser();
     $arrayBuilder = new Search_Formatter_ArrayBuilder();
     $arguments = $parser->parse($match->getArguments());
     if (!empty($arguments['name'])) {
         $sequence = $this->build($arguments['name'], $arrayBuilder->getData($match->getBody()));
         if (isset($arguments['group'])) {
             $sequence->setRequiredGroup($arguments['group']);
         }
         return $sequence;
     }
 }
Example #5
0
 function apply(WikiParser_PluginMatcher $matches)
 {
     $argumentParser = new WikiParser_PluginArgumentParser();
     foreach ($matches as $match) {
         if ($match->getName() === 'facet') {
             $arguments = $argumentParser->parse($match->getArguments());
             $operator = isset($arguments['operator']) ? $arguments['operator'] : 'or';
             if (isset($arguments['name'])) {
                 $this->facets[] = array('name' => $arguments['name'], 'operator' => $operator);
             }
         }
     }
 }
Example #6
0
 private function processDisplay($valueFormatter, $body, $arguments)
 {
     $parser = new WikiParser_PluginArgumentParser();
     $arguments = $parser->parse($arguments);
     $name = $arguments['name'];
     if (isset($arguments['format'])) {
         $format = $arguments['format'];
     } else {
         $format = 'plain';
     }
     unset($arguments['format']);
     unset($arguments['name']);
     return $valueFormatter->{$format}($name, $arguments);
 }
Example #7
0
 function apply(WikiParser_PluginMatcher $matches)
 {
     $argumentParser = new WikiParser_PluginArgumentParser();
     foreach ($matches as $match) {
         $name = $match->getName();
         if ($name == 'group') {
             $arguments = $argumentParser->parse($match->getArguments());
             $field = isset($arguments['field']) ? $arguments['field'] : 'aggregate';
             $collect = isset($arguments['collect']) ? explode(',', $arguments['collect']) : array('user');
             $this->result->groupBy($field, $collect);
         }
     }
     if ($this->paginationArguments) {
         $this->result->setMaxResults($this->paginationArguments['max']);
     }
 }
Example #8
0
 function apply(WikiParser_PluginMatcher $matches)
 {
     $argumentParser = new WikiParser_PluginArgumentParser();
     foreach ($matches as $match) {
         $name = $match->getName();
         $arguments = $argumentParser->parse($match->getArguments());
         $this->addQueryArgument($name, $arguments);
     }
     $offsetArg = $this->paginationArguments['offset_arg'];
     $maxRecords = $this->paginationArguments['max'];
     if (isset($_REQUEST[$offsetArg])) {
         $this->query->setRange($_REQUEST[$offsetArg], $maxRecords * $this->boost);
     } else {
         $this->query->setRange(0, $maxRecords * $this->boost);
     }
 }
Example #9
0
 function getData($string)
 {
     $matches = WikiParser_PluginMatcher::match($string);
     $parser = new WikiParser_PluginArgumentParser();
     $data = array();
     foreach ($matches as $m) {
         $name = $m->getName();
         $arguments = $m->getArguments();
         if (isset($data[$name])) {
             if (!is_int(key($data[$name]))) {
                 $data[$name] = array($data[$name]);
             }
             $data[$name][] = $parser->parse($arguments);
         } else {
             $data[$name] = $parser->parse($arguments);
         }
     }
     return $data;
 }
Example #10
0
 function apply(WikiParser_PluginMatcher $matches)
 {
     $argumentParser = new WikiParser_PluginArgumentParser();
     foreach ($matches as $match) {
         $name = $match->getName();
         $arguments = $argumentParser->parse($match->getArguments());
         foreach ($arguments as $key => $value) {
             $function = "wpquery_{$name}_{$key}";
             if (method_exists($this, $function)) {
                 call_user_func(array($this, $function), $this->query, $value, $arguments);
             }
         }
     }
     $offsetArg = $this->paginationArguments['offset_arg'];
     $maxRecords = $this->paginationArguments['max'];
     if (isset($_REQUEST[$offsetArg])) {
         $this->query->setRange($_REQUEST[$offsetArg], $maxRecords * $this->boost);
     } else {
         $this->query->setRange(0, $maxRecords * $this->boost);
     }
 }
Example #11
0
 public static function search_plugin_content(Tiki_Profile_Writer $writer, $content)
 {
     $searchlib = TikiLib::lib('unifiedsearch');
     $dataSource = $searchlib->getProfileExportHelper();
     $argumentParser = new WikiParser_PluginArgumentParser();
     $matches = WikiParser_PluginMatcher::match($content);
     $justReplace = false;
     foreach ($matches as $match) {
         if ($justReplaced) {
             $justReplaced = false;
             continue;
         }
         $name = $match->getName();
         $args = $argumentParser->parse($match->getArguments());
         if ($name === 'filter') {
             $args = $dataSource->replaceFilterReferences($writer, $args);
             $match->replaceWithPlugin('filter', $args, $match->getBody());
             $justReplaced = true;
         }
     }
     return $matches->getText();
 }
Example #12
0
function wikiplugin_appframe_execute($plugin)
{
    $name = $plugin->getName();
    $body = $plugin->getBody();
    $argumentParger = new WikiParser_PluginArgumentParser();
    $params = $argumentParger->parse($plugin->getArguments());
    if (!in_array($name, array('tab', 'column', 'page', 'module', 'cond', 'anchor', 'overlay', 'template', 'hidden', 'mapcontrol'))) {
        return null;
    }
    $function = 'wikiplugin_appframe_' . $name;
    return $function($body, new JitFilter($params), $plugin->getStart());
}
Example #13
0
 /**
  * Foreach plugin used in a object content call its save handler,
  * if one exist, and send email notifications when it has pending
  * status, if preference is enabled.
  *
  * A plugin save handler is a function defined on the plugin file
  * with the following format: wikiplugin_$pluginName_save()
  *
  * This function is called from object_post_save. Do not call directly.
  *
  * @param array $context object type and id
  * @param array $data
  * @return void
  */
 private function plugin_post_save_actions($context, $data = null)
 {
     global $prefs;
     $parserlib = TikiLib::lib('parser');
     if (is_null($data)) {
         $content = array();
         if (isset($context['values'])) {
             $content = $context['values'];
         }
         if (isset($context['data'])) {
             $content[] = $context['data'];
         }
         $data['content'] = implode(' ', $content);
     }
     $argumentParser = new WikiParser_PluginArgumentParser();
     $matches = WikiParser_PluginMatcher::match($data['content']);
     foreach ($matches as $match) {
         $plugin_name = $match->getName();
         $body = $match->getBody();
         $arguments = $argumentParser->parse($match->getArguments());
         $dummy_output = '';
         if ($parserlib->plugin_enabled($plugin_name, $dummy_output)) {
             $status = $parserlib->plugin_can_execute($plugin_name, $body, $arguments, true);
             // when plugin status is pending, $status equals plugin fingerprint
             if ($prefs['wikipluginprefs_pending_notification'] == 'y' && $status !== true && $status != 'rejected') {
                 $this->plugin_pending_notification($plugin_name, $body, $arguments, $context);
             }
             $alias = new WikiPlugin_Negotiator_Wiki_Alias();
             $alias->findImplementation($plugin_name, $body, $arguments);
             $func_name = 'wikiplugin_' . $plugin_name . '_save';
             if (function_exists($func_name)) {
                 $func_name($context, $body, $arguments);
             }
         }
     }
 }
Example #14
0
 private function loadYaml($content)
 {
     $this->pageContent = $content;
     $pos = 0;
     $this->data = array();
     $matches = WikiParser_PluginMatcher::match($content);
     $parser = new WikiParser_PluginArgumentParser();
     foreach ($matches as $match) {
         $arguments = $parser->parse($match->getArguments());
         if ($match->getName() == 'code' && isset($arguments['caption']) && $arguments['caption'] == 'YAML' || $match->getName() == 'profile') {
             $yaml = $match->getBody();
             $data = Horde_Yaml::load($yaml);
             foreach ($data as $key => $value) {
                 if (array_key_exists($key, $this->data)) {
                     $this->data[$key] = $this->mergeData($this->data[$key], $value);
                 } else {
                     $this->data[$key] = $value;
                 }
             }
         }
     }
     $this->fetchExternals();
     $this->getObjects();
 }
Example #15
0
 function moveWikiUpToFgal($page_info, $fgalId, &$errors, &$feedbacks)
 {
     global $user;
     $tikilib = TikiLib::lib('tiki');
     include_once 'lib/mime/mimelib.php';
     $argumentParser = new WikiParser_PluginArgumentParser();
     $files = array();
     if (strpos($page_info['data'], 'img/wiki_up') === false) {
         return;
     }
     $matches = WikiParser_PluginMatcher::match($page_info['data']);
     foreach ($matches as $match) {
         $modif = false;
         $plugin_name = $match->getName();
         if ($plugin_name == 'img') {
             $arguments = $argumentParser->parse($match->getArguments());
             $newArgs = array();
             foreach ($arguments as $key => $val) {
                 if ($key == 'src') {
                     if (false === ($data = @file_get_contents($val))) {
                         $errors[] = tra('Cannot open this file:') . ' ' . $val . ' ' . tra('Page:') . ' ' . $page_info['pageName'];
                         continue;
                     }
                     $name = preg_replace('|.*/([^/]*)|', '$1', $val);
                     $fileId = $this->insert_file($fgalId, $name, 'Used in ' . $page_info['pageName'], $name, $data, strlen($data), tiki_get_mime($name, 'application/octet-stream', $val), $user, '', 'wiki_up conversion');
                     if (empty($fileId)) {
                         $errors[] = tra('Cannot upload this file') . ' ' . $val . ' ' . tra('Page:') . ' ' . $page_info['pageName'];
                         continue;
                     } else {
                         $files[] = $val;
                         $modif = true;
                         $newArgs[] = 'fileId="' . $fileId . '"';
                     }
                 } else {
                     $newArgs[] = "{$key}=\"{$val}\"";
                 }
             }
             if ($modif) {
                 $match->replaceWith('{img ' . implode(' ', $newArgs) . '}');
             }
         }
     }
     if (!empty($files)) {
         $tikilib->update_page($page_info['pageName'], $matches->getText(), 'wiki_up conversion', $user, $tikilib->get_ip_address());
         foreach ($files as $file) {
             unlink($file);
         }
         $feedbacks[] = $page_info['pageName'];
     }
 }
 private function cs_process_group(&$dataappend, $grouped, $id, $grouping_keys, $min_match = 2, $max_match = 99, $checksimilar = true, $drop_if_no_match = false)
 {
     $parser = new WikiParser_PluginArgumentParser();
     $to_reconstruct = array();
     foreach ($grouped as $group_id => $grp) {
         if (count($grp) > 1) {
             $args = array();
             $args_checked = array();
             // just for consistency checking
             $query_vals = array();
             foreach ($grp as $g) {
                 $matches = WikiParser_PluginMatcher::match($dataappend[$g]);
                 foreach ($matches as $match) {
                     if ($match->getName() != 'filter') {
                         $query_vals = array();
                         break 2;
                     }
                     $args = $parser->parse($match->getArguments());
                     // double check that they are the same filter other than the query itself, to avoid errornous mixing
                     if ($checksimilar) {
                         $args_to_check = $args;
                         foreach ($grouping_keys as $k) {
                             unset($args_to_check[$k]);
                         }
                         if (!empty($args_checked) && $args_checked != $args_to_check) {
                             $query_vals = array();
                             break 2;
                         } else {
                             $args_checked = $args_to_check;
                         }
                     }
                     foreach ($grouping_keys as $k) {
                         if (array_key_exists($k, $args)) {
                             $query_vals[] = $args[$k];
                             break;
                         }
                     }
                 }
             }
             if (count($query_vals) >= $min_match && count($query_vals) <= $max_match) {
                 $to_reconstruct[$group_id] = array('args' => $args, 'query_vals' => $query_vals);
             } elseif ($drop_if_no_match) {
                 foreach ($grouped[$group_id] as $to_drop) {
                     unset($dataappend[$to_drop]);
                 }
             }
         }
     }
     return $to_reconstruct;
 }
function wikiplugin_list($data, $params)
{
	$unifiedsearchlib = TikiLib::lib('unifiedsearch');

	$alternate = null;
	$output = null;
	$subPlugins = array();

	$query = new Search_Query;
	$query->setWeightCalculator($unifiedsearchlib->getWeightCalculator());

	if (isset($_REQUEST['maxRecords'])) {
		if (isset($_REQUEST['offset'])) {
			$query->setRange($_REQUEST['offset'], $_REQUEST['maxRecords']);
		} else {
			$query->setRange(0, $_REQUEST['maxRecords']);
		}
	} elseif (isset($_REQUEST['offset'])) {
		$query->setRange($_REQUEST['offset']);
	}

	$matches = WikiParser_PluginMatcher::match($data);
	$argumentParser = new WikiParser_PluginArgumentParser;

	$onclick = '';
	$offset_jsvar = '';

	foreach ($matches as $match) {
		$name = $match->getName();
		$arguments = $argumentParser->parse($match->getArguments());

		foreach ($arguments as $key => $value) {
			$function = "wpquery_{$name}_{$key}";

			if (function_exists($function)) {
				$function($query, $value, $arguments);
			}

			$function = "wpformat_{$name}_{$key}";

			if (function_exists($function)) {
				$function($subPlugins, $value, $match->getBody());
			}
		}

		if ($name == 'output') {
			$output = $match;
		}

		if ($name == 'alternate') {
			$alternate = $match->getBody();
		}

		if ($name == 'pagination' && isset($arguments['onclick'])) {
			$onclick = $arguments['onclick'];
		}
		if ($name == 'pagination' && isset($arguments['offset_jsvar'])) {
			$offset_jsvar = $arguments['offset_jsvar'];
		}
	}

	if (! Perms::get()->admin) {
		$query->filterPermissions(Perms::get()->getGroups());
	}

	if (!empty($_REQUEST['sort_mode'])) {
		$query->setOrder($_REQUEST['sort_mode']);
	}

	$index = $unifiedsearchlib->getIndex();

	$result = $query->search($index);

	if (count($result)) {
		if (!empty($output)) {
			$arguments = $argumentParser->parse($output->getArguments());

			if (isset($arguments['template'])) {
				if ($arguments['template'] == 'table') {
					$arguments['template'] = dirname(__FILE__) . '/../../templates/table.tpl';
				} else if (!file_exists($arguments['template'])) {
					TikiLib::lib('errorreport')->report(tr('Missing template "%0"', $arguments['template']));
					return '';
				}
				$builder = new Search_Formatter_ArrayBuilder;
				$templateData = $builder->getData($output->getBody());

				$plugin = new Search_Formatter_Plugin_SmartyTemplate($arguments['template']);
				$plugin->setData($templateData);
				$plugin->setFields(wp_list_findfields($templateData));
			} elseif (isset($arguments['wiki']) && TikiLib::lib('tiki')->page_exists($arguments['wiki'])) {	
				$wikitpl = "tplwiki:" . $arguments['wiki'];
				$wikicontent = TikiLib::lib('smarty')->fetch($wikitpl);
				$plugin = new Search_Formatter_Plugin_WikiTemplate($wikicontent);
			} else {
				$plugin = new Search_Formatter_Plugin_WikiTemplate($output->getBody());
			}

			if (isset($arguments['pagination'])) {
				$plugin = new WikiPlugin_List_AppendPagination($plugin, $onclick, $offset_jsvar);
			}
		} else {
			$plugin = new Search_Formatter_Plugin_WikiTemplate("* {display name=title format=objectlink}\n");
		}

		$formatter = new Search_Formatter($plugin);
		$formatter->setDataSource($unifiedsearchlib->getDataSource());

		foreach ($subPlugins as $key => $plugin) {
			$formatter->addSubFormatter($key, $plugin);
		}

		$out = $formatter->format($result);
	} elseif (!empty($alternate)) {
		$out = $alternate;
	} else {
		$out = '^' . tra('No results for query.') . '^';
	}

	return $out;
}
function wikiplugin_customsearch($data, $params)
{
	global $prefs;
	if (!isset($params['wiki'])) {
		return tra('Template is not specified');
	} elseif (!TikiLib::lib('tiki')->page_exists($params['wiki'])) {
		return tra('Template page not found');
	}
	if (isset($params['id'])) {
		$id = $params['id'];
	} else {
		$id = '0';
	}
	if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) {
		$recalllastsearch = 1;
	} else {
		$recalllastsearch = 0;
	}
	if (isset($params['autosearchdelay'])) {
		$autosearchdelay = $params['autosearchdelay'];
	} else {
		$autosearchdelay = 0;
	}
	if (isset($params['searchfadediv'])) {
		$searchfadediv = $params['searchfadediv'];
	} else {
		$searchfadediv = '';
	}
	if (!isset($_REQUEST["offset"])) {
		$offset = 0;
	} else {
		$offset = $_REQUEST["offset"];
	} 
	if (isset($_REQUEST['maxRecords'])) {
		$maxRecords = $_REQUEST['maxRecords'];
	} elseif ($recalllastsearch && !empty($_SESSION["customsearch_$id"]['maxRecords'])) {
		$maxRecords = $_SESSION["customsearch_$id"]['maxRecords'];
	} else {
		$maxRecords = $prefs['maxRecords']; 
	}		
	if (!empty($_REQUEST['sort_mode'])) {
		$sort_mode = $_REQUEST['sort_mode'];
	} elseif ($recalllastsearch && !empty($_SESSION["customsearch_$id"]['sort_mode'])) {
		$sort_mode = $_SESSION["customsearch_$id"]['sort_mode'];
	} else {
		$sort_mode = '';
	}
	if (!isset($params['searchonload'])) {
		$params['searchonload'] = 1;
	}

	$wikitpl = "tplwiki:" . $params['wiki'];
	$wikicontent = TikiLib::lib('smarty')->fetch($wikitpl);
	TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent);

	$matches = WikiParser_PluginMatcher::match($wikicontent);

	$parser = new WikiParser_PluginArgumentParser;
	$fingerprint = md5(print_r($matches, true));
	$sessionprint = "customsearch_{$id}_$fingerprint";
	if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) {
		unset($_SESSION["customsearch_$id"]);
	} 
	$_SESSION[$sessionprint] = $fingerprint;

	// important that offset from session is set after fingerprint check otherwise blank page might show
	if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_$id"]["offset"])) {
		$offset = $_SESSION["customsearch_$id"]["offset"];
	}
	
	$groups = array();
	$textrangegroups = array();
	$daterangegroups = array();

	$script = "
function add_customsearch_$id(fieldid, filter) {
	customsearch_{$id}_searchdata[fieldid] = filter;
}
function remove_customsearch_$id(fieldid) {
	delete customsearch_{$id}_searchdata[fieldid];
}
customsearch_{$id}_searchdata = new Object();
customsearch_{$id}_basedata = " . json_encode((string) $data) . ";
$('#customsearch_$id').click(function() {
	// reset offset on reclick of form since new search should always start from 0 offset
	customsearch_offset_$id = 0;
});
$('#customsearch_$id').submit(function() {
	load_customsearch_$id($.toJSON(customsearch_{$id}_searchdata));
	return false;
});
";
		
	foreach ($matches as $k => $match) {
		$name = $match->getName(); 
		$arguments = $parser->parse($match->getArguments());
		$fieldid = "customsearch_{$id}_$k";
		if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) {
			$sort_mode = $arguments['mode'];
			$match->replaceWith('');
			continue;
		} 
		if ($arguments['_filter'] == 'content' && !empty($arguments['_field'])) {
			$filter = $arguments['_field'];
		} elseif ($arguments['_filter'] == 'content' && empty($arguments['_field'])) {
			$filter = 'content';
		} else {
			$filter = '';
		}
		if ( $filter && !empty($_REQUEST['default'][$filter]) ) {
			$default = $_REQUEST['default'][$filter];
		} elseif ($recalllastsearch && isset($_SESSION["customsearch_$id"][$fieldid])) { 
			$default = $_SESSION["customsearch_$id"][$fieldid]; 
		} elseif (!empty($arguments['_default'])) {
			if (strpos($arguments['_default'], ',') !== false) {
				$default = explode(',', $arguments['_default']);
			} else {
				$default = $arguments['_default'];
			}
		} else {
			$default = '';
		}
		if ( $name == 'categories' ) {
			$parent = $arguments['_parent'];
			if (!empty($_REQUEST['defaultcat'][$parent])) {
				$default = $_REQUEST['defaultcat'][$parent];
			}
		}
		$function = "cs_design_{$name}";
		if (function_exists($function)) {
			if (isset($arguments['_group'])) {
				$groups[$fieldid] = $arguments['_group']; 
				$fieldname = "customsearch_{$id}_gr" . $arguments['_group'];
			} elseif (isset($arguments['_textrange'])) {
				$textrangegroups[$fieldid] = $arguments['_textrange'];
				$fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange'];
			} elseif (isset($arguments['_daterange'])) {
				$daterangegroups[$fieldid] = $arguments['_daterange'];
				$fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange'];
			} else {
				$fieldname = $fieldid;
			}
			$match->replaceWith($function($id, $fieldname, $fieldid, $arguments, $default, $script, $groups, $autosearchdelay));
		} 
	}

	if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) {
		$callbackscript_tpl = "wiki:" . $params['callbackscript'];
		$callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl); 
	}

	$script .= "function load_customsearch_$id(searchdata) {\n";
	$searchfadetext = tr('Searching...');
	if ($searchfadediv) { 
		$script .= "	if ($('#$searchfadediv').length) $('#$searchfadediv').modal('$searchfadetext');\n";
		$script .= "	else $('#customsearch_$id').modal('$searchfadetext');\n";
	} else {
		$script .= "	$('#customsearch_$id').modal('$searchfadetext');\n";
	}
	$script .= "
	var datamap = {
		basedata: customsearch_{$id}_basedata,
		adddata: searchdata,
		searchid: '$id',
		groups: '" . json_encode($groups) . "',
		textrangegroups: '" . json_encode($textrangegroups) . "',
		daterangegroups: '" . json_encode($daterangegroups) . "',
		offset: customsearch_offset_$id,
		maxRecords: customsearch_maxRecords_$id
	};
	if (customsearch_sort_mode_$id) {
		// blank sort_mode is not allowed by Tiki input filter
		datamap['sort_mode'] = customsearch_sort_mode_$id;
	}
	$.ajax({
		type: 'POST',
		url: $.service('tracker_search', 'customsearch'),
		data: datamap,
		dataType: 'html',
		success: function(data){
";

	if ($searchfadediv) {
		$script .= "			if ($('#$searchfadediv').length) $('#$searchfadediv').modal();\n";
		$script .= "			else $('#customsearch_$id').modal();\n";
	} else {
		$script .= "			$('#customsearch_$id').modal();\n";
	}
	if (!empty($params['destdiv'])) {
		$script .= "			$('#{$params['destdiv']}').html(data); customsearch_quiet_$id = false;\n";
	} else {
		$script .= "			$('#customsearch_{$id}_results').html(data); customsearch_quiet_$id = false;\n";
	}

	$script .= "			$(document).trigger('pageSearchReady');\n";
	if (!empty($callbackScript)) $script .= $callbackScript;		
	$script .= "
		}
	});
};
customsearch_sort_mode_$id = '$sort_mode';
customsearch_offset_$id = $offset;
customsearch_maxRecords_$id = $maxRecords;
";

	if ($params['searchonload']) {
		$script .= "$('#customsearch_$id').submit();
";
	}
	TikiLib::lib('header')->add_jq_onready($script);

	$form = '<div id="' . "customsearch_$id" . '_form' . '"><form id="' . "customsearch_$id" . '">' . $matches->getText() . '</form></div>';

	if (empty($params['destdiv'])) {
		$results = '<div id="' . "customsearch_$id" . '_results"></div>';
	}

	$out = $form . $results;


	return $out;
}
Example #19
0
 function process_save_plugins($data, array $context)
 {
     $parserlib = TikiLib::lib('parser');
     $argumentParser = new WikiParser_PluginArgumentParser();
     $matches = WikiParser_PluginMatcher::match($data);
     foreach ($matches as $match) {
         $plugin_name = $match->getName();
         $body = $match->getBody();
         $arguments = $argumentParser->parse($match->getArguments());
         $dummy_output = '';
         if ($parserlib->plugin_enabled($plugin_name, $dummy_output)) {
             $func_name = 'wikiplugin_' . $plugin_name . '_rewrite';
             if (function_exists($func_name)) {
                 $parserlib->plugin_apply_filters($plugin_name, $data, $arguments);
                 $output = $func_name($body, $arguments, $context);
                 if ($output !== false) {
                     $match->replaceWith($output);
                 }
             }
             if ($plugin_name == 'translationof') {
                 $this->add_translationof_relation($data, $arguments, $context['itemId']);
             }
         }
     }
     $matches_text = $matches->getText();
     return $matches_text;
 }
Example #20
0
 function plugin($pluginDetails)
 {
     $argParser = new WikiParser_PluginArgumentParser();
     return $this->parse($this->pluginExecute($pluginDetails['name'], $argParser->parse($pluginDetails['args']), $pluginDetails['body']));
 }
Example #21
0
 public static function fitnesse_content(Tiki_Profile_Writer $writer, $content)
 {
     $searchlib = TikiLib::lib('unifiedsearch');
     $argumentParser = new WikiParser_PluginArgumentParser();
     $matches = WikiParser_PluginMatcher::match($content);
     $justReplaced = false;
     foreach ($matches as $match) {
         if ($justReplaced) {
             $justReplaced = false;
             continue;
         }
         $name = $match->getName();
         $args = $argumentParser->parse($match->getArguments());
         if (isset($args['trackerId'])) {
             $args['trackerId'] = $writer->getReference('tracker', $args['trackerId']);
             $match->replaceWithPlugin($name, $args, $match->getBody());
             $justReplaced = true;
         }
     }
     return $matches->getText();
 }
Example #22
0
 function parse_first(&$data, &$preparsed, &$noparsed, $options = null, $real_start_diff = '0')
 {
     global $tikilib, $tiki_p_edit, $prefs, $pluginskiplist;
     $smarty = TikiLib::lib('smarty');
     if (!is_array($pluginskiplist)) {
         $pluginskiplist = array();
     }
     $is_html = isset($options['is_html']) ? $options['is_html'] : false;
     $data = $this->protectSpecialChars($data, $is_html, $options);
     $matches = WikiParser_PluginMatcher::match($data);
     $argumentParser = new WikiParser_PluginArgumentParser();
     if (!isset($options['parseimgonly'])) {
         $options['parseimgonly'] = false;
     }
     foreach ($matches as $match) {
         if ($options['parseimgonly'] && $this->getName() != 'img') {
             continue;
         }
         //note parent plugin in case of plugins nested in an include - to suppress plugin edit icons below
         $plugin_parent = isset($plugin_name) ? $plugin_name : false;
         $plugin_name = $match->getName();
         //suppress plugin edit icons for plugins within includes since edit doesn't work for these yet
         $options['suppress_icons'] = $plugin_name != 'include' && $plugin_parent && $plugin_parent == 'include' ? true : $options['suppress_icons'];
         $plugin_data = $match->getBody();
         $arguments = $argumentParser->parse($match->getArguments());
         $start = $match->getStart();
         $pluginOutput = null;
         if ($this->plugin_enabled($plugin_name, $pluginOutput)) {
             static $plugin_indexes = array();
             if (!array_key_exists($plugin_name, $plugin_indexes)) {
                 $plugin_indexes[$plugin_name] = 0;
             }
             $current_index = ++$plugin_indexes[$plugin_name];
             // get info to test for preview with auto_save
             if (!$options['skipvalidation']) {
                 $status = $this->plugin_can_execute($plugin_name, $plugin_data, $arguments, $options['preview_mode'] || $options['ck_editor']);
             } else {
                 $status = true;
             }
             global $tiki_p_plugin_viewdetail, $tiki_p_plugin_preview, $tiki_p_plugin_approve;
             $details = $tiki_p_plugin_viewdetail == 'y' && $status != 'rejected';
             $preview = $tiki_p_plugin_preview == 'y' && $details && !$options['preview_mode'];
             $approve = $tiki_p_plugin_approve == 'y' && $details && !$options['preview_mode'];
             if ($status === true || $tiki_p_plugin_preview == 'y' && $details && $options['preview_mode'] && $prefs['ajax_autosave'] === 'y' || isset($options['noparseplugins']) && $options['noparseplugins']) {
                 if (isset($options['stripplugins']) && $options['stripplugins']) {
                     $ret = $plugin_data;
                 } else {
                     if (isset($options['noparseplugins']) && $options['noparseplugins']) {
                         $ret = '~np~' . (string) $match . '~/np~';
                     } else {
                         $ret = $this->plugin_execute($plugin_name, $plugin_data, $arguments, $start, false, $options);
                     }
                 }
             } else {
                 if ($status != 'rejected') {
                     $smarty->assign('plugin_fingerprint', $status);
                     $status = 'pending';
                 }
                 if ($options['ck_editor']) {
                     $ret = $this->convert_plugin_for_ckeditor($plugin_name, $arguments, tra('Plugin execution pending approval'), $plugin_data, array('icon' => 'img/icons/error.png'));
                 } else {
                     $smarty->assign('plugin_name', $plugin_name);
                     $smarty->assign('plugin_index', $current_index);
                     $smarty->assign('plugin_status', $status);
                     if (!$options['inside_pretty']) {
                         $smarty->assign('plugin_details', $details);
                     } else {
                         $smarty->assign('plugin_details', '');
                     }
                     $smarty->assign('plugin_preview', $preview);
                     $smarty->assign('plugin_approve', $approve);
                     $smarty->assign('plugin_body', $plugin_data);
                     $smarty->assign('plugin_args', $arguments);
                     $ret = '~np~' . $smarty->fetch('tiki-plugin_blocked.tpl') . '~/np~';
                 }
             }
         } else {
             $ret = $pluginOutput->toWiki();
         }
         if ($ret === false) {
             continue;
         }
         if ($this->plugin_is_editable($plugin_name) && (empty($options['preview_mode']) || !$options['preview_mode']) && empty($options['indexing']) && (empty($options['print']) || !$options['print']) && !$options['suppress_icons']) {
             $headerlib = TikiLib::lib('header');
             $headerlib->add_jsfile('tiki-jsplugin.php?language=' . $prefs['language'], 'dynamic');
             if ($prefs['wikiplugin_module'] === 'y' && $prefs['wikiplugininline_module'] === 'n') {
                 $headerlib->add_jsfile('tiki-jsmodule.php?language=' . $prefs['language'], 'dynamic');
             }
             include_once 'lib/smarty_tiki/function.icon.php';
             global $page;
             $id = 'plugin-edit-' . $plugin_name . $current_index;
             $headerlib->add_js("\$(document).ready( function() {\nif ( \$('#{$id}') ) {\n\$('#{$id}').click( function(event) {\n\tpopup_plugin_form(" . json_encode('editwiki') . ', ' . json_encode($plugin_name) . ', ' . json_encode($current_index) . ', ' . json_encode($page) . ', ' . json_encode($arguments) . ', ' . json_encode($this->unprotectSpecialChars($plugin_data, true)) . ", event.target);\n} );\n}\n} );\n");
             $iconDisplayStyle = '';
             if ($prefs['wiki_edit_icons_toggle'] == 'y' && ($prefs['wiki_edit_plugin'] == 'y' || $prefs['wiki_edit_section'] == 'y')) {
                 if (!isset($_COOKIE['wiki_plugin_edit_view'])) {
                     $iconDisplayStyle = ' style="display:none;"';
                 }
             }
             $ret .= '~np~<a id="' . $id . '" href="javascript:void(1)" class="editplugin"' . $iconDisplayStyle . '>' . smarty_function_icon(array('_id' => 'wiki_plugin_edit', 'alt' => tra('Edit Plugin') . ':' . $plugin_name), $smarty) . "</a>~/np~";
         }
         // End plugin handling
         $ret = str_replace('~/np~~np~', '', $ret);
         $match->replaceWith($ret);
     }
     $data = $matches->getText();
     $this->strip_unparsed_block($data, $noparsed);
     // ~pp~
     $start = -1;
     while (false !== ($start = strpos($data, '~pp~', $start + 1))) {
         if (false !== ($end = strpos($data, '~/pp~', $start))) {
             $content = substr($data, $start + 4, $end - $start - 4);
             // ~pp~ type "plugins"
             $key = "§" . md5($tikilib->genPass()) . "§";
             $noparsed["key"][] = preg_quote($key);
             $noparsed["data"][] = '<pre>' . $content . '</pre>';
             $data = substr($data, 0, $start) . $key . substr($data, $end + 5);
         }
     }
 }
function wikiplugin_customsearch($data, $params)
{
    global $prefs;
    if (!isset($params['wiki'])) {
        return tra('Template is not specified');
    } elseif (!TikiLib::lib('tiki')->page_exists($params['wiki'])) {
        return tra('Template page not found');
    }
    if (isset($params['id'])) {
        $id = $params['id'];
    } else {
        $id = '0';
    }
    if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) {
        $recalllastsearch = 1;
    } else {
        $recalllastsearch = 0;
    }
    if (isset($params['searchfadediv'])) {
        $searchfadediv = $params['searchfadediv'];
    } else {
        $searchfadediv = '';
    }
    if (!isset($_REQUEST["offset"])) {
        $offset = 0;
    } else {
        $offset = (int) $_REQUEST["offset"];
    }
    if (isset($_REQUEST['maxRecords'])) {
        $maxRecords = (int) $_REQUEST['maxRecords'];
    } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['maxRecords'])) {
        $maxRecords = (int) $_SESSION["customsearch_{$id}"]['maxRecords'];
    } else {
        $maxRecords = (int) $prefs['maxRecords'];
    }
    if (!empty($_REQUEST['sort_mode'])) {
        $sort_mode = $_REQUEST['sort_mode'];
    } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['sort_mode'])) {
        $sort_mode = $_SESSION["customsearch_{$id}"]['sort_mode'];
    } else {
        $sort_mode = '';
    }
    if (!isset($params['searchonload'])) {
        $params['searchonload'] = 1;
    }
    $definitionKey = md5($data);
    $matches = WikiParser_PluginMatcher::match($data);
    $query = new Search_Query();
    $builder = new Search_Query_WikiBuilder($query);
    $builder->apply($matches);
    $builder = new Search_Formatter_Builder();
    $builder->apply($matches);
    $formatter = $builder->getFormatter();
    $cachelib = TikiLib::lib('cache');
    $cachelib->cacheItem($definitionKey, serialize(array('query' => $query, 'formatter' => $formatter)), 'customsearch');
    $wikitpl = "tplwiki:" . $params['wiki'];
    $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl);
    TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent);
    $matches = WikiParser_PluginMatcher::match($wikicontent);
    $fingerprint = md5($wikicontent);
    $sessionprint = "customsearch_{$id}_{$fingerprint}";
    if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) {
        unset($_SESSION["customsearch_{$id}"]);
    }
    $_SESSION[$sessionprint] = $fingerprint;
    // important that offset from session is set after fingerprint check otherwise blank page might show
    if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_{$id}"]["offset"])) {
        $offset = (int) $_SESSION["customsearch_{$id}"]["offset"];
    }
    $options = array('searchfadetext' => tr('Loading...'), 'searchfadediv' => $searchfadediv, 'results' => empty($params['destdiv']) ? "#customsearch_{$id}_results" : "#{$params['destdiv']}", 'autosearchdelay' => isset($params['autosearchdelay']) ? max(1500, (int) $params['autosearchdelay']) : 0, 'searchonload' => (int) $params['searchonload']);
    /**
     * NOTES: Search Execution
     *
     * There is a global delay on execution of 1 second. This makes sure
     * multiple submissions will never trigger multiple requests.
     *
     * There is an additional autosearchdelay configuration that can trigger the search
     * on field change rather than explicit request. Explicit requests will still work.
     */
    $script = "\nvar customsearch = {\n\toptions: " . json_encode($options) . ",\n\tid: " . json_encode($id) . ",\n\toffset: 0,\n\tsearchdata: {},\n\tdefinition: " . json_encode((string) $definitionKey) . ",\n\tautoTimeout: null,\n\tadd: function (fieldId, filter) {\n\t\tthis.searchdata[fieldId] = filter;\n\t\tthis.auto();\n\t},\n\tremove: function (fieldId) {\n\t\tdelete this.searchdata[fieldId];\n\t\tthis.auto();\n\t},\n\tload: function () {\n\t\tthis._executor(this);\n\t},\n\tauto: function () {\n\t},\n\t_executor: delayedExecutor(1000, function (cs) {\n\t\tvar selector = '#' + cs.options.searchfadediv;\n\t\tif (cs.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\tselector = '#customsearch_' + cs.id;\n\t\t}\n\n\t\t\$(selector).modal(cs.options.searchfadetext);\n\n\t\tcs._load(function (data) {\n\t\t\t\$(selector).modal();\n\t\t\t\$(cs.options.results).html(data);\n\t\t\t\$(document).trigger('pageSearchReady');\n\t\t});\n\t}),\n\tinit: function () {\n\t\tvar that = this;\n\t\tif (that.options.searchonload) {\n\t\t\tthat.load();\n\t\t}\n\n\t\tif (that.options.autosearchdelay) {\n\t\t\tthat.auto = delayedExecutor(that.options.autosearchdelay, function () {\n\t\t\t\tthat.load();\n\t\t\t});\n\t\t}\n\t}\n};\n\$('#customsearch_{$id}').click(function() {\n\tcustomsearch.offset = 0;\n});\n\$('#customsearch_{$id}').submit(function() {\n\tcustomsearch.load();\n\treturn false;\n});\n\ncustomsearch_{$id} = customsearch;\n";
    $parser = new WikiParser_PluginArgumentParser();
    foreach ($matches as $match) {
        $name = $match->getName();
        $arguments = $parser->parse($match->getArguments());
        $key = $match->getInitialStart();
        $fieldid = "customsearch_{$id}_{$key}";
        if (isset($arguments['id'])) {
            $fieldid = $arguments['id'];
        }
        if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) {
            $sort_mode = $arguments['mode'];
            $match->replaceWith('');
            continue;
        }
        if (!empty($arguments['_field']) && $arguments['_filter'] == 'content') {
            $filter = $arguments['_field'];
        } elseif (!empty($arguments['_field']) && $arguments['_filter'] == 'content') {
            $filter = 'content';
        } else {
            $filter = '';
        }
        if ($filter && !empty($_REQUEST['default'][$filter])) {
            $default = $_REQUEST['default'][$filter];
        } elseif ($recalllastsearch && isset($_SESSION["customsearch_{$id}"][$fieldid])) {
            $default = $_SESSION["customsearch_{$id}"][$fieldid];
        } elseif (!empty($arguments['_default'])) {
            if (strpos($arguments['_default'], ',') !== false) {
                $default = explode(',', $arguments['_default']);
            } else {
                $default = $arguments['_default'];
            }
        } else {
            $default = '';
        }
        if ($name == 'categories') {
            $parent = $arguments['_parent'];
            if (!empty($_REQUEST['defaultcat'][$parent])) {
                $default = $_REQUEST['defaultcat'][$parent];
            }
        }
        $function = "cs_design_{$name}";
        if (function_exists($function)) {
            if (isset($arguments['_group'])) {
                $fieldname = "customsearch_{$id}_gr" . $arguments['_group'];
            } elseif (isset($arguments['_textrange'])) {
                $fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange'];
            } elseif (isset($arguments['_daterange'])) {
                $fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange'];
            } else {
                $fieldname = $fieldid;
            }
            $match->replaceWith($function($id, $fieldname, $fieldid, $arguments, $default, $script));
        }
    }
    $callbackScript = null;
    if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) {
        $callbackscript_tpl = "wiki:" . $params['callbackscript'];
        $callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl);
    }
    global $page;
    $script .= "\ncustomsearch._load = function (receive) {\n\tvar datamap = {\n\t\tdefinition: this.definition,\n\t\tadddata: \$.toJSON(this.searchdata),\n\t\tsearchid: this.id,\n\t\toffset: customsearch.offset,\n\t\tmaxRecords: this.maxRecords,\n\t\tpage: " . json_encode($page) . ",\n\t\trecalllastsearch: {$recalllastsearch}\n\t};\n\tif (customsearch.sort_mode) {\n\t\t// blank sort_mode is not allowed by Tiki input filter\n\t\tdatamap.sort_mode = customsearch.sort_mode;\n\t}\n\t\$.ajax({\n\t\ttype: 'POST',\n\t\turl: \$.service('search_customsearch', 'customsearch'),\n\t\tdata: datamap,\n\t\tdataType: 'html',\n\t\tsuccess: function(data) {\n\t\t\treceive(data);\n\t\t\t{$callbackScript};\n\t\t}\n\t});\n};\ncustomsearch.sort_mode = " . json_encode($sort_mode) . ";\ncustomsearch.offset = {$offset};\ncustomsearch.maxRecords = {$maxRecords};\ncustomsearch.init();\n";
    TikiLib::lib('header')->add_jq_onready($script);
    $out = '<div id="customsearch_' . $id . '_form"><form id="customsearch_' . $id . '">' . $matches->getText() . '</form></div>';
    if (empty($params['destdiv'])) {
        $out .= '<div id="customsearch_' . $id . '_results"></div>';
    }
    return $out;
}
 function testInvalidEnd()
 {
     $out = array('a' => 'b');
     $parser = new WikiParser_PluginArgumentParser();
     $this->assertEquals($parser->parse('a=b foo='), $out);
 }
Example #25
0
function wikiplugin_customsearch($data, $params)
{
    global $prefs;
    static $instance_id = null;
    if (empty($params['wiki']) && empty($params['tpl'])) {
        return tra('Template is not specified');
    } elseif (!empty($params['wiki']) && !TikiLib::lib('tiki')->page_exists($params['wiki'])) {
        return tra('Template page not found');
    }
    if (isset($params['id'])) {
        $id = $params['id'];
    } else {
        if ($instance_id === null) {
            $instance_id = 0;
        } else {
            $instance_id++;
        }
        $id = (string) $instance_id;
    }
    if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) {
        $recalllastsearch = 1;
    } else {
        $recalllastsearch = 0;
    }
    $defaults = array();
    $plugininfo = wikiplugin_customsearch_info();
    foreach ($plugininfo['params'] as $key => $param) {
        $defaults["{$key}"] = $param['default'];
    }
    $params = array_merge($defaults, $params);
    if (!isset($_REQUEST["offset"])) {
        $offset = 0;
    } else {
        $offset = (int) $_REQUEST["offset"];
    }
    if (isset($_REQUEST['maxRecords'])) {
        $maxRecords = (int) $_REQUEST['maxRecords'];
    } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['maxRecords'])) {
        $maxRecords = (int) $_SESSION["customsearch_{$id}"]['maxRecords'];
    } else {
        $maxRecords = (int) $prefs['maxRecords'];
        $maxDefault = true;
    }
    if (!empty($_REQUEST['sort_mode'])) {
        $sort_mode = $_REQUEST['sort_mode'];
    } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['sort_mode'])) {
        $sort_mode = $_SESSION["customsearch_{$id}"]['sort_mode'];
    } else {
        $sort_mode = '';
    }
    $definitionKey = md5($data);
    $matches = WikiParser_PluginMatcher::match($data);
    $query = new Search_Query();
    if (!isset($params['searchable_only']) || $params['searchable_only'] == 1) {
        $query->filterIdentifier('y', 'searchable');
    }
    $builder = new Search_Query_WikiBuilder($query);
    $builder->apply($matches);
    $paginationArguments = $builder->getPaginationArguments();
    // Use maxRecords set in LIST parameters rather then global default if set.
    if (isset($maxDefault) && $maxDefault) {
        if (!empty($paginationArguments['max'])) {
            $maxRecords = $paginationArguments['max'];
        }
    }
    // setup AJAX pagination
    $paginationArguments['offset_jsvar'] = "customsearch_{$id}.offset";
    $paginationArguments['sort_jsvar'] = "customsearch_{$id}.sort_mode";
    $paginationArguments['_onclick'] = "\$('#customsearch_{$id}').submit();return false;";
    $builder = new Search_Formatter_Builder();
    $builder->setPaginationArguments($paginationArguments);
    $builder->apply($matches);
    $formatter = $builder->getFormatter();
    $facets = new Search_Query_FacetWikiBuilder();
    $facets->apply($matches);
    $cachelib = TikiLib::lib('cache');
    $cachelib->cacheItem($definitionKey, serialize(array('query' => $query, 'formatter' => $formatter, 'facets' => $facets)), 'customsearch');
    if (!empty($params['wiki'])) {
        $wikitpl = "tplwiki:" . $params['wiki'];
    } else {
        $wikitpl = $params['tpl'];
    }
    $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl);
    TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent);
    $matches = WikiParser_PluginMatcher::match($wikicontent);
    $fingerprint = md5($wikicontent);
    $sessionprint = "customsearch_{$id}_{$fingerprint}";
    if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) {
        unset($_SESSION["customsearch_{$id}"]);
    }
    $_SESSION[$sessionprint] = $fingerprint;
    // important that offset from session is set after fingerprint check otherwise blank page might show
    if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_{$id}"]["offset"])) {
        $offset = (int) $_SESSION["customsearch_{$id}"]["offset"];
    }
    $options = array('searchfadetext' => tr('Loading...'), 'searchfadediv' => $params['searchfadediv'], 'results' => empty($params['destdiv']) ? "#customsearch_{$id}_results" : "#{$params['destdiv']}", 'autosearchdelay' => isset($params['autosearchdelay']) ? max(1500, (int) $params['autosearchdelay']) : 0, 'searchonload' => (int) $params['searchonload'], 'requireinput' => (bool) $params['requireinput'], 'origrequireinput' => (bool) $params['requireinput'], 'forcesortmode' => (bool) $params['forcesortmode']);
    /**
     * NOTES: Search Execution
     *
     * There is a global delay on execution of 1 second. This makes sure
     * multiple submissions will never trigger multiple requests.
     *
     * There is an additional autosearchdelay configuration that can trigger the search
     * on field change rather than explicit request. Explicit requests will still work.
     */
    $script = "\nvar customsearch = {\n\toptions: " . json_encode($options) . ",\n\tid: " . json_encode($id) . ",\n\toffset: 0,\n\tsearchdata: {},\n\tdefinition: " . json_encode((string) $definitionKey) . ",\n\tautoTimeout: null,\n\tadd: function (fieldId, filter) {\n\t\tthis.searchdata[fieldId] = filter;\n\t\tthis.auto();\n\t},\n\tremove: function (fieldId) {\n\t\tdelete this.searchdata[fieldId];\n\t\tthis.auto();\n\t},\n\tload: function () {\n\t\tthis._executor(this);\n\t},\n\tauto: function () {\n\t},\n\t_executor: delayedExecutor(1000, function (cs) {\n\t\tvar selector = '#' + cs.options.searchfadediv;\n\t\tif (cs.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\tselector = '#customsearch_' + cs.id;\n\t\t}\n\n\t\t\$(selector).tikiModal(cs.options.searchfadetext);\n\n\t\tcs._load(function (data) {\n\t\t\t\$(selector).tikiModal();\n\t\t\t\$(cs.options.results).html(data);\n\t\t\t\$(document).trigger('pageSearchReady');\n\t\t});\n\t\tcs.store_query = '';\n\t}),\n\tinit: function () {\n\t\tvar that = this;\n\t\tif (that.options.searchonload) {\n\t\t\tthat.load();\n\t\t}\n\n\t\tif (that.options.autosearchdelay) {\n\t\t\tthat.auto = delayedExecutor(that.options.autosearchdelay, function () {\n\t\t\t\tif (that.options.requireinput && (!\$('#customsearch_{$id}').find(':text').val() || \$('#customsearch_{$id}').find(':text').val().indexOf('...') > 0)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthat.load();\n\t\t\t});\n\t\t}\n\t}\n};\n\$('#customsearch_{$id}').click(function() {\n\tcustomsearch.offset = 0;\n});\n\$('#customsearch_{$id}').submit(function() {\n\tif (customsearch.options.requireinput && (!\$(this).find(':text').val() || \$(this).find(':text').val().indexOf('...') > 0)) {\n\t\talert(tr('Please enter a search query'));\n\t\treturn false;\n\t}\n\tif (customsearch.options.origrequireinput != customsearch.options.requireinput) {\n\t\tcustomsearch.options.requireinput = customsearch.options.origrequireinput;\n\t}\n\tcustomsearch.load();\n\treturn false;\n});\n\nwindow.customsearch_{$id} = customsearch;\n\$(document).trigger('formSearchReady');\n";
    $parser = new WikiParser_PluginArgumentParser();
    $dr = 0;
    foreach ($matches as $match) {
        $name = $match->getName();
        $arguments = $parser->parse($match->getArguments());
        $key = $match->getInitialStart();
        $fieldid = "customsearch_{$id}_{$key}";
        if (isset($arguments['id'])) {
            $fieldid = $arguments['id'];
        }
        if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) {
            $sort_mode = $arguments['mode'];
            $match->replaceWith('');
            continue;
        }
        if (!empty($arguments['_field']) && !empty($arguments['_filter']) && $arguments['_filter'] == 'content') {
            $filter = $arguments['_field'];
        } elseif (empty($arguments['_field']) && !empty($arguments['_filter']) && $arguments['_filter'] == 'content') {
            $filter = 'content';
        } else {
            $filter = '';
        }
        if ($filter && !empty($_REQUEST['default'][$filter])) {
            $default = $_REQUEST['default'][$filter];
        } elseif ($recalllastsearch && isset($_SESSION["customsearch_{$id}"][$fieldid])) {
            $default = $_SESSION["customsearch_{$id}"][$fieldid];
        } elseif (!empty($arguments['_default'])) {
            if (strpos($arguments['_default'], ',') !== false) {
                $default = explode(',', $arguments['_default']);
            } else {
                $default = $arguments['_default'];
            }
        } else {
            $default = '';
        }
        if ($name == 'categories') {
            $parent = $arguments['_parent'];
            if (!empty($_REQUEST['defaultcat'][$parent])) {
                $default = $_REQUEST['defaultcat'][$parent];
            }
        }
        $function = "cs_design_{$name}";
        if (function_exists($function)) {
            if (isset($arguments['_group'])) {
                $fieldname = "customsearch_{$id}_gr" . $arguments['_group'];
            } elseif (isset($arguments['_textrange'])) {
                $fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange'];
            } elseif (isset($arguments['_daterange'])) {
                $fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange'];
            } else {
                $fieldname = $fieldid;
            }
            $html = $function($id, $fieldname, $fieldid, $arguments, $default, $script);
            if ($params['trimlinefeeds']) {
                $html = trim($html);
            }
            $match->replaceWith($html);
        }
        if ($name == 'daterange') {
            $dr++;
        }
    }
    $callbackScript = null;
    if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) {
        $callbackscript_tpl = "wiki:" . $params['callbackscript'];
        $callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl);
    }
    //get iconset icon if daterange is one of the fields
    if ($dr) {
        $smarty = TikiLib::lib('smarty');
        $smarty->loadPlugin('smarty_function_js_insert_icon');
        $iconinsert = smarty_function_js_insert_icon(['type' => 'jscalendar', 'return' => 'y'], $smarty);
    } else {
        $iconinsert = '';
    }
    global $page;
    $script .= "\ncustomsearch._load = function (receive) {\n\tvar datamap = {\n\t\tdefinition: this.definition,\n\t\tadddata: \$.toJSON(this.searchdata),\n\t\tsearchid: this.id,\n\t\toffset: customsearch.offset,\n\t\tmaxRecords: this.maxRecords,\n\t\tstore_query: this.store_query,\n\t\tpage: " . json_encode($page) . ",\n\t\trecalllastsearch: {$recalllastsearch}\n\t};\n\tif (!customsearch.options.forcesortmode && \$('#customsearch_{$id}').find(':text').val() && \$('#customsearch_{$id}').find(':text').val().indexOf('...') <= 0) {\n\t\tcustomsearch.sort_mode = 'score_desc';\n\t}\n\tif (customsearch.sort_mode) {\n\t\t// blank sort_mode is not allowed by Tiki input filter\n\t\tdatamap.sort_mode = customsearch.sort_mode;\n\t}\n\t\$.ajax({\n\t\ttype: 'POST',\n\t\turl: \$.service('search_customsearch', 'customsearch'),\n\t\tdata: datamap,\n\t\tdataType: 'html',\n\t\tsuccess: function(data) {\n\t\t\treceive(data);\n\t\t\t{$callbackScript};\n\t\t},\n\t\terror: function ( jqXHR, textStatus, errorThrown ) {\n\t\t\tvar selector = '#' + customsearch.options.searchfadediv;\n\t\t\tif (customsearch.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\t\tselector = '#customsearch_' + customsearch.id;\n\t\t\t}\n\t\t\t\$(selector).tikiModal();\n\n\t\t\t\$('#customsearch_{$id}').showError(jqXHR)\n\t\t}\n\t});\n};\ncustomsearch.sort_mode = " . json_encode($sort_mode) . ";\ncustomsearch.offset = {$offset};\ncustomsearch.maxRecords = {$maxRecords};\ncustomsearch.store_query ='';\ncustomsearch.init();\n{$iconinsert}";
    TikiLib::lib('header')->add_jq_onready($script);
    if ($params['customsearchjs']) {
        TikiLib::lib('header')->add_jsfile('lib/jquery_tiki/customsearch.js');
    }
    $out = '<div id="customsearch_' . $id . '_form"><form id="customsearch_' . $id . '">' . $matches->getText() . '</form></div>';
    if (empty($params['destdiv'])) {
        $out .= '<div id="customsearch_' . $id . '_results"></div>';
    }
    if (!empty($params['wiki'])) {
        return $out;
    } else {
        // If using smarty tpl should assume it's all HTML
        $out = str_replace('~np~', '', $out);
        $out = str_replace('~/np~', '', $out);
        return '~np~' . $out . '~/np~';
    }
}