/**
 * Render object subscriptions icon and link
 * 
 * Params:
 * 
 * - object - Object user needs to be subscribed to
 * - user - User who is subscribed, if not set logged user is used
 *
 * @param array $params
 * @param Smarty $smarty
 * @return string
 */
function smarty_function_object_subscription($params, &$smarty)
{
    $object = array_var($params, 'object');
    if (!instance_of($object, 'ProjectObject')) {
        return new InvalidParamError('$object', $object, '$object is expected to be a valid instance of ProjectObject class', true);
    }
    // if
    $user = array_var($params, 'user');
    if (!instance_of($user, 'User')) {
        return new InvalidParamError('$user', $user, '$user is expected to be a valid instance of User class', true);
    }
    // if
    $render_wrapper = (bool) array_var($params, 'render_wrapper', true);
    $wrapper_id = 'object_subscription_widget_' . $object->getId() . '_user_' . $user->getId();
    require_once SMARTY_PATH . '/plugins/block.link.php';
    if (Subscriptions::isSubscribed($user, $object)) {
        $content = '<a href="' . $object->getUnsubscribeUrl($user) . '" title="' . lang('Click to unsubscribe') . '"><img src="' . get_image_url('subscribe-small.gif') . '" alt="" /></a>';
    } else {
        $content = '<a href="' . $object->getSubscribeUrl($user) . '" title="' . lang('Click to subscribe') . '"><img src="' . get_image_url('gray-subscribe-small.gif') . '" alt="" /></a>';
    }
    // if
    $content .= '<script type="text/javascript">App.layout.init_subscribe_unsubscribe_link("' . $wrapper_id . '")</script>';
    return $render_wrapper ? '<span id="' . $wrapper_id . '">' . $content . '</span>' : $content;
}
 /**
  * Subscribe $user to a given $object
  *
  * @param User $user
  * @param ProjectObject $object
  * @return boolean
  */
 function subscribe($user, $object)
 {
     if (!$object->can_have_subscribers) {
         return new InvalidParamError('$object', $object, '$object does not support subscribers', true);
     }
     // if
     if (Subscriptions::isSubscribed($user, $object, false)) {
         return true;
     }
     // if
     $subscription = new Subscription();
     $subscription->setUserId($user->getId());
     $subscription->setParentId($object->getId());
     $save = $subscription->save();
     if ($save && !is_error($save)) {
         Subscriptions::dropUserCache($user);
         return true;
     }
     // if
     return $save;
 }
 /**
  * Return array of quick options
  *
  * @param User $user
  * @return NamedList
  */
 function getQuickOptions($user)
 {
     if (!isset($this->quick_options[$user->getId()])) {
         $options = new NamedList();
         if ($this->canEdit($user)) {
             $options->add('edit', array('text' => lang('Edit'), 'url' => $this->getEditUrl()));
         }
         // if
         if ($this->canChangeCompleteStatus($user)) {
             if ($this->isCompleted()) {
                 $options->add('reopen', array('text' => lang('Reopen'), 'url' => $this->getOpenUrl(), 'method' => 'post'));
             } else {
                 $options->add('complete', array('text' => lang('Complete'), 'url' => $this->getCompleteUrl(), 'method' => 'post'));
             }
             // if
         }
         // if
         if ($this->canSubscribe($user)) {
             if (Subscriptions::isSubscribed($user, $this)) {
                 $options->add('unsubscribe', array('text' => lang('Unsubscribe'), 'url' => $this->getUnsubscribeUrl(), 'method' => 'post'));
             } else {
                 $options->add('subscribe', array('text' => lang('Subscribe'), 'url' => $this->getSubscribeUrl(), 'method' => 'post'));
             }
             // if
         }
         // if
         if ($this->canSubtask($user)) {
             $options->add('new_task', array('text' => lang('New Task'), 'url' => $this->getPostTaskUrl()));
         }
         // if
         if ($this->canSendReminder($user)) {
             $options->add('send_reminder', array('text' => lang('Send Reminder'), 'url' => $this->getSendReminderUrl(), 'class' => 'send_reminder'));
         }
         // if
         if ($this->getType() == 'Checklist') {
             if ($this->canEdit($user)) {
                 $options->add('open_closed_tasks', array('text' => lang('Set All Tasks to Active'), 'url' => assemble_url('project_checklist_open_tasks', array('project_id' => $this->getProjectId(), 'checklist_id' => $this->getId()))));
             }
         }
         event_trigger('on_project_object_quick_options', array(&$options, $this, $user));
         $this->quick_options[$user->getId()] = $options;
     }
     // if
     return $this->quick_options[$user->getId()];
 }