plugins:customurl:customurl_code

NP_CustomURL.phpのソースコード

<?php
 
if (!function_exists('sql_table')) {
	function sql_table($name)
	{
		return 'nucleus_' . $name;
	}
}
 
if (!function_exists('htmlspecialchars_decode')) {
	function htmlspecialchars_decode($text)
	{
		return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
	}
}
 
if (!defined('_CUSTOMURL_TABLE_DEFINED')) {
	define('_CUSTOMURL_TABLE_DEFINED',	1);
	define('_CUSTOMURL_TABLE',	sql_table('plug_customurl'));
	define('_C_SUBCAT_TABLE',	sql_table('plug_multiple_categories_sub'));
}
 
class NP_CustomURL extends NucleusPlugin
 {
 
	function getMinNucleusVersion()
	{
		return '322';
	}
 
	function getName()
	{
		return 'Customized URL';
	}
 
	function getAuthor()
	{
		return 'shizuki';
	}
 
	function getURL()
	{
		return 'http://shizuki.kinezumi.net/NucleusCMS/Plugins/NP_CustomURL/NP_CustomURL.html';
	}
 
	function getVersion()
	{
		return '0.3.2c';
	}
 
	function getDescription()
	{
		return _DESCRIPTION;
	}
 
	function supportsFeature($what)
	{
		switch($what) {
			case 'SqlTablePrefix':
				return 1;
			case 'HelpPage':
				return 1;
			default:
				return 0;
		}
	}
 
	function hasAdminArea()
	{
		return 1;
	}
 
	function event_QuickMenu(&$data)
	{
		global $member;
		$quickLink   = ($this->getOption( 'customurl_quicklink') == 'yes');
		$memberCheck = ($member->isLoggedIn() && $member->isAdmin());
		if (!$quickLink || !$memberCheck) {
			return;
		}
		array_push(
			$data['options'],
			array(
				'title'		=> _ADMIN_TITLE,
				'url'		=> $this->getAdminURL(),
				'tooltip'	=> _QUICK_TIPS
			)
		);
	}
 
	function getTableList()
	{
		return	array(
			_CUSTOMURL_TABLE
		);
	}
 
	function getEventList()
	{
		return	array(
			'QuickMenu',
//			'AdminPrePageHead',
			'ParseURL',
			'GenerateURL',
			'PostAddBlog',
			'PostAddItem',
			'PostUpdateItem',
			'PostRegister',
			'PostAddCategory',
			'PostDeleteBlog',
			'PostDeleteItem',
			'PostDeleteMember',
			'PostDeleteCategory',
			'PrePluginOptionsUpdate',
			'PreItem',
			'PostItem',
			'PreSkinParse',
			'AddItemFormExtras',
			'EditItemFormExtras',
			'PostMoveCategory',
			'PostMoveItem',
//			'PreSendContentType',
			'InitSkinParse',
		);
	}
 
//	function event_AdminPrePageHead($data)
//	{
//		if ($data['action'] == 'pluginhelp' && intGetVar('plugid') == $this->getID()) {
//			$data['extrahead'] = '<link rel="stylesheet" title="NP_CustomURL HELP"'
//								. ' type="text/css"'
//								. "\n"
//								. "\t\t\t"
//								. ' href="' . $this->getAdminURL()
//								. 'helpstyle.css" />' . "\n";
//		}
//	}
 
	function install()
	{
		global $manager, $CONF;
// Keys initialize
		if (empty($CONF['ArchiveKey'])) {
			$CONF['ArchiveKey'] = 'archive';
		}
		if (empty($CONF['ArchivesKey'])) {
			$CONF['ArchivesKey'] = 'archives';
		}
		if (empty($CONF['MemberKey'])) {
			$CONF['MemberKey'] = 'member';
		}
		if (empty($CONF['ItemKey'])) {
			$CONF['ItemKey'] = 'item';
		}
		if (empty($CONF['CategoryKey'])) {
			$CONF['CategoryKey'] = 'category';
		}
 
//Plugins sort
		$myid = intval($this->getID());
		$res = sql_query('SELECT pid, porder FROM '.sql_table('plugin'));
		while($p = mysql_fetch_array($res)) {
			$updateQuery = 'UPDATE %s SET porder = %d WHERE pid = %d';
			if (intval($p['pid']) == $myid) {
				sql_query(sprintf($updateQuery, sql_table('plugin'), 1, $myid));
			} else {
				sql_query(sprintf($updateQuery, sql_table('plugin'), $p['porder']+1, $p['pid']));
			}
		}
 
//create plugin's options and set default value
		$this->createOption('customurl_archive',	_OP_ARCHIVE_DIR_NAME,
							'text',		$CONF['ArchiveKey']);
		$this->createOption('customurl_archives',	_OP_ARCHIVES_DIR_NAME,
							'text',		$CONF['ArchivesKey']);
		$this->createOption('customurl_member',		_OP_MEMBER_DIR_NAME,
							'text',		$CONF['MemberKey']);
		$this->createOption('customurl_dfitem',		_OP_DEF_ITEM_KEY,
							'text',		$CONF['ItemKey']);
		$this->createOption('customurl_dfcat',		_OP_DEF_CAT_KEY,
							'text',		$CONF['CategoryKey']);
		$this->createOption('customurl_dfscat',		_OP_DEF_SCAT_KEY,
							'text',		'subcategory');
		$this->createOption('customurl_tabledel',	_OP_TABLE_DELETE,
							'yesno',	'no');
		$this->createOption('customurl_quicklink',	_OP_QUICK_LINK,
							'yesno',	'yes');
		$this->createOption('customurl_notfound',	_OP_NOT_FOUND,
							'select',	'404',
							'404 Not Found|404|303 See Other|303');
		$this->createBlogOption(	'use_customurl',	_OP_USE_CURL,
									'yesno',	'yes');
		$this->createBlogOption(	'redirect_normal',	_OP_RED_NORM,
									'yesno',	'yes');
		$this->createBlogOption(	'redirect_search',	_OP_RED_SEARCH,
									'yesno',	'yes');
		$this->createBlogOption(	'customurl_bname',	_OP_BLOG_PATH,
									'text');
//		$this->createItemOption(	'customurl_iname',	_OP_ITEM_PATH,
//									'text',		$CONF['ItemKey']);
		$this->createMemberOption(	'customurl_mname',	_OP_MEMBER_PATH,
									'text');
		$this->createCategoryOption('customurl_cname',	_OP_CATEGORY_PATH,
									'text');
 
		//default archive directory name
		$this->setOption('customurl_archive',	$CONF['ArchiveKey']);
		//default archives directory name
		$this->setOption('customurl_archives',	$CONF['ArchivesKey']);
		//default member directory name
		$this->setOption('customurl_member',	$CONF['MemberKey']);
		//default itemkey_template
		$this->setOption('customurl_dfitem',	$CONF['ItemKey']);
		//default categorykey_template
		$this->setOption('customurl_dfcat',		$CONF['CategoryKey']);
		//default subcategorykey_template
		$this->setOption('customurl_dfscat',	'subcategory');
 
//create data table
		$sql = 'CREATE TABLE IF NOT EXISTS ' . _CUSTOMURL_TABLE . ' ('
			 . ' `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, '
			 . ' `obj_param` VARCHAR(15) NOT NULL, '
			 . ' `obj_name` VARCHAR(128) NOT NULL, '
			 . ' `obj_id` INT(11) NOT NULL, '
			 . ' `obj_bid` INT(11) NOT NULL,'
			 . ' INDEX (`obj_name`)'
			 . ' )';
		sql_query($sql);
 
//setting default aliases
		$this->_createNewPath('blog',		'blog',		'bnumber',	'bshortname');
		$this->_createNewPath('item',		'item',		'inumber',	'iblog');
		$this->_createNewPath('category',	'category',	'catid',	'cblog');
		$this->_createNewPath('member',		'member',	'mnumber',	'mname');
 
		if ($this->pluginCheck('MultipleCategories')) {
			$this->_createNewPath('subcategory', 'plug_multiple_categories_sub', 'scatid', 'catid');
		}
 
	}
 
	function _createNewPath($type, $n_table, $id, $bids)
	{
		$tmpTable = sql_table('plug_customurl_temp');
		$createQuery = 'CREATE TABLE %s SELECT obj_id, obj_param FROM %s'
					 . ' WHERE obj_param = "%s"';
		sql_query(sprintf($createQuery, $tmpTable, _CUSTOMURL_TABLE, $type));
		$TmpQuery    = 'SELECT %s, %s FROM %s LEFT JOIN %s ON %s.%s = %s.obj_id'
					 . ' WHERE %s.obj_id is null';
		$table = sql_table($n_table);
		$temp = sql_query(sprintf($TmpQuery, $id, $bids, $table, $tmpTable, $table, $id, $tmpTable, $tmpTable));
		if ($temp) {
			while ($row=mysql_fetch_array($temp)) {
				switch ($type) {
					case 'blog':
						//set access by BlogshortName/
						$newPath = $row[$bids];
						$blgid = 0;
					break;
					case 'item':
						//set access by (itemkey_template)_itemid.html
						$tque = 'SELECT itime as result FROM %s WHERE inumber = %d';
						$itime = quickQuery( sprintf($tque ,sql_table('item'), intval($row[$id]) ) );
						$y = $m = $d = '';
						sscanf($itime,'%d-%d-%d %s',$y,$m,$d,$temp);
						$ikey = TEMPLATE::fill($this->getOption('customurl_dfitem'),
												array ('year' => $y,
														'month' => $m,
														'day' => $d)
											  );
						$newPath = $ikey . '_' . $row[$id] . '.html';
						$blgid = $row[$bids];
					break;
					case 'category':
						//set access by (categorykey_template)_categoryid/
						$newPath = $this->getOption('customurl_dfcat') . '_' . $row[$id];
						$blgid = $row[$bids];
					break;
					case 'member':
						//set access by loginName.html
						$newPath = $row[$bids] . '.html';
						$blgid = 0;
					break;
					case 'subcategory':
						//set access by (subcategorykey_template)_subcategoryid/
						$newPath = $this->getOption('customurl_dfscat') . '_' . $row[$id];
						$blgid = $row[$bids];
					break;
					default:
					break;
				}
				$insertQuery = 'INSERT INTO %s (obj_param, obj_id, obj_name, obj_bid)'
							 . ' VALUES ("%s", %d, "%s", %d)';
				$row[$id] = intval($row[$id]);
				$blgid    = intval($blgid);
				sql_query(sprintf($insertQuery, _CUSTOMURL_TABLE, $type, $row[$id], $newPath, $blgid));
			}
		}
		$query = 'SELECT obj_id, obj_name FROM %s WHERE obj_param = "%s"';
		$temp = sql_query(sprintf($query, _CUSTOMURL_TABLE, $type));
		while ($row = mysql_fetch_array($temp)) {
			$name = $row['obj_name'];
			$id   = intval($row['obj_id']);
			switch ($type) {
				case 'blog':
					$this->setBlogOption($id, 'customurl_bname', $name);
				break;
				case 'category':
					$this->setCategoryOption($id, 'customurl_cname', $name);
				break;
				case 'member':
					$obj_name = substr($name, 0, -5);
					$this->setMemberOption($id, 'customurl_mname', $obj_name);
				break;
				default:
				break;
			}
		}
 
		sql_query('DROP TABLE IF EXISTS ' . $tmpTable);
	}
 
	function init()
	{
		global $admin;
		$language = ereg_replace( '[\\|/]', '', getLanguageName());
		if (file_exists($this->getDirectory() . 'language/' . $language . '.php')) {
			include_once($this->getDirectory() . 'language/' . $language . '.php');
		} else {
			include_once($this->getDirectory() . 'language/english.php');
		}
	}
 
	function pluginCheck($pluginName)
	{
		global $manager;
		if (!$manager->pluginInstalled('NP_' . $pluginName)) {
			return;
		}
		$plugin =& $manager->getPlugin('NP_' . $pluginName);
		return $plugin;
	}
 
	function unInstall()
	{
		if ($this->getOption('customurl_tabledel') == 'yes') {
			sql_query("DROP TABLE "._CUSTOMURL_TABLE);
		}
		$this->deleteOption('customurl_archive');
		$this->deleteOption('customurl_archives');
		$this->deleteOption('customurl_member');
		$this->deleteOption('customurl_dfitem');
		$this->deleteOption('customurl_dfcat');
		$this->deleteOption('customurl_dfscat');
		$this->deleteOption('customurl_notfound');
		$this->deleteOption('customurl_tabledel');
		$this->deleteOption('customurl_quicklink');
		$this->deleteBlogOption('use_customurl');
		$this->deleteBlogOption('redirect_normal');
		$this->deleteBlogOption('redirect_search');
		$this->deleteBlogOption('customurl_bname');
//		$this->deleteItemOption('customurl_iname');
		$this->deleteMemberOption('customurl_mname');
		$this->deleteCategoryOption('customurl_cname');
	}
 
	function event_ParseURL($data)
	{
		global $CONF, $manager, $curl_blogid, $blogid, $itemid, $catid;
		global $memberid, $archivelist, $archive, $query;
// initialize
		$info     =  $data['info'];
		$complete =& $data['complete'];
		if ($complete) return;
		$useCustomURL = $this->getAllBlogOptions('use_customurl');
 
// Use NP_MultipleCategories ?
		$mcategories = $this->pluginCheck('MultipleCategories');
		if ($mcategories) {
			if (method_exists($mcategories, "getRequestName")) {
				$mcategories->event_PreSkinParse(array());
				global $subcatid;
				$subrequest = $mcategories->getRequestName();
			}
		}
		if (!$subrequest) {
			$subrequest = 'subcatid';
		}
 
// initialize and sanitize '$blogid'
		if (!$blogid) {
			if ( getVar('blogid') ) {
				if ( is_numeric(getVar('blogid')) ) {
					$blogid = intval(getVar('blogid'));
				} else {
					$blogid = intval(getBlogIDFromName(getVar('blogid')));
				}
			} elseif ($curl_blogid) {
				$blogid = intval($curl_blogid);
			} else {
				$blogid = $CONF['DefaultBlog'];
			}
		} else {
			if (is_numeric($blogid)) {
				$blogid = intval($blogid);
			} else {
				$blogid = intval(getBlogIDFromName($blogid));
			}
		}
 
		if (!$info) {
			if (serverVar('PATH_INFO')) {
				$info = serverVar('PATH_INFO');
			} elseif (getNucleusVersion() < 330) {
				if (getVar('virtualpath')) {
					$info = getVar('virtualpath');
				}
			} else {
				return;
			}
		}
 
// Sanitize 'PATH_INFO'
		$info = trim($info, '/');
		$v_path = explode("/", $info);
		foreach($v_path as $key => $value) {
			$value = urlencode($value);
			$value = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', $value);
			$v_path[$key] = $value;
		}
		if (phpversion() >= '4.1.0') {
			$_SERVER['PATH_INFO'] = implode('/', $v_path);
		}
		global $HTTP_SERVER_VARS;
		$HTTP_SERVER_VARS['PATH_INFO'] = implode('/', $v_path);
 
// Admin area check
		$tmpURL = sprintf("%s%s%s", "http://", serverVar("HTTP_HOST"), serverVar("SCRIPT_NAME"));
		$uri = str_replace('/', '\/', $tmpURL);
		$plug_url = str_replace('/', '\/', $CONF['PluginURL']);
		$u_plugAction = (getVar('action') == 'plugin' && getVar('name'));
		if (strpos($uri, $plug_url) === 0 || $u_plugAction) {
			$UsingPlugAdmin = TRUE;
		}
 
// redirect to other URL style
		$useCustomURLyes = ($useCustomURL[$blogid] == 'yes');
		if ($useCustomURLyes && !$UsingPlugAdmin && !$CONF['UsingAdminArea']) {
// Search query redirection
// 301 permanent ? or 302 temporary ?
			$queryURL = (strpos(serverVar('REQUEST_URI'), 'query=') !== FALSE);
			$search_q = (getVar('query') || $queryURL);
			$redirectSerch = ($this->getBlogOption($blogid, 'redirect_search') == 'yes');
			if ($redirectSerch) {
				if ($search_q) {
					$que_str = getVar('query');
					$que_str = htmlspecialchars($que_str);
					$que_str = mb_eregi_replace('/', 'ssslllaaassshhh', $que_str);
					$que_str = mb_eregi_replace("'", 'qqquuuooottt', $que_str);
					$que_str = mb_eregi_replace('&', 'aaammmppp', $que_str);
					$que_str = urlencode($que_str);
					$search_path = '/search/' . $que_str;
					$b_url = createBlogidLink($blogid);
					$redurl = sprintf("%s%s", $b_url, $search_path);
					redirect($redurl); // 302 Moved temporary
					exit;
				}
			}
			if (!$redirectSerch && $search_q) {
				$exLink = TRUE;
			}
 
// redirection nomal URL to FancyURL
			$temp_req = explode('?', serverVar('REQUEST_URI'));
			$reqPath  = trim(end($temp_req), '/');
			$indexrdf = ($reqPath == 'xml-rss1.php');
			$atomfeed = ($reqPath == 'atom.php');
			$rss2feed = ($reqPath == 'xml-rss2.php');
			$feeds    = ($indexrdf || $atomfeed || $rss2feed);
			$redirectNormal = ($this->getBlogOption($blogid, 'redirect_normal') == 'yes');
			if ($redirectNormal && serverVar('QUERY_STRING') && !$feeds && !$exLink) {
				$temp = explode('&', serverVar('QUERY_STRING'));
				foreach ($temp as $k => $val) {
					if (preg_match('/^virtualpath/', $val)) {
						unset($temp[$k]);
					}
				}
				if (!empty($temp)) {
					$p_arr = array();
					foreach ($temp as $key => $value) {
						$p_key = explode('=', $value);
						switch (reset($p_key)) {
							case 'blogid';
								$p_arr[] = $CONF['BlogKey'] . '/'
										 . intGetVar('blogid');
								unset($temp[$key]);
								break;
							case 'catid';
								$p_arr[] = $CONF['CategoryKey'] . '/'
										 . intGetVar('catid');
								unset($temp[$key]);
								break;
							case $subrequest;
								$p_arr[] = $subrequest . '/'
										 . intGetVar($subrequest);
								unset($temp[$key]);
								break;
							case 'itemid';
								$p_arr[] = $CONF['ItemKey'] . '/'
										 . intGetVar('itemid');
								unset($temp[$key]);
								break;
							case 'memberid';
								$p_arr[] = $CONF['MemberKey'] . '/'
										 . intGetVar('memberid');
								unset($temp[$key]);
								break;
							case 'archivelist';
								$p_arr[] = $CONF['ArchivesKey'] . '/'
										 . $blogid;
								unset($temp[$key]);
								break;
							case 'archive';
								$p_arr[] = $CONF['ArchiveKey'] . '/'
										 . $blogid . '/' . getVar('archive');
								unset($temp[$key]);
								break;
							default:
								break;
						}
					}
					if (reset($p_arr)) {
						$b_url = createBlogidLink($blogid);
						$red_path = '/' . implode('/', $p_arr);
						if (substr($b_url, -1) == '/') {
							$b_url = rtrim($b_url, '/');
						}
						$redurl = sprintf("%s%s", $b_url, $red_path);
						// HTTP status 301 "Moved Permanentry"
						header( "HTTP/1.1 301 Moved Permanently" );
						header('Location: ' . $redurl);
						exit;
					}
				}
			} elseif ($redirectNormal && $feeds) {
				$b_url = rtrim(createBlogidLink($blogid), '/');
				switch ($reqPath) {
					case 'xml-rss1.php':
						$feed_code = '/index.rdf';
						break;
					case 'xml-rss2.php':
						$feed_code = '/rss2.xml';
						break;
					case 'atom.php':
						$feed_code = '/atom.xml';
						break;
					default:
						break;
				}
				// HTTP status 301 "Moved Permanentry"
				header('HTTP/1.1 301 Moved Permanently');
				header('Location: ' . $b_url . $feed_code);
				exit;
			}
		}
// decode path_info
 
// decode unofficial Page switch '/page_2.html'
		foreach($v_path as $pathName) {
			if (preg_match('/^page_/', $pathName)) {
				$temp_info = explode('page_', $pathName);
				$_GET['page'] = intval($temp_info[1]);
				$page = array_pop($v_path);
			}
		}
 
// decode TrackBack URL shorten ver.
		$tail = end($v_path);
		if (substr($tail, -10, 10) == '.trackback') {
			$v_pathName = substr($tail, 0, -10);
//			echo $v_pathName;
			if (is_numeric($v_pathName)) {
				$this->_trackback($blogid, $v_pathName);
			} else {
				$this->_trackback($blogid, $v_pathName . '.html');
			}
			return;
		}
 
// decode other type URL
		$bLink = $cLink = $iLink = $exLink = FALSE;
		if (empty($info)) {
			$bLink = TRUE;
		}
		$linkObj = array (
			'bid' => 0,
			'name' => reset($v_path),
			'linkparam' => 'blog'
		);
		$blog_id = $this->getRequestPathInfo($linkObj);
		if ($blog_id) {
			$blogid = $blog_id;
			$trush = array_shift($v_path);
			$bLink = TURE;
		}
		if ($useCustomURL[$blogid] == 'no') {
			return;
		}
		$i = 1;
		foreach($v_path as $pathName) {
			switch ($pathName) {
// decode FancyURLs and redirection to Customized URL
				// for blogsgetAllBlogOptions($name)
				case $CONF['BlogKey']:
					if (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						if ($useCustomURL[intval($v_path[$i])] != 'yes') {
							$blogid = intval($v_path[$i]);
							$bLink = TRUE;
						} else {
							$redURI = createBlogidLink(intval($v_path[$i]));
						}
					}
				break;
				// for items
				case $CONF['ItemKey']:
					if (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						if ($useCustomURL[$blogid] != 'yes') {
							$itemid = intval($v_path[$i]);
							$iLink = TRUE;
						} else {
							$redURI = createItemLink(intval($v_path[$i]));
						}
					}
				break;
				// for categories
				case $CONF['CategoryKey']:
				case 'catid':
					if (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						if ($useCustomURL[$blogid] != 'yes') {
							$catid = intval($v_path[$i]);
							$cLink = TRUE;
						} else {
							$redURI = createCategoryLink(intval($v_path[$i]));
						}
					}
				break;
				// for subcategories
				case $subrequest:
					$c = $i - 2;
					$subCat = (isset($v_path[$i]) && is_numeric($v_path[$i]));
					if ($mcategories && $subCat && $i >= 3 && is_numeric($v_path[$c])) {
						if ($useCustomURL[$blogid] != 'yes') {
							$subcatid = intval($v_path[$i]);
							$catid    = intval($v_path[$c]);
							$cLink    = TRUE;
						} else {
							$subcat_id = intval($v_path[$i]);
							$catid     = intval($v_path[$c]);
							$linkParam = array($subrequest => $subcat_id);
							$redURI   = createCategoryLink($catid, $linkParam);
						}
					}
				break;
				// for archives
				case $CONF['ArchivesKey']:
				case $this->getOption('customurl_archives'):
				// FancyURL
					if (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						if ($useCustomURL[intval($v_path[$i])] != 'yes') {
							$archivelist = intval($v_path[$i]);
							$blogid = $archivelist;
							$exLink = TRUE;
						} else {
							$redURI = createArchiveListLink(intval($v_path[$i]));
						}
				// Customized URL
					} elseif (isset($v_path[$i])) {
						$archivelist = $blogid;
						$redURI = createArchiveListLink($archivelist);
					} else {
						$archivelist = $blogid;
						$exLink = TRUE;
					}
				break;
				// for archive
				case $CONF['ArchiveKey']:
				case $this->getOption('customurl_archive'):
					$y = $m = $d = '';
					$ar = $i + 1;
					if (isset($v_path[$i])) {
						$darc  = (ereg('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', $v_path[$i]));
						$marc  = (ereg('([0-9]{4})-([0-9]{1,2})', $v_path[$i]));
						$yarc  = (ereg('([0-9]{4})', $v_path[$i]));
						$adarc = (ereg('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})', $v_path[$ar]));
						$amarc = (ereg('([0-9]{4})-([0-9]{1,2})', $v_path[$ar]));
						$ayarc = (ereg('([0-9]{4})', $v_path[$ar]));
						$arc   = (!$darc && !$marc && !$yarc);
						$aarc  = ($adarc || $amarc || $ayarc);
						$carc  = ($darc || $marc || $yarc);
				// FancyURL
//						if (is_numeric($v_path[$i]) && !$darc && !$marc && !$yarc && isset($v_path[$ar]) && ($adarc || $amarc || $ayarc)) {
						if (is_numeric($v_path[$i]) && $arc && isset($v_path[$ar]) && $aarc) {
								sscanf($v_path[$ar], '%d-%d-%d', $y, $m, $d);
							if (!empty($d)) {
								$archive = sprintf('%04d-%02d-%02d', $y, $m, $d);
							} elseif (!empty($m)) {
								$archive = sprintf('%04d-%02d', $y, $m);
							} else {
								$archive = sprintf('%04d', $y);
							}
							if ($useCustomURL[intval($v_path[$i])] != 'yes') {
								$blogid = intval($v_path[$i]);
								$exLink = TRUE;
							} else {
								$blogid = intval($v_path[$i]);
								$redURI = createArchiveLink($blogid, $archive);
							}
				// Customized URL
//						} elseif ($darc || $marc || $yarc) {
						} elseif ($carc) {
							sscanf($v_path[$i], '%d-%d-%d', $y, $m, $d);
							if (isset($d)) {
								$archive = sprintf('%04d-%02d-%02d', $y, $m, $d);
							} elseif (!empty($m)) {
								$archive = sprintf('%04d-%02d', $y, $m);
							} else {
								$archive = sprintf('%04d', $y);
							}
							$exLink = TRUE;
						} else {
							$redURI = createArchiveListLink($blogid);
						}
					} else {
						$redURI = createArchiveListLink($blogid);
					}
				break;
				// for member
				case $CONF['MemberKey']:
				case $this->getOption('customurl_member'):
				// Customized URL
					$customMemberURL = (substr($v_path[$i], -5, 5) == '.html');
					if (isset($v_path[$i]) && $customMemberURL) {
						$memberInfo = array('linkparam' => 'member',
											'bid' => 0,
											'name' => $v_path[$i]);
						$member_id = $this->getRequestPathInfo($memberInfo);
						$memberid = intval($member_id);
						$exLink = TRUE;
				// FancyURL
					} elseif (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						if ($useCustomURL[$blogid] != 'yes') {
							$memberid = intval($v_path[$i]);
							$exLink   = TRUE;
						} else {
							$redURI = createMemberLink(intval($v_path[$i]));
						}
					} else {
						$redURI = createBlogidLink($blogid);
					}
				break;
				// for tag
				case 'tag':
					if (isset($v_path[$i]) && is_string($v_path[$i])) {
						$_REQUEST['tag'] = $v_path[$i];
						$exLink = TRUE;
					}
				break;
				// for ExtraSkinJP
				case 'extra':
					$ExtraSkinJP = $this->pluginCheck('ExtraSkinJP');
					if ($ExtraSkinJP) {
						// under v3.2 needs this
						if ($CONF['DisableSite'] && !$member->isAdmin()) {
							header('Location: ' . $CONF['DisableSiteURL']);
							exit;
						}
						$extraParams = explode("/", serverVar('PATH_INFO'));
						array_shift ($extraParams);
 
					if (isset($extraParams[1]) && preg_match("/^([1-9]+[0-9]*)(\?.*)?$/", $extraParams[1], $matches)) {
						$extraParams[1] = $matches[1];
					}
 
						$ExtraSkinJP->extra_selector($extraParams);
						exit;
					}
				break;
				// for search query
				case 'search':
					$redirectSerch = ($this->getBlogOption($blogid, 'redirect_search') == 'yes');
					if ($redirectSerch) {
						$que_str = urldecode($v_path[$i]);
						$que_str = mb_eregi_replace('ssslllaaassshhh', '/', $que_str);
						$que_str = mb_eregi_replace('qqquuuooottt',    "'", $que_str);
						$que_str = mb_eregi_replace('aaammmppp',       '&', $que_str);
						$que_str = htmlspecialchars_decode($que_str);
						$_GET['query'] = $que_str;
						$query  = $que_str;
						$exLink = TRUE;
					}
				break;
				// for pageswitch
				case 'page':
					if (isset($v_path[$i]) && is_numeric($v_path[$i])) {
						$_GET['page'] = intval($v_path[$i]);
						$exLink = TRUE;
					}
				break;
				// for tDiarySkin
				case 'tdiarydate':
				case 'categorylist':
				case 'monthlimit':
					$tDiaryPlugin = $this->pluginCheck('tDiarySkin');
					if ($tDiaryPlugin && isset($v_path[$i])) {
//						sscanf($v_path[$i], '%d-%d', $m, $d);
//						$linkDate = sprintf('%02d-%02d', $m, $d);
//						$_GET['linkdate'] = $linkDate;
						$_GET[$pathName] = $v_path[$i];
						$exLink = TRUE;
					}
				break;
				// for trackback
				case 'trackback':
					if (isset($v_path[$i]) && is_string($v_path[$i])) {
						$this->_trackback($blogid, $v_path[$i]);
					}
					return;
				break;
 
// decode Customized URL
				default:
				// initialyze
					$linkObj = array ('bid' => $blogid,
									  'name' => $pathName
									 );
					$comp = FALSE;
					$isItem = (substr($pathName, -5) == '.html');
				// category ?
					if (!$comp && !$cLink && !$iLink && !$isItem) {
						$linkObj['linkparam'] = 'category';
						$cat_id = $this->getRequestPathInfo($linkObj);
						if (!empty($cat_id)) {
							$catid = intval($cat_id);
							$cLink = TURE;
							$comp  = TRUE;
						}
					}
				// subcategory ?
					if (!$comp && $cLink && !$iLink && $mcategories && !$isItem) {
						$linkObj['linkparam'] = 'subcategory';
						$linkObj['bid']       = $catid;
						$subcat_id = $this->getRequestPathInfo($linkObj);
						if (!empty($subcat_id)) {
							$_REQUEST[$subrequest] = intval($subcat_id);
							$subcatid = intval($subcat_id);
							$sc       = $i;
							$comp     = TRUE;
						}
					}
				// item ?
					if ($isItem) {
						$linkObj['linkparam'] = 'item';
						$item_id = $this->getRequestPathInfo($linkObj);
						if (!empty($item_id)) {
							$itemid = intval($item_id);
							$iLink  = TRUE;
						}
					}
				break;
			}
			if (preg_match('/^[0-9page]$/', $pathName)) {
				$exLink = $pathName;
			}
			$i++;
		}
 
// FancyURL redirect to Customized URL if use it
// HTTP status 301 "Moved Permanentry"
		if ($redURI) {
			header('HTTP/1.1 301 Moved Permanently');
			header('Location: ' . $redURI);
			exit;
		}
 
		$feedurl = array(
						'rss1.xml',
						'index.rdf',
						'rss2.xml',
						'atom.xml',
						);
		$siteMapPlugin = $this->pluginCheck('GoogleSitemap');
		if ($siteMapPlugin) {
			$pcSitemaps = $siteMapPlugin->getAllBlogOptions('PcSitemap');
			foreach ($pcSitemaps as $pCsitemap) {
				if ($pCsitemap) {
					$feedurl[] = $pCsitemap;
				}
			}
			$mobSitemaps = $siteMapPlugin->getAllBlogOptions('MobileSitemap');
			foreach ($mobSitemaps as $mobSitemap) {
				if ($mobSitemap) {
					$feedurl[] = $mobSitemap;
				}
			}
		}
		$feedurl = array_unique($feedurl);
		$request_path = end($v_path);
		$feeds = in_array($request_path, $feedurl, true);
 
// finish decode
		if (!$exLink && !$feeds) {
// URL Not Found
			if (substr(end($v_path), -5) == '.html' && !$iLink) {
				$notFound = TRUE;
				if (!empty($subcatid)) {
					$linkParam = array($subrequest => $subcatid);
					$uri = createCategoryLink($catid, $linkParam);
				} elseif (!empty($catid)) {
					$uri = createCategoryLink($catid);
				} else {
					$uri = createBlogidLink($blogid);
				}
			} elseif (count($v_path) > $sc && !empty($subcatid) && !$iLink) {
				$notFound = TRUE;
				$linkParam = array($subrequest => $subcatid);
				$uri = createCategoryLink($catid, $linkParam);
			} elseif (count($v_path) >= 2 && !$subcatid && !$iLink) {
				$notFound = TRUE;
				if (isset($catid)) {
					$uri = createCategoryLink($catid);
				} else {
					$uri = createBlogidLink($blogid);
				}
			} elseif (reset($v_path) && !$catid && !$subcatid && !$iLink) {
				$notFound = TRUE;
				$uri = createBlogidLink($blogid);
			} else {
// Found
// setting $CONF['Self'] for other plugins
				$uri = createBlogidLink($blogid);
				$CONF['Self'] = rtrim($uri, '/');
				$complete = TRUE;
				return ;
			}
		} else {
			$uri = createBlogidLink($blogid);
			$CONF['Self'] = rtrim($uri, '/');
			$complete = TRUE;
				return ;
		}
// Behavior Not Found
		if ($notFound) {
			if (substr($uri, -1) != '/') $uri .= '/';
			if ($this->getOption('customurl_notfound') == '404') {
				header('HTTP/1.1 404 Not Found');
				doError(_NO_SUCH_URI);
				exit;
			} else {
				header('HTTP/1.1 303 See Other');
				header('Location: ' . $uri);
				exit;
			}
		}
	}
 
// decode 'path name' to 'id'
	function getRequestPathInfo($linkObj)
	{
		$query     = 'SELECT obj_id as result FROM %s'
				   . ' WHERE obj_name = "%s"'
				   . ' AND obj_bid = %d AND obj_param = "%s"';
		$name      = $this->quote_smart($linkObj['name']);
		$bid       = $this->quote_smart($linkObj['bid']);
		$linkparam = $this->quote_smart($linkObj['linkparam']);
		$ObjID     = quickQuery(sprintf($query, _CUSTOMURL_TABLE, $name, $bid, $linkparam));
		if (!$ObjID) {
			return;
		} else {
			return intval($ObjID);
		}
	}
 
// Receive TrackBack ping
	function _trackback($bid, $path)
	{
		$blog_id = intval($bid);
		$TrackBack = $this->pluginCheck('TrackBack');
		if ($TrackBack) {
			if (substr($path, -5, 5) == '.html') {
				$linkObj = array ('linkparam' => 'item',
								  'bid' => $blog_id,
								  'name' => $path);
				$item_id = $this->getRequestPathInfo($linkObj);
				if ($item_id) {
					$tb_id = intval($item_id);
				} else {
					doError(_NO_SUCH_URI);
				}
			} else {
				$tb_id = intval($path);
			}
 
			$errorMsg = $TrackBack->handlePing($tb_id);
			if ($errorMsg != '') {
				$TrackBack->xmlResponse($errorMsg);
			} else {
				$TrackBack->xmlResponse();
			}
		}
		exit;
	}
 
	function event_GenerateURL($data)
	{
		global $CONF, $manager, $blogid;
		if ($data['completed']) {
			return;
		}
 
		if (is_numeric($blogid)) {
			$blogid = intval($blogid);
		} else {
			$blogid = intval(getBlogIDFromName($blogid));
		}
		$mcategories = $this->pluginCheck('MultipleCategories');
		if ($mcategories) {
			if (method_exists($mcategories, 'getRequestName')) {
				$mcategories->event_PreSkinParse(array());
				global $subcatid;
				$subrequest = $mcategories->getRequestName();
			}
		}
		if ($subcatid) {
			$subcatid = intval($subcatid);
		}
		$OP_ArchiveKey	= $this->getOption('customurl_archive');
		$OP_ArchivesKey	= $this->getOption('customurl_archives');
		$OP_MemberKey	= $this->getOption('customurl_member');
		$params         = $data['params'];
		$catParam       = $params['extra']['catid'];
//		echo $catParam;
		$subcatParam    = $params['extra'][$subrequest];
		$useCustomURL   = $this->getAllBlogOptions('use_customurl');
		switch ($data['type']) {
			case 'item':
				if (!is_numeric($params['itemid'])) {
					return;
				}
				$item_id = intval($params['itemid']);
				$bid = intval(getBlogIDFromItemID($item_id));
				if ($useCustomURL[$bid] == 'no') {
					return;
				}
				$query = 'SELECT obj_name as result FROM %s'
					   . ' WHERE obj_param = "item" AND obj_id = %d';
				$path = quickQuery(sprintf($query, _CUSTOMURL_TABLE, $item_id));
				if ($path) {
					$objPath = $path;
				} else {
					if (!$this->_isValid(array('item', 'inumber', $item_id))) {
						$objPath = _NOT_VALID_ITEM;
					} else {
						$y = $m = $d = $temp = '';
						$table =  sql_table('item');
						$tque = 'SELECT itime as result FROM %s'
							  . ' WHERE inumber = %d';
						$itime = quickQuery(sprintf($tque ,$table, $item_id));
						sscanf($itime,'%d-%d-%d %s', $y, $m, $d, $temp);
						$defItem   = $this->getOption('customurl_dfitem');
						$tempParam = array('year' => $Y,
										   'month' => $m,
										   'day' => $d);
						$ikey = TEMPLATE::fill($defItem, $tempParam);
						$ipath = $ikey . '_' . $item_id;
						$query = 'SELECT ititle as result FROM %s'
							   . ' WHERE inumber = %d';
						$iname = quickQuery(sprintf($query, $table, $item_id));
						$this->RegistPath($item_id, $ipath, $bid, 'item', $iname, TRUE);
						$objPath = $ipath . '.html';
					}
				}
//				if ($catParam && $subcatid && !$subcatParam) {
//					$params['extra'][$subrequest] = $subcatid;
//				}
				if ($bid != $blogid) {
					$burl = $this->_generateBlogLink($bid);
				} else {
					$burl = $this->_generateBlogLink($blogid);
				}
			break;
			case 'member':
				if (!is_numeric($params['memberid']) || $useCustomURL[$blogid] =='no') {
					return;
				}
				$memberID = intval($params['memberid']);
				$path = $this->getMemberOption($memberID, 'customurl_mname');
				if ($path) {
					$data['url'] = $this->_generateBlogLink($blogid) . '/'
								 . $OP_MemberKey . '/' . $path . '.html';
					$data['completed'] = TRUE;
					return;
				} else {
					if (!$this->_isValid(array('member', 'mnumber', $memberID))) {
						$data['url'] = $this->_generateBlogLink($blogid) . '/'
									 . _NOT_VALID_MEMBER;
						$data['completed'] = TRUE;
						return;
					} else {
						$query = 'SELECT mname as result FROM %s'
							   . ' WHERE mnumber = %d';
						$table = sql_table('member');
						$mname = quickQuery(sprintf($query, $table, $memberID));
						$this->RegistPath($memberID, $mname, 0, 'member', $mname, TRUE);
						$data['url'] = $this->_generateBlogLink($blogid) . '/'
									 . $OP_MemberKey . '/' . $mname . '.html';
						$data['completed'] = TRUE;
						return;
					}
				}
			break;
			case 'category':
				if (!is_numeric($params['catid'])) {
					return;
				}
				$cat_id = intval($params['catid']);
				$bid = intval(getBlogidFromCatID($cat_id));
				if ($useCustomURL[$bid] == 'no') {
					return;
				}
				$objPath = $this->_generateCategoryLink($cat_id);
				if ($bid != $blogid) {
					$burl = $this->_generateBlogLink($bid);
				}
			break;
			case 'archivelist':
				if ($useCustomURL[$blogid] == 'no') {
					return;
				}
				$objPath = $OP_ArchivesKey . '/';
				$bid = $blogid;
//				if ($catParam && $subcatid && !$subcatParam) {
//					$params['extra'][$subrequest] = $subcatid;
//				}
			break;
			case 'archive':
				if ($useCustomURL[$blogid] == 'no') {
					return;
				}
				sscanf($params['archive'], '%d-%d-%d', $y, $m, $d);
				if ($d) {
					$arc = sprintf('%04d-%02d-%02d', $y, $m, $d);
				} elseif ($m) {
					$arc = sprintf('%04d-%02d', $y, $m);
				} else {
					$arc = sprintf('%04d', $y);
				}
				$objPath = $OP_ArchiveKey . '/' . $arc . '/';
				$bid = $blogid;
//				if ($catParam && $subcatid && !$subcatParam) {
//					$params['extra'][$subrequest] = $subcatid;
//				}
			break;
			case 'blog':
				if (!is_numeric($params['blogid'])) {
					return;
				}
				$bid = intval($params['blogid']);
				$burl = $this->_generateBlogLink($bid);
			break;
			default:
				return;
		}
		if (!$burl) {
			$burl = $this->_generateBlogLink($blogid);
		}
 
		//NP_Analyze AdminArea check
		$aplugin = $this->pluginCheck('Analyze');
		if ($aplugin) {
			$aadmin = str_replace('/', '\/', $aplugin->getAdminURL());
			$p_arr  = explode('/', serverVar('SCRIPT_NAME'));
			$tmp    = array_pop($p_arr);
			$p_info = implode('\/', $p_arr);
		}
		if ($p_info) {
			if (strpos($aadmin, $p_info)) {
				$CONF['UsingAdminArea'] = TRUE;
			}
		}
		//NP_Analyze AdminArea check end
 
		if (getVar('virtualpath')) {
			$info = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', getVar('virtualpath'));
		} elseif (serverVar('PATH_INFO')) {
			$info = preg_replace('|[^a-zA-Z0-9-~+_.?#=&;,/:@%]|i', '', serverVar('PATH_INFO'));
		}
		$v_path = explode('/', $info);
 
		$feedurl = array();
		$SiteMapP = $this->pluginCheck('GoogleSitemap');
		if ($SiteMapP) {
			$PcSitemaps = $SiteMapP->getAllBlogOptions('PcSitemap');
			foreach ($PcSitemaps as $PCsitemap) {
				if ($PCsitemap) {
					$feedurl[] = $PCsitemap;
				}
			}
			$MobSitemaps = $SiteMapP->getAllBlogOptions('MobileSitemap');
			foreach ($MobSitemaps as $Mobsitemap) {
				if ($Mobsitemap) {
					$feedurl[] = $Mobsitemap;
				}
			}
		}
		$feedurl      = array_unique($feedurl);
		$request_path = end($v_path);
		$feeds        = in_array($request_path, $feedurl, true);
 
		if (!$feeds && $bid != $blogid && !$CONF['UsingAdminArea']) {
			$params['extra'] = array();
		}
		if ($objPath || $data['type'] == 'blog') {
			$LinkURI = $this->_addLinkParams($objPath, $params['extra']);
			if ($LinkURI) {
				$data['url'] = $burl . '/' . $LinkURI;
			} else {
				$data['url'] = $burl;
			}
			$arcTmp  = (preg_match('/' . $OP_ArchivesKey . '/', $data['url']));
			$arcsTmp = (preg_match('/' . $OP_ArchiveKey . '/', $data['url']));
			$isArchives = ($arcTmp || $arcsTmp);
			$isItem = (substr($data['url'], -5, 5) == '.html');
			$isDirectory = (substr($data['url'], -1) == '/');
			$puri = parse_url($data['url']);
			if ($isArchives && !$isItem && !$isDirectory && !$puri['query']) {
				$data['url'] .= '/';
			}
			$data['completed'] = TRUE;
			if (strstr ($data['url'], '//')) {
				$link = preg_replace("/([^:])\/\//", "$1/", $data['url']);
			}
			return $data;
		}
	}
 
	function _createSubCategoryLink($scid)
	{
		$scids = $this->getParents(intval($scid));
		$subcatids = explode('/', $scids);
		$eachPath = array();
		foreach ($subcatids as $sid) {
			$subcat_id = intval($sid);
			$query = 'SELECT obj_name as result FROM %s'
				   . ' WHERE obj_id = %d AND obj_param = "%s"';
			$path  = quickQuery(sprintf($query, _CUSTOMURL_TABLE, $subcat_id, 'subcategory'));
			if ($path) {
				$eachPath[] = $path;
			} else {
				$tempParam = array('plug_multiple_categories_sub',
								   'scatid',
								   $subcat_id);
				if (!$this->_isValid($tempParam)) {
					return $url = _NOT_VALID_SUBCAT;
				} else {
					$scpath = $this->getOption('customurl_dfscat') . '_' . $subcat_id;
					$query = 'SELECT catid as result FROM %s WHERE scatid = %d';
					$cid= quickQuery(sprintf($query, _C_SUBCAT_TABLE, $subcat_id));
					if (!$cid) return 'no_such_subcat=' . $subcat_id . '/';
					$this->RegistPath($subcat_id, $scpath, $cid, 'subcategory', 'subcat_' . $subcat_id, TRUE);
					$eachPath[] = $scpath;
				}
			}
		}
		$subcatPath = @join('/', $eachPath);
		return $subcatPath . '/';
	}
 
	function getParents($subid)
	{
		$subcat_id = intval($subid);
		$query = 'SELECT scatid, parentid FROM %s WHERE scatid = %d';
		$res   = sql_query(sprintf($query, _C_SUBCAT_TABLE, $subcat_id));
		list($sid, $parent) = mysql_fetch_row($res);
		if ($parent != 0) {
			$r = $this->getParents($parent) . '/' . $sid;
		} else {
			$r = $sid;
		}
		return $r;
	}
 
	function _generateCategoryLink($cid)
	{
		global $CONF;
		$cat_id = intval($cid);
		$path = $this->getCategoryOption($cat_id, 'customurl_cname');
		if ($path) {
			return $path . '/';
		} else {
			if (!$this->_isValid(array('category', 'catid', $cat_id))) {
				return $url = _NOT_VALID_CAT;
			} else {
				$cpath   = $this->getOption('customurl_dfcat') . '_' . $cat_id;
				$blog_id = intval(getBlogIDFromCatID($cat_id));
				$catname = 'catid_' . $cat_id;
				$this->RegistPath($cat_id, $cpath, $blog_id, 'category', $catname, TRUE);
				return $cpath . '/';
			}
		}
	}
 
	function _generateBlogLink($bid)
	{
		global $manager, $CONF;
		$blog_id = intval($bid);
		if ($this->getBlogOption($blog_id, 'use_customurl') == 'no') {
			$b =& $manager->getBlog($blog_id);
			$burl = $b->getURL();
		} else {
			if ($blog_id == $CONF['DefaultBlog']) {
				$burl = trim($CONF['IndexURL'], '/');
			} else {
				$query = 'SELECT burl as result FROM %s WHERE bnumber = %d';
				$burl = quickQuery(sprintf($query, sql_table('blog'), $blog_id));
				if ($burl) {
					if (substr($burl, -4, 4) == '.php') {
						$path = $this->getBlogOption($blog_id, 'customurl_bname');
						if ($path) {
							$burl = $CONF['IndexURL'] . $path;
						} else {
							$query = 'SELECT bshortname as result FROM %s'
								   . ' WHERE bnumber = %d';
							$bpath = quickQuery(sprintf($query, sql_table('blog'), $blog_id));
							$this->RegistPath($blog_id, $bpath, 0, 'blog', $bpath, TRUE);
							$burl = $CONF['IndexURL'] . $bpath;
						}
						$burl_update = 'UPDATE %s SET burl = "%s" WHERE bnumber = %d';
						sql_query(sprintf($burl_update, sql_table('blog'), $this->quote_smart($burl), $blog_id));
					}
				} else {
					$burl = _NOT_VALID_BLOG;
				}
			}
		}
		return trim($burl, '/');
	}
 
	function _addLinkParams($link, $params)
	{
		global $CONF, $manager, $catid;
		$arcTmp      = (preg_match('/' . $this->getOption('customurl_archives') . '/', $link));
		$arcsTmp     = (preg_match('/' . $this->getOption('customurl_archive') . '/', $link));
		$isArchives  = ($arcTmp || $arcsTmp);
		$mcategories = $this->pluginCheck('MultipleCategories');
		if ($mcategories) {
			if (method_exists($mcategories,"getRequestName")) {
				$mcategories->event_PreSkinParse(array());
				global $subcatid;
				$subrequest = $mcategories->getRequestName();
			} else {
				$subrequest = 'subcatid';
			}
		}
		if (is_array($params)) {
			if ($params['archives']) {
				$linkExtra = $this->getOption('customurl_archives') . '/';
				unset($params['archives']);
			} elseif ($params['archivelist']) {
				$linkExtra = $this->getOption('customurl_archives') . '/';
				unset($params['archivelist']);
			} elseif ($params['archive']) {
				sscanf($params['archive'], '%d-%d-%d', $y, $m, $d);
				if ($d) {
					$arc = sprintf('%04d-%02d-%02d', $y, $m, $d);
				} elseif ($m) {
					$arc = sprintf('%04d-%02d', $y, $m);
				} else {
					$arc = sprintf('%04d', $y);
				}
				$linkExtra = $this->getOption('customurl_archive') . '/' . $arc;
				unset($params['archive']);
			}
			$paramlink = array();
			foreach ($params as $param => $value) {
				switch ($param) {
					case 'catid':
					case $CONF['CategoryKey']:
						$paramlink[] = $this->_generateCategoryLink(intval($value));
					break;
					case $subrequest:
						if ($mcategories) {
							$paramlink[] = $this->_createSubCategoryLink(intval($value));
						}
					break;
					default:
						$paramlink[] = $param . '/' . $value . '/';
					break;
				}
			}
//			$tagparam = (preg_match('/^tag\//', $link));
			if (substr($link, -5, 5) == '.html' || $isArchives) {
//				$link = $catlink . $sublink . $link;
				$link = implode('', $paramlink) . $link;
			} else {
//				$link .= $catlink . $sublink;
				$link .= implode('', $paramlink);
			}
		}
//		if ($params['tag']) {
//			$link .= 'tag/' . $params['tag'] . '/';
//		}
		if ($linkExtra) {
			$link .= $linkExtra;
		}
		if (requestVar('skinid')) {
			if (strpos('?', $link)) {
				$link .= '&amp;skinid=' . htmlspecialchars(requestVar('skinid'));
			} else {
				if (substr($link, -1) != '/' && !empty($link)) {
					$link .= '/?skinid=' . htmlspecialchars(requestVar('skinid'));
				} else {
					$link .= '?skinid=' . htmlspecialchars(requestVar('skinid'));
				}
			}
		}
		if (strstr ($link, '//')) {
			$link = preg_replace("/([^:])\/\//", "$1/", $link);
		}
		return $link;
	}
 
	function _convertAlphabettoXHTMLCharacterEntity($text)	//add shizuki
	{
		$alphabetKey = array (
							  '/',
							  '@',
							  'A',
							  'B',
							  'C',
							  'D',
							  'E',
							  'F',
							  'G',
							  'H',
							  'I',
							  'J',
							  'K',
							  'L',
							  'M',
							  'N',
							  'O',
							  'P',
							  'Q',
							  'R',
							  'S',
							  'T',
							  'U',
							  'V',
							  'W',
							  'X',
							  'Y',
							  'Z',
							  'a',
							  'b',
							  'c',
							  'd',
							  'e',
							  'f',
							  'g',
							  'h',
							  'i',
							  'j',
							  'k',
							  'l',
							  'm',
							  'n',
							  'o',
							  'p',
							  'q',
							  'r',
							  's',
							  't',
							  'u',
							  'v',
							  'w',
							  'x',
							  'y',
							  'z',
							  '&&'
							 );
		$alphabetVal = array (
							  '&#47;',
							  '&#64;',
							  '&#65;',
							  '&#66;',
							  '&#67;',
							  '&#68;',
							  '&#69;',
							  '&#70;',
							  '&#71;',
							  '&#72;',
							  '&#73;',
							  '&#74;',
							  '&#75;',
							  '&#76;',
							  '&#77;',
							  '&#78;',
							  '&#79;',
							  '&#80;',
							  '&#81;',
							  '&#82;',
							  '&#83;',
							  '&#84;',
							  '&#85;',
							  '&#86;',
							  '&#87;',
							  '&#88;',
							  '&#89;',
							  '&#90;',
							  '&#97;',
							  '&#98;',
							  '&#99;',
							  '&#100;',
							  '&#101;',
							  '&#102;',
							  '&#103;',
							  '&#104;',
							  '&#105;',
							  '&#106;',
							  '&#107;',
							  '&#108;',
							  '&#109;',
							  '&#110;',
							  '&#111;',
							  '&#112;',
							  '&#113;',
							  '&#114;',
							  '&#115;',
							  '&#116;',
							  '&#117;',
							  '&#118;',
							  '&#119;',
							  '&#120;',
							  '&#121;',
							  '&#122;',
							  '&#65286;&'
							 );
		$retData = str_replace($alphabetKey, $alphabetVal, $text);
		return $retData;
	}
 
	function doSkinVar($skinType, $link_type = '', $target = '', $title = '')
	{
		global $blogid;
		if ($skinType == 'item' && $link_type == 'trackback') {
			global $itemid, $CONF;
			if ($this->getBlogOption($blogid, 'use_customurl') == 'yes') {
				$que = 'SELECT obj_name as result FROM %s'
					 . ' WHERE obj_param = "item" AND obj_id = %d';
				$itempath = quickQuery(sprintf($que, _CUSTOMURL_TABLE, $itemid));
				$uri = $CONF['BlogURL'] . '/trackback/' . $itempath;
// /item_123.trackback
//				$itempath = substr($itempath, 0, -5) . '.trackback';
//				$uri = $CONF['BlogURL'] . '/' . $itempath;
			} else {
				$uri = $CONF['ActionURL']
					 . '?action=plugin&amp;name=TrackBack&amp;tb_id=' . $itemid;
			}
			echo $this->_convertAlphabettoXHTMLCharacterEntity($uri);
			return;
		}
		// $data == type / id || name / 'i'd || 'n'ame
		// ex. =>	[(b)log / blogid [|| shortname / 'i'd || 'n'ame]]
		//			(c)at  / catid [|| cname / 'i'd || 'n'ame]
		//			(s)cat / subcatid [|| sname / 'i'd || 'n'ame]
		//			[(i)tem /] itemid [/ 'path']
		//			(m)ember / mnumber [|| mname / 'i'd || 'n'ame]
		//
		// if second param is null, third param is id
		// if param is null, generate blog link
		if (!$link_type) {
			$link_params = '0, b/' . intval($blogid) . '/i,'
						 . $target . ',' . $title;
		} else {
			$l_params = explode("/", $link_type);
			if (count($l_params) == 1) {
				$link_params = array(0, 'b/' . intval($link_type) . '/i,'
							 . $target . ',' . $title);
			} else {
				$link_params = array(0,
									 $link_type . ',' . $target . ',' . $title);
			}
		}
		echo $this->URL_Callback($link_params);
	}
 
	function doTemplateVar(&$item, $link_type = '', $target = '', $title = '')
	{
		$item_id = intval($item->itemid);
		if ($link_type == 'trackback') {
			global $CONF;
			$blog_id = intval(getBlogIDFromItemID($item_id));
			if ($this->getBlogOption($blog_id, 'use_customurl') == 'yes') {
				$que = 'SELECT obj_name as result FROM %s'
					 . ' WHERE obj_param = "item" AND obj_id = %d';
				$itempath = quickQuery(sprintf($que, _CUSTOMURL_TABLE, $item_id));
				$uri = $CONF['BlogURL'] . '/trackback/' . $itempath;
// /item_123.trackback
//				$itempath = substr($itempath, 0, -5) . '.trackback';
//				$uri = $CONF['BlogURL'] . '/' . $itempath;
			} else {
				$uri = $CONF['ActionURL']
					 . '?action=plugin&amp;name=TrackBack&amp;tb_id=' . $item_id;
			}
			echo $this->_convertAlphabettoXHTMLCharacterEntity($uri);
			return;
		}
		if (!$link_type) {
			$link_params = array(0,
								 'i/' . $item_id . '/i,' . $target . ',' . $title);
		} elseif ($link_type == 'path') {
			$link_params = array(0,
								 'i/' . $item_id . '/path,' . $target . ',' . $title);
		} else {
			$link_params = array(0,
								 $link_type . ',' . $target . ',' . $title);
		}
		echo $this->URL_Callback($link_params);
	}
 
	function URL_Callback($data)
	{
		$l_data		= explode(",", $data[1]);
		$l_type		= $l_data[0];
		$target		= $l_data[1];
		$title		= $l_data[2];
		$item_id	= intval($this->currentItem->itemid);
		if (!$l_type) {
			$link_params = array ('i',
								  $item_id,
								  'i');
		} else {
			$link_data = explode("/", $l_type);
			if (count($link_data) == 1) {
				$link_params = array ('i',
									  intval($l_type),
									  'i');
			} elseif (count($link_data) == 2) {
				if ($link_data[1] == 'path') {
					$link_params = array ('i',
										  $link_data[0],
										  'path');
				} else {
					$link_params = array ($link_data[0],
										  intval($link_data[1]),
										  'i');
				}
			} else {
				$link_params = array ($link_data[0],
									  $link_data[1],
									  $link_data[2]);
			}
		}
		$url = $this->_genarateObjectLink($link_params);
		if ($target) {
			if ($title) {
				$ObjLink = '<a href="' . htmlspecialchars($url) . '" '
						 . 'title="' . htmlspecialchars($title) . '">'
						 . htmlspecialchars($target) . '</a>';
			} else {
				$ObjLink = '<a href="' . htmlspecialchars($url) . '" '
						 . 'title="' . htmlspecialchars($target) . '">'
						 . htmlspecialchars($target) . '</a>';
			}
		} else {
			$ObjLink = htmlspecialchars($url);
		}
		return $ObjLink;
	}
 
	function _isValid($data)
	{
		$query = 'SELECT * FROM %s WHERE %s = %d';
		$data[2] = $this->quote_smart($data[2]);
		$res = sql_query(sprintf($query, sql_table($data[0]), $data[1], $data[2]));
		return (mysql_num_rows($res) != 0);
	}
 
	function _genarateObjectLink($data)
	{
		global $CONF, $manager, $blog;
		$ext = substr(serverVar('REQUEST_URI'), -4);
		if ($ext == '.rdf' || $ext == '.xml') {
			$CONF['URLMode'] = 'pathinfo';
		}
		if ($CONF['URLMode'] != 'pathinfo') {
			return;
		}
		$query = 'SELECT %s as result FROM %s WHERE %s = "%s"';
		switch ($data[0]) {
			case 'b':
				if ($data[2] == 'n') {
					$bid = getBlogIDFromName($data[1]);
				} else {
					$bid = $data[1];
				}
				$blog_id = intval($bid);
				$param = array('blog',
							   'bnumber',
							   $blog_id);
				if (!$this->_isValid($param)) {
					$url = _NOT_VALID_BLOG;
				} else {
					$url = $this->_generateBlogLink($blog_id) . '/';
				}
			break;
			case 'c':
				if ($data[2] == 'n') {
					$cid = getCatIDFromName($data[1]);
				} else {
					$cid = $data[1];
				}
				$cat_id = intval($cid);
				$param = array('category',
							   'catid',
							   $cat_id);
				if (!$this->_isValid($param)) {
					$url = _NOT_VALID_CAT;
				} else {
//					$bid = intval(getBlogIDFromCatID($cat_id));
//					$blink = $this->_generateBlogLink(intval($bid));
//					$url = $blink . '/' . $this->_generateCategoryLink($cat_id, '');
					$url = createCategoryLink($cat_id);
				}
			break;
			case 's':
				$mcategories = $this->pluginCheck('MultipleCategories');
				if ($mcategories) {
					if (method_exists($mcategories, "getRequestName")) {
						if ($data[2] == 'n') {
							$temp = $this->quote_smart($data[1]);
							$scid = quickQuery(sprintf($query, 'scatid', _C_SUBCAT_TABLE, 'sname', $temp));
						} else {
							$scid = $data[1];
						}
						$sub_id = intval($scid);
						$param = array('plug_multiple_categories_sub',
									   'scatid',
									   $sub_id);
						if (!$this->_isValid($param)) {
							$url = _NOT_VALID_SUBCAT;
						} else {
							$cid = quickQuery(sprintf($query, 'catid', _C_SUBCAT_TABLE, 'scatid', $sub_id));
							$cid = intval($cid);
							$subrequest = $mcategories->getRequestName();
							if (!$subrequest) {
								$subrequest = 'subcatid';
							}
							$linkParam = array($subrequest => $sub_id);
							$url = createCategoryLink($cid, $linkParam);
						}
					}
				}
			break;
			case 'i':
				$param = array('item',
							   'inumber',
							   intval($data[1]));
				if (!$this->_isValid($param)) {
					$url = _NOT_VALID_ITEM;
				} else {
					$blink = $this->_generateBlogLink(getBlogIDFromItemID(intval($data[1])));
					$i_query = 'SELECT obj_name as result FROM %s'
							 . ' WHERE obj_param = "item" AND obj_id = %d';
					$path = quickQuery(sprintf($i_query, _CUSTOMURL_TABLE, intval($data[1])));
					if ($path) {
						if ($data[2] == 'path') {
							$url = $path;
						} else {
							$url = $blink . '/' . $path;
						}
					} else {
						if ($data[2] == 'path') {
							$url = $CONF['ItemKey'] . '/'
								 . intval($data[1]);
						} else {
							$url = $blink . '/' . $CONF['ItemKey'] . '/'
								 . intval($data[1]);
						}
					}
				}
			break;
			case 'm':
				if ($data[2] == 'n') {
					$data[1] = $this->quote_smart($data[1]);
					$mid = quickQuery(sprintf($query, 'mnumber', sql_table('member'), 'mname', $data[1]));
				} else {
					$mid = $data[1];
				}
				$member_id = intval($mid);
				$param = array('member',
							   'mnumber',
							   $member_id);
				if (!$this->_isValid($param)) {
					$url = _NOT_VALID_MEMBER;
				} else {
					$url = createMemberLink($member_id);
				}
			break;
		}
		return $url;
	}
 
/*	function event_PreSendContentType($data)
	{
		global $blogid, $CONF;
 
		$ext = substr(serverVar('REQUEST_URI'), -4);
		if ($ext == '.rdf' || $ext == '.xml') {
			$p_info = trim(serverVar('PATH_INFO'), '/');
			$path_arr = explode('/', $p_info);
			switch (end($path_arr)) {
				case 'rss1.xml':
				case 'index.rdf':
				case 'rss2.xml':
				case 'atom.xml':
					$data['contentType'] = 'application/xml';
					break;
				default:
					break;
			}
		}
	}*/
 
	function event_InitSkinParse($data)
	{
		global $blogid, $CONF, $manager;
		$feedurl = array(
						'rss1.xml',
						'index.rdf',
						'rss2.xml',
						'atom.xml',
						);
		$reqPaths = explode('/', serverVar('PATH_INFO'));
		$reqPath  = end($reqPaths);
		$feeds    = in_array($reqPath, $feedurl, true);
		if (!$feeds) {
			return;
		} else {
			$p_info = trim(serverVar('PATH_INFO'), '/');
			$path_arr = explode('/', $p_info);
			switch (end($path_arr)) {
				case 'rss1.xml':
				case 'index.rdf':
					$skinName = 'feeds/rss10';
					break;
				case 'rss2.xml':
					$skinName = 'feeds/rss20';
					break;
				case 'atom.xml':
					$skinName = 'feeds/atom';
					break;
			}
			if (SKIN::exists($skinName)) {
				$skin =& SKIN::createFromName($skinName);
				$data['skin']->SKIN($skin->getID());
				$skinData =& $data['skin'];
				$pageType =  $data['type'];
				if (!$CONF['DisableSite']) {
					ob_start();
 
					$skinID    = $skinData->id;
					$contents  = $this->getSkinContent($pageType, $skinID);
					$actions   = SKIN::getAllowedActionsForType($pageType);
					$dataArray = array('skin'     => &$skinData,
									   'type'     =>  $pageType,
									   'contents' => &$contents);
					$manager->notify('PreSkinParse', $dataArray);
					PARSER::setProperty('IncludeMode',   SKIN::getIncludeMode());
					PARSER::setProperty('IncludePrefix', SKIN::getIncludePrefix());
					$handler =& new ACTIONS($pageType, $skinData);
					$parser  =& new PARSER($actions, $handler);
					$handler->setParser($parser);
					$handler->setSkin($skinData);
					$parser->parse($contents);
					$dataArray = array('skin' => &$skinData,
									   'type' =>  $pageType);
					$manager->notify('PostSkinParse', $dataArray);
 
					$feed = ob_get_contents();
 
					ob_end_clean();
					$eTag = '"' . md5($feed) . '"';
					header('Etag: ' . $eTag);
					if ($eTag == serverVar('HTTP_IF_NONE_MATCH')) {	
						header("HTTP/1.0 304 Not Modified");
						header('Content-Length: 0');
					} else {
						$feed = mb_convert_encoding($feed, 'UTF-8', _CHARSET);
						header("Content-Type: application/xml");
						header('Generator: Nucleus CMS ' . $nucleus['version']);
						// dump feed
						echo $feed;
					}
				} else {
					echo '<' . '?xml version="1.0" encoding="ISO-8859-1"?' . '>';
?>
<rss version="2.0">
  <channel>
    <title><?php echo htmlspecialchars($CONF['SiteName'])?></title>
    <link><?php echo htmlspecialchars($CONF['IndexURL'])?></link>
    <description></description>
    <docs>http://backend.userland.com/rss</docs>
  </channel>
</rss>	
<?php
				}
			}
		exit;
		}
	}
 
	function getSkinContent($pageType, $skinID)
	{
		$skinID   = intval($skinID);
		$pageType = addslashes($pageType);
		$query = 'SELECT scontent FROM %s WHERE sdesc = %d AND stype = %d';
		$res = sql_query(sprintf($query, sql_table('skin'), $skinID, $pageType));
 
		if (mysql_num_rows($res) == 0)
			return '';
		else
			return mysql_result($res, 0, 0);
	}
 
 
// merge NP_RightURL
	function event_PreSkinParse($data)
	{
		global $CONF, $manager, $blog, $catid, $itemid, $subcatid;
		global $memberid;
		if (!$blog) {
			$b =& $manager->getBlog($CONF['DefaultBlog']);
		} else {
			$b =& $blog;
		}
		$blogurl = $b->getURL();
		
		if (!$blogurl) {
			if($blog) {
				$b_tmp =& $manager->getBlog($CONF['DefaultBlog']);
				$blogurl = $b_tmp->getURL();
			}
			if (!$blogurl) {
				$blogurl = $CONF['IndexURL'];
				if ($CONF['URLMode'] != 'pathinfo'){
					if ($data['type'] == 'pageparser') {
						$blogurl .= 'index.php';
					} else {
						$blogurl = $CONF['Self'];
					}
				}
			}
		}
		if ($CONF['URLMode'] == 'pathinfo'){
			if (substr($blogurl, -1) == '/') {
				$blogurl = substr($blogurl, 0, -1);
			}
		}
		$CONF['BlogURL']        = $blogurl;
		$CONF['ItemURL']        = $blogurl;
		$CONF['CategoryURL']    = $blogurl;
		$CONF['ArchiveURL']     = $blogurl;
		$CONF['ArchiveListURL'] = $blogurl;
		$CONF['SearchURL']      = $blogurl;
//		$CONF['MemberURL']      = $blogurl;
	}
 
	function event_PreItem($data)
	{
		global $CONF, $manager;
 
		$this->currentItem = &$data['item']; 
		$pattern = '/<%CustomURL\((.*)\)%>/';
		$data['item']->body = preg_replace_callback($pattern, array(&$this, 'URL_Callback'), $data['item']->body);
		if ($data['item']->more) {
			$data['item']->more = preg_replace_callback($pattern, array(&$this, 'URL_Callback'), $data['item']->more);
		}
 
		$itemid = intval($data['item']->itemid);
		$itemblog =& $manager->getBlog(getBlogIDFromItemID($itemid));
		$blogurl = $itemblog->getURL();
		if (!$blogurl) {
			$b =& $manager->getBlog($CONF['DefaultBlog']);
			if (!($blogurl = $b->getURL())) {
				$blogurl = $CONF['IndexURL'];
				if ($CONF['URLMode'] != 'pathinfo'){
					if ($data['type'] == 'pageparser') {
						$blogurl .= 'index.php';
					} else {
						$blogurl = $CONF['Self'];
					}
				}
			}
		}
		if ($CONF['URLMode'] == 'pathinfo'){
			if (substr($blogurl, -1) == '/') {
				$blogurl = substr($blogurl, 0, -1);
			}
		}
		$CONF['BlogURL']        = $blogurl;
		$CONF['ItemURL']        = $blogurl;
		$CONF['CategoryURL']    = $blogurl;
		$CONF['ArchiveURL']     = $blogurl;
		$CONF['ArchiveListURL'] = $blogurl;
//		$CONF['MemberURL']      = $blogurl;
	}
 
	function event_PostItem($data)
	{
		global $CONF, $manager, $blog;
		if (!$blog) {
			$b =& $manager->getBlog($CONF['DefaultBlog']);
		} else {
			$b =& $blog;
		}
		$blogurl = $b->getURL();
		if (!$blogurl) {
			if($blog) {
				$b_tmp =& $manager->getBlog($CONF['DefaultBlog']);
				$blogurl = $b_tmp->getURL();
			}
			if (!$blogurl) {
				$blogurl = $CONF['IndexURL'];
				if ($CONF['URLMode'] != 'pathinfo'){
					if ($data['type'] == 'pageparser') {
						$blogurl .= 'index.php';
					} else {
						$blogurl = $CONF['Self'];
					}
				}
			}
		}
		if ($CONF['URLMode'] == 'pathinfo'){
			if (substr($blogurl, -1) == '/') {
				$blogurl = substr($blogurl, 0, -1);
			}
		}
		$CONF['BlogURL']        = $blogurl;
		$CONF['ItemURL']        = $blogurl;
		$CONF['CategoryURL']    = $blogurl;
		$CONF['ArchiveURL']     = $blogurl;
		$CONF['ArchiveListURL'] = $blogurl;
//		$CONF['MemberURL']      = $CONF['Self'];
	}
// merge NP_RightURL end
 
	function event_PostDeleteBlog ($data)
	{
		$query  = 'DELETE FROM %s WHERE obj_id = %d AND obj_param = "%s"';
		$pquery = 'DELETE FROM %s WHERE obj_bid = %d AND obj_param= "%s"';
		$blogid = intval($data['blogid']);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $blogid, 'blog'));
		sql_query(sprintf($pquery, _CUSTOMURL_TABLE, $blogid, 'item'));
		$cnmquery = 'SELECT catid FROM %s WHERE cblog = %d';
		$table = sql_table('category');
		$cnm = sql_query(sprintf($cnmquery, $table, $blogid));
		while ($c = mysql_fetch_object($cnm)) {
			$catid = intval($c->catid);
			sql_query(sprintf($pquery, _CUSTOMURL_TABLE, $catid, 'subcategory'));
			sql_query(sprintf($query, _CUSTOMURL_TABLE, $catid, 'category'));
		}
	}
 
	function event_PostDeleteCategory ($data)
	{
		$query  = 'DELETE FROM %s WHERE obj_id = %d AND obj_param = "%s"';
		$squery = 'DELETE FROM %s WHERE obj_bid = %d AND obj_param = "%s"';
		$catid  = intval($data['catid']);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $catid, 'category'));
		sql_query(sprintf($squery, _CUSTOMURL_TABLE, $catid, 'subcategory'));
	}
 
	function event_PostDeleteItem ($data)
	{
		$query = 'DELETE FROM %s WHERE obj_id = %d AND obj_param = "%s"';
		$itemid = intval($data['itemid']);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $itemid, 'item'));
	}
 
	function event_PostDeleteMember ($data)
	{
		$query = 'DELETE FROM %s WHERE obj_id = %d AND obj_param = "%s"';
		$memberid = intval($data['member']->id);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $memberid, 'member'));
	}
 
	function event_PostAddBlog ($data)
	{
		$blog_id    = intval($data['blog']->blogid);
		$bshortname = $data['blog']->settings['bshortname'];
		$this->RegistPath($blog_id, $bshortname, 0, 'blog', $bshortname, TRUE);
		$this->setBlogOption($blog_id, 'customurl_bname', $bshortname);
	}
 
	function event_PostAddCategory ($data)
	{
		global $CONF;
		$cat_id = intval($data['catid']);
		if (!$data['blog']->blogid) {
			$query = 'SELECT cblog as result FROM %s WHERE catid = %d';
			$bid = quickQuery(sprintf($query, sql_table('category'), $cat_id));
		} else {
			$bid = $data['blog']->blogid;
		}
		if (!$data['name']) {
			$query = 'SELECT cname as result FROM %s WHERE catid = %d';
			$name = quickQuery(sprintf($query, sql_table('category'), $cat_id));
		} else {
			$name = $data['name'];
		}
		$bid     = intval($bid);
		$dfcat   = $this->getOption('customurl_dfcat');
		$catpsth = $dfcat . '_' . $cat_id;
		$this->RegistPath($cat_id, $catpsth, $bid, 'category', $name, TRUE);
		$this->setCategoryOption($cat_id, 'customurl_cname', $catpsth);
	}
 
	function event_PostAddItem ($data)
	{
		$item_id = intval($data['itemid']);
//		$item_id = $data['itemid'];
		$tpath = requestVar('plug_custom_url_path');
		$tque = 'SELECT itime as result FROM %s WHERE inumber = %d';
		$itime = quickQuery(sprintf($tque, sql_table('item'), $item_id));
		echo 'itemid='.$item_id.'<br>idate='.$itime;
		$y = $m = $d = $temp = '';
		sscanf($itime, '%d-%d-%d %s', $y, $m, $d, $temp);
		$param = array ('year'  => $y,
						'month' => $m,
						'day'   => $d);
		$ipath = TEMPLATE::fill($tpath, $param);
		$query = 'SELECT ititle as result FROM %s WHERE inumber = %d';
		$iname = quickQuery(sprintf($query, sql_table('item'), $item_id));
		$blog_id = intval(getBlogIDFromItemID($item_id));
		$this->RegistPath($item_id, $ipath, $blog_id, 'item', $iname, TRUE);
	}
 
	function event_PostRegister ($data)
	{
		$memberID = intval($data['member']->id);
		$dispName = $data['member']->displayname;
		$this->RegistPath($memberID, $dispName, 0, 'member', $dispName, TRUE);
		$this->setMemberOption($memberID, 'customurl_mname', $dispName);
	}
 
	function event_AddItemFormExtras(&$data)
	{
		$this->createItemForm();
	}
 
	function event_EditItemFormExtras(&$data)
	{
		$this->createItemForm(intval($data['itemid']));
	}
 
	function event_PostUpdateItem($data)
	{
		$tpath = requestVar('plug_custom_url_path');
		$item_id = intval($data['itemid']);
		$tque = 'SELECT itime as result FROM %s WHERE inumber = %d';
		$itime = quickQuery(sprintf($tque ,sql_table('item'), $item_id));
//		$itimestamp = strtotime($itime);
//		$tt = explode(',', date('Y,m,d', $itimestamp));
		$y = $m = $d = $temp = '';
		sscanf($itime, '%d-%d-%d %s', $y, $m, $d, $temp);
		$param = array ('year'  => $y,
						'month' => $m,
						'day'   => $d);
		$ipath = TEMPLATE::fill($tpath, $param);
		$query = 'SELECT ititle as result FROM %s WHERE inumber = %d';
		$iname = quickQuery(sprintf($query, sql_table('item'), $item_id));
		$blog_id = intval(getBlogIDFromItemID($item_id));
		$this->RegistPath($item_id, $ipath, $blog_id, 'item', $iname);
	}
 
	function createItemForm($item_id = 0)
	{
		global $CONF;
		if ($item_id) {
			$query = 'SELECT obj_name as result FROM %s'
				   . ' WHERE obj_param = "item" AND obj_id = %d';
			$item_id = intval($item_id);
			$res = quickQuery(sprintf($query, _CUSTOMURL_TABLE, $item_id));
			$ipath = substr($res, 0, strlen($res)-5);
		} else {
			$ipath = $this->getOption('customurl_dfitem');
		}
		echo <<<OUTPUT
<h3>Custom URL</h3>
<p>
<label for="plug_custom_url">Custom Path:</label>
<input id="plug_custom_url" name="plug_custom_url_path" value="{$ipath}" />
</p>
OUTPUT;
	}
 
	function event_PrePluginOptionsUpdate($data)
	{
		$blog_option = ($data['optionname'] == 'customurl_bname');
		$cate_option = ($data['optionname'] == 'customurl_cname');
		$memb_option = ($data['optionname'] == 'customurl_mname');
		$arch_option = ($data['optionname'] == 'customurl_archive');
		$arvs_option = ($data['optionname'] == 'customurl_archives');
		$memd_option = ($data['optionname'] == 'customurl_member');
		$contextid   = intval($data['contextid']);
		$context     = $data['context'];
		if ($blog_option || $cate_option || $memb_option) {
			if ($context == 'member' ) {
				$blogid = 0;
				$query  = 'SELECT mname as result FROM %s WHERE mnumber = %d';
				$table  = sql_table('member');
				$name   = quickQuery(sprintf($query, $table, $contextid));
			} elseif (context == 'category') {
				$blogid = getBlogIDFromCatID($contextid);
				$query  = 'SELECT cname as result FROM %s WHERE catid = %d';
				$table  = sql_table('category');
				$name   = quickQuery(sprintf($query, $table, $contextid));
			} else {
				$blogid = 0;
				$query  = 'SELECT bname as result FROM %s WHERE bnumber = %d';
				$table  = sql_table('blog');
				$name   = quickQuery(sprintf($query, $table, $contextid));
			}
			$blogid = intval($blogid);
			$msg = $this->RegistPath($contextid, $data['value'], $blogid, $context, $name);
			if ($msg) {
				$this->error($msg);
				exit;
			}
		} elseif ($arch_option || $arvs_option || $memd_option) {
			if (!ereg("^[-_a-zA-Z0-9]+$", $data['value'])) {
				$name = substr($data['optionname'], 8);
				$msg = array (1, _INVALID_ERROR, $name, _INVALID_MSG);
				$this->error($msg);
				exit;
			} else {
				return;
			}
		}
		return;
	}
 
	function event_PostMoveItem($data)
	{
		$query = 'UPDATE %s SET obj_bid = %d'
			   . ' WHERE obj_param = "%s" AND obj_id = %d';
		$destblogid = intval($data['destblogid']);
		$item_id = intval($data['itemid']);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $destblogid, 'item', $item_id));
	}
 
	function event_PostMoveCategory($data)
	{
		$query = 'UPDATE %s SET obj_bid = %d'
			   . ' WHERE obj_param = "%s" AND obj_id = %d';
		$destblogid = intval($data['destblog']->blogid);
		$cat_id = intval($data['catid']);
		sql_query(sprintf($query, _CUSTOMURL_TABLE, $destblogid, 'category', $cat_id));
	}
 
	function RegistPath($objID, $path, $bid, $oParam, $name, $new = FALSE )
	{
		global $CONF;
		switch($oParam) {
			case 'item':
			case 'member':
				if (preg_match('/.html$/', $path))
					$path = substr($path, 0, -5);
			break;
			case 'blog':
			case 'category':
			case 'subcategory':
				break;
			default :
				return;
				break;
		}
		$bid   = intval($bid);
		$objID = intval($objID);
		$name  = rawurlencode($name);
 
		if ($new && $oParam == 'item') {
			$tque = 'SELECT itime as result FROM %s WHERE inumber = %d';
			$itime = quickQuery(sprintf($tque ,sql_table('item'), $objID));
//			$itimestamp = strtotime($itime);
//			$tt = explode(',', date('Y,m,d', $itimestamp));
			$y = $m = $d = $temp = '';
			sscanf($itime, '%d-%d-%d %s', $y, $m, $d, $temp);
			$template = $this->getOption('customurl_dfitem');
			$param    = array ('year' => $y,
							   'month' => $m,
							   'day' => $d);
			$ikey = TEMPLATE::fill($template, $param); 
				if ($path == $ikey) {
					$path = $ikey . '_' . $objID;
				}
		} elseif (!$new && strlen($path) == 0) {
			$del_que = 'DELETE FROM %s WHERE obj_id = %d AND obj_param = "%s"';
			sql_query(sprintf($del_que, _CUSTOMURL_TABLE, $objID, $oParam));
			$msg = array (0, _DELETE_PATH, $name, _DELETE_MSG);
			return $msg;
			exit;
		}
 
		$dotslash = array ('.', '/');
		$path = str_replace ($dotslash, '_', $path);
		if (!ereg("^[-_a-zA-Z0-9]+$", $path)) {
			$msg = array (1, _INVALID_ERROR, $name, _INVALID_MSG);
			return $msg;
			exit;
		}
 
		$tempPath = $path;
		if ($oParam == 'item' || $oParam == 'member') $tempPath .= '.html';
		$conf_que = 'SELECT obj_id FROM %s'
				  . ' WHERE obj_name = "%s"'
				  . ' AND obj_bid = %d'
				  . ' AND obj_param = "%s"'
				  . ' AND obj_id != %d';
		$res = sql_query(sprintf($conf_que, _CUSTOMURL_TABLE, $tempPath, $bid, $oParam, $objID));
		if ($res && mysql_num_rows($res)) {
			$msg = array (0, _CONFLICT_ERROR, $name, _CONFLICT_MSG);
			$path .= '_'.$objID;
		}
		if ($oParam == 'category' && !$msg) {
			$conf_cat = 'SELECT obj_id FROM %s WHERE obj_name = "%s"'
					  . ' AND obj_param = "blog"';
			$res = sql_query(sprintf($conf_cat, _CUSTOMURL_TABLE, $tempPath));
			if ($res && mysql_num_rows($res)) {
				$msg = array (0, _CONFLICT_ERROR, $name, _CONFLICT_MSG);
				$path .= '_'.$objID;
			}
		}
		if ($oParam == 'blog' && !$msg) {
			$conf_blg = 'SELECT obj_id FROM %s WHERE obj_name = "%s"'
					  . ' AND obj_param = "category"';
			$res = sql_query(sprintf($conf_blg, _CUSTOMURL_TABLE, $tempPath));
			if ($res && mysql_num_rows($res)) {
				$msg = array (0, _CONFLICT_ERROR, $name, _CONFLICT_MSG);
				$path .= '_'.$objID;
			}
		}
 
		$newPath = $path;
		if ($oParam == 'item' || $oParam == 'member') $newPath .= '.html';
		$query = 'SELECT * FROM %s WHERE obj_id = %d AND obj_param = "%s"';
		$res = sql_query(sprintf($query, _CUSTOMURL_TABLE, $objID, $oParam));
		$row = mysql_fetch_object($res);
		$pathID = $row->id;
		if ($pathID) {
			$query = 'UPDATE %s SET obj_name = "%s" WHERE id = %d';
			sql_query(sprintf($query, _CUSTOMURL_TABLE, $newPath, $pathID));
		} else {
			$query = 'INSERT INTO %s (obj_param, obj_name, obj_id, obj_bid)'
				   . ' VALUES ("%s", "%s", %d, %d)';
			sql_query(sprintf($query, _CUSTOMURL_TABLE, $oParam, $newPath, $objID, $bid));
		}
		switch($oParam) {
			case 'blog':
				$this->setBlogOption($objID, 'customurl_bname', $path);
			break;
			case 'category':
				$this->setCategoryOption($objID, 'customurl_cname', $path);
			break;
			case 'member':
				$this->setMemberOption($objID, 'customurl_mname', $path);
			break;
			default :
			break;
		}
		return $msg;
	}
 
	function error($msg = '')
	{
		global $admin;
 
		$admin->pagehead();
		echo $msg[1].' : '.$msg[2].'<br />';
		echo $msg[3].'<br />';
		echo '<a href="index.php" onclick="history.back()">'._BACK.'</a>';
		$admin->pagefoot();
		return;
	}
 
	function quote_smart($value)
	{
		if (get_magic_quotes_gpc()) $value = stripslashes($value);
		if (!is_numeric($value)) {
			$value = mysql_real_escape_string($value);
		} elseif (is_numeric($value)) {
			$value = intval($value);
		}
		return $value;
	}
}
?>
 
plugins/customurl/customurl_code.txt · 最終更新: 2006/11/26 02:33 by shizuki