<?php
/**
 * Elgg Bookmarks plugin
 *
 * @package ElggBookmarks
 */

elgg_register_event_handler('init', 'system', 'bookmarks_init');

/**
 * Bookmark init
 */
function bookmarks_init() {
	global $CONFIG;

	$root = dirname(__FILE__);
	elgg_register_library('elgg:bookmarks', "$root/lib/bookmarks.php");

	// actions
	$action_path = "$root/actions/bookmarks";
	elgg_register_action('bookmarks/save', "$action_path/save.php", 'logged_in');
	elgg_register_action('bookmarks/delete', "$action_path/delete.php", 'logged_in');
	elgg_register_action('bookmarks/share', "$action_path/share.php", 'logged_in');

	// menus
	elgg_register_menu_item('site', array(
		'name' => 'bookmarks',
		'title' => elgg_echo('bookmarks'),
		'url' => 'pg/bookmarks/all'
	));

	elgg_register_plugin_hook_handler('register', 'menu:page', 'bookmarks_page_menu');
	elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'bookmarks_owner_block_menu');
	elgg_register_plugin_hook_handler('register', 'menu:user_hover', 'bookmarks_user_hover_menu');

	elgg_register_page_handler('bookmarks', 'bookmarks_page_handler');

	elgg_extend_view('css/screen', 'bookmarks/css');
	elgg_extend_view('js/elgg', 'bookmarks/js');
	elgg_extend_view('page/links', 'bookmarks/page_links');

	// Register granular notification for this type
	if (is_callable('register_notification_object')) {
		register_notification_object('object', 'bookmarks', elgg_echo('bookmarks:new'));
	}

	// Listen to notification events and supply a more useful message
	elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'bookmarks_notify_message');

	// Register a URL handler for bookmarks
	elgg_register_entity_url_handler('object','bookmarks', 'bookmark_url');

	// Register entity type for search
	elgg_register_entity_type('object', 'bookmarks');

	// Groups
	add_group_tool_option('bookmarks', elgg_echo('bookmarks:enablebookmarks'), true);
	elgg_extend_view('groups/tool_latest', 'bookmarks/group_module');
}

/**
 * Dispatcher for bookmarks.
 *
 * URLs take the form of
 *  All bookmarks:        pg/bookmarks/all
 *  User's bookmarks:     pg/bookmarks/owner/<username>
 *  Friends' bookmarks:   pg/bookmarks/friends/<username>
 *  View bookmark:        pg/bookmarks/view/<guid>/<title>
 *  New bookmark:         pg/bookmarks/add/<guid> (container: user, group, parent)
 *  Edit bookmark:        pg/bookmarks/edit/<guid>
 *  Group bookmarks:      pg/bookmarks/group/<guid>/owner
 *  Bookmarklet:          pg/bookmarks/bookmarklet/<guid> (user)
 *
 * Title is ignored
 *
 * @param array $page
 */
function bookmarks_page_handler($page) {
	elgg_load_library('elgg:bookmarks');

	elgg_push_breadcrumb(elgg_echo('bookmarks'), 'pg/bookmarks/all');
	elgg_push_context('bookmarks');

	// old group usernames
	if (substr_count($page[0], 'group:')) {
		preg_match('/group\:([0-9]+)/i', $page[0], $matches);
		$guid = $matches[1];
		if ($entity = get_entity($guid)) {
			bookmarks_url_forwarder($page);
		}
	}

	// user usernames
	$user = get_user_by_username($page[0]);
	if ($user) {
		bookmarks_url_forwarder($page);
	}

	$pages = dirname(__FILE__) . '/pages';

	switch ($page[0]) {
		case "all":
			include "$pages/all.php";
			break;

		case "owner":
			set_input('username', $page[1]);
			include "$pages/owner.php";
			break;

		case "friends":
			set_input('username', $page[1]);
			include "$pages/friends.php";
			break;

		case "read":
		case "view":
			set_input('guid', $page[1]);
			include "$pages/view.php";
			break;

		case "add":
			gatekeeper();
			set_input('container_guid', $page[1]);
			include "$pages/add.php";
			break;

		case "edit":
			gatekeeper();
			set_input('guid', $page[1]);
			include "$pages/edit.php";
			break;

		case 'group':
			group_gatekeeper();
			set_input('guid', $page[1]);
			include "$pages/owner.php";
			break;

		case "bookmarklet":
			set_input('container_guid', $page[1]);
			include "$pages/bookmarklet.php";
			break;

		default:
			return false;
	}

	elgg_pop_context();

	return true;
}

