diff --git a/config/config.inc.php b/config/config.inc.php
index c814c8c60..f423c03af 100644
--- a/config/config.inc.php
+++ b/config/config.inc.php
@@ -1,278 +1,285 @@
+ * 0: generate debug messages/not display
+ * 1: display messages through debugPrint() function
+ * 2: output execute time, Request/Response info
+ * 4: output DB query history
+ *
+ */
+ define('__DEBUG__', 0);
+}
+if(!defined('__DEBUG_OUTPUT__'))
+{
/**
- * Display XE's full version.
- * The version should be revised when releasing even if no change is made.
-
- * XE core's version name is designated development stage. Basically consist of 4 numbers. For example X.X.X.X.
-
- * First position number means 'major' update.
- * Second position number means 'minor' update.
- * Third position number '0, 1, 2, 3' means 'status' update.
- * Forth position number means 'patch' update.
-
- * Third position number for status display is consist of 0~3 numbers.
- * '0' means 'alpha' status.
- * '1' means 'beta' status.
- * '2' means 'release candidate' status.
- * '3' means 'final' status.
+ * output location of debug message
+ *
+ *
+ * 0: connect to the files/_debug_message.php and output
+ * 1: HTML output as a comment on the bottom (when response method is the HTML)
+ * 2: Firebug console output (PHP 4 & 5. Firebug/FirePHP plug-in required)
+ *
*/
- define('__XE_VERSION__', '1.7.0.0');
+ define('__DEBUG_OUTPUT__', 0);
+}
+if(!defined('__DEBUG_PROTECT__'))
+{
/**
- * @deprecated __ZBXE_VERSION__ will be removed. Use __XE_VERSION__ instead.
+ * output comments of the firePHP console and browser
+ *
+ *
+ * 0: No limit (not recommended)
+ * 1: Allow only specified IP addresses
+ *
*/
- define('__ZBXE_VERSION__', __XE_VERSION__);
+ define('__DEBUG_PROTECT__', 1);
+}
+if(!defined('__DEBUG_PROTECT_IP__'))
+{
/**
- * The base path to where you installed zbXE Wanted
+ * Set a ip address to allow debug
*/
- define('_XE_PATH_', str_replace('config/config.inc.php', '', str_replace('\\', '/', __FILE__)));
+ define('__DEBUG_PROTECT_IP__', '127.0.0.1');
+}
-
- // Set can use other method instead cookie to store session id(for file upload)
- ini_set('session.use_only_cookies', 0);
-
-
- if(file_exists(_XE_PATH_.'config/package.inc.php')) {
- require _XE_PATH_.'config/package.inc.php';
- } else {
- /**
- * Package type
- */
- define('_XE_PACKAGE_','XE');
-
- /**
- * Location
- */
- define('_XE_LOCATION_','en');
-
- /**
- * Location site
- */
- define('_XE_LOCATION_SITE_','http://www.xpressengine.org/');
-
- /**
- * Download server
- */
- define('_XE_DOWNLOAD_SERVER_','http://en.download.xpressengine.org/');
- }
-
- /*
- * user configuration files which override the default settings
- * save the following information into config/config.user.inc.php
- *
+ * 0: No output
+ * 1: files/_debug_db_query.php connected to the output
+ *
*/
- if(file_exists(_XE_PATH_.'config/config.user.inc.php')) {
- require _XE_PATH_.'config/config.user.inc.php';
- }
+ define('__DEBUG_DB_OUTPUT__', 0);
+}
- if(!defined('__DEBUG__'))
- {
- /**
- * output debug message(bit value)
- *
- *
- * 0: generate debug messages/not display
- * 1: display messages through debugPrint() function
- * 2: output execute time, Request/Response info
- * 4: output DB query history
- *
- */
- define('__DEBUG__', 0);
- }
+if(!defined('__LOG_SLOW_QUERY__'))
+{
+ /**
+ * Query log for only timeout query among DB queries
+ *
+ *
+ * 0: Do not leave a log
+ * = 0: leave a log when the slow query takes over specified seconds
+ * Log file is saved as ./files/_db_slow_query.php file
+ *
+ */
+ define('__LOG_SLOW_QUERY__', 0);
+}
- if(!defined('__DEBUG_OUTPUT__'))
- {
- /**
- * output location of debug message
- *
- *
- * 0: connect to the files/_debug_message.php and output
- * 1: HTML output as a comment on the bottom (when response method is the HTML)
- * 2: Firebug console output (PHP 4 & 5. Firebug/FirePHP plug-in required)
- *
- */
- define('__DEBUG_OUTPUT__', 0);
- }
+if(!defined('__DEBUG_QUERY__'))
+{
+ /**
+ * Leave DB query information
+ *
+ *
+ * 0: Do not add information to the query
+ * 1: Comment the XML Query ID
+ *
+ */
+ define('__DEBUG_QUERY__', 0);
+}
- if(!defined('__DEBUG_PROTECT__'))
- {
- /**
- * output comments of the firePHP console and browser
- *
- *
- * 0: No limit (not recommended)
- * 1: Allow only specified IP addresses
- *
- */
- define('__DEBUG_PROTECT__', 1);
- }
+if(!defined('__OB_GZHANDLER_ENABLE__'))
+{
+ /**
+ * option to enable/disable a compression feature using ob_gzhandler
+ *
+ *
+ * 0: Not used
+ * 1: Enabled
+ * Only particular servers may have a problem in IE browser when sending a compression
+ *
+ */
+ define('__OB_GZHANDLER_ENABLE__', 1);
+}
- if(!defined('__DEBUG_PROTECT_IP__'))
- {
- /**
- * Set a ip address to allow debug
- */
- define('__DEBUG_PROTECT_IP__', '127.0.0.1');
- }
+if(!defined('__ENABLE_PHPUNIT_TEST__'))
+{
+ /**
+ * decide to use/not use the php unit test (Path/tests/index.php)
+ *
+ *
+ * 0: Not used
+ * 1: Enabled
+ *
+ */
+ define('__ENABLE_PHPUNIT_TEST__', 0);
+}
- if(!defined('__DEBUG_DB_OUTPUT__'))
- {
- /**
- * DB error message definition
- *
- *
- * 0: No output
- * 1: files/_debug_db_query.php connected to the output
- *
- */
- define('__DEBUG_DB_OUTPUT__', 0);
- }
+if(!defined('__PROXY_SERVER__'))
+{
+ /**
+ * __PROXY_SERVER__ has server information to request to the external through the target server
+ * FileHandler:: getRemoteResource uses the constant
+ */
+ define('__PROXY_SERVER__', null);
+}
- if(!defined('__LOG_SLOW_QUERY__'))
- {
- /**
- * Query log for only timeout query among DB queries
- *
- *
- * 0: Do not leave a log
- * = 0: leave a log when the slow query takes over specified seconds
- * Log file is saved as ./files/_db_slow_query.php file
- *
- */
- define('__LOG_SLOW_QUERY__', 0);
- }
+if(!defined('__XE_CDN_PREFIX__'))
+{
+ /**
+ * CDN prefix
+ */
+ define('__XE_CDN_PREFIX__', 'http://static.xpressengine.com/core/');
+}
- if(!defined('__DEBUG_QUERY__'))
- {
- /**
- * Leave DB query information
- *
- *
- * 0: Do not add information to the query
- * 1: Comment the XML Query ID
- *
- */
- define('__DEBUG_QUERY__', 0);
- }
+if(!defined('__XE_CDN_VERSION__'))
+{
+ /**
+ * CDN version
+ */
+ define('__XE_CDN_VERSION__', '%__XE_CDN_VERSION__%');
+}
- if(!defined('__OB_GZHANDLER_ENABLE__'))
- {
- /**
- * option to enable/disable a compression feature using ob_gzhandler
- *
- *
- * 0: Not used
- * 1: Enabled
- * Only particular servers may have a problem in IE browser when sending a compression
- *
- */
- define('__OB_GZHANDLER_ENABLE__', 1);
- }
+// Require specific files when using Firebug console output
+if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '6.0.0') === -1)
+{
+ require _XE_PATH_.'libs/FirePHPCore/FirePHP.class.php';
+}
- if(!defined('__ENABLE_PHPUNIT_TEST__'))
- {
- /**
- * decide to use/not use the php unit test (Path/tests/index.php)
- *
- *
- * 0: Not used
- * 1: Enabled
- *
- */
- define('__ENABLE_PHPUNIT_TEST__', 0);
- }
+// Set Timezone as server time
+if(version_compare(PHP_VERSION, '5.3.0') >= 0)
+{
+ date_default_timezone_set(@date_default_timezone_get());
+}
- if(!defined('__PROXY_SERVER__'))
- {
- /**
- * __PROXY_SERVER__ has server information to request to the external through the target server
- * FileHandler:: getRemoteResource uses the constant
- */
- define('__PROXY_SERVER__', null);
- }
+if(!defined('__XE_LOADED_CLASS__'))
+{
+ // Require a function-defined-file for simple use
+ require(_XE_PATH_.'config/func.inc.php');
- if(!defined('__XE_CDN_PREFIX__'))
- {
- /**
- * CDN prefix
- */
- define('__XE_CDN_PREFIX__', 'http://static.xpressengine.com/core/');
- }
+ if(__DEBUG__) define('__StartTime__', getMicroTime());
- if(!defined('__XE_CDN_VERSION__'))
- {
- /**
- * CDN version
- */
- define('__XE_CDN_VERSION__', '%__XE_CDN_VERSION__%');
- }
-
- // Require specific files when using Firebug console output
- if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '6.0.0') === -1) {
- require _XE_PATH_.'libs/FirePHPCore/FirePHP.class.php';
- }
-
- // Set Timezone as server time
- if(version_compare(PHP_VERSION, '5.3.0') >= 0)
- {
- date_default_timezone_set(@date_default_timezone_get());
- }
-
- if(!defined('__XE_LOADED_CLASS__')){
- // Require a function-defined-file for simple use
- require(_XE_PATH_.'config/func.inc.php');
-
- if(__DEBUG__) define('__StartTime__', getMicroTime());
-
- // include the class files
- //TODO When _autoload() can be used for PHP5 based applications, it will be removed.
- if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime());
- require(_XE_PATH_.'classes/object/Object.class.php');
- require(_XE_PATH_.'classes/extravar/Extravar.class.php');
- require(_XE_PATH_.'classes/handler/Handler.class.php');
- require(_XE_PATH_.'classes/xml/XmlParser.class.php');
- require(_XE_PATH_.'classes/xml/XmlGenerator.class.php');
- require(_XE_PATH_.'classes/xml/XmlJsFilter.class.php');
- require(_XE_PATH_.'classes/xml/XmlLangParser.class.php');
- require(_XE_PATH_.'classes/cache/CacheHandler.class.php');
- require(_XE_PATH_.'classes/context/Context.class.php');
- require(_XE_PATH_.'classes/db/DB.class.php');
- require(_XE_PATH_.'classes/file/FileHandler.class.php');
- require(_XE_PATH_.'classes/widget/WidgetHandler.class.php');
- require(_XE_PATH_.'classes/editor/EditorHandler.class.php');
- require(_XE_PATH_.'classes/module/ModuleObject.class.php');
- require(_XE_PATH_.'classes/module/ModuleHandler.class.php');
- require(_XE_PATH_.'classes/display/DisplayHandler.class.php');
- require(_XE_PATH_.'classes/template/TemplateHandler.class.php');
- require(_XE_PATH_.'classes/mail/Mail.class.php');
- require(_XE_PATH_.'classes/page/PageHandler.class.php');
- require(_XE_PATH_.'classes/mobile/Mobile.class.php');
- require(_XE_PATH_.'classes/validator/Validator.class.php');
- require(_XE_PATH_.'classes/frontendfile/FrontEndFileHandler.class.php');
- require(_XE_PATH_.'classes/security/Security.class.php');
- if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
- }
-?>
+ // include the class files
+ //TODO When _autoload() can be used for PHP5 based applications, it will be removed.
+ if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime());
+ require(_XE_PATH_.'classes/object/Object.class.php');
+ require(_XE_PATH_.'classes/extravar/Extravar.class.php');
+ require(_XE_PATH_.'classes/handler/Handler.class.php');
+ require(_XE_PATH_.'classes/xml/XmlParser.class.php');
+ require(_XE_PATH_.'classes/xml/XmlGenerator.class.php');
+ require(_XE_PATH_.'classes/xml/XmlJsFilter.class.php');
+ require(_XE_PATH_.'classes/xml/XmlLangParser.class.php');
+ require(_XE_PATH_.'classes/cache/CacheHandler.class.php');
+ require(_XE_PATH_.'classes/context/Context.class.php');
+ require(_XE_PATH_.'classes/db/DB.class.php');
+ require(_XE_PATH_.'classes/file/FileHandler.class.php');
+ require(_XE_PATH_.'classes/widget/WidgetHandler.class.php');
+ require(_XE_PATH_.'classes/editor/EditorHandler.class.php');
+ require(_XE_PATH_.'classes/module/ModuleObject.class.php');
+ require(_XE_PATH_.'classes/module/ModuleHandler.class.php');
+ require(_XE_PATH_.'classes/display/DisplayHandler.class.php');
+ require(_XE_PATH_.'classes/template/TemplateHandler.class.php');
+ require(_XE_PATH_.'classes/mail/Mail.class.php');
+ require(_XE_PATH_.'classes/page/PageHandler.class.php');
+ require(_XE_PATH_.'classes/mobile/Mobile.class.php');
+ require(_XE_PATH_.'classes/validator/Validator.class.php');
+ require(_XE_PATH_.'classes/frontendfile/FrontEndFileHandler.class.php');
+ require(_XE_PATH_.'classes/security/Security.class.php');
+ if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
+}
+/* End of file config.inc.php */
+/* Location: ./config/config.inc.php */
diff --git a/config/func.inc.php b/config/func.inc.php
index 351a5399c..9f0822f6b 100644
--- a/config/func.inc.php
+++ b/config/func.inc.php
@@ -1,1153 +1,1236 @@
'[GMT -12:00] Baker Island Time',
- '-1100' => '[GMT -11:00] Niue Time, Samoa Standard Time',
- '-1000' => '[GMT -10:00] Hawaii-Aleutian Standard Time, Cook Island Time',
- '-0930' => '[GMT -09:30] Marquesas Islands Time',
- '-0900' => '[GMT -09:00] Alaska Standard Time, Gambier Island Time',
- '-0800' => '[GMT -08:00] Pacific Standard Time',
- '-0700' => '[GMT -07:00] Mountain Standard Time',
- '-0600' => '[GMT -06:00] Central Standard Time',
- '-0500' => '[GMT -05:00] Eastern Standard Time',
- '-0400' => '[GMT -04:00] Atlantic Standard Time',
- '-0330' => '[GMT -03:30] Newfoundland Standard Time',
- '-0300' => '[GMT -03:00] Amazon Standard Time, Central Greenland Time',
- '-0200' => '[GMT -02:00] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time',
- '-0100' => '[GMT -01:00] Azores Standard Time, Cape Verde Time, Eastern Greenland Time',
- '0000' => '[GMT 00:00] Western European Time, Greenwich Mean Time',
- '+0100' => '[GMT +01:00] Central European Time, West African Time',
- '+0200' => '[GMT +02:00] Eastern European Time, Central African Time',
- '+0300' => '[GMT +03:00] Moscow Standard Time, Eastern African Time',
- '+0330' => '[GMT +03:30] Iran Standard Time',
- '+0400' => '[GMT +04:00] Gulf Standard Time, Samara Standard Time',
- '+0430' => '[GMT +04:30] Afghanistan Time',
- '+0500' => '[GMT +05:00] Pakistan Standard Time, Yekaterinburg Standard Time',
- '+0530' => '[GMT +05:30] Indian Standard Time, Sri Lanka Time',
- '+0545' => '[GMT +05:45] Nepal Time',
- '+0600' => '[GMT +06:00] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time',
- '+0630' => '[GMT +06:30] Cocos Islands Time, Myanmar Time',
- '+0700' => '[GMT +07:00] Indochina Time, Krasnoyarsk Standard Time',
- '+0800' => '[GMT +08:00] China Standard Time, Australian Western Standard Time, Irkutsk Standard Time',
- '+0845' => '[GMT +08:45] Southeastern Western Australia Standard Time',
- '+0900' => '[GMT +09:00] Korea Standard Time, Japan Standard Time',
- '+0930' => '[GMT +09:30] Australian Central Standard Time',
- '+1000' => '[GMT +10:00] Australian Eastern Standard Time, Vladivostok Standard Time',
- '+1030' => '[GMT +10:30] Lord Howe Standard Time',
- '+1100' => '[GMT +11:00] Solomon Island Time, Magadan Standard Time',
- '+1130' => '[GMT +11:30] Norfolk Island Time',
- '+1200' => '[GMT +12:00] New Zealand Time, Fiji Time, Kamchatka Standard Time',
- '+1245' => '[GMT +12:45] Chatham Islands Time',
- '+1300' => '[GMT +13:00] Tonga Time, Phoenix Islands Time',
- '+1400' => '[GMT +14:00] Line Island Time'
- ) ;
-
- /**
- * Define a function to use {@see ModuleHandler::getModuleObject()} ($module_name, $type)
- *
- * @param string $module_name The module name to get a instance
- * @param string $type disp, proc, controller, class
- * @param string $kind admin, null
- * @return mixed Module instance
- */
- function &getModule($module_name, $type = 'view', $kind = '') {
- return ModuleHandler::getModuleInstance($module_name, $type, $kind);
- }
-
- /**
- * Create a controller instance of the module
- *
- * @param string $module_name The module name to get a controller instance
- * @return mixed Module controller instance
- */
- function &getController($module_name) {
- return getModule($module_name, 'controller');
- }
-
- /**
- * Create a admin controller instance of the module
- *
- * @param string $module_name The module name to get a admin controller instance
- * @return mixed Module admin controller instance
- **/
- function &getAdminController($module_name) {
- return getModule($module_name, 'controller','admin');
- }
-
- /**
- * Create a view instance of the module
- *
- * @param string $module_name The module name to get a view instance
- * @return mixed Module view instance
- **/
- function &getView($module_name) {
- return getModule($module_name, 'view');
- }
-
- /**
- * Create a mobile instance of the module
- *
- * @param string $module_name The module name to get a mobile instance
- * @return mixed Module mobile instance
- **/
- function &getMobile($module_name) {
- return getModule($module_name, 'mobile');
- }
-
- /**
- * Create a admin view instance of the module
- *
- * @param string $module_name The module name to get a admin view instance
- * @return mixed Module admin view instance
- **/
- function &getAdminView($module_name) {
- return getModule($module_name, 'view','admin');
- }
-
- /**
- * Create a model instance of the module
- *
- * @param string $module_name The module name to get a model instance
- * @return mixed Module model instance
- **/
- function &getModel($module_name) {
- return getModule($module_name, 'model');
- }
-
- /**
- * Create an admin model instance of the module
- *
- * @param string $module_name The module name to get a admin model instance
- * @return mixed Module admin model instance
- **/
- function &getAdminModel($module_name) {
- return getModule($module_name, 'model','admin');
- }
-
- /**
- * Create an api instance of the module
- *
- * @param string $module_name The module name to get a api instance
- * @return mixed Module api class instance
- **/
- function &getAPI($module_name) {
- return getModule($module_name, 'api');
- }
-
- /**
- * Create a wap instance of the module
- *
- * @param string $module_name The module name to get a wap instance
- * @return mixed Module wap class instance
- **/
- function &getWAP($module_name) {
- return getModule($module_name, 'wap');
- }
-
- /**
- * Create a class instance of the module
- *
- * @param string $module_name The module name to get a class instance
- * @return mixed Module class instance
- **/
- function &getClass($module_name) {
- return getModule($module_name, 'class');
- }
-
- /**
- * The alias of DB::executeQuery()
- *
- * @see DB::executeQuery()
- * @param string $query_id (module name.query XML file)
- * @param object $args values of args object
- * @param string[] $arg_columns Column list
- * @return object Query result data
- **/
- function executeQuery($query_id, $args = null, $arg_columns = null) {
- $oDB = &DB::getInstance();
- return $oDB->executeQuery($query_id, $args, $arg_columns);
- }
-
- /**
- * Function to handle the result of DB::executeQuery() as an array
- *
- * @see DB::executeQuery()
- * @see executeQuery()
- * @param string $query_id (module name.query XML file)
- * @param object $args values of args object
- * @param string[] $arg_columns Column list
- * @return object Query result data
- **/
- function executeQueryArray($query_id, $args = null, $arg_columns = null) {
- $oDB = &DB::getInstance();
- $output = $oDB->executeQuery($query_id, $args, $arg_columns);
- if(!is_array($output->data) && count($output->data) > 0){
- $output->data = array($output->data);
- }
- return $output;
- }
-
- /**
- * Alias of DB::getNextSequence()
- *
- * @see DB::getNextSequence()
- * @return int
- **/
- function getNextSequence() {
- $oDB = &DB::getInstance();
- return $oDB->getNextSequence();
- }
-
- /**
- * Get a encoded url. Define a function to use Context::getUrl()
- *
- * getUrl() returns the URL transformed from given arguments of RequestURI
- *
- * argument format follows as (key, value).
- * ex) getUrl('key1', 'val1', 'key2',''): transform key1 and key2 to val1 and '' respectively
- * returns URL without the argument if no argument is given.
- * URL made of args_list added to RequestUri if the first argument value is ''.
- *
- *
- * @return string
- **/
- function getUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- if($num_args) $url = Context::getUrl($num_args, $args_list);
- else $url = Context::getRequestUri();
-
- return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
- }
-
- /**
- * Get a not encoded(html entity) url
- *
- * @see getUrl()
- * @return string
- */
- function getNotEncodedUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- if($num_args) $url = Context::getUrl($num_args, $args_list, null, false);
- else $url = Context::getRequestUri();
-
- return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
- }
-
- /**
- * Get a encoded url. If url is encoded, not encode. Otherwise html encode the url.
- *
- * @see getUrl()
- * @return string
- */
- function getAutoEncodedUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- if($num_args) $url = Context::getUrl($num_args, $args_list, null, true, true);
- else $url = Context::getRequestUri();
-
- return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
- }
-
- /**
- * Return the value adding request uri to getUrl() to get the full url
- *
- * @return string
- **/
- function getFullUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
- $request_uri = Context::getRequestUri();
- if(!$num_args) return $request_uri;
-
- $url = Context::getUrl($num_args, $args_list);
- if(!preg_match('/^http/i',$url)){
- preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
- return substr($match[0],0,-1).$url;
- }
- return $url;
- }
-
- /**
- * Return the value adding request uri to getUrl() to get the not encoded full url
- *
- * @return string
- **/
- function getNotEncodedFullUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
- $request_uri = Context::getRequestUri();
- if(!$num_args) return $request_uri;
-
- $url = Context::getUrl($num_args, $args_list, null, false);
- if(!preg_match('/^http/i',$url)){
- preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
- $url = Context::getUrl($num_args, $args_list, null, false);
- return substr($match[0],0,-1).$url;
- }
- return $url;
- }
-
- /**
- * getSiteUrl() returns the URL by transforming the given argument value of domain
- * The first argument should consist of domain("http://" not included) and path
- *
- * @return string
- **/
- function getSiteUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- if(!$num_args) return Context::getRequestUri();
-
- $domain = array_shift($args_list);
- $num_args = count($args_list);
-
- return Context::getUrl($num_args, $args_list, $domain);
- }
-
- /**
- * getSiteUrl() returns the not encoded URL by transforming the given argument value of domain
- * The first argument should consist of domain("http://" not included) and path
- *
- * @return string
- **/
- function getNotEncodedSiteUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- if(!$num_args) return Context::getRequestUri();
-
- $domain = array_shift($args_list);
- $num_args = count($args_list);
-
- return Context::getUrl($num_args, $args_list, $domain, false);
- }
-
- /**
- * Return the value adding request uri to the getSiteUrl() To get the full url
- *
- * @return string
- **/
- function getFullSiteUrl() {
- $num_args = func_num_args();
- $args_list = func_get_args();
-
- $request_uri = Context::getRequestUri();
- if(!$num_args) return $request_uri;
-
- $domain = array_shift($args_list);
- $num_args = count($args_list);
-
- $url = Context::getUrl($num_args, $args_list, $domain);
- if(!preg_match('/^http/i',$url)){
- preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
- return substr($match[0],0,-1).$url;
- }
- return $url;
- }
-
- /**
- * Return if domain of the virtual site is url type or id type
- *
- * @param string $domain
- * @return bool
- **/
- function isSiteID($domain) {
- return preg_match('/^([a-z0-9\_]+)$/i', $domain);
- }
-
- /**
- * Put a given tail after trimming string to the specified size
- *
- * @param string $string The original string to trim
- * @param int $cut_size The size to be
- * @param string $tail Tail to put in the end of the string after trimming
- * @return string
- **/
- function cut_str($string, $cut_size = 0, $tail = '...')
- {
- if($cut_size < 1 || !$string) return $string;
-
- if($GLOBALS['use_mb_strimwidth'] || function_exists('mb_strimwidth'))
+// define an empty function to avoid errors when iconv function doesn't exist
+if(!function_exists('iconv')) {
+ eval('
+ function iconv($in_charset, $out_charset, $str)
{
- $GLOBALS['use_mb_strimwidth'] = TRUE;
- return mb_strimwidth($string, 0, $cut_size + 4, $tail, 'utf-8');
+ return $str;
}
+ ');
+}
- $chars = array(12, 4, 3, 5, 7, 7, 11, 8, 4, 5, 5, 6, 6, 4, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 8, 6, 8, 6, 10, 8, 8, 9, 8, 8, 7, 9, 8, 3, 6, 7, 7, 11, 8, 9, 8, 9, 8, 8, 7, 8, 8, 10, 8, 8, 8, 6, 11, 6, 6, 6, 4, 7, 7, 7, 7, 7, 3, 7, 7, 3, 3, 6, 3, 9, 7, 7, 7, 7, 4, 7, 3, 7, 6, 10, 6, 6, 7, 6, 6, 6, 9);
- $max_width = $cut_size*$chars[0]/2;
- $char_width = 0;
-
- $string_length = strlen($string);
- $char_count = 0;
-
- $idx = 0;
- while($idx < $string_length && $char_count < $cut_size && $char_width <= $max_width) {
- $c = ord(substr($string, $idx,1));
- $char_count++;
- if($c < 128)
- {
- $char_width += (int)$chars[$c-32];
- $idx++;
- }
- else if(191 < $c && $c < 224)
- {
- $char_width += $chars[4];
- $idx += 2;
- }
- else
- {
- $char_width += $chars[0];
- $idx += 3;
- }
- }
-
- $output = substr($string, 0, $idx);
- if(strlen($output) < $string_length)
- {
- $output .= $tail;
- }
-
- return $output;
- }
-
+if( !function_exists('htmlspecialchars_decode') )
+{
/**
- * Get a time gap between server's timezone and XE's timezone
+ * Decode html special characters
*
- * @return int
- */
- function zgap() {
- $time_zone = $GLOBALS['_time_zone'];
- if($time_zone < 0) $to = -1; else $to = 1;
- $t_hour = substr($time_zone, 1, 2) * $to;
- $t_min = substr($time_zone, 3, 2) * $to;
-
- $server_time_zone = date("O");
- if($server_time_zone < 0) $so = -1; else $so = 1;
- $c_hour = substr($server_time_zone, 1, 2) * $so;
- $c_min = substr($server_time_zone, 3, 2) * $so;
-
- $g_min = $t_min - $c_min;
- $g_hour = $t_hour - $c_hour;
-
- $gap = $g_min*60 + $g_hour*60*60;
- return $gap;
- }
-
- /**
- * YYYYMMDDHHIISS format changed to unix time value
- *
- * @param string $str Time value in format of YYYYMMDDHHIISS
- * @return int
- **/
- function ztime($str) {
- if(!$str) return;
- $hour = (int)substr($str,8,2);
- $min = (int)substr($str,10,2);
- $sec = (int)substr($str,12,2);
- $year = (int)substr($str,0,4);
- $month = (int)substr($str,4,2);
- $day = (int)substr($str,6,2);
- if(strlen($str) <= 8) {
- $gap = 0;
- } else {
- $gap = zgap();
- }
-
- return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap;
- }
-
- /**
- * If the recent post within a day, output format of YmdHis is "min/hours ago from now". If not within a day, it return format string.
- *
- * @param string $date Time value in format of YYYYMMDDHHIISS
- * @param string $format If gap is within a day, returns this format.
- * @return string
- **/
- function getTimeGap($date, $format = 'Y.m.d') {
- $gap = time() + zgap() - ztime($date);
-
- $lang_time_gap = Context::getLang('time_gap');
- if($gap<60) $buff = sprintf($lang_time_gap['min'], (int)($gap / 60)+1);
- elseif($gap<60*60) $buff = sprintf($lang_time_gap['mins'], (int)($gap / 60)+1);
- elseif($gap<60*60*2) $buff = sprintf($lang_time_gap['hour'], (int)($gap / 60 /60)+1);
- elseif($gap<60*60*24) $buff = sprintf($lang_time_gap['hours'], (int)($gap / 60 /60)+1);
- else $buff = zdate($date, $format);
- return $buff;
- }
-
- /**
- * Name of the month return
- *
- * @param int $month Month
- * @param boot $short If set, returns short string
- * @return string
- **/
- function getMonthName($month, $short = true) {
- $short_month = array('','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
- $long_month = array('','January','February','March','April','May','June','July','August','September','October','November','December');
- return !$short?$long_month[$month]:$short_month[$month];
- }
-
- /**
- * Change the time format YYYYMMDDHHIISS to the user defined format
- *
- * @param string|int $str YYYYMMDDHHIISS format time values
- * @param string $format Time format of php date() function
- * @param bool $conversion Means whether to convert automatically according to the language
- * @return string
- **/
- function zdate($str, $format = 'Y-m-d H:i:s', $conversion=true) {
- // return null if no target time is specified
- if(!$str) return;
- // convert the date format according to the language
- if($conversion == true) {
- switch(Context::getLangType()) {
- case 'en' :
- case 'es' :
- if($format == 'Y-m-d') $format = 'M d, Y';
- elseif($format == 'Y-m-d H:i:s') $format = 'M d, Y H:i:s';
- elseif($format == 'Y-m-d H:i') $format = 'M d, Y H:i';
- break;
- case 'vi' :
- if($format == 'Y-m-d') $format = 'd-m-Y';
- elseif($format == 'Y-m-d H:i:s') $format = 'H:i:s d-m-Y';
- elseif($format == 'Y-m-d H:i') $format = 'H:i d-m-Y';
- break;
-
- }
- }
-
- // If year value is less than 1970, handle it separately.
- if((int)substr($str,0,4) < 1970) {
- $hour = (int)substr($str,8,2);
- $min = (int)substr($str,10,2);
- $sec = (int)substr($str,12,2);
- $year = (int)substr($str,0,4);
- $month = (int)substr($str,4,2);
- $day = (int)substr($str,6,2);
-
- // leading zero?
- $lz = create_function('$n', 'return ($n>9?"":"0").$n;');
-
- $trans = array(
- 'Y'=>$year,
- 'y'=>$lz($year%100),
- 'm'=>$lz($month),
- 'n'=>$month,
- 'd'=>$lz($day),
- 'j'=>$day,
- 'G'=>$hour,
- 'H'=>$lz($hour),
- 'g'=>$hour%12,
- 'h'=>$lz($hour%12),
- 'i'=>$lz($min),
- 's'=>$lz($sec),
- 'M'=>getMonthName($month),
- 'F'=>getMonthName($month,false)
- );
-
- $string = strtr($format, $trans);
- } else {
- // if year value is greater than 1970, get unixtime by using ztime() for date() function's argument.
- $string = date($format, ztime($str));
- }
- // change day and am/pm for each language
- $unit_week = Context::getLang('unit_week');
- $unit_meridiem = Context::getLang('unit_meridiem');
- $string = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),$unit_week, $string);
- $string = str_replace(array('am','pm','AM','PM'), $unit_meridiem, $string);
- return $string;
- }
-
- /**
- * Returns encoded value of given email address for email scraping
- *
- * @param string $email The email
+ * @param string $text
* @return string
*/
- function getEncodeEmailAddress($email) {
- $return = '';
- for ($i=0,$c=strlen($email);$i<$c;$i++) {
- $return .= '' . (rand(0,1)==0 ? ord($email[$i]) : 'X'.dechex(ord($email[$i]))) . ';';
- }
- return $return;
- }
-
- /**
- * Prints debug messages
- *
- * Display $buff contents into the file ./files/_debug_message.php.
- * You can see the file on your prompt by command: tail-f./files/_debug_message.php
- *
- * @param mixed $debug_output Target object to be printed
- * @param bool $display_option boolean Flag whether to print seperator (default:true)
- * @param string $file Target file name
- * @return void
- **/
- function debugPrint($debug_output = null, $display_option = true, $file = '_debug_message.php') {
- if(!(__DEBUG__ & 1)) return;
-
- static $firephp;
- $bt = debug_backtrace();
- if(is_array($bt)) $first = array_shift($bt);
- $file_name = array_pop(explode(DIRECTORY_SEPARATOR, $first['file']));
- $line_num = $first['line'];
-
- if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) {
- if(!isset($firephp)) $firephp = FirePHP::getInstance(true);
- if(function_exists("memory_get_usage"))
- {
- $label = sprintf('[%s:%d] (m:%s)', $file_name, $line_num, FileHandler::filesize(memory_get_usage()));
- }
- else
- {
- $label = sprintf('[%s:%d] ', $file_name, $line_num);
- }
- // Check a FirePHP option
- if($display_option === 'TABLE') $label = $display_option;
- // Check if the IP specified by __DEBUG_PROTECT__ option is same as the access IP.
- if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) {
- $debug_output = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php';
- $label = null;
- }
-
- $firephp->fb($debug_output, $label);
-
- } else {
- if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) {
- return;
- }
- $debug_file = _XE_PATH_.'files/'.$file;
- if(function_exists("memory_get_usage"))
- {
- $debug_output = sprintf("[%s %s:%d] - mem(%s)\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, FileHandler::filesize(memory_get_usage()), print_r($debug_output, true));
- }
- else
- {
- $debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true));
- }
-
- if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40);
- $debug_output = "\n\n";
-
- if(@!$fp = fopen($debug_file, 'a')) return;
- fwrite($fp, $debug_output);
- fclose($fp);
- }
- }
-
-
- /**
- * microtime() return
- *
- * @return float
- **/
- function getMicroTime() {
- list($time1, $time2) = explode(' ', microtime());
- return (float)$time1 + (float)$time2;
- }
-
- /**
- * Delete the second object vars from the first argument
- *
- * @param object $target_obj An original object
- * @param object $del_obj Object vars to delete from the original object
- * @return object
- **/
- function delObjectVars($target_obj, $del_obj) {
- if(!is_object($target_obj)) return;
- if(!is_object($del_obj)) return;
-
- $target_vars = get_object_vars($target_obj);
- $del_vars = get_object_vars($del_obj);
-
- $target = array_keys($target_vars);
- $del = array_keys($del_vars);
- if(!count($target)||!count($del)) return $target_obj;
-
- $return_obj = NULL;
-
- $target_count = count($target);
- for($i = 0; $i < $target_count; $i++) {
- $target_key = $target[$i];
- if(!in_array($target_key, $del)) $return_obj->{$target_key} = $target_obj->{$target_key};
- }
-
- return $return_obj;
- }
-
- /**
- * Change error_handing to debugPrint on php5 higher
- *
- * @param int $errno
- * @param string $errstr
- * @param string $file
- * @param int $line
- * @return void
- **/
- function handleError($errno, $errstr, $file, $line) {
- if(!__DEBUG__) return;
- $errors = array(E_USER_ERROR, E_ERROR, E_PARSE);
- if(!in_array($errno, $errors)) return;
-
- $output = sprintf("Fatal error : %s - %d", $file, $line);
- $output .= sprintf("%d - %s", $errno, $errstr);
-
- debugPrint($output);
- }
-
- /**
- * Trim a given number to a fiven size recursively
- *
- * @param int $no A given number
- * @param int $size A given digits
- **/
- function getNumberingPath($no, $size=3) {
- $mod = pow(10, $size);
- $output = sprintf('%0'.$size.'d/', $no%$mod);
- if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size);
- return $output;
- }
-
- /**
- * Decode the URL in Korean
- *
- * @param string $str The url
- * @return string
- **/
- function url_decode($str) {
- return preg_replace('/%u([[:alnum:]]{4})/', '\\1;',$str);
- }
-
- function purifierHtml(&$content)
+ function htmlspecialchars_decode($text)
{
- require_once(_XE_PATH_.'classes/security/Purifier.class.php');
- $oPurifier = Purifier::getInstance();
- $oPurifier->purify($content);
+ return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
+ }
+}
+
+/**
+ * Time zone
+ * @var array
+ */
+$time_zone = array(
+ '-1200' => '[GMT -12:00] Baker Island Time',
+ '-1100' => '[GMT -11:00] Niue Time, Samoa Standard Time',
+ '-1000' => '[GMT -10:00] Hawaii-Aleutian Standard Time, Cook Island Time',
+ '-0930' => '[GMT -09:30] Marquesas Islands Time',
+ '-0900' => '[GMT -09:00] Alaska Standard Time, Gambier Island Time',
+ '-0800' => '[GMT -08:00] Pacific Standard Time',
+ '-0700' => '[GMT -07:00] Mountain Standard Time',
+ '-0600' => '[GMT -06:00] Central Standard Time',
+ '-0500' => '[GMT -05:00] Eastern Standard Time',
+ '-0400' => '[GMT -04:00] Atlantic Standard Time',
+ '-0330' => '[GMT -03:30] Newfoundland Standard Time',
+ '-0300' => '[GMT -03:00] Amazon Standard Time, Central Greenland Time',
+ '-0200' => '[GMT -02:00] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time',
+ '-0100' => '[GMT -01:00] Azores Standard Time, Cape Verde Time, Eastern Greenland Time',
+ '0000' => '[GMT 00:00] Western European Time, Greenwich Mean Time',
+ '+0100' => '[GMT +01:00] Central European Time, West African Time',
+ '+0200' => '[GMT +02:00] Eastern European Time, Central African Time',
+ '+0300' => '[GMT +03:00] Moscow Standard Time, Eastern African Time',
+ '+0330' => '[GMT +03:30] Iran Standard Time',
+ '+0400' => '[GMT +04:00] Gulf Standard Time, Samara Standard Time',
+ '+0430' => '[GMT +04:30] Afghanistan Time',
+ '+0500' => '[GMT +05:00] Pakistan Standard Time, Yekaterinburg Standard Time',
+ '+0530' => '[GMT +05:30] Indian Standard Time, Sri Lanka Time',
+ '+0545' => '[GMT +05:45] Nepal Time',
+ '+0600' => '[GMT +06:00] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time',
+ '+0630' => '[GMT +06:30] Cocos Islands Time, Myanmar Time',
+ '+0700' => '[GMT +07:00] Indochina Time, Krasnoyarsk Standard Time',
+ '+0800' => '[GMT +08:00] China Standard Time, Australian Western Standard Time, Irkutsk Standard Time',
+ '+0845' => '[GMT +08:45] Southeastern Western Australia Standard Time',
+ '+0900' => '[GMT +09:00] Korea Standard Time, Japan Standard Time',
+ '+0930' => '[GMT +09:30] Australian Central Standard Time',
+ '+1000' => '[GMT +10:00] Australian Eastern Standard Time, Vladivostok Standard Time',
+ '+1030' => '[GMT +10:30] Lord Howe Standard Time',
+ '+1100' => '[GMT +11:00] Solomon Island Time, Magadan Standard Time',
+ '+1130' => '[GMT +11:30] Norfolk Island Time',
+ '+1200' => '[GMT +12:00] New Zealand Time, Fiji Time, Kamchatka Standard Time',
+ '+1245' => '[GMT +12:45] Chatham Islands Time',
+ '+1300' => '[GMT +13:00] Tonga Time, Phoenix Islands Time',
+ '+1400' => '[GMT +14:00] Line Island Time'
+);
+
+/**
+ * Define a function to use {@see ModuleHandler::getModuleObject()} ($module_name, $type)
+ *
+ * @param string $module_name The module name to get a instance
+ * @param string $type disp, proc, controller, class
+ * @param string $kind admin, null
+ * @return mixed Module instance
+ */
+function &getModule($module_name, $type = 'view', $kind = '')
+{
+ return ModuleHandler::getModuleInstance($module_name, $type, $kind);
+}
+
+/**
+ * Create a controller instance of the module
+ *
+ * @param string $module_name The module name to get a controller instance
+ * @return mixed Module controller instance
+ */
+function &getController($module_name)
+{
+ return getModule($module_name, 'controller');
+}
+
+/**
+ * Create a admin controller instance of the module
+ *
+ * @param string $module_name The module name to get a admin controller instance
+ * @return mixed Module admin controller instance
+ */
+function &getAdminController($module_name)
+{
+ return getModule($module_name, 'controller','admin');
+}
+
+/**
+ * Create a view instance of the module
+ *
+ * @param string $module_name The module name to get a view instance
+ * @return mixed Module view instance
+ */
+function &getView($module_name)
+{
+ return getModule($module_name, 'view');
+}
+
+/**
+ * Create a mobile instance of the module
+ *
+ * @param string $module_name The module name to get a mobile instance
+ * @return mixed Module mobile instance
+ */
+function &getMobile($module_name)
+{
+ return getModule($module_name, 'mobile');
+}
+
+/**
+ * Create a admin view instance of the module
+ *
+ * @param string $module_name The module name to get a admin view instance
+ * @return mixed Module admin view instance
+ */
+function &getAdminView($module_name)
+{
+ return getModule($module_name, 'view','admin');
+}
+
+/**
+ * Create a model instance of the module
+ *
+ * @param string $module_name The module name to get a model instance
+ * @return mixed Module model instance
+ */
+function &getModel($module_name)
+{
+ return getModule($module_name, 'model');
+}
+
+/**
+ * Create an admin model instance of the module
+ *
+ * @param string $module_name The module name to get a admin model instance
+ * @return mixed Module admin model instance
+ */
+function &getAdminModel($module_name)
+{
+ return getModule($module_name, 'model','admin');
+}
+
+/**
+ * Create an api instance of the module
+ *
+ * @param string $module_name The module name to get a api instance
+ * @return mixed Module api class instance
+ */
+function &getAPI($module_name)
+{
+ return getModule($module_name, 'api');
+}
+
+/**
+ * Create a wap instance of the module
+ *
+ * @param string $module_name The module name to get a wap instance
+ * @return mixed Module wap class instance
+ */
+function &getWAP($module_name)
+{
+ return getModule($module_name, 'wap');
+}
+
+/**
+ * Create a class instance of the module
+ *
+ * @param string $module_name The module name to get a class instance
+ * @return mixed Module class instance
+ */
+function &getClass($module_name)
+{
+ return getModule($module_name, 'class');
+}
+
+/**
+ * The alias of DB::executeQuery()
+ *
+ * @see DB::executeQuery()
+ * @param string $query_id (module name.query XML file)
+ * @param object $args values of args object
+ * @param string[] $arg_columns Column list
+ * @return object Query result data
+ */
+function executeQuery($query_id, $args = null, $arg_columns = null)
+{
+ $oDB = &DB::getInstance();
+ return $oDB->executeQuery($query_id, $args, $arg_columns);
+}
+
+/**
+ * Function to handle the result of DB::executeQuery() as an array
+ *
+ * @see DB::executeQuery()
+ * @see executeQuery()
+ * @param string $query_id (module name.query XML file)
+ * @param object $args values of args object
+ * @param string[] $arg_columns Column list
+ * @return object Query result data
+ */
+function executeQueryArray($query_id, $args = null, $arg_columns = null)
+{
+ $oDB = &DB::getInstance();
+ $output = $oDB->executeQuery($query_id, $args, $arg_columns);
+ if(!is_array($output->data) && count($output->data) > 0)
+ {
+ $output->data = array($output->data);
+ }
+ return $output;
+}
+
+/**
+ * Alias of DB::getNextSequence()
+ *
+ * @see DB::getNextSequence()
+ * @return int
+ */
+function getNextSequence()
+{
+ $oDB = &DB::getInstance();
+ return $oDB->getNextSequence();
+}
+
+/**
+ * Get a encoded url. Define a function to use Context::getUrl()
+ *
+ * getUrl() returns the URL transformed from given arguments of RequestURI
+ *
+ * argument format follows as (key, value).
+ * ex) getUrl('key1', 'val1', 'key2',''): transform key1 and key2 to val1 and '' respectively
+ * returns URL without the argument if no argument is given.
+ * URL made of args_list added to RequestUri if the first argument value is ''.
+ *
+ *
+ * @return string
+ */
+function getUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ if($num_args) $url = Context::getUrl($num_args, $args_list);
+ else $url = Context::getRequestUri();
+
+ return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
+}
+
+/**
+ * Get a not encoded(html entity) url
+ *
+ * @see getUrl()
+ * @return string
+ */
+function getNotEncodedUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ if($num_args) $url = Context::getUrl($num_args, $args_list, null, false);
+ else $url = Context::getRequestUri();
+
+ return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
+}
+
+/**
+ * Get a encoded url. If url is encoded, not encode. Otherwise html encode the url.
+ *
+ * @see getUrl()
+ * @return string
+ */
+function getAutoEncodedUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ if($num_args) $url = Context::getUrl($num_args, $args_list, null, true, true);
+ else $url = Context::getRequestUri();
+
+ return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url);
+}
+
+/**
+ * Return the value adding request uri to getUrl() to get the full url
+ *
+ * @return string
+ */
+function getFullUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+ $request_uri = Context::getRequestUri();
+ if(!$num_args) return $request_uri;
+
+ $url = Context::getUrl($num_args, $args_list);
+ if(!preg_match('/^http/i',$url))
+ {
+ preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
+ return substr($match[0],0,-1).$url;
+ }
+ return $url;
+}
+
+/**
+ * Return the value adding request uri to getUrl() to get the not encoded full url
+ *
+ * @return string
+ */
+function getNotEncodedFullUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+ $request_uri = Context::getRequestUri();
+ if(!$num_args) return $request_uri;
+
+ $url = Context::getUrl($num_args, $args_list, null, false);
+ if(!preg_match('/^http/i',$url))
+ {
+ preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
+ $url = Context::getUrl($num_args, $args_list, null, false);
+ return substr($match[0],0,-1).$url;
+ }
+ return $url;
+}
+
+/**
+ * getSiteUrl() returns the URL by transforming the given argument value of domain
+ * The first argument should consist of domain("http://" not included) and path
+ *
+ * @return string
+ */
+function getSiteUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ if(!$num_args) return Context::getRequestUri();
+
+ $domain = array_shift($args_list);
+ $num_args = count($args_list);
+
+ return Context::getUrl($num_args, $args_list, $domain);
+}
+
+/**
+ * getSiteUrl() returns the not encoded URL by transforming the given argument value of domain
+ * The first argument should consist of domain("http://" not included) and path
+ *
+ * @return string
+ */
+function getNotEncodedSiteUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ if(!$num_args) return Context::getRequestUri();
+
+ $domain = array_shift($args_list);
+ $num_args = count($args_list);
+
+ return Context::getUrl($num_args, $args_list, $domain, false);
+}
+
+/**
+ * Return the value adding request uri to the getSiteUrl() To get the full url
+ *
+ * @return string
+ */
+function getFullSiteUrl()
+{
+ $num_args = func_num_args();
+ $args_list = func_get_args();
+
+ $request_uri = Context::getRequestUri();
+ if(!$num_args) return $request_uri;
+
+ $domain = array_shift($args_list);
+ $num_args = count($args_list);
+
+ $url = Context::getUrl($num_args, $args_list, $domain);
+ if(!preg_match('/^http/i',$url))
+ {
+ preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
+ return substr($match[0],0,-1).$url;
+ }
+ return $url;
+}
+
+/**
+ * Return if domain of the virtual site is url type or id type
+ *
+ * @param string $domain
+ * @return bool
+ */
+function isSiteID($domain)
+{
+ return preg_match('/^([a-z0-9\_]+)$/i', $domain);
+}
+
+/**
+ * Put a given tail after trimming string to the specified size
+ *
+ * @param string $string The original string to trim
+ * @param int $cut_size The size to be
+ * @param string $tail Tail to put in the end of the string after trimming
+ * @return string
+ */
+function cut_str($string, $cut_size = 0, $tail = '...')
+{
+ if($cut_size < 1 || !$string) return $string;
+
+ if($GLOBALS['use_mb_strimwidth'] || function_exists('mb_strimwidth'))
+ {
+ $GLOBALS['use_mb_strimwidth'] = TRUE;
+ return mb_strimwidth($string, 0, $cut_size + 4, $tail, 'utf-8');
}
- /**
- * Pre-block the codes which may be hacking attempts
- *
- * @param string $content Taget content
- * @return string
- **/
- function removeHackTag($content) {
- require_once(_XE_PATH_.'classes/security/EmbedFilter.class.php');
- $oEmbedFilter = EmbedFilter::getInstance();
- $oEmbedFilter->check($content);
+ $chars = array(12, 4, 3, 5, 7, 7, 11, 8, 4, 5, 5, 6, 6, 4, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 8, 6, 8, 6, 10, 8, 8, 9, 8, 8, 7, 9, 8, 3, 6, 7, 7, 11, 8, 9, 8, 9, 8, 8, 7, 8, 8, 10, 8, 8, 8, 6, 11, 6, 6, 6, 4, 7, 7, 7, 7, 7, 3, 7, 7, 3, 3, 6, 3, 9, 7, 7, 7, 7, 4, 7, 3, 7, 6, 10, 6, 6, 7, 6, 6, 6, 9);
+ $max_width = $cut_size*$chars[0]/2;
+ $char_width = 0;
- purifierHtml($content);
+ $string_length = strlen($string);
+ $char_count = 0;
- // change the specific tags to the common texts
- $content = preg_replace('@<(\/?(?:html|body|head|title|meta|base|link|script|style|applet)(/*)[\w\s>])@i', '<$1', $content);
-
- /**
- * Remove codes to abuse the admin session in src by tags of imaages and video postings
- * - Issue reported by Sangwon Kim
- **/
- $content = preg_replace_callback('@<(/?)([a-z]+[0-9]?)((?>"[^"]*"|\'[^\']*\'|[^>])*?\b(?:on[a-z]+|data|style|background|href|(?:dyn|low)?src)\s*=[\s\S]*?)(/?)($|>|<)@i', 'removeSrcHack', $content);
-
- // xmp tag ?인 ?추?
- $content = checkXmpTag($content);
- return $content;
- }
-
- /**
- * Check xmp tag, close it.
- *
- * @param string $content Target content
- * @return string
- **/
- function checkXmpTag($content) {
- $content = preg_replace('@<(/?)xmp.*?>@i', '<\1xmp>', $content);
-
- if(($start_xmp = strrpos($content, '')) !==false) {
- if(($close_xmp = strrpos($content, ' ')) === false) $content .= '';
- else if($close_xmp < $start_xmp) $content .= '';
+ $idx = 0;
+ while($idx < $string_length && $char_count < $cut_size && $char_width <= $max_width)
+ {
+ $c = ord(substr($string, $idx,1));
+ $char_count++;
+ if($c < 128)
+ {
+ $char_width += (int)$chars[$c-32];
+ $idx++;
+ }
+ else if(191 < $c && $c < 224)
+ {
+ $char_width += $chars[4];
+ $idx += 2;
+ }
+ else
+ {
+ $char_width += $chars[0];
+ $idx += 3;
}
-
- return $content;
}
+ $output = substr($string, 0, $idx);
+ if(strlen($output) < $string_length)
+ {
+ $output .= $tail;
+ }
+
+ return $output;
+}
+
+/**
+ * Get a time gap between server's timezone and XE's timezone
+ *
+ * @return int
+ */
+function zgap()
+{
+ $time_zone = $GLOBALS['_time_zone'];
+ if($time_zone < 0) $to = -1; else $to = 1;
+ $t_hour = substr($time_zone, 1, 2) * $to;
+ $t_min = substr($time_zone, 3, 2) * $to;
+
+ $server_time_zone = date("O");
+ if($server_time_zone < 0) $so = -1; else $so = 1;
+ $c_hour = substr($server_time_zone, 1, 2) * $so;
+ $c_min = substr($server_time_zone, 3, 2) * $so;
+
+ $g_min = $t_min - $c_min;
+ $g_hour = $t_hour - $c_hour;
+
+ $gap = $g_min*60 + $g_hour*60*60;
+ return $gap;
+}
+
+/**
+ * YYYYMMDDHHIISS format changed to unix time value
+ *
+ * @param string $str Time value in format of YYYYMMDDHHIISS
+ * @return int
+ */
+function ztime($str)
+{
+ if(!$str) return;
+ $hour = (int)substr($str,8,2);
+ $min = (int)substr($str,10,2);
+ $sec = (int)substr($str,12,2);
+ $year = (int)substr($str,0,4);
+ $month = (int)substr($str,4,2);
+ $day = (int)substr($str,6,2);
+ if(strlen($str) <= 8)
+ {
+ $gap = 0;
+ }
+ else
+ {
+ $gap = zgap();
+ }
+
+ return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap;
+}
+
+/**
+ * If the recent post within a day, output format of YmdHis is "min/hours ago from now". If not within a day, it return format string.
+ *
+ * @param string $date Time value in format of YYYYMMDDHHIISS
+ * @param string $format If gap is within a day, returns this format.
+ * @return string
+ */
+function getTimeGap($date, $format = 'Y.m.d')
+{
+ $gap = time() + zgap() - ztime($date);
+
+ $lang_time_gap = Context::getLang('time_gap');
+ if($gap<60) $buff = sprintf($lang_time_gap['min'], (int)($gap / 60)+1);
+ elseif($gap<60*60) $buff = sprintf($lang_time_gap['mins'], (int)($gap / 60)+1);
+ elseif($gap<60*60*2) $buff = sprintf($lang_time_gap['hour'], (int)($gap / 60 /60)+1);
+ elseif($gap<60*60*24) $buff = sprintf($lang_time_gap['hours'], (int)($gap / 60 /60)+1);
+ else $buff = zdate($date, $format);
+ return $buff;
+}
+
+/**
+ * Name of the month return
+ *
+ * @param int $month Month
+ * @param boot $short If set, returns short string
+ * @return string
+ */
+function getMonthName($month, $short = true)
+{
+ $short_month = array('','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
+ $long_month = array('','January','February','March','April','May','June','July','August','September','October','November','December');
+ return !$short?$long_month[$month]:$short_month[$month];
+}
+
+/**
+ * Change the time format YYYYMMDDHHIISS to the user defined format
+ *
+ * @param string|int $str YYYYMMDDHHIISS format time values
+ * @param string $format Time format of php date() function
+ * @param bool $conversion Means whether to convert automatically according to the language
+ * @return string
+ */
+function zdate($str, $format = 'Y-m-d H:i:s', $conversion=true)
+{
+ // return null if no target time is specified
+ if(!$str) return;
+ // convert the date format according to the language
+ if($conversion == true)
+ {
+ switch(Context::getLangType())
+ {
+ case 'en' :
+ case 'es' :
+ if($format == 'Y-m-d') $format = 'M d, Y';
+ elseif($format == 'Y-m-d H:i:s') $format = 'M d, Y H:i:s';
+ elseif($format == 'Y-m-d H:i') $format = 'M d, Y H:i';
+ break;
+ case 'vi' :
+ if($format == 'Y-m-d') $format = 'd-m-Y';
+ elseif($format == 'Y-m-d H:i:s') $format = 'H:i:s d-m-Y';
+ elseif($format == 'Y-m-d H:i') $format = 'H:i d-m-Y';
+ break;
+ }
+ }
+
+ // If year value is less than 1970, handle it separately.
+ if((int)substr($str,0,4) < 1970)
+ {
+ $hour = (int)substr($str,8,2);
+ $min = (int)substr($str,10,2);
+ $sec = (int)substr($str,12,2);
+ $year = (int)substr($str,0,4);
+ $month = (int)substr($str,4,2);
+ $day = (int)substr($str,6,2);
+
+ // leading zero?
+ $lz = create_function('$n', 'return ($n>9?"":"0").$n;');
+
+ $trans = array(
+ 'Y'=>$year,
+ 'y'=>$lz($year%100),
+ 'm'=>$lz($month),
+ 'n'=>$month,
+ 'd'=>$lz($day),
+ 'j'=>$day,
+ 'G'=>$hour,
+ 'H'=>$lz($hour),
+ 'g'=>$hour%12,
+ 'h'=>$lz($hour%12),
+ 'i'=>$lz($min),
+ 's'=>$lz($sec),
+ 'M'=>getMonthName($month),
+ 'F'=>getMonthName($month,false)
+ );
+
+ $string = strtr($format, $trans);
+ }
+ else
+ {
+ // if year value is greater than 1970, get unixtime by using ztime() for date() function's argument.
+ $string = date($format, ztime($str));
+ }
+ // change day and am/pm for each language
+ $unit_week = Context::getLang('unit_week');
+ $unit_meridiem = Context::getLang('unit_meridiem');
+ $string = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),$unit_week, $string);
+ $string = str_replace(array('am','pm','AM','PM'), $unit_meridiem, $string);
+ return $string;
+}
+
+/**
+ * Returns encoded value of given email address for email scraping
+ *
+ * @param string $email The email
+ * @return string
+ */
+function getEncodeEmailAddress($email)
+{
+ $return = '';
+ for ($i=0,$c=strlen($email);$i<$c;$i++)
+ {
+ $return .= '' . (rand(0,1)==0 ? ord($email[$i]) : 'X'.dechex(ord($email[$i]))) . ';';
+ }
+ return $return;
+}
+
+/**
+ * Prints debug messages
+ *
+ * Display $buff contents into the file ./files/_debug_message.php.
+ * You can see the file on your prompt by command: tail-f./files/_debug_message.php
+ *
+ * @param mixed $debug_output Target object to be printed
+ * @param bool $display_option boolean Flag whether to print seperator (default:true)
+ * @param string $file Target file name
+ * @return void
+ */
+function debugPrint($debug_output = null, $display_option = true, $file = '_debug_message.php')
+{
+ if(!(__DEBUG__ & 1)) return;
+
+ static $firephp;
+ $bt = debug_backtrace();
+ if(is_array($bt)) $first = array_shift($bt);
+ $file_name = array_pop(explode(DIRECTORY_SEPARATOR, $first['file']));
+ $line_num = $first['line'];
+
+ if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1)
+ {
+ if(!isset($firephp)) $firephp = FirePHP::getInstance(true);
+ if(function_exists("memory_get_usage"))
+ {
+ $label = sprintf('[%s:%d] (m:%s)', $file_name, $line_num, FileHandler::filesize(memory_get_usage()));
+ }
+ else
+ {
+ $label = sprintf('[%s:%d] ', $file_name, $line_num);
+ }
+ // Check a FirePHP option
+ if($display_option === 'TABLE') $label = $display_option;
+ // Check if the IP specified by __DEBUG_PROTECT__ option is same as the access IP.
+ if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR'])
+ {
+ $debug_output = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php';
+ $label = null;
+ }
+
+ $firephp->fb($debug_output, $label);
+
+ }
+ else
+ {
+ if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR'])
+ {
+ return;
+ }
+ $debug_file = _XE_PATH_.'files/'.$file;
+ if(function_exists("memory_get_usage"))
+ {
+ $debug_output = sprintf("[%s %s:%d] - mem(%s)\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, FileHandler::filesize(memory_get_usage()), print_r($debug_output, true));
+ }
+ else
+ {
+ $debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true));
+ }
+
+ if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40);
+ $debug_output = "\n\n";
+
+ if(@!$fp = fopen($debug_file, 'a')) return;
+ fwrite($fp, $debug_output);
+ fclose($fp);
+ }
+}
+
+/**
+ * microtime() return
+ *
+ * @return float
+ */
+function getMicroTime()
+{
+ list($time1, $time2) = explode(' ', microtime());
+ return (float)$time1 + (float)$time2;
+}
+
+/**
+ * Delete the second object vars from the first argument
+ *
+ * @param object $target_obj An original object
+ * @param object $del_obj Object vars to delete from the original object
+ * @return object
+ */
+function delObjectVars($target_obj, $del_obj)
+{
+ if(!is_object($target_obj)) return;
+ if(!is_object($del_obj)) return;
+
+ $target_vars = get_object_vars($target_obj);
+ $del_vars = get_object_vars($del_obj);
+
+ $target = array_keys($target_vars);
+ $del = array_keys($del_vars);
+ if(!count($target)||!count($del)) return $target_obj;
+
+ $return_obj = NULL;
+
+ $target_count = count($target);
+ for($i = 0; $i < $target_count; $i++)
+ {
+ $target_key = $target[$i];
+ if(!in_array($target_key, $del)) $return_obj->{$target_key} = $target_obj->{$target_key};
+ }
+
+ return $return_obj;
+}
+
+/**
+ * Change error_handing to debugPrint on php5 higher
+ *
+ * @param int $errno
+ * @param string $errstr
+ * @param string $file
+ * @param int $line
+ * @return void
+ */
+function handleError($errno, $errstr, $file, $line)
+{
+ if(!__DEBUG__) return;
+ $errors = array(E_USER_ERROR, E_ERROR, E_PARSE);
+ if(!in_array($errno, $errors)) return;
+
+ $output = sprintf("Fatal error : %s - %d", $file, $line);
+ $output .= sprintf("%d - %s", $errno, $errstr);
+
+ debugPrint($output);
+}
+
+/**
+ * Trim a given number to a fiven size recursively
+ *
+ * @param int $no A given number
+ * @param int $size A given digits
+ */
+function getNumberingPath($no, $size=3)
+{
+ $mod = pow(10, $size);
+ $output = sprintf('%0'.$size.'d/', $no%$mod);
+ if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size);
+ return $output;
+}
+
+/**
+ * Decode the URL in Korean
+ *
+ * @param string $str The url
+ * @return string
+ */
+function url_decode($str)
+{
+ return preg_replace('/%u([[:alnum:]]{4})/', '\\1;',$str);
+}
+
+function purifierHtml(&$content)
+{
+ require_once(_XE_PATH_.'classes/security/Purifier.class.php');
+ $oPurifier = Purifier::getInstance();
+ $oPurifier->purify($content);
+}
+
+/**
+ * Pre-block the codes which may be hacking attempts
+ *
+ * @param string $content Taget content
+ * @return string
+ */
+function removeHackTag($content)
+{
+ require_once(_XE_PATH_.'classes/security/EmbedFilter.class.php');
+ $oEmbedFilter = EmbedFilter::getInstance();
+ $oEmbedFilter->check($content);
+
+ purifierHtml($content);
+
+ // change the specific tags to the common texts
+ $content = preg_replace('@<(\/?(?:html|body|head|title|meta|base|link|script|style|applet)(/*)[\w\s>])@i', '<$1', $content);
+
/**
- * Remove src hack(preg_replace_callback)
- *
- * @param array $match
- * @return string
+ * Remove codes to abuse the admin session in src by tags of imaages and video postings
+ * - Issue reported by Sangwon Kim
*/
- function removeSrcHack($match) {
- $tag = strtolower($match[2]);
+ $content = preg_replace_callback('@<(/?)([a-z]+[0-9]?)((?>"[^"]*"|\'[^\']*\'|[^>])*?\b(?:on[a-z]+|data|style|background|href|(?:dyn|low)?src)\s*=[\s\S]*?)(/?)($|>|<)@i', 'removeSrcHack', $content);
- // xmp tag ?리
- if($tag=='xmp') return "<{$match[1]}xmp>";
- if($match[1]) return $match[0];
- if($match[4]) $match[4] = ' '.$match[4];
+ // xmp tag ?인 ?추?
+ $content = checkXmpTag($content);
+ return $content;
+}
- $attrs = array();
- if(preg_match_all('/([\w:-]+)\s*=(?:\s*(["\']))?(?(2)(.*?)\2|([^ ]+))/s', $match[3], $m)) {
- foreach($m[1] as $idx=>$name){
- if(substr($name,0,2) == 'on') continue;
+/**
+ * Check xmp tag, close it.
+ *
+ * @param string $content Target content
+ * @return string
+ */
+function checkXmpTag($content)
+{
+ $content = preg_replace('@<(/?)xmp.*?>@i', '<\1xmp>', $content);
- $val = preg_replace('/(?:x([a-fA-F0-9]+)|0*(\d+));/e','chr("\\1"?0x00\\1:\\2+0)',$m[3][$idx].$m[4][$idx]);
- $val = preg_replace('/^\s+|[\t\n\r]+/', '', $val);
+ if(($start_xmp = strrpos($content, '')) !==false)
+ {
+ if(($close_xmp = strrpos($content, ' ')) === false) $content .= '';
+ else if($close_xmp < $start_xmp) $content .= '';
+ }
- if(preg_match('/^[a-z]+script:/i', $val)) continue;
+ return $content;
+}
- $attrs[$name] = $val;
- }
+/**
+ * Remove src hack(preg_replace_callback)
+ *
+ * @param array $match
+ * @return string
+ */
+function removeSrcHack($match)
+{
+ $tag = strtolower($match[2]);
+
+ // xmp tag ?리
+ if($tag=='xmp') return "<{$match[1]}xmp>";
+ if($match[1]) return $match[0];
+ if($match[4]) $match[4] = ' '.$match[4];
+
+ $attrs = array();
+ if(preg_match_all('/([\w:-]+)\s*=(?:\s*(["\']))?(?(2)(.*?)\2|([^ ]+))/s', $match[3], $m))
+ {
+ foreach($m[1] as $idx=>$name)
+ {
+ if(substr($name,0,2) == 'on') continue;
+
+ $val = preg_replace('/(?:x([a-fA-F0-9]+)|0*(\d+));/e','chr("\\1"?0x00\\1:\\2+0)',$m[3][$idx].$m[4][$idx]);
+ $val = preg_replace('/^\s+|[\t\n\r]+/', '', $val);
+
+ if(preg_match('/^[a-z]+script:/i', $val)) continue;
+
+ $attrs[$name] = $val;
}
+ }
- if(isset($attrs['style']) && preg_match('@(?:/\*|\*/|\n|:\s*expression\s*\()@i', $attrs['style'])) {
- unset($attrs['style']);
- }
+ if(isset($attrs['style']) && preg_match('@(?:/\*|\*/|\n|:\s*expression\s*\()@i', $attrs['style']))
+ {
+ unset($attrs['style']);
+ }
- $attr = array();
- foreach($attrs as $name=>$val) {
- if($tag == 'object' || $tag == 'embed' || $tag == 'a')
+ $attr = array();
+ foreach($attrs as $name=>$val)
+ {
+ if($tag == 'object' || $tag == 'embed' || $tag == 'a')
+ {
+ $attribute = strtolower(trim($name));
+ if($attribute == 'data' || $attribute == 'src' || $attribute == 'href')
{
- $attribute = strtolower(trim($name));
- if($attribute == 'data' || $attribute == 'src' || $attribute == 'href')
- {
- if(strpos(strtolower($val), 'data:') === 0)
- {
- continue;
- }
- }
- }
-
- if($tag == 'img')
- {
- $attribute = strtolower(trim($name));
if(strpos(strtolower($val), 'data:') === 0)
{
continue;
}
}
- $val = str_replace('"', '"', $val);
- $attr[] = $name."=\"{$val}\"";
- }
- $attr = count($attr)?' '.implode(' ',$attr):'';
-
- return "<{$match[1]}{$tag}{$attr}{$match[4]}>";
- }
-
- // convert hexa value to RGB
- if(!function_exists('hexrgb')) {
- /**
- * Convert hexa value to RGB
- *
- * @param string $hexstr
- * @return array
- */
- function hexrgb($hexstr) {
- $int = hexdec($hexstr);
-
- return array('red' => 0xFF & ($int >> 0x10),
- 'green' => 0xFF & ($int >> 0x8),
- 'blue' => 0xFF & $int);
- }
- }
-
- /**
- * Php function for mysql old_password()
- * provides backward compatibility for zero board4 which uses old_password() of mysql 4.1 earlier versions.
- * the function implemented by referring to the source codes of password.c file in mysql
- *
- * @param string $password
- * @return string
- **/
- function mysql_pre4_hash_password($password) {
- $nr = 1345345333;
- $add = 7;
- $nr2 = 0x12345671;
-
- settype($password, "string");
-
- for ($i=0; $i>6)+192).chr(($num&63)+128);
- if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
- if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
- return '';
- }
-
- /**
- * Get whether utf8 or not given string
- *
- * @param string $string
- * @param bool $return_convert If set, returns converted string
- * @param bool $urldecode
- * @return bool|string
- */
- function detectUTF8($string, $return_convert = false, $urldecode = true) {
- if($urldecode) $string = urldecode($string);
-
- $sample = iconv('utf-8', 'utf-8', $string);
- $is_utf8 = (md5($sample) == md5($string));
-
- if(!$urldecode) $string = urldecode($string);
-
- if($return_convert) return ($is_utf8) ? $string : iconv('euc-kr', 'utf-8', $string);
-
- return $is_utf8;
- }
-
- /**
- * get json encoded string of data
- *
- * @param mixed $data
- * @return string
- */
- function json_encode2($data) {
- switch (gettype($data)) {
- case 'boolean':
- return $data?'true':'false';
- case 'integer':
- case 'double':
- return $data;
- case 'string':
- return '"'.strtr($data, array('\\'=>'\\\\','"'=>'\\"')).'"';
- case 'object':
- $data = get_object_vars($data);
- case 'array':
- $rel = false; // relative array?
- $key = array_keys($data);
- foreach ($key as $v) {
- if (!is_int($v)) {
- $rel = true;
- break;
- }
- }
-
- $arr = array();
- foreach ($data as $k=>$v) {
- $arr[] = ($rel?'"'.strtr($k, array('\\'=>'\\\\','"'=>'\\"')).'":':'').json_encode2($v);
- }
-
- return $rel?'{'.join(',', $arr).'}':'['.join(',', $arr).']';
- default:
- return '""';
- }
- }
-
- /**
- * Get is current user crawler
- *
- * @param string $agent if set, use this value instead HTTP_USER_AGENT
- * @return bool
- */
- function isCrawler($agent = null) {
- if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT'];
- $check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss', 'facebook');
- $check_ip = array(
- '211.245.21.11*' /* mixsh */
- );
-
- foreach($check_agent as $str) {
- if(stristr($agent, $str) != FALSE) return true;
- }
-
- $check_ip = '/^('.implode($check_ip, '|').')/';
- $check_ip = str_replace('.', '\.', $check_ip);
- $check_ip = str_replace('*', '.+', $check_ip);
- $check_ip = str_replace('?', '.?', $check_ip);
-
- if(preg_match($check_ip, $_SERVER['REMOTE_ADDR'], $matches)) return true;
-
- return false;
- }
-
- /**
- * Remove embed media for admin
- *
- * @param string $content
- * @param int $writer_member_srl
- * @return void
- */
- function stripEmbedTagForAdmin(&$content, $writer_member_srl)
- {
- if(!Context::get('is_logged')) return;
- $oModuleModel = &getModel('module');
- $logged_info = Context::get('logged_info');
-
- if($writer_member_srl != $logged_info->member_srl && ($logged_info->is_admin == "Y" || $oModuleModel->isSiteAdmin($logged_info)) )
- {
- if($writer_member_srl)
- {
- $oMemberModel =& getModel('member');
- $member_info = $oMemberModel->getMemberInfoByMemberSrl($writer_member_srl);
- if($member_info->is_admin == "Y")
- {
- return;
- }
- }
- $security_msg = "".Context::getLang('security_warning_embed')."
";
- $content = preg_replace('/]+>(.*?<\/object>)?/is', $security_msg, $content);
- $content = preg_replace('/]+>(\s*<\/embed>)?/is', $security_msg, $content);
- $content = preg_replace('/ ]+editor_component="multimedia_link"[^>]*>(\s*<\/img>)?/is', $security_msg, $content);
}
- return;
- }
-
- /**
- * Require pear
- *
- * @return void
- */
- function requirePear()
- {
- if(version_compare(PHP_VERSION, "5.3.0") < 0)
+ if($tag == 'img')
{
- set_include_path(_XE_PATH_."libs/PEAR");
+ $attribute = strtolower(trim($name));
+ if(strpos(strtolower($val), 'data:') === 0)
+ {
+ continue;
+ }
+ }
+ $val = str_replace('"', '"', $val);
+ $attr[] = $name."=\"{$val}\"";
+ }
+ $attr = count($attr)?' '.implode(' ',$attr):'';
+
+ return "<{$match[1]}{$tag}{$attr}{$match[4]}>";
+}
+
+// convert hexa value to RGB
+if(!function_exists('hexrgb'))
+{
+ /**
+ * Convert hexa value to RGB
+ *
+ * @param string $hexstr
+ * @return array
+ */
+ function hexrgb($hexstr)
+ {
+ $int = hexdec($hexstr);
+
+ return array('red' => 0xFF & ($int >> 0x10),
+ 'green' => 0xFF & ($int >> 0x8),
+ 'blue' => 0xFF & $int);
+ }
+}
+
+/**
+ * Php function for mysql old_password()
+ * provides backward compatibility for zero board4 which uses old_password() of mysql 4.1 earlier versions.
+ * the function implemented by referring to the source codes of password.c file in mysql
+ *
+ * @param string $password
+ * @return string
+ */
+function mysql_pre4_hash_password($password)
+{
+ $nr = 1345345333;
+ $add = 7;
+ $nr2 = 0x12345671;
+
+ settype($password, "string");
+
+ for ($i=0; $i>6)+192).chr(($num&63)+128);
+ if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
+ if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
+ return '';
+}
+
+/**
+ * Get whether utf8 or not given string
+ *
+ * @param string $string
+ * @param bool $return_convert If set, returns converted string
+ * @param bool $urldecode
+ * @return bool|string
+ */
+function detectUTF8($string, $return_convert = false, $urldecode = true)
+{
+ if($urldecode) $string = urldecode($string);
+
+ $sample = iconv('utf-8', 'utf-8', $string);
+ $is_utf8 = (md5($sample) == md5($string));
+
+ if(!$urldecode) $string = urldecode($string);
+
+ if($return_convert) return ($is_utf8) ? $string : iconv('euc-kr', 'utf-8', $string);
+
+ return $is_utf8;
+}
+
+/**
+ * get json encoded string of data
+ *
+ * @param mixed $data
+ * @return string
+ */
+function json_encode2($data)
+{
+ switch (gettype($data))
{
- echo <<'\\\\','"'=>'\\"')).'"';
+ case 'object':
+ $data = get_object_vars($data);
+ case 'array':
+ $rel = false; // relative array?
+ $key = array_keys($data);
+ foreach($key as $v)
+ {
+ if(!is_int($v))
+ {
+ $rel = true;
+ break;
+ }
+ }
+
+ $arr = array();
+ foreach ($data as $k=>$v)
+ {
+ $arr[] = ($rel?'"'.strtr($k, array('\\'=>'\\\\','"'=>'\\"')).'":':'').json_encode2($v);
+ }
+
+ return $rel?'{'.join(',', $arr).'}':'['.join(',', $arr).']';
+ default:
+ return '""';
+ }
+}
+
+/**
+ * Get is current user crawler
+ *
+ * @param string $agent if set, use this value instead HTTP_USER_AGENT
+ * @return bool
+ */
+function isCrawler($agent = null) {
+ if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT'];
+
+ $check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss', 'facebook');
+ $check_ip = array(
+ '211.245.21.11*' /* mixsh */
+ );
+
+ foreach($check_agent as $str)
+ {
+ if(stristr($agent, $str) != FALSE) return true;
+ }
+
+ $check_ip = '/^('.implode($check_ip, '|').')/';
+ $check_ip = str_replace('.', '\.', $check_ip);
+ $check_ip = str_replace('*', '.+', $check_ip);
+ $check_ip = str_replace('?', '.?', $check_ip);
+
+ if(preg_match($check_ip, $_SERVER['REMOTE_ADDR'], $matches)) return true;
+
+ return false;
+}
+
+/**
+ * Remove embed media for admin
+ *
+ * @param string $content
+ * @param int $writer_member_srl
+ * @return void
+ */
+function stripEmbedTagForAdmin(&$content, $writer_member_srl)
+{
+ if(!Context::get('is_logged')) return;
+ $oModuleModel = &getModel('module');
+ $logged_info = Context::get('logged_info');
+
+ if($writer_member_srl != $logged_info->member_srl && ($logged_info->is_admin == "Y" || $oModuleModel->isSiteAdmin($logged_info)) )
+ {
+ if($writer_member_srl)
+ {
+ $oMemberModel =& getModel('member');
+ $member_info = $oMemberModel->getMemberInfoByMemberSrl($writer_member_srl);
+ if($member_info->is_admin == "Y")
+ {
+ return;
+ }
+ }
+ $security_msg = "".Context::getLang('security_warning_embed')."
";
+ $content = preg_replace('/]+>(.*?<\/object>)?/is', $security_msg, $content);
+ $content = preg_replace('/]+>(\s*<\/embed>)?/is', $security_msg, $content);
+ $content = preg_replace('/ ]+editor_component="multimedia_link"[^>]*>(\s*<\/img>)?/is', $security_msg, $content);
+ }
+
+ return;
+}
+
+/**
+ * Require pear
+ *
+ * @return void
+ */
+function requirePear()
+{
+ if(version_compare(PHP_VERSION, "5.3.0") < 0)
+ {
+ set_include_path(_XE_PATH_."libs/PEAR");
+ }
+ else
+ {
+ set_include_path(_XE_PATH_."libs/PEAR.1.9");
+ }
+}
+
+/**
+ * Print raw html header
+ *
+ * @return void
+ */
+function htmlHeader()
+{
+ echo <<
@@ -1155,49 +1238,51 @@
HTMLHEADER;
- }
+}
- /**
- * Print raw html footer
- *
- * @return void
- */
- function htmlFooter()
- {
- echo '';
- }
+/**
+ * Print raw html footer
+ *
+ * @return void
+ */
+function htmlFooter()
+{
+ echo '