plugin=&$GLOBALS['plugin_commentcenter'];
		$smarty=&$this->smarty;
		# The default TPL
		$smarty->assign('admin_resource', 'plugin:commentcenter/policies');
		$smarty->assign('plugin_url', plugin_geturl('commentcenter'));
		$smarty->register_modifier('idToSubject', array(&$this, '_idToTitle'));
		add_filter('wp_title', array(&$this, '_title'), 15, 2);
		add_action('wp_head', array(&$this, '_head'), 10);
	}
	/**
	 * This function is the callback for the hook system.
	 * It sets the title.
	 *
	 * @param string $val: The current title
	 * @param string $sep: The separator
	 * @return string: The title
	 */
	function _title($val, $sep)  {
		return "{$val} {$sep} Comment Center";
	}
	/**
	 * This function is the callback for the hook system.
	 * It adds the javascript of the plugin.
	 */
	function _head()  {
		if(!function_exists('plugin_jquery_head')) {
			return;
		}
		$src1=plugin_geturl('commentcenter').'res/ajax.js';
		$src2=BLOG_BASEURL.'admin.php?jslang=commentcenter';
		echo '\n";
		echo '\n";
	}
	/**
	 * This function return the entry title from the id.
	 * It's made to be called from Smarty.
	 *
 	 * @param string $id: The entry id
	 * @return string: The output
	 */
	function _idToTitle($id) {
		$o=new FPDB_Query(array('start'=>0, 'count'=>1, 'fullparse'=>false, 'id'=>$id), null);
		if(!$o->hasMore()) {
			return false;
		}
		$arr=$o->getEntry();
		return wp_specialchars($arr[1]['subject']);
	}
	/**
	 * This function is an advanced redirect option.
	 *
	 * @param string $cmd: The command
	 * @param mixed $cmdval: The value for the command
	 * @param boolean $nosuccess: Don't save the success?
	 */
	function _redirect($cmd, $cmdval=1, $nosuccess=false) {
		global $panel;
		$smarty=&$this->smarty;
		sess_add("success_{$panel}", $smarty->get_template_vars('success'));
		$action_url=$smarty->get_template_vars('action_url');
		$url=admin_filter_command($action_url, $cmd, $cmdval);
		$url=html_entity_decode($url);
		$url=substr($url, strlen(BLOG_BASEURL));
		utils_redirect($url);
		die;
	}
	/**
	 * This is the main function of the panel.
	 */
	function main() {
		$smarty=&$this->smarty;
		$plugin=&$this->plugin;
		$plugin->loadPolicies();
		$smarty->assign('policies', $plugin->policies);
	}
	/**
	 * This is the callback for the configure command.
	 */
	function doconfigure() {
		global $lang;
		$plugin=&$this->plugin;
		$conf=$plugin->getConf();
		$smarty=&$this->smarty;
		$smarty->assign('admin_resource', 'plugin:commentcenter/configure');
		$smarty->assign('pl_conf', $conf);
		$conf=$plugin->getConf();
		if(isset($conf) && array_key_exists('akismet_check', $conf) && $conf['akismet_check']) {
			$akismet=$plugin->akismetLoad();
			if(is_numeric($akismet)) {
				$error=$lang['admin']['entry']['commentcenter']['akismet_errors'][$akismet];
				$smarty->assign('warnings', $error);
			}
		}
	}
	/**
	 * This callback is used when the configuration is saved.
	 */
	function onconfigure() {
		if(!empty($_POST['akismet_url'])) {
			$pos=strpos($_POST['akismet_url'], '//');
			if($pos===FALSE || $pos>8) {
				$_POST['akismet_url']='http://'.$_POST['akismet_url'];
			}
		}
		$save=array('log_all'=>isset($_POST['log_all']), 
			'email_alert'=>isset($_POST['email_alert']),
			'akismet_check'=>isset($_POST['akismet_check']),
			'akismet_key'=>$_POST['akismet_key'],
			'akismet_url'=>$_POST['akismet_url']);
		// It doesn't make very sense: I could just use array_merge but...
		foreach($save as $key=>$value) {
			plugin_addoption('commentcenter', $key, $value);
		}
		$success=plugin_saveoptions() ? 1 : -1;
		$this->smarty->assign('success', $success);
		$this->_redirect('configure');
	}
	/**
	 * The edit policy/new policy action callback.
	 *
	 * @param integer $id: The policy id. -1 means a new one
	 * @return integer: The redirect option
	 */
	function dopoledit($id) {
		global $lang;
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		$plang=&$lang['admin']['entry']['commentcenter'];
		$plugin->loadPolicies();
		$smarty->assign('policy', array());
		$smarty->assign('admin_resource', 'plugin:commentcenter/editpol');
		$smarty->assign('pol_id', $id);
		if($id!=-1 && isset($plugin->policies[$id])) {
			$smarty->assign('policy', $plugin->policies[$id]);
		} elseif($id!=-1) {
			# Inexistent policy
			$smarty->assign('errors', $plang['errors']['pol_nonex']);
		} else {
			$smarty->assign('polnew', true);
		}
		return 0;
	}
	/**
	 * The edit policy/new policy save callback.
	 *
	 * @return integer: The redirect option
	 */
	function onedit_policy() {
		$plugin=&$this->plugin;
		$success=2;
		$policy=array();
		@$id=$_POST['policy_id'];
		$plugin->loadPolicies();
		if($id!=-1 && !isset($plugin->policies[$id])) {
			$success=-2;
		}
		while(true && $success==2) {
			if(empty($_POST['apply_to'])) {
				$success=-2;
				break;
			}
			if(!isset($_POST['behavoir'])) {
				$success=-2;
				break;
			}
			$behavoir=$_POST['behavoir'];
			if($behavoir!=1 && $behavoir!=0 && $behavoir!=-1) {
				$success=-2;
				break;
			}
			$policy['do']=$behavoir;
			switch($_POST['apply_to']) {
				case 'all_entries':
					$policy['is_all']=true;
					break 2;
				case 'some_entries':
					if(empty($_POST['entries'])) {
						$success=-2;
					} else {
						$entries=array();
						foreach($_POST['entries'] as $entry) {
							if(entry_exists($entry)) {
								$entries[]=$entry;
							}
						}
						if(count($entries)==0) {
							$success=-2;
						} else {
							$entries=array_unique($entries);
							$policy['entry']=$entries;
						}
					}
					break 2;
				case 'properties':
					$policy['is_all']=true;
					if(isset($_POST['cats'])) {
						$policy['categories']=array_keys($_POST['cats']);
						$policy['is_all']=false;
					}
					if(is_numeric($_POST['older'])) {
						# Save in seconds
						$policy['older']=$_POST['older']*86400;
						$policy['is_all']=false;
					}
					if(isset($policy['is_all']) && @!$policy['is_all']) {
						unset($policy['is_all']);
					}
					break 2;
				default:
					$success=-2;
					break 2;
			}
			break;
		}
		if($success==2) {
			if($id==-1) {
				$plugin->policies[]=$policy;
			} else {
				$plugin->policies[$id]=$policy;
			}
			$success=$plugin->savePolicies() ? 2 : -2;
		}
		$this->smarty->assign('success', $success);
		return 2;
	}
	/**
	 * This function is the callback for the poldelete action.
	 *
	 * @param integer $id: The id of policy you wish to delete
	 * @return integer: Redirect option
	 */
	function dopoldelete($id) {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
		$plugin->loadPolicies();
		if(isset($plugin->policies[$id])) {
			$smarty->assign('policies', array($id=>$plugin->policies[$id]));
		}
		$smarty->assign('single', true);
		return 0;
	}
	/**
	 * This function is like dopoldelete but it's for multiple policies.
	 *
	 * @return integer: Redirect option
	 */
	function onmultidel() {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		if(@!count($_POST['select'])) {
			$smarty->assign('success', -4);
			return 2;
		}
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
		$plugin->loadPolicies();
		$policies=array();
		foreach($_POST['select'] as $polid=>$checkvalue) {
			if(isset($plugin->policies[$polid])) {
				$policies[$polid]=$plugin->policies[$polid];
			}
		}
		if(count($policies)>0) {
			$smarty->assign('policies', $policies);
		} else {
			$smarty->assign('success', -4);
			return 2;
		}
		if(count($policies)==1) {
			$smarty->assign('single', true);
		}
		return 0;
	}
	/**
	 * This is the delete ok command.
	 *
	 * @return integer: The redirect option
	 */
	function ondelok() {
		if(empty($_POST['del_policy'])) {
			$s=-4;
		} else {
			$plugin=$this->plugin;
			$plugin->loadPolicies();
			foreach($_POST['del_policy'] as $polid) {
				if(isset($plugin->policies[$polid])) {
					unset($plugin->policies[$polid]);
				}
			}
			$s=$plugin->savePolicies() ? 4 : -4;
		}
		$this->smarty->assign('success', $s);
		return 2;
	}
	/**
	 * This is the cancel callback. It just makes the redirect.
	 *
	 * @return integer: The redirect option
	 */
	function oncancel() {
		return 2;
	}
	/**
	 * This function is the callback for the polup action.
	 *
	 * @param integer $id: The id of policy you wish to delete
	 * @return integer: Redirect option
	 */
	function dopolup($id) {
		$s=-3;
		if($id>0) {
			$plugin=&$this->plugin;
			$plugin->loadPolicies();
			$plugin->policyMove($id, $id-1);
			$s=$plugin->savePolicies() ? 3 : -3;
		}
		$this->smarty->assign('success', $s);
		return 2;
	}
	/**
	 * This function is the callback for the poldown action.
	 *
	 * @param integer $id: The id of policy you wish to delete
	 * @return integer: Redirect option
	 */
	function dopoldown($id) {
		$s=-3;
		$plugin=&$this->plugin;
		$plugin->loadPolicies();
		if($idpolicies)-1) {
			$plugin->policyMove($id, $id+1);
			$s=$plugin->savePolicies() ? 3 : -3;
		}
		$this->smarty->assign('success', $s);
		return 2;
	}
	/**
	 * This function is the callback for the approve_list command
	 *
	 * @return integer: The redirect option
	 */
	function doapprove_list() {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		$conf=$plugin->getConf();
		$smarty->assign('use_akismet', @$conf['akismet_check']);
		$smarty->assign('other', @$conf['log_all']);
		$smarty->assign('admin_resource', 'plugin:commentcenter/approvelist');
		$lister=new commentcenter_list($plugin->pl_dir);
		$smarty->assign('entries', $lister->toDetails());
		return 0;
	}
	/**
	 * This function is the callback for the publishcomm command
	 *
	 * @param string $id: The comment id
	 * @param boolean $noredirect: If true, don't redirect
	 * @param boolean $noham: If it was blocked from Akismet, don't submit as ham
	 * @return integer: The redirect option
	 */
	function dopublishcomm($id, $noredirect=false, $noham=false) {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		$f=$plugin->pl_dir.$id.'.txt';
		if(!file_exists($f)) {
			$smarty->assign('success', -5);
			$succ=-5;
		} else {
			include $f;
			$entry=substr($id, 1, 18);
			$ham=false;
			if(isset($comment['log_reason'])) {
				$ham=$comment['log_reason']=='akismet' && !$noham;
				unset($comment['log_reason']);
			}
			if(isset($comment['id'])) {
				unset($comment['id']);
			}
			if($ham) {
				$clean=$plugin->akismetClean($comment, $entry);
				$akismet=&$plugin->akismetLoad();
				if(is_object($akismet)) {
					$akismet->setComment($clean);
					$akismet->submitHam();
				}
			}
			$id=comment_save($entry, $comment);
			do_action('comment_post', $entry, array($id, $comment));
			$succ=$id ? 5 : -5;
			$smarty->assign('success', $succ);
			if($succ==5) {
				@unlink($f);
			}
		}
		if($noredirect) {
			return $succ==5;
		}
		$this->_redirect('approve_list');
		return 0;
	}
	/**
	 * This is the callback for the action pubnoham.
	 *
	 * @param string $id: The comment id
	 * @return integer: The redirect option.
	 */
	function dopubnoham($id) {
		return $this->dopublishcomm($id, false, true);
	}
	/**
	 * This is the callback to publish multiple comments.
	 *
	 * @return integer: The redirect option
	 */
	function onmpubcomm() {
		if(!isset($_POST['select'])) {
			$this->dopublishcomm('fake');
		}
		$target=count($_POST['select']);
		$noham=!isset($_POST['submitham']);
		$i=0;
		foreach((array)$_POST['select'] as $comm=>$check) {
			$i++;
			$this->dopublishcomm($comm, $i!=$target, $noham);
		}
		// If it's correct, we should exited the script before
		$this->smarty->assign('success', -5);
		$this->_redirect('approve_list');
		return 0;
	}
	/**
	 * This function is the callback for the deletecomm action.
	 *
	 * @param integer $id: The id of the comment you wish to delete
	 * @return integer: Redirect option
	 */
	function dodeletecomm($id) {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
		$entry=substr($id, 1, 18);
		$commid=substr($id, 21, 20);
		$f=$plugin->pl_dir.$id.'.txt';
		if(file_exists($f)) {
			include $f;
			$delete[$entry]['del'][$commid]=$comment;
			$smarty->assign('entries', $delete);
		} else {
			$smarty->assign('success', -6);
			$this->_redirect('approve_list');
		}
		$smarty->assign('single', true);
		return 0;
	}
	/**
	 * This function is like dopoldelete but it's for multiple policies.
	 *
	 * @return integer: Redirect option
	 */
	function onmdelcomm() {
		$plugin=&$this->plugin;
		$smarty=&$this->smarty;
		if(@!count($_POST['select'])) {
			$smarty->assign('success', -6);
			$this->_redirect('approve_list');
			return 0;
		}
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
		$remove=array();
		foreach($_POST['select'] as $commbig=>$check) {
			$entry=substr($commbig, 1, 18);
			$commid=substr($commbig, 21, 20);
			$f=$plugin->pl_dir.$commbig.'.txt';
			if(file_exists($f)) {
				include $f;
				$remove[$entry]['del'][$commid]=$comment;
			}
		}
		if(count($remove)>0) {
			$smarty->assign('entries', $remove);
		} else {
			$smarty->assign('success', -6);
			$this->_redirect('approve_list');
			return 0;
		}
		if(count($remove)==1) {
			$smarty->assign('single', true);
		}
		return 0;
	}
	/**
	 * This is the delete ok command.
	 *
	 * @return integer: The redirect option
	 */
	function oncommdelok() {
		if(empty($_POST['select'])) {
			$s=-6;
		} else {
			foreach($_POST['select'] as $commid=>$check) {
				$f=$this->plugin->pl_dir.$commid.'.txt';
				@unlink($f);
			}
			$s=6;
		}
		$this->smarty->assign('success', $s);
		$this->_redirect('approve_list');
		return 2;
	}
	/**
	 * This is the cancel callback. It just makes the redirect.
	 *
	 * @return integer: The redirect option
	 */
	function onccancel() {
		$this->_redirect('approve_list');
		return 2;
	}
	/**
	 * This function is the callback for the action "manage".
	 *
	 * @param string $entry: The entry id
	 * @return integer: The redirect option
	 */
	function domanage($entry) {
		global $lang, $fpdb;
		$smarty=&$this->smarty;
		$smarty->assign('admin_resource', 'plugin:commentcenter/manage');
		$smarty->assign('is_managing', true);
		$conf=$this->plugin->getConf();
		if(@$conf['akismet_check']) {
			$smarty->assign('use_akismet', true);
		}
		if($entry!='search' && !entry_exists($entry)) {
			$smarty->assign('error', $lang['admin']['entry']['commentcenter']['errors']['entry_nf']);
		} elseif($entry!='search') {
			$smarty->assign('entry_id', $entry);
			$smarty->assign('fetch', 'list');
			$fpdb->query("id:{$entry},fullparse:true,comments:true");
			$q=&$fpdb->getQuery();
			$q->getEntry();
			$list=array();
			while($q->comments->hasMore()) {
				list($id, $comment)=$q->comments->getComment();
				$list[$entry]['list'][$id]=$comment;
			}
			$smarty->assign('entries', $list);
		}
		return 0;
	}
	/**
	 * Since it's impossible to use a GET form in Flatpress, to search entries
	 * we have to use a POST form, and here's its callback.
	 *
	 * @return integer: The redirect option
	 */
	function onentry_search() {
		if(!isset($_POST['entry'])) {
			$_POST['entry']='';
		}
		// In the function we call 'search' isn't an error, but here yes, so delete it
		if($_POST['entry']=='search') {
			$_POST['entry']='';
		}
		return @$this->domanage($_POST['entry']);
	}
	/**
	 * This function is the callback for the deletecomm2 action.
	 *
	 * @param integer $id: The id of the comment you wish to delete
	 * @return integer: Redirect option
	 */
	function dodeletecomm2($id) {
		$smarty=&$this->smarty;
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
		$smarty->assign('is_managing', true);
		$entry=substr($id, 1, 18);
		$commid=substr($id, 21, 20);
		$smarty->assign('entry', $entry);
		if(comment_exists($entry, $commid)) {
			$delete[$entry]['del'][$commid]=comment_parse($entry, $commid);
			$smarty->assign('entries', $delete);
		} else {
			$smarty->assign('success', -6);
			$this->_redirect('manage', $entry);
		}
		$smarty->assign('single', true);
		return 0;
	}
	/**
	 * This function is like dopoldelete but it's for multiple policies.
	 *
	 * @return integer: Redirect option
	 */
	function onmdelcomm_2() {
		$smarty=&$this->smarty;
		if(@!count($_POST['select'])) {
			$smarty->assign('success', -6);
			$this->_redirect('manage', @$_POST['entry_hid']);
			return 0;
		}
		$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
		$smarty->assign('is_managing', true);
		$smarty->assign('entry', @$_POST['entry_hid']);
		$remove=array();
		foreach($_POST['select'] as $commbig=>$check) {
			$entry=substr($commbig, 1, 18);
			$commid=substr($commbig, 21, 20);
			$comment=comment_parse($entry, $commid);
			if($comment!==false) {
				$remove[$entry]['del'][$commid]=$comment;
			}
		}
		if(count($remove)>0) {
			$smarty->assign('entries', $remove);
		} else {
			$smarty->assign('success', -6);
			$this->_redirect('manage', @$_POST['entry_hid']);
			return 0;
		}
		if(count($remove)==1) {
			$smarty->assign('single', true);
		}
		return 0;
	}
	/**
	 * This is the delete ok command.
	 *
	 * @return integer: The redirect option
	 */
	function oncommdelok_2() {
		if(empty($_POST['select'])) {
			$s=-6;
		} else {
			$i=0;
			foreach($_POST['select'] as $commid=>$check) {
				$entry=substr($commid, 1, 18);
				$commid=substr($commid, 21, 20);
				$i+=comment_delete($entry, $commid) ? 1 : 0;
			}
			$s=$i>0 ? 6 : -6;
		}
		$this->smarty->assign('success', $s);
		$this->_redirect('manage', @$_POST['entry']);
		return 2;
	}
	/**
	 * This is the cancel callback. It just makes the redirect.
	 *
	 * @return integer: The redirect option
	 */
	function onccancel_2() {
		$this->_redirect('manage', @$_POST['entry']);
		return 2;
	}
	/**
 	 * This function is the callback for the action commspam.
 	 *
 	 * @param string $id: The comment id
 	 * @return integer: The redirect option
 	 */
	function docommspam($id) {
		$smarty=&$this->smarty;
		$plugin=&$this->plugin;
		$entry=substr($id, 1, 18);
		$commid=substr($id, 21, 20);
		if(!comment_exists($entry, $commid)) {
			$smarty->assign('success', -7);
		} else {
			$comment=comment_parse($entry, $commid);
			$clean=$plugin->akismetClean($comment, $entry);
			$akismet=&$plugin->akismetLoad();
			if(is_object($akismet)) {
				$akismet->setComment($clean);
				$akismet->submitSpam();
				$smarty->assign('success', $akismet->errorsExist() ? -7 : 7);
			} else {
				$smarty->assign('success', -7);
			}
		}
		$this->_redirect('manage', $entry);
		return 0;
	}
}
admin_addpanelaction('entry', 'commentcenter', true);