function can_change_tag(PaperInfo $prow, $tag, $previndex, $index, $forceShow = null) { global $Conf; if ($forceShow === ALWAYS_OVERRIDE) { return true; } $rights = $this->rights($prow, $forceShow); if (!($rights->allow_pc && ($rights->can_administer || $Conf->timePCViewPaper($prow, false)))) { if ($this->privChair && TagInfo::has_sitewide() && (!$tag || ($t = TagInfo::defined_tag($tag)) && $t->sitewide)) { return true; } return false; } if (!$tag) { return true; } $tag = TagInfo::base($tag); $twiddle = strpos($tag, "~"); if ($twiddle === 0 && $tag[1] === "~") { return $rights->can_administer; } if ($twiddle > 0 && substr($tag, 0, $twiddle) != $this->contactId && !$rights->can_administer) { return false; } if ($twiddle !== false) { $t = TagInfo::defined_tag(substr($tag, $twiddle + 1)); return !($t && $t->vote && $index < 0); } else { $t = TagInfo::defined_tag($tag); return !$t || ($rights->can_administer || $this->privChair && $t->sitewide || !$t->chair && !$t->rank) && !$t->vote && !$t->approval; } }