/**
 * Forward to the new style of URLs
 *
 * @param string $page
 */
function bookmarks_url_forwarder($page) {
	global $CONFIG;

	if (!isset($page[1])) {
		$page[1] = 'items';
	}

	switch ($page[1]) {
		case "read":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/view/{$page[2]}/{$page[3]}";
			break;
		case "inbox":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/inbox/{$page[0]}/";
			break;
		case "friends":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/friends/{$page[0]}/";
			break;
		case "add":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/add/{$page[0]}/";
			break;
		case "items":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/owner/{$page[0]}/";
			break;
		case "bookmarklet":
			$url = "{$CONFIG->wwwroot}pg/bookmarks/bookmarklet/{$page[0]}/";
			break;
	}

	register_error(elgg_echo("changebookmark"));
	forward($url);
}

/**
 * Populates the ->getUrl() method for bookmarked objects
 *
 * @param ElggEntity $entity The bookmarked object
 * @return string bookmarked item URL
 */
function bookmark_url($entity) {
	global $CONFIG;

	$title = $entity->title;
	$title = elgg_get_friendly_title($title);
	return $CONFIG->url . "pg/bookmarks/view/" . $entity->getGUID() . "/" . $title;
}

/**
 * Add a menu item to an ownerblock
 */
function bookmarks_owner_block_menu($hook, $type, $return, $params) {
	if (elgg_instanceof($params['entity'], 'user')) {
		$url = "pg/bookmarks/owner/{$params['entity']->username}";
		$item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks'), $url);
		$return[] = $item;
	} else {
		if ($params['entity']->bookmarks_enable != 'no') {
			$url = "pg/bookmarks/group/{$params['entity']->guid}/owner";
			$item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks:group'), $url);
			$return[] = $item;
		}
	}

	return $return;
}

/**
 * Returns a more meaningful message
 *
 * @param unknown_type $hook
 * @param unknown_type $entity_type
 * @param unknown_type $returnvalue
 * @param unknown_type $params
 */
function bookmarks_notify_message($hook, $entity_type, $returnvalue, $params) {
	$entity = $params['entity'];
	$to_entity = $params['to_entity'];
	$method = $params['method'];
	if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'bookmarks')) {
		$descr = $entity->description;
		$title = $entity->title;
		global $CONFIG;
		$url = elgg_get_site_url() . "pg/view/" . $entity->guid;
		if ($method == 'sms') {
			$owner = $entity->getOwnerEntity();
			return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $url . ' (' . $title . ')';
		}
		if ($method == 'email') {
			$owner = $entity->getOwnerEntity();
			return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL();
		}
		if ($method == 'web') {
			$owner = $entity->getOwnerEntity();
			return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL();
		}

	}
	return null;
}

/**
 * Add a user hover menu.
 *
 * @param unknown_type $hook
 * @param unknown_type $type
 * @param unknown_type $return
 * @param unknown_type $params
 */
function bookmarks_user_hover_menu($hook, $type, $return, $params) {
	$user = $params['entity'];

	$title = elgg_echo('bookmarks');
	$url = "pg/bookmarks/owner/$user->username";
	$return[] = new ElggMenuItem('bookmarks', $title, $url);

	return $return;
}

/**
 * Add a page menu menu.
 *
 * @param unknown_type $hook
 * @param unknown_type $type
 * @param unknown_type $return
 * @param unknown_type $params
 */
function bookmarks_page_menu($hook, $type, $return, $params) {
	if (elgg_is_logged_in()) {
		// only show bookmarklet in bookmark pages
		if (elgg_in_context('bookmarks')) {
			$page_owner = elgg_get_page_owner_entity();
			if ($page_owner instanceof ElggGroup) {
				$title = elgg_echo('bookmarks:bookmarklet:group');
			} else {
				$title = elgg_echo('bookmarks:bookmarklet');
			}

			$return[] = new ElggMenuItem('bookmarklet', $title, 'pg/bookmarks/bookmarklet/' . $page_owner->getGUID());
		}
	}

	return $return;
}