function wikiplugin_zoterolist($data, $params)
{
	if (! isset($params['tag'])) {
		return WikiParser_PluginOutput::argumentError(array('tag'));
	}

	$cachelib = TikiLib::lib('cache');
	$tikilib = TikiLib::lib('tiki');

	$cacheKey = 'zoterolist.' . $params['tag'];

	if ($cached = $cachelib->getSerialized($cacheKey, 'zotero')) {
		if (($cached['created'] + 3600) > $tikilib->now) {
			return WikiParser_PluginOutput::html($cached['data']);
		}
	}
	
	$zoterolib = TikiLib::lib('zotero');
	$html = $zoterolib->get_formatted_references($params['tag']);

	$cachelib->cacheItem($cacheKey, serialize(array('created' => $tikilib->now, 'data' => $html)), 'zotero');

	if ($html) {
		return WikiParser_PluginOutput::html($html);
	} else {
		return WikiParser_PluginOutput::error(tra('Error'), tra('No results obtained. The Zotero citation server may be down.'));
	}
}
function wikiplugin_transclude( $data, $params )
{
	if ( ! isset( $params['page'] ) ) {
		return WikiParser_PluginOutput::argumentError(array( 'page' ));
	}
	
	$page = $params['page'];
	unset($params['page']);

	global $tikilib;

	if ( ! Perms::get('wiki page', $page)->view ) {
		return WikiParser_PluginOutput::error(tra('Permission Denied'), tra('Attempt to include a page that cannot be viewed.'));
	}

	if ( $info = $tikilib->get_page_info($page) ) {
		$parts = preg_split('/%%%text%%%/', $info['data']);
		$data = $tikilib->parse_data($data);
                $pass = $parts[0] . $data . $parts[1];
		return preg_replace_callback(
						'/%%%([A-z0-9]+)%%%/',
						array( new WikiPlugin_Transclude_Replacer($params), 'callback' ),
						$pass
		);
	} else {
		return WikiParser_PluginOutput::error(tr('Page not found'), tr('Page named "%0" does not exist at this time.', $page));
	}
}
function wikiplugin_trackeritemfield($data, $params)
{
    global $userTracker, $group, $user, $userlib, $tiki_p_admin_trackers, $prefs, $smarty, $tikilib;
    global $trklib;
    include_once 'lib/trackers/trackerlib.php';
    static $memoItemId = 0;
    static $memoTrackerId = 0;
    static $memoStatus = 0;
    static $memoUserTracker = false;
    static $memoItemObject = null;
    extract($params, EXTR_SKIP);
    if (empty($itemId) && !empty($_REQUEST['itemId'])) {
        if (!empty($trackerId)) {
            $info = $trklib->get_item_info($_REQUEST['itemId']);
            if (!empty($info) && $info['trackerId'] == $trackerId) {
                $itemId = $_REQUEST['itemId'];
            }
        } else {
            $itemId = $_REQUEST['itemId'];
        }
    }
    if (empty($itemId) && !empty($trackerId) && ($tracker_info = $trklib->get_tracker($trackerId))) {
        if ($t = $trklib->get_tracker_options($trackerId)) {
            $tracker_info = array_merge($tracker_info, $t);
        }
        $itemId = $trklib->get_user_item($trackerId, $tracker_info);
    }
    if (!empty($itemId) && $memoItemId == $itemId || empty($itemId) && !empty($memoItemId)) {
        $itemId = $memoItemId;
        if (empty($memoTrackerId)) {
            return tra('Incorrect param');
        }
        $trackerId = $memoTrackerId;
        $itemObject = $memoItemObject;
    } else {
        if (!empty($trackerId) && !empty($_REQUEST['view_user'])) {
            $itemId = $trklib->get_user_item($trackerId, $tracker_info, $_REQUEST['view_user']);
        }
        if (empty($trackerId) && empty($itemId) && (isset($userTracker) && $userTracker == 'y' || isset($prefs) && $prefs['userTracker'] == 'y') && !empty($group) && ($utid = $userlib->get_tracker_usergroup($user)) && $utid['usersTrackerId']) {
            $trackerId = $utid['usersTrackerId'];
            $itemId = $trklib->get_item_id($trackerId, $utid['usersFieldId'], $user);
        } else {
            if (empty($trackerId) && !empty($itemId)) {
                $item = $trklib->get_tracker_item($itemId);
                $trackerId = $item['trackerId'];
            }
        }
        if (empty($itemId) && empty($test) && empty($status)) {
            // need an item
            return tra('Incorrect param') . ': itemId';
        }
        if (!empty($status) && !$trklib->valid_status($status)) {
            return tra('Incorrect param') . ': status';
        }
        $info = $trklib->get_tracker_item($itemId);
        if (!empty($info) && empty($trackerId)) {
            $trackerId = $info['trackerId'];
        }
        $itemObject = Tracker_Item::fromInfo($info);
        if (!$itemObject->canView()) {
            return WikiParser_PluginOutput::error(tr('Permission denied'), tr('You are not allowed to view this item.'));
        }
        $memoStatus = $info['status'];
        $memoItemId = $itemId;
        $memoTrackerId = $info['trackerId'];
        $memoItemObject = $itemObject;
        if (isset($_REQUEST['itemId']) && $_REQUEST['itemId'] != $itemId) {
            global $logslib;
            include_once 'lib/logs/logslib.php';
            $logslib->add_action('Viewed', $itemId, 'trackeritem', $_SERVER['REQUEST_URI'] . '&trackeritemfield');
        }
    }
    if (!isset($data)) {
        $data = $dataelse = '';
    } elseif (!empty($data) && strpos($data, '{ELSE}')) {
        $dataelse = substr($data, strpos($data, '{ELSE}') + 6);
        $data = substr($data, 0, strpos($data, '{ELSE}'));
    } else {
        $dataelse = '';
    }
    if (!empty($status)) {
        if (!strstr($status, $memoStatus)) {
            return $dataelse;
        }
    }
    if (empty($itemId) && !empty($test)) {
        return $dataelse;
    } elseif (empty($itemId)) {
        return tra('Incorrect param') . ': itemId';
    } elseif (isset($fields)) {
        $all_fields = $trklib->list_tracker_fields($trackerId, 0, -1);
        $all_fields = $all_fields['data'];
        if (!empty($fields)) {
            foreach ($all_fields as $i => $fopt) {
                if (!in_array($fopt['fieldId'], $fields)) {
                    unset($all_fields[$i]);
                }
            }
            if (empty($all_fields)) {
                return tra('Incorrect param');
            }
        }
        $field_values = $trklib->get_item_fields($trackerId, $itemId, $all_fields, $itemUser);
        foreach ($field_values as $field_value) {
            if ($field_value['type'] == 'p' && $field_value['options_array'][0] == 'password' || $field_value['isHidden'] != 'n' && $field_value['isHidden'] != 'c') {
                continue;
            }
            if (!$itemObject->canViewField($field_value['fieldId'])) {
                continue;
            }
            if (empty($field_value['value'])) {
                return $dataelse;
            }
        }
    } elseif (!empty($fieldId)) {
        if (!($field = $trklib->get_tracker_field($fieldId))) {
            return tra('Incorrect param') . ': fieldId';
        }
        if (!$itemObject->canViewField($fieldId)) {
            return WikiParser_PluginOutput::error(tr('Permission denied'), tr('You are not allowed to view this field.'));
        }
        if (empty($test)) {
            $test = false;
        }
        if (($val = $trklib->get_item_value($trackerId, $itemId, $fieldId)) !== false) {
            if ($test) {
                if (!empty($value) && $val != $value) {
                    return $dataelse;
                }
                return $data;
            } else {
                $field['value'] = $val;
                $handler = $trklib->get_field_handler($field, $info);
                // gets the handler to blend back the value into the definitions array
                $out = $handler->renderOutput(array('showlinks' => 'n'));
                return $out;
            }
        } elseif ($test) {
            // testing the value of a field that does not exist yet
            return $dataelse;
        }
    }
    return $data;
